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

Atmega168 Bascom problem z watchdog

RoBoS 02 Mar 2009 22:36 2353 8
REKLAMA
  • #1 6228493
    RoBoS
    Poziom 15  
    Po zmianie uP z M8 na Atmega168 mam problem z watchdog'iem.
    po resecie watchdoga uklad wisi... nawet zewnetrzny reset nie pomaga..
    co ciekawe uklad mozna skasowac, zaprogramowac innym flashem i zweryfikowac..
    Pomaga tylko odlaczenie zasilania - uklad wstaje normalnie.


    $crystal = 7372800
    $regfile = "m168def.dat"
    
       Config Watchdog = 1024
       Start Watchdog
    
       ....
    
       Do : Loop
    


    W programie jest petla ktora ma wywolac reset po dluzszym nacisnieciu przycisku.
    mega8 wstaje normalnie M168 - wisi

    Czy może ktos spotkal sie juz z takim problemem ?
    / Nie jestem pewien czy bascom dobrze ustawia rejestry w M168 /
  • REKLAMA
  • #2 6228887
    dawid512
    Poziom 32  
    Masz podciagniecie resetu do VCC? Spróbuj sam ustawiać rejestry od watch doga.
  • REKLAMA
  • #3 6232261
    RoBoS
    Poziom 15  
    Tak oczywiscie reset podciagniety.

    Co ciekawe tak samo jak u kolegi w watku:
    https://www.elektroda.pl/rtvforum/topic925393.html
    http://forum.ep.com.pl/viewtopic.php?p=77464
    po wykomentowaniu linii uzywajacych lcd uklad zachowuje sie prawidlowo :|
    Po uzyciu instrukcji Waitms uklad rowniez przestaje dzialac prawidlowo

    Okrojony do minimum program:
    $crystal = 7372800
    $regfile = "m168def.dat"
    
    Config Aci = Off
    Config Lcd = 40 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portb.4 , Rs = Portb.5
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Timer1_int
    
    Config Pinc.4 = Input                                       ' przycisk
    Dol Alias Pinc.4
    
    Config Pind.0 = Output                                      ' LED
    
    Dim Counts As Byte , Counts2 As Word , Counts3 As Byte
    
    
    
    '      Waitms 50
    '      Cls : Cursor Off
          Set Portc.4                                           ' podciagnij klawiature
    
          Counter1 = 54040
          Start Timer1
          Enable Timer1
          Enable Interrupts                                     ' przerwanie 10 razy na sekunde
    
          Config Watchdog = 1024
          Start Watchdog
    
    Do
          Reset Watchdog
    
          If Counts3 > 4 Then
             Toggle Portd.0                                     ' zmien stan portu
             Counts3 = 0
          End If
    
    '      Locate 2 , 2 : Lcd Counts2 ; "    "                   'pokaz kolejna liczbe
    
          If Dol = 0 Then      ' po przycisnieciu przycisku na dluzej niz 2 sekundy - reset
             Incr Counts
             If Counts > 20 Then
                Do : Loop                                       ' przepelnienie watchdog'a
             End If
          Else
             Counts = 0
          End If
    
          Idle
    Loop
    
    
    
    Timer1_int:
          Stop Timer1
          Counter1 = 54040                                      ' 10 razy na sekunde
          Start Timer1
    
          Incr Counts
          Incr Counts2
          Incr Counts3
    Return
    


    Ma ktos jakies sugestie ??
    Z dory dziekuje.
  • REKLAMA
  • #4 6233331
    Konto nie istnieje
    Poziom 1  
  • #5 6236399
    janbernat
    Poziom 38  
    A którą wersję Bascoma używasz?
  • REKLAMA
  • #6 6236448
    Konto nie istnieje
    Poziom 1  
  • #7 6236957
    janbernat
    Poziom 38  
    A jest 1.11.9.3
    Dla attiny na pewno lepsza.
    Może dla atmega też.
  • #8 6237942
    RoBoS
    Poziom 15  
    janbernat napisał:
    A którą wersję Bascoma używasz?

    1.11.9.0

    Timer1_int: 
          Counter1 = 54040                                      ' 10 razy na sekunde 
          ....
    Return


    Nie wiem dokladnie ile cykli w bascom-avr jest zuzywane na odlozenie wartosc rejestrow na stos
    dlatego wybralem wartosc 54040 zamiast 54016 jako bardziej zblizone do 0.1s
    / stos + 0,09979167s / moze ktos wie ile dokladnie cykli jest tracone przed przeladowaniem?

    Mam prosbe - o kompilacje w nowszej wersji niz 1.11.9.0 zrodla z mojego 2 postu
    z uzyciem tych liniami:
    
          Waitms 50 
          Cls : Cursor Off 
    
          Locate 2 , 2 : Lcd Counts2 ; "    "                   'pokaz kolejna liczbe


    emarcus dziekuje za uwagi - datasheet porownywalem miedzy m8 a m168
    i nie wiem do konca czy w m168 najpierw nie jest wykonywane przerwanie od watchdoga
    i tam program glupieje.. nie wiem niestety
    dziwi mnie tylko ze po uzyciu lcd i waitms program swiruje...
    Nie wiem czy do konca dobrze ustawiam rejestr WDTCSR (WDE, WDIF, WDIE)

    Pozdrawiam Robert
  • #9 6254701
    RoBoS
    Poziom 15  
    Problem w pewien sposob rozwiazany, moze komus sie przyda
    Dodano linie:
    $initmicro
    
    ........
    
    _init_micro:
          Config Watchdog = 1024
          Start Watchdog
    Return
    



    W tej postaci watchdog poprawnie resetuje uP:
    $crystal = 7372800
    $regfile = "m168def.dat"
    $initmicro
    
    
    Config Aci = Off
    Config Lcd = 40 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portb.4 , Rs = Portb.5
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Timer1_int
    
    Config Pinc.4 = Input                                       ' przycisk
    Dol Alias Pinc.4
    
    Config Pind.0 = Output                                      ' LED
    
    Dim Counts As Byte , Counts2 As Word , Counts3 As Byte
    
    
          Waitms 50
          Cls : Cursor Off
          Set Portc.4                                           ' podciagnij klawiature
    
          Counter1 = 54040
          Start Timer1
          Enable Timer1
          Enable Interrupts                                     ' przerwanie 10 razy na sekunde
    
    Do
          Reset Watchdog
    
          If Counts3 > 4 Then
             Toggle Portd.0                                     ' zmien stan portu
             Counts3 = 0
          End If
    
          Locate 2 , 2 : Lcd Counts2 ; "    "                   'pokaz kolejna liczbe
    
          If Dol = 0 Then                                       ' po przycisnieciu przycisku na dluzej niz 2 sekundy - reset
             Incr Counts
             If Counts > 20 Then
                Do : Loop                                       ' przepelnienie watchdog'a
             End If
          Else
             Counts = 0
          End If
    
          Idle
    Loop
    
    
    _init_micro:
          Config Watchdog = 1024
          Start Watchdog
    Return
    
    Timer1_int:
          Stop Timer1
          Counter1 = 54040                                      ' 10 razy na sekunde
          Start Timer1
    
          Incr Counts
          Incr Counts2
          Incr Counts3
    Return
    
    



    Pozdrawiam.
REKLAMA