Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega644p][Codevision] - Timer - usypianie a watchdog.

Marek_Gorecki 15 Wrz 2012 10:47 1227 6
  • #1 15 Wrz 2012 10:47
    Marek_Gorecki
    Poziom 16  

    Poprawiłem tytuł na bardziej oddający problem i zgodny z regulaminem p. 3.1.15.
    LordBlick

    Jestem początkującym w języku C i ogólnie w programowaniu procesorów.Dlatego prosze o wyrozumiałość.

    Chciałem zrobić timerek zasilany z baterii, który co 8sek ma zmienić stan portu.
    Przymierzam się do zastosowania trybu Powerdown, ale najpierw muszę poradzić sobie z działaniem watchdoga i przerwania od niego.

    Napisałem sobie taki program w Codevision:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    instrukcja przerwania to poprostu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    pod PORTA 2 mam podłączoną diodę, która świeci mniej więcej co 0.5 sek, a według obilczeń watchdog ma sie przepełniać co 8sek.
    Gdzie jest błąd - błagam o pomoc bo siedze nad tym już 2 dzień.

    0 6
  • Pomocny post
    #2 15 Wrz 2012 15:29
    MArSTER_1
    Poziom 18  

    Dla konfiguracji resetowania się watchDoga po 4 sekundach :

    Mcusr = &B00000000 'Zerowanie rejestru aby wyłączyć bit 3 czyli WDRF.

    'Dokonywanie jakichkolwiek zmian w WatchDogu musi dokonywać się w ściśle określonej sekwencji wpisów do rejestru
    'WDTCSR. Jako pierwszy krok trzeba zrobić wpisanie wartości 1 do bitu numer 4 nazywanego WDCE.Pozostałe bity mogą
    'mieć dowolne wartości.
    Wdtcsr = &B00111001
    'Następnie w ciągu 4 cykli zegara należy wpisać do rejestru WDTCSR konfigurację bitów
    'zapewniającą taki jak chcemy sposób pracy WatchDoga.Bity numer 0,1,2 i 5 określają czas po którym nastąpi zadziałanie
    'WatchDoga.Dla Bit0=0 , Bit1=0 , Bit2=0 i Bit5=1 mam nastawiony czas 4 sekundy.Następnie bity 3 oznaczony jako WDE i
    'bit 6 oznaczony jaki WDIE decydują co stanie się po upłynięciu czasu. Dla akcji System Reset Mode bity muszą mieć
    'wartości: Bit3=1 , Bit6=0.To wszystko. Do rejestru należy więc zapisać:
    Wdtcsr = &B00101000
    'Koniec konfiguracji WatchDoga.

    0
  • #3 15 Wrz 2012 19:21
    dondu
    Moderator Mikrokontrolery Projektowanie

    MArSTER_1 napisał:
    Dokonywanie jakichkolwiek zmian w WatchDogu musi dokonywać się w ściśle określonej sekwencji wpisów do rejestru WDTCSR.

    A wszystko pięknie opisane w datasheet w rozdziale: 8.8 Watchdog Timer
    wraz z przykładem w C.

    0
  • #4 15 Wrz 2012 22:36
    Marek_Gorecki
    Poziom 16  

    Dziekuję Master za obfitą wypowiedż.

    Jeśli zatem chcę ustawić watchdoga z preskalerem /1024k, aby nie resetował się procek ,lecz wskakiwał do procedury obsługi przerwania to czy prawidłowy będzie taki zapis:

    Wdtcsr = 0b00111001;
    Wdtcsr = 0b01100001;

    spróbuje ale dopiero we wtorek i dam znać.
    Pozdrawiam

    0
  • #5 15 Wrz 2012 22:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Naucz się używać definicje bitów i przesunięcia bitowe, bo aby sprawdzić co chcesz ustawić trzeba sięgać do datasheet, a mało komu chce się to robić.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Podobnie dla WDTCSR, itd.

    0
  • #6 16 Wrz 2012 12:51
    MArSTER_1
    Poziom 18  

    Tak jak napisałeś powinno być dobrze.
    Jeszcze jedna uwaga. Poprzednio miałeś ustawione bity na Interrupt and System Reset Mode. To może obecnie skomplikować ci możliwość przestawienia nastaw WatchDoga.Jeśli po wpisaniu tych wartości do rejestru nadal działanie WatchDoga nie będzie zgodne z oczekiwaniami to dzieje się tak dlatego iż w sterowaniu WatchDogiem jest począwszy od ATmegi 168 zmiana. Dlatego jest sporo osób, które nie mogą przesiąść się z ATmegi 8 na ATmegę 168. Właśnie dlatego, że nie mogą poradzić sobie w nagłą zmianą działania programu, jeśli używały WatchDoga. W Atmega 644 należy wiedzieć, że jeśli mamy ustawione działanie WatchDoga na na przykład 8 sekund i jeśli WatchDog z jakiegoś powodu zadziała to czas działania WatchDoga zostanie poza kontrolą programisty zmieniony na 16 milisekund. To powoduje, że procesor nie zdąży wystartować z programem aplikacyjnym i znów się resetuje. Wyjściem z tej pętli jest wtedy jedynie wyłączenie zasilania i właczenie go ponownie.....Ale o tym będziemy wiedzieli we wtorek.

    0
  • #7 17 Wrz 2012 10:30
    Marek_Gorecki
    Poziom 16  

    Jest działa mi :D

    Ustawianie watchdoga w tym trybie ma być tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dziękuję wszystkim za pomoc.

    0