ATmega8A - realizace hodin 24h cyklus

Zdravím,

chtěl jsem poprosit, jestli by mě někdo nenasměroval. Potřeboval bych totiž udělat na Atmega8A hodiny (realtime). Dělám aplikaci, kde potřebuju mít 24h counter s rozlišením na hodiny a minuty, abych mohl na určité časy nastavit události (např. v 7:00 pohnout servem, které přiotevře záklopku a do akvária se vysype dávka krmiva).

Četl jsem v datasheetu že to má nějaký mód realtime counter nebo co, že se připojí ext oscilátorek s poměrně nízkou frekvencí …

děkuji za nasměrování a rady

s pozdravem
Slávek

Jestli chceš jen jednorázové řešení a ne se učit programovat mcu, lepší by bylo už nějaké hotové řešení, např.: ok2jnj.wz.cz/stmivac.htm

Při vlastní konstrukci bys sice mohl použít hodinový krystal jen 32,768 kHz, výhodou je nízká spotřeba (vydrží pak jet při výpadku elektřiny i s malou záložní baterií), nevýhoda je nízká frekvence, která může být na překážku kvůli displeji - LCD by ještě vyhovoval (pomalé překreslování), ale LED displej by už mohl trochu blikat.

Realtime časovač to sám o sobě nevyřeší - je to jen periodické přerušování, ale vlastní hlídání času sepnutí a vypnutí si musíš dělat sám. To co bys musel řešit ve vlastním programu - vyvolávat periodické přerušování, obsluhovat čítání času, překreslování displeje, obsluha tlačítek, ovládací funkce (nastavení času, nastavení předvoleb), ukládání předvoleb spínacích časů do EEPROM.

jo tohle všechno budu asi muset dělat no, alespoň se to naučím. Je to školní projekt právě …

Ale tím že připojím kristal jen pro realtime, neznamená že na té frekvenci pojede i procesor ne ? těch 32,768 KHz se použije jen pro časovač ne ?

Jeden kolega mi říkal, že když se ten čítaček nastaví do režimu realtime, tak sám přetíká po sekuindě (když má ten ext osc). Pak bych si inkrementoval nějaký ten int v přerušení a potom v hlavní rutině hlídal, jestli se neshoduje předvolba s časem.

Ten realtime umí čítač T0 ? Protože T1 (16b) potřebuju pro servomotory.

To se dá udělat na spoustu způsobů. Jak píše Panda38, buď si “real time core” vytvoříš v mcu pomocí přerušení od interního časovače živenýho z nějakýho dobře dělitelnýho krystalu a pak ten čas zpropaguješ do vlastního programu pro řízení, nastavovaní atd. nebo můžeš mít exerní RTCC třeba na I2C zběrně (PCF8583) a z něj si čas tahat. Ale ostatní serepetičky kolem tě neminou (LED disp, LCD disp, uživatelský interface)

Jestli se nepletu tak T0 můžeš živit z XTAL/PRESC nebo z externího zdroje přivedeného na nohu procesoru.

ps: nechápu proč výrobci součástek produkujou ty datasheety když je stejně nikdo nečte.

Například když použiješ 4.19304MHz tak podle nastavení předděliče dostaneš 16-64-256-2048-16384 přerušení/s a s tím už se dá pracovat a mcu jede už dostatečně rychle .

Už jsem to tu někomu psal. Nejelegantnější je nechat běžet MCU na IntRC, v pojistkách zapnout CKOPT a použít externí krystal 32768 Hz. Při zapnutém CKOPT nejsou potřeba ani kondíky u krystalu. Použiješ pak Timer/Counter2 v asynchronním režimu (nebere hodiny z interního oscilátoru, ale z externiho krystalu) a máš přesné časování. Při použití prescaleru = 1 Ti časovač přeteče a vyvolá přerušení 128x za sek. (to kdybys chtěl nějak přesněji seřizovat čas). Stejného výsledku se dá dosahnout i s vyresetováním prescaleru během čítání. S prescalerem 64 dostáváš kmitočet 2 Hz - při každém přerušení změníš stav dvojtečky (zhasnout/rozsvítit) a při jejím rozsvícení navíc updatneš čas. Pokud netrváš na blikání dvojtečky, tak nastavíš prescaler na 128 a každé přerušení updatneš čas. Máš vyřešený jak displej (MCU běží na IntRC 1-8 MHz), tak hodiny krystalem 32768 Hz na kterým běží oscilátor pro časovač.

A nakonec to můžeš “vyšperkovat” třeba automatickým seřiováním času podle DCF signálu. Modul koupíš u Conrada za cca 300 Kč a nemusíš se starat vůbec o nic. Dělal jsem dokonce i hodiny, které běží jen na IntRC bez hodinkovýho krystalu a trvale se synchronizují právě podle DCF.

zkrátka a dobře na T0 můžu přivést ext kmitočet a procesor může dál tikat na interním osc je tak ?

takhle jsem to nějak myslel, tak to udělám díky

Balu: Jestli mu bude stačit přesnost interního RC oscilátoru na ty ostatní věci (serva tuším) tak je to naprosto OK.

DCF modul : shop.fkt.cz/deska-prijimace-dcf-mod-dcf+dp55380/

to Radius: Myslím, že by přesnost stačit mohla. Přecijenom se jedná o intervaly v řádu ms. A i když tam nějaké nepřesnosti budou, tak si myslím, že by neměl být nějaký výraznější problém.

Tak v papírech píšou 3% pro 1MHz (jde to prý i nějak vylepšit). Takže na servo se mu to promítne jako cca 3 úhlové stupně. (PPM 1-2ms dělá obvykle do 90°) To by mohl zkousnout :slight_smile:

je to tak … a dá se to ještě vylepšit kalibračním bajtem ne ? Když tu hodnotu vyčtu programátorem a zapíšu v programu do správného registru ?

Procesor implicitně kalibrační konstantu čte a nastavuje do registru. Dá se ručně najít přesnější hodnota a tu pak nastavit do registru programově.

Co to znamená ručně ? To řeba vzít čítač a zkoumat co z toho procesoru leze ? Spočítat si počet pulzů za sekundu nebo tak něco ? Jako taková vlastní kalibrace (justování) ?

V podstatě ano, čítač + teploměr (pokud to chceš pro velký rozsah teplot) a vznikne číslo/tabulka kterou tvůj pogram použije.

Niméně pokud to nechceš řešit, tak zvol řešení s jedním krystalem (kmitočtem) pro celý mcu.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Spíš cejchování konstanty zkusmo, např. když je potřeba trochu odlišnou frekvenci než je z výroby.

Jo, nebo dolaďování podle teplotní závislosti, jak píše Radius. Ale to už se pak ztrácí výhoda jednoduchosti RC.

Mozes pouzit interny RC, nech si kmita ako len chce. S teplotou to tak ci tak bude kolisat aj o +/-8% tak naco sa trapit so solichanim pri 25°C. No nie?

Ale nastav si casovac riadiaci celu cinnost procesora tak, aby si poteboval predvolbu nejakeho citaca tak v okoli 150-230. Napriklad na 8MHz RC pouzijes predvolbu delica 4x a predvolbu pocitadla daj na 200. Nastavenie bitu casovaca dostanes jeden krat za 0.1ms. Potom pocitaj pocet nastaveni napriklad za jednu sekundu. Tuto sekundu si odvod od Xtaloveho casovaca. Ak bude hodnota nastaveni bitu casovaca vacsia ako 10000, potom zvis predvolbu 200 o + 1. Ak bude pocet nastaveni mensi, tak predvolbu o jednotku zniz. Po par sekundach budes mat hodiny pre riadenie internych procesov presne nastavene a automaticky sa sami presne dostavia na spravnu hodnotu i vzhladom ku kolisaniu od teploty. Jasne, ze serva si budes potom riadit softverovo, ale mas presnu casovu zakladnu 100us a s tymto krokom mas definovane aj sw PWM. Kluidne to skus, uvidis, ze mcu to hravo stiha.

napriklad tento PWM kod pre 8MHz a optimalizaciu -Os

		  	for(uint8_t i = 0; i < POCET_PWM; i++) {
				prac_cnt*++;
				if (prac_cnt* >=predvolba_perioda*) {
					prac_cnt* = 0;
				}
				if (prac_cnt* > predvolba_h*) vystupy |= (1<<i);
				else vystupy &= ~(1<<i);
			}
			vysledok	= vystupy;

trva 42.7us pre styri 16 bitove PWM a 96us pre osem 16bitovych PWM.
Pre osem bitove PWM trvaju styri sw PWM cca 28.8us a osem 8bit PWM len 67us.******

To poslední řešení zní velmi zajímavě. Teď mám kopu jiné práce, ale popřemýšlím si nad tím a pak třeba sem hodím jak jsem dopadl :slight_smile:

díky

Můžu se ještě zeptat, jak nejlípe softwarově ošetřit zákmity tlačítka ? já jsem to řešil tak jak je v přiloženém kódu. Ale nemám uplně ponětí, jak dlouho se tam zákmity objevují … taky mi to občas samo od sebe přepne (mám u toho ext 32.768KHz osc, takže to dělá také nějaké rušení asi).

pastebin.com/AWbhyt6t

jsou to dvě funkce IfPinHigh, IfPinLow …

Taky důležitá otázka, lze takto vnést do funkce adresu toho portu a pracovat s ní takto dále ?
potřebuju udělat nějakou takovou init část, kde budu zadávat čas aktuální (jako po restrtu mobilu co nepodrží čas)

ocením každý názor, každou radu :slight_smile: díky

:arrow_right: administrator: příspěvek byl upraven
Odkaz byl vyjmut z code.

:arrow_right: administrator: přiloženy externí soubory
ifpin.txt (558 Bytes)