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

[BASCOM] Wykywanie liczby resetów Watchdog'a - jak?

xury 25 Paź 2010 20:59 1985 12
REKLAMA
  • #1 8663174
    xury
    Specjalista automatyka domowa
    Chciałbym zrobić coś takiego:
    Odbieram przez USART odpowiedzi z telefonu i chcę wykryć np. brak lub wyłączony telefon. Sęk w tym, że w tym momencie korzystam z Watchdoga i kiedy jest brak odpowiedzi z telefonu to program zawisa na Input'cie i wtedy go watchdog resetuje. Chciałbym w jakiś sposób zliczać te resety by np. po dziesięciu próbować włączyć telefon itp. tylko jak to zrobić ?
    Myślałem o zwiększaniu zmiennej liczbowej do pewnego etapu, a po jego przejściu jej zerowanie z powiązaniu z dyrektywą $NORAMCLEAR, a może jest inny sposób ?
  • REKLAMA
  • #2 8664737
    marek-c
    Poziom 19  
    Kolego WatchDog resetuje uP i raczej nie policzysz 'resetów'.
    Jak już to w pętli oczekującej wstaw dodatkowy warunek po przekroczeniu, którego program 'pójdzie' dalej.
    Np:

    
    i = 0;
    while((i<1000) && (!dzwonek))
      i++;
    //dalsza część np.
    if(i ==  1000) {
      //nie było dzwonka - ale uwaga co w momencie gdy dzwonek był zaraz po wyjściu z while...
    }
    
    
  • Pomocny post
    #3 8664789
    _Robak_
    Poziom 33  
    Oczywiście że można resety policzyć, bez mniejszego problemu. xury poczytaj sobie o MCUCSR.
  • #4 8664872
    Plumpi
    Specjalista - systemy grzewcze
    Może po prostu zrobić licznik ze amienną zapisywalny w EEPROM przed główną pętlą programową zaraz po starcie.
    Odczyt stanu zmiennej, a nastepnie powiększenie o jeden i zapis.
    Jedyny mankament to jest to, że przyrost licznika będzie realizowany także podczas każdego startu mikrokontrolera.
  • REKLAMA
  • #5 8664887
    _Robak_
    Poziom 33  
    Wszystkich którzy chcą się wypowiedzieć, proszę na prawdę o zapoznanie się z rejestrem MCUCSR. Szczególnie Plumpi i marek-c.
  • Pomocny post
    #6 8664948
    tmf
    VIP Zasłużony dla elektroda
    Dokładnie, poza tym to wcale nie musi być zmienna w EEPROM, SRAM przecież przez WD nie jest ruszany. Więc o ile Bascom ma coś takiego jak nieinicjalizowane segementy pamięci to zmienną można trzymać w SRAM i inkrementować po odczytaniu statusu z MCUCSR.
  • #7 8665726
    xury
    Specjalista automatyka domowa
    Własnie poczytałem. Trzeci bit w rejestrze MCUCSR o nazwie WDRF.
    I już chyba wiem jak to zrobić.
    Zaraz na starcie sprawdzę czy był reset z WD i inkrementuję zmienną.
    Będę w domu to sprawdzę czy zmienna w RAMie bedzie działać. Wolałbym w RAMie, niż w EEPROM
  • REKLAMA
  • #8 8667354
    Jaca
    Poziom 31  
    Idziecie nie w tym kierunku co trzeba. Trzeba zająć się odpowiednią obsługą komunikacji a nie watchdog'a.

    1. Jeśli odbiór ma wykorzystywać Input to jest coś takiego jak:

    $Timeout = value


    2. Komunikację radziłbym wykonać w oparciu o przerwanie od Urxc.
  • REKLAMA
  • #9 8668643
    xury
    Specjalista automatyka domowa
    A więc tak:
    Mój pomysł z wykorzystaniem $Noramclear działa, ale go nie chcę, bo nie jestem pewien czy nie wyczyszczona pamięć nie namiesza mi w programie.
    Konstrukcja
    If Mcucsr.wdrf = 1 Then
    Info = 1
    End If
    nie działa. Nie wiem dlaczego po resecie ten bit nie jest ustawiany ??
    A to by było rozwiązanie najlepsze.
    Co zaś do $Timeout, to owszem można by było, ale musiałbym wyłączać watchdoga, a tego nie chcę.

    Zastanawia mnie dlaczego flaga wdrf nie jest ustawiana po resecie od watchdoga? Albo może to bascom po resecie czyści cały rejestr MCUCSR ?
    Procesor to Atmega 162 więc na pewno ma ten rejestr, czytałem w DSie.
  • Pomocny post
    #10 8668936
    Jaca
    Poziom 31  
    Jak już tak uparłeś się na liczenie to rozwiązanie masz w tematach przyklejonych w tym dziale:

    Dim Mcureg As Byte
    Dim Watchdog_flag As Byte
    
    Mcureg = Peek(0)
    If Mcureg.wdrf = 1 Then                                 ' Czy uruchomienie wywołał WATCHDOG ?
       Watchdog_flag = 1
    End If
    
  • #11 8669752
    xury
    Specjalista automatyka domowa
    No to jest to czego szukałem. Tylko teraz pytanie: Dlaczego zawartość rejestru R0 to zawiera,a nie można odczytać z MCUCSR jak jest opisane w DSie??

    edit
    Aaa już wiem gdzie robiłem błąd. Można odczytać WDRF moim sposobem tylko przed Config Watchdog, bo ta instrukcja czyści rejestr MCU(C)SR.
    Wszystko pięknie jest wyjaśnione w Helpie od wersji 2.0.1.0
  • Pomocny post
    #12 8672712
    Konto nie istnieje
    Poziom 1  
  • #13 8674355
    xury
    Specjalista automatyka domowa
    @emarcus ja nie chcę nic poza tym. EWD też mi nie jest potrzebny.
    Najlepiej sprawdził się kod kolegi Jaca i to w zupełności mnie zadowala. Z tym, że zmienne w RAM zerują się bez $NORAMCLEAR, ale zawartość rejestru R0 po WD resecie zostaje i to mi wystarcza. W każdym razie dzięki za info, bo o budowie AVR wiem niewiele.
REKLAMA