Tohle není celý kód nebo nejde přeložit. Co je include (bez křížku…) ?
3x delay 5 ms v přerušovacím vektoru ? To nemůžeš myslet vážně.
Proč 25x čteš AD převodník a až potom to ukládáš do proměnných pro displej, když to neprůměruješ nebo jinak nezpracováváš ? Pokud používáš přerušení pro zobrazení, tak použij časovač.
Pokud děláš multiplexovaný displej, musíš nejdřív vypnout společnou anodu (nebo katodu), pak poslat nová data a pak teprve společnou zapnout. Druhá varianta je poslat data pro zhasnuté segmenty, přepnout společnou a poslat nová data. Tak, jak to máš Ty “prosvítají” jednotky do desítek, desítky do stovek a stovky do jednotek. Kromě toho když při každém přerušení přepneš číslici, máš zaručené, že budou všechny číslice svítit stejně dlouho (a tudíž stejně jasně).
Pokud si AD převodník sám na konci převodu spouští další převod, nebylo by vhodnější použít freerunning mód ?
A nakonec : Jaký je použitý čip ? To v programu být nemusí, ale pokud Ti to má někdo zkouknout, bylo by to vhodné napsat.
Jsem tam nechtěně smazal ten křížek už to je napraveno.
Program je pro atmega8 těch 25x mám zpoždění pro vypis na display jinak to tam je zbytečný, promiň že se tak blbě ptám ale co to je ten freerunning mód programuji teprve týden, takže jsem na tom dost bídně zatím.
V preruseni sa snaz zdrziavat co najkratsie. Ak budes dlho v preruseni, moze medzi tym nastat nejake ine prerusenie, ktore nezachytis. Preto sa vyhybaj pouzivaniu _delay v obsluhe prerusenia.
Freerunning je taky mod, kedy po skonceni ADC prevodu vznikne prerusenie, aby si vedel ze prevod skoncil (tak ako to mas teraz) a hned sa spusti aj dalsi prevod. Tu by napr. mohol nastat problem, ak by si dlho prerusenie obsluhoval. ADC by ti spravil dalsich 5 prevodov, ktore by si nezachytil, lebo by si spracovaval este prvy prevod.
Žádnej učenej z nebe nespadnul a každej jsme nějak začínal. Takže :
Vyhoď z přerušení od AD to zobrazení.
Spusť AD převodník ve freerunning módu. V datasheetu najdeš jak - aspoň si procvičíš hledání v datasheetech. Hodnotu AD ulož do nějaké proměnné - samozřejmě v přerušení. Druhá možnost je spouštět periodicky převodník třeba 1x za sekundu - pokud nepotřebuješ měřit teplotu kontinuálně a stačí Ti pravidelné intervaly.
Nastav si časovač a povol přerušení od něj. V každém přerušení časovače přepni na další číslici. Tím máš zaručeno, že všechny číslice budou svítit stejně dlouho. A hlavně nezapoměň před přepnutím na další číslici tu předchozí zhasnout … Tady si taky vytvoříš odpočítávání pro spouštění AD převodníku. Ne, že dáš vteřinovej delay do hlavního programu !!! Obecně funkci delay se snaž nepoužívat a pokud ano, tak pro časy maximálně jednotky milisekund, a i to je pro MCU věčnost a může toho dělat spoustu užitečnějšího, než mít plný ruce práce s delayem…
V hlavním programu si zkontroluješ aktuální hodnotu AD převodu s minule načtenou a pokud se bude lišit, tak přepočítáš číslice a jede se dál.
A především (jak už psal xpertvis) - doba zpracování přerušení musí být co možná nejkratší.
To by pro začátek mohlo stačit, abych Ti nezamotal hlavu až moc …
adc a ADC -> Není vhodné rozdělovat různé proměnné jenom pomocí malých a velkých písmen. Je k tomu několik důvodů. Ten nejdůležitější je asi přehlednost. V adc a ADC se můžeš celkem brzy ztratit. Druhým je, že ne každý překladač musí nutně rozlišovat adc a ADC jako dvě různé proměnné. Přestože to C dovoluje, snaž se tomu vyhnout. V Basicu bys měl problém. Tomu jsou malá a velká písmena ukradená.
Ve smyčce while můžeš použít buď sleep - pokud procesor nedělá nic jiného, než obsluhu teploměru, tak můžeš snížit spotřebu. Obzvlášť pokud by zařízení napájel z baterek. Samozřejmě musíš v inicializaci programu vybrat požadovaný sleep mód, aby Ti přerušení mcu probudilo.
Pokud toho procesor dělal víc, je vhodné vytvořit si ještě proměnnou last_adc a zkontrolovat adc a last_adc. Pokud se liší, tak do last_adc nakopíruješ adc a provedeš výpočet. Pokud jsou shodné, nebudeš nic přepočítávat. Výpočty trvají relativně dlouho a můžeš takto ušetřit čas pro jiné věci, které by měl mcu na starost.
A ještě dotaz - proč v přerušení od časovače nastavuješ časovač na 60535 ? Pokud potřebuješ jenom 5000 cyklů, tak tady je elegantnější řešení : Na začátku nastav čítač 1 do CTC režimu, OCR1A nastav na 4999 (5000 cyklů) a použij přerušení TIMER1_COMPA místo TIMER1_TOV. Čítač čítá od 0 do 4999, pak se sám vynuluje a spustí přeřušení. 1) Odpadá Ti přenastavování čítače. 2) Je to přesnější.