Cześć wszystkim,
Jestem w trakcie swojego małego projekciku termostatu i z powodu uszkodzenia nogi RTC, który dysponuje solidnymi timerami, zmuszony jestem wybudzać jakoś swój układ za pomocą czegoś innego. Korzystam z ATmegi88PA-PU
Zdecydowałem się na taki system:
1. Jest odpalony timer z okresem 8s i posiada licznik, co w sumie zapewnia przepełnienie co minutę.
2A. Jeśli wciśnięty zostanie dowolny klawisz, timer z pkt.1. jest resetowany.
2B. Jeśli timer z pkt.1. się przepełni, to odpala WatchDogTimer i usypia układ.
3. WatchDogTimer ma okres 8s i posiada licznik, co w sumie zapewnia przepełnienie co 15min.
Przy usypianiu gaszone jest kilka modułów, co powoduje mniejsze zjadanie przez nie energii.
Przy budzeniu przez WDT sprawdzany jest licznik:
[*] Jeśli ten spadł do 0, to wołane jest wdt_disable() i odpalane są moduły. Liczniki timera i WDT są resetowane.
[*] Jeśli jest >0, to następuje jego dekrementacja, a następnie ponownie odpalany jest WDT i usypiany układ.
Ponadto istnieje flaga "isAsleep", która jest ustawiana na 1 przez Timer przy pierwszym odpaleniu WDT i usuwana przez WDT wybudzającego w pełni procek. Główna pętla programu wykonuje swoje instrukcje tylko jeśli isAsleep==0, inaczej to jest while(1);
Niestety póki co pomysł nie działa - prawidłowo idzie spać, tylko jeśli nie korzystam z guzików, prawidłowo gasi moduły przed i odpala je po wybudzeniu, jednak ilość czasu, którą spędza w śnie jest zdecydowanie za krótka. Procek siedzi w temp ok. 30 stopni, bo obok wentylatora komputera, a zatem i programatora (dane odczytane z modułu termometru).
Jakieś pomysły? Oczywiście na czas testowania ustawiłem sobie mniejsze wartości - timer przepełnia się po 16s, WDT tak samo.
Poniżej wrzucam pseudo kody implementacji tego usypiania. Funkcje do sleepa i wdt brane są z bibliotek avr

main:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
checkTimers:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
WDT i sleep inits:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
initTimers:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przerwania:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.