logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega328P - Watchdog generuje tylko reset, brak przerwania. Jak to naprawić?

mk5th 08 Sie 2016 12:16 1782 13
  • #1 15855968
    mk5th
    Poziom 9  
    Dzień dobry.
    Na nowo zaczynam przygodę z AVR'ami.
    Mam problem z watchdog'iem. Chciałbym obsłużyć przerwanie generowane przez watchog, ale mi się to nie udaje. W zamian watchog generuje tylko sygnał reset (bez uprzedniego przerwania). Piszę na ATmega328P ( Atmel Xplained Mini 328P).
    FuseBit WDTON nie jest zaprogramowany.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeśli ktoś mógłby rzucić okiem i powiedzieć co nie gra.
    Kieruję się książką Tomasza Francuza - "Od podstaw do zaawansowanych aplikacji", lecz autor nie pokazuje pełnego kodu. w zamian otrzymuję funkcje wyrwane trochę z kontekstu. Dziękuję za pomoc :)
  • Pomocny post
    #2 15855991
    excray
    Poziom 41  
    A skąd wiesz, że się nie wykonuje? Jedyne co widzę, to to, że w przerwaniu zerujesz wyzerowany port. To raczej trudno zauważyć.
  • #3 15856004
    mk5th
    Poziom 9  
    jest jeszcze 2 sekundowy delay. Dioda zatem powinna się przestać świecić na 2 sekundy.
  • #4 15856016
    excray
    Poziom 41  
    A skąd wiesz, że nie przestaje, skoro później masz reset? Zrób bardziej rozpoznawalną flagę - mignij diodą na zupełnie innym porcie.
  • #5 15856026
    mk5th
    Poziom 9  
    Z tego co wiem to najpierw watchdog powinien poczekać 2 sekundy, potem obsłużyć przerwanie i zacząć liczyć od nowa ( podczas gdy MCU będzie czekać 2000ms) i migać dalej. Dopiero po kolejnym odliczeniu 2 sekund przez watchdoga system powinien się zresetować.
  • Pomocny post
    #6 15856031
    excray
    Poziom 41  
    To coś źle wiesz. Natychmiast po przerwaniu następuje reset. Może jednak się skusisz i zrobisz jak napisałem - w przerwaniu zapalisz diodę na zupełnie innym porcie, nie używanym przez żadną inną funkcję? Wiesz trudno jest pomóc komuś kto sam sobie nie chce pomóc.
  • #7 15856039
    mk5th
    Poziom 9  
    Dziękuję za pomoc. Aporopos innej diody to musiałbym lecieć do sklepu. Niestety nie jestem u siebie i mam tylko surową płytkę. Jeszcze raz dziękuję za pomoc. Jaki jest sens takiego przerwania skoro natychmiast po rozpoczęciu procedury obsługi przerwania jest generowany sygnał reset. A gdybym chciał w przerwaniu powiedzmy wysłać coś na UART? Mikrokontroler nic by nie wysłał?

    Dla potomnych zostawiam kod który może pokazać że przerwanie jest generowane.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 15856046
    excray
    Poziom 41  
    Możesz tą samą diodę wpiąć na inny port. Jak się zapali to wiadomo będzie, że tylko WDT mógł ją włączyć. Bardzo sensowne jest ta opcja, tylko źle ją interpretujesz. Nie natychmiast, tylko po przerwaniu. W instrukcji jest napisane, że najpierw następuje przerwanie a później reset. Czyli ta opcja wywołuje przerwanie, wykonuje program zawarty w przerwaniu, a w momencie jak program dojdzie do klamry kończącej przerwanie następuje reset. Czyli jeśli coś wysyłasz w przerwaniu na USART to zostanie to wysłane.
  • #9 15856050
    mk5th
    Poziom 9  
    Dlaczego zatem nie została wykonana funkcja _delay_ms(2000); w przerwaniu?
    Czyżby kompilator ignorował delay'e w przerwaniu?
  • #10 15856060
    excray
    Poziom 41  
    Kto wie. Może to już kompilator uznał, że jest ona bez sensu i ją wywalił. To już musiałbyś wrzucić tutaj plik *.lss aby to stwierdzić.
  • #11 15856074
    mk5th
    Poziom 9  
    Jeszcze jedna kwestia, jeśli zamiast ustawiać WDE i WDIE ustawimy tylko WDIE, uC powinien według autora generować tylko przerwanie bez resetu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Podczas gdy dioda dalej miga co sekundę tak jakby uC był i tak resetowany.
  • #12 15856093
    excray
    Poziom 41  
    Przyjrzyj się funkcji wdt_enable albo lepiej jej się nie przyglądaj tylko wywal a odpowiednie bity ustaw linijkę wyżej wraz w włączeniem WDTIE
  • #13 15856125
    mk5th
    Poziom 9  
    Ustawiłem bit WDIE oraz WDP1 i WDP2 ( ustawiają sekundę jak było napisane w nocie katalogowej), lecz jak śledzę to debuggerem to widzę że system dalej się resetuje.
    Dziwna sprawa dioda świeci się (około 1 sekunda) i gaśnie (na około 1 sekundę), chociaż nie ma delyów ani operacji xor.
    Wydaje mi się że ten program powinien zapalić diodę po upływie 1 sekundy a tak nie robi.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 15856145
    excray
    Poziom 41  
    Testuj bez debuggera
REKLAMA