ATmega8 - čítače / časovače - jak počítat čas?

Zdravim, potreboval bych poradit:
Mam aplikaci “stopky” ktere jsou spusteny externim prerusenim a stopnuty druhym externim preruseni. Mam multiplexni ovladani segmentovky, na kterem cas stopuji (minuty, sekundy, setiny)
Externi krystal 8MHz, podeleny 8 - zajistuje multiplexi rizeni - s kazdym pretecenim se prepne segmentovka, rychlost je dostatecna na to aby to oko nepostrehlo a proto to vypada jako kdyby displej svitil spojite.
Pak potrebuji nejak pocitat cas, ale vubec netusim jak.
Idealni by bylo kdybych na druhy citac/casovac mohl pripojit interni hodiny a preddelickou a stropem citace nasel takove nastaveni aby mi tento citac pretekl jednou za setinu vteriny, podle ktere bych uz odecetl sekundy a minuty.
Jsem zacatecnik, ale podle mych informaci bohuzel procesor nemuze s dvema zdroji hodinovych pulsu pracovat.

Druhy dotaz je kolik hodinovych tiku ma jeden strojovy cyklus u Atmega8…?? Vim ze u ruznych procesoru se to lisi, potreboval bych to vedet abych do prace mohl spocitat po jakym case se prepinaj ty segmentovky.

Dekuji, doufam ze se dockam rady :slight_smile:

:arrow_right: administrator: přejmenováno z "citace/casovace Atmega8"

Samozrejme ze moze. Pocitaj pocet prepnuti tych sedemsegmentiviek. Ak je to odvodene od Xtalu je to rost presne. Ale da sa to este presnejsie s ICP vstupom.

ATmega nie je nejaky PIC16 alebo 89C5x

ATmega ma jeden strojovy cyklus na jeden tik hodin. Na meranie cesu pouzi ten casovac. Snad nechces pocitat pocet instrukcii? Na co ine tam ten casovac potom vobec mas? Ve dprdsa mas znamy Xtal, preddelicku pocitadla a hodnotu pocitadla do ktorej toto pocita. Z toho cas presne zpocitas.

Ak nevies ako dalej,klidne sa pytaj. Vsetci sme boli volakedy zaciatocnici :slight_smile:

:arrow_right: administrator: příspěvek byl upraven
Citace byla pozměněna.

Mam to vyresene tak, ze kdyz projedu startem, nastavi se mi promena “x” a s kazdym prerusenim 8b citace (8MHz a preddelickou 8) se mi inkrementuje promenna “y”.
Setiny odmeruji tak, ze dam do podminky if((x==1)&&(y==5)).
Cas to kupodivu meri i docela presne, ale na minutu je tam cca pul vteriny rozdil oproti skutecnemu.
Zkusim popremyslet nad jinym resenim, ale nic moc me nenapada.

Pročti si tento odkaz:

elektroworld.info/modules.ph … ic&t=37095

Mě se něco podobného stalo při programování PIC v mikroC. Také jsem měl problém s přesným časování, tak jsem si prohlédl překlad do asm, a když jsem ten kód poté zkusil v MPLABu, tak to moc přesné nebylo. Záleží na tom, jak dobře je napsaný překladač.

8MHz, ovf. 100/s -> 80 000 tiků / 8 = 10 000.
Timer1, dělička 8, mode14/15 (Fast PWM), TOP = 10 000-1

V každým přerušení (po 1ms) si pak jen do nějaký “volatile” globální proměnný přičítej milisekundy.

S 8-bit timerem nedosáhneš přetečení po 1ms.
Potřeboval bys děličku 8e6/100/256 = 312.5.
Ovšem s děličkou 64 a TOP=250-1 ti přeteče přesně 5x/ms a to už je počítatelný.
Timer2, mode CTC, využít přerušení od “Compare Match” místo overflow.

Tak presne podle rad z predchoziho prispevku.
Pouzit externi krystal s frekvenci 8MHz, preddelicka 64 a strop preteceni nastaven na OCR2=0xF9 (250-1). V interaptu od preteceni c/c2 inkrementuji promennou. K preteceni pak dojde 500x za sekndu (jednou za 2ms), z cehoz setinu odpocitavam kdyz promenna nabyde velikosti 5.
Vse funguje presne a jak ma, jeste jednou diky za rady!