AtMega8 - co nejpřesnější měření doby mezi změnama na pinu.

Zdravím vás,
rád by jsem pomocí AtMega 8 - 8MHz interního osc. měřil co nejpřesněji dobu mezi změnou stavu na určitém pinu. Jak se dá změřit co nejpřesněji doba? Jakou přesnost jsem z AtMega8 schopný vymáčnout? Nemám použít externí oscilátor pro větší tatk a přesnost?

Tak jsem vás zasypal. :slight_smile: Za každou radu budu rád.

Krystal nebo externí oscilátor(POZOR, to není to samé, je třeba různě nastavit fuses) připoj určitě, interní RC může mít odchylku až 10% (obvykle se vejde do 3%). Na 16MHz trvá tik oscilátoru 62,5 ns, takže s přesností 0,1us by snad šlo se zamhouřenýma oběma očima počítat. Budeš potřebovat input capture jednotku timeru a pro delší intervaly si ukládat počet přetečení timeru.

Edit: jelikož není timer schopen se nechat automaticky spustit externí událostí, bude třeba ho startovat externím přerušením a tím ti spadne přesnost na jednotky us.

Právě se mi podařilo vyhrabat, že potřebuji měřit od 0.1ms a více. Přesnost na 0.1ns tedy nebude potřeba. :slight_smile: Teoreticky by mi stačilo počítat tiky (8MHz = 125ns) od změny z 0->1 do změny 1->0 . No ale jak to spolehlivě spočítat.

0,1ns bys opravdu nedal :smiley: (o 3 řády mimo možnosti avr).
Signál si přiveď na pin pro externí přerušení a ICP zároveň. Externí přerušení si nastav na náběžnou hranu, IC na sestupnou a jesli ti nebude vadut 4 takty zpoždění(což by nemělo, přesnost spuštění timeru bude stejně mnohem horší) zapni noise canceler.
V obsluze externího přerušení zapneš timer, v obsluze input capture si uložíš napočítanou hodnotu a timer vynuluješ. Pokud bude perioda větší, než je schopen timer napočítat, je třeba si v přerušení od přetečení timeru uložit kolikrát přetekl. Výsledná doba pak je /počet přetečení/*2^16 + ICR. Kdybys chtěl bejt punťa, tak si ješte v simulátoru změříš jak dlouho trvá aktivace timeru po příchodu náběžný hrany a tu hodnotu od výsledku odečteš.

no páni. Díky za podrobnou odpověď. Pokusím se to zbrastlit. :slight_smile: