Zacząłem się bawić Watchdogiem i w teorii niby wszystko fajnie. Dodałem bibliotekę <avr/wdt.h> i <avr/sleep.h> i teoretycznie w głowie pojawił się pewien plan, który jednak padł na samym początku. Wszystko fajnie tylko po pierwszym uruchomieniu i odliczeniu tych 10ciu sekund oczekiwania na uzbrojenie, jeżeli drzwi będą prawidłowo zamknięte wykona się funkcja sleep_mode(). Po dwóch sekundach nastąpi reset, i....cykl się powtórzy, tzn zacznie się odliczanie 10 sekund na uzbrojenie itd. No trochę bez sensu
Czy jest możliwość ustawienia zmiennych - flag w pamięci RAM, tak by reset ich nie nadpisywał wartością 0, czy trzeba wykonać po uzbrojeniu zapis do pamięci EEPROM i po każdym resecie odczytywać wartość flagi z tej pamięci....w sumie żadne inne możliwości nie przyszły mi go głowy.
No trochę dowaliłem z tym EEPROMEM, bo przecież jego zawartość ne kasuje się po zaniku zasilania, czyli jak raz ustawię flagę i ją zapisze to do śmierci procka będzie zapisana.
Chociaż w sumie....
Załączam zasilanie stacyjką, czyli załączam alarm. Program zaczyna sie wykonywać, czyli:
-wyłączam watchgod
-odmierzam 10 sekund na uzbrojenie alarmu-zapisuje flage uzbrojenia w eeprom
-jeżeli drzwi zamknięte-zapisuję flagę kontroli drzwi w eeprom
-załączam watchdog na 2 sekundy
-sleep_mode
-jeżeli drzwi otwarte-natychmiastowy alarm 10 sekund
-zerowanie flagi uzbrojenia i konrtoli drzwi w eeprom
W tym stanie układ zostaję do ponownego uzbrojenia stacyjką
-po każdym resecie, jeżeli flaga uzbrojenia alarmu ustawiona:
-wyłączenie watchdoga
-kontrola czujnika
-jeżeli nieaktywny
-załączenie watchdoga
-sleep_mode
-jeżeli czujnik aktywny
-wyłączenie watchdoga
-odczekanie 10 sekund i alarm 180 sekund potem 3 sekundy alarmu co 5 sekund
-zerowanie flagi uzbrojenia i kontroli drzwi w eeprom
W tym stanie układ zostaję do ponownego uzbrojenia stacyjką
Wyłączenie alarmu nieprawidłowo domkniętych drzwi jak i alarmu włamania możliwy tylko po przekręcenu stacyjki.
Zacząłem zabawę z Watchdogiem i trybem Powersave. O ile samo przejście w Powersave dzięki dołączonej bibliotece to nic trudnego o tyle obsługa Watchdoga zajęła mi wiele godzin. Oczywiście gotowa funkcja "enable_wdt (value)" działa świetnie, jednak z disable_wdt() jest...no teraz to już był problem. Attiny 13 zachowywał się dobrze tylko przy pierwszym uruchomieniu, przechodził w tryb Powersave i później zaczynał się z szybkością światła resetować. Oczywiście nie pomagało wyłączenie Watchdoga na samym początku za pomocą disable_wdt(). Po długich godzinach poszukiwań odkryłem a raczej wyczytałem że Attiny 13 posiada - jak to wyczytałem z necie - rozbudowany układ Watchdoga z możliwością generowania przerwań i po resecie przyjmuję wartość domyślną 16ms. Później trafiłem na bloga Mirka i znalazłem kod który po wklejeniu generował błąd podczas kompilacji. Chodzi dokładnie o ten kod, który znalazłem pod adresem
http://atnel.pl/mkbootloader.html :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Oczywiście błędów nie ma w kodzie, tylko w mej łepetynie i po zerknięciu do pdf,a odkryłem że Attiny 13 nie posiada rejestru WDTCSR, tylko WTDCR. Po skasowaniu tej jednej literki okazało się, że ....ooooo skompilowało się i działa
Aktualnie kod wyłączenia watchdoga wygląda w ten sposób:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Załączanie watchdoga za pomocą enable_wdt(value);
Dzięki temu zabiegowui udało mi się ograniczyć pobór prądu całego alarmu (wraz ze stabilizatorem i wszystkimi peryferiami) do 93uA.
Tak wygląda gotowy kod z działającą obsługą watchdoga, teraz czas na zapis/odczyt z eeprom
.....i kto by pomyślał, że się kiedykolwiek cieszył z tego, ze mi się procek resetuje
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.