Watchdog problem


Witam mam pewien problem z watchdogiem, mianowicie po załadowaniu programu watchdog cały czas resetuje procesor. A według programu powinien następować reset watchdoga po około 1s. Poniżej zamieszczam kod programu.

$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
 
Config Lcd = 16 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x16, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
 
'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
Dim Flaga_4ms As Bit , Flaga_1s As Bit                      'flagi przerwa?
Dim Dzielnik(1) As Byte
 
Config 1wire = Portb.1                                      'deklaracja portu na którym będą podpięte DS18b20
 
Config Pinb.3 = Input
Config Pinb.2 = Input
Set Portb.2
Set Portb.3
 
P1 Alias Pinb.3
P2 Alias Pinb.2
 
Declare Sub Skasowano
 
Dim Ide1(8) As Eram Byte
Dim Ide2(8) As Eram Byte
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
 
Dim I11 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp
 
Dim Zewmin As Integer
Dim Zewmax As Integer
Dim Wewmin As Integer
Dim Wewmax As Integer
 
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Tzew(8) As Byte
Dim Twew(8) As Byte
 
Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
 
Dim Y As Bit , Z As Byte , T As Byte , X As Byte
 
Dim Yyy As Byte
Dim Yy As Byte
Yy = 0
Yyy = 0
 
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           ' znak stopnia
Deflcdchar 1 , 4 , 14 , 31 , 4 , 4 , 4 , 4 , 4              ' strzałka w góre
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 31 , 14 , 4              ' strzałka w dół
 
Zewmin = 125 * 16
Wewmin = 125 * 16
Zewmax = -55 * 16
Wewmax = -55 * 16
 
Config Watchdog = 2048
Start Watchdog
 
Cursor Off
Cls
 
'____ główna pętla program ______
Do
 
   Poczatek:
 
    If Flaga_4ms = 1 Then
      Flaga_4ms = 0
      Gosub Przyciski
      End If
 
    Gosub Menu
   Loop
 
'---- podprogramy -----
 
Prztimer0:
  Timer0 = 131
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
      Dzielnik(1) = 0
      Reset Watchdog
      End If
  Return
 
Menu:
   Select Case X
      Case 0:
         Gosub Pokaz_temp
      Case 1:
         Gosub Przypisanie_czuj
      Case 2:
         Gosub Temp_minmax
      Case 3:
         Gosub Kasuj_temp_minmax
 
      Case 10:
         Gosub Czuj_zew1
      Case 11:
         Gosub Czuj_zew2
      Case 13:
         Gosub Czuj_wew1
      Case 14:
         Gosub Czuj_wew2
 
      Case 16:
         Gosub Zapis_zew1
         X = 13
      Case 17:
         Gosub Zapis_zew2
         X = 13
      Case 18:
         Gosub Zapis_wew1
         X = 1
      Case 19:
         Gosub Zapis_wew2
         X = 1
 
      Case 20:
         Gosub Maxminzew
      Case 21:
         Gosub Maxminwew
 
      Case 22:
         Gosub Kasuj
 
   End Select
   Return
 
Przyciski:
   If P2 = 1 And Z = 0 Then
      Set Z
 
   Elseif P2 = 0 And Z = 1 Then
      Reset Z
 
      If X = 3 Then X = 4
      If X = 2 Then X = 3
      If X = 1 Then X = 2
      If X = 0 Then X = 1
      If X = 4 Then X = 0
 
      If X = 14 Then X = 15
      If X = 13 Then X = 14
      If X = 15 Then X = 13
 
      If X = 11 Then X = 12
      If X = 10 Then X = 11
      If X = 12 Then X = 10
      End If
 
   If P1 = 1 And Y = 0 Then
      Set Y
      Elseif P1 = 0 And Y = 1 Then
      Reset Y
 
      If X = 10 Then X = 16
      If X = 11 Then X = 17
      If X = 13 Then X = 18
      If X = 14 Then X = 19
 
      If X = 1 Then X = 10
      If X = 3 Then X = 22
      If X = 21 Then X = 3
      If X = 20 Then X = 21
      If X = 2 Then X = 20
 
 
      End If
   Return
 
Przypisanie_czuj:
      Locate 1 , 1
      Lcd "  PRZYP. CZUJ.  "
      Locate 2 , 1
      Lcd Chr(2) ; " NEXT" ; "      OK " ; Chr(2)
      Return
 
Czuj_zew1:
      Locate 1 , 1
      Lcd "Czuj.Zew.1  "
      Locate 2 , 1
      Dsid1(1) = 1wsearchfirst()
 
      If Dsid1(8) = Crc8(dsid1(1) , 7) Then
         Wait 1
         Locate 1 , 13
 
         For B = 1 To 8
            Lcd Hex(dsid1(b))
            Next
 
         Gosub Pokaz_temp1
         Locate 2 , 14
         Lcd ; Ss ;
         Locate 2 , 1
         Lcd Chr(2) ; " next" ; " save " ; Chr(2) ; " "
         End If
      Return
 
Czuj_zew2:
      Locate 1 , 1
      Lcd "Czuj.Zew.2  "
      Dsid2(1) = 1wsearchnext()
 
      If Dsid2(8) = Crc8(dsid2(1) , 7) Then
         Wait 1
         Locate 1 , 13
 
         For B = 1 To 8
             Lcd Hex(dsid2(b))
             Next B
 
         Gosub Pokaz_temp2
         Locate 2 , 14
         Lcd ; Ss ;
         Locate 2 , 1
         Lcd Chr(1) ; " next" ; " save " ; Chr(2) ; " "
         End If
      Return
 
Czuj_wew1:
      Locate 1 , 1
      Lcd "Czuj.Wew.1  "
      Locate 2 , 1
      Dsid1(1) = 1wsearchfirst()
 
      If Dsid1(8) = Crc8(dsid1(1) , 7) Then
         Wait 1
         Locate 1 , 13
 
         For B = 1 To 8
            Lcd Hex(dsid1(b))
            Next
 
         Gosub Pokaz_temp1
         Locate 2 , 14
         Lcd ; Ss ;
         Locate 2 , 1
         Lcd Chr(2) ; " next" ; " save " ; Chr(2) ; " "
         End If
      Return
 
Czuj_wew2:
      Locate 1 , 1
      Lcd "Czuj.Wew.2  "
      Dsid2(1) = 1wsearchnext()
 
      If Dsid2(8) = Crc8(dsid2(1) , 7) Then
         Wait 1
         Locate 1 , 13
 
         For B = 1 To 8
             Lcd Hex(dsid2(b))
             Next B
          Gosub Pokaz_temp2
               Locate 2 , 14
               Lcd ; Ss ;
               Locate 2 , 1
               Lcd Chr(1) ; " next" ; " save " ; Chr(2) ; " "
         End If
      Return
 
Temp_minmax:
   Locate 1 , 1
   Lcd " TEMP. MIN MAX"
   Locate 2 , 1
   Lcd Chr(2) ; " NEXT" ; "      OK " ; Chr(2)
   Return
 
Kasuj_temp_minmax:
   Locate 1 , 1
   Lcd " KASOW. MIN MAX"
   Locate 2 , 1
   Lcd Chr(2) ; " NEXT" ; "      OK " ; Chr(2)
   Return
 
Pokaz_temp1:
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Wait 1
 
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   I1 = 1wread(2)
 
   I1 = I1 * 10
   I1 = I1 / 16
   Ss = Str(i1)
   Gosub Formatss2
   Return
 
Pokaz_temp2:
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Wait 1
 
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
   1wwrite &HBE
   I2 = 1wread(2)
 
   I2 = I2 * 10
   I2 = I2 / 16
   Ss = Str(i2)
   Gosub Formatss2
   Return
 
Pokaz_temp:
   Disable Interrupts
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Wait 1
 
   1wreset
   For B = 1 To 8 Step 1
      Twew(b) = Ide1(b)
      Next B
   1wwrite &H55
   1wverify Twew(1)
   1wwrite &HBE
   I1 = 1wread(2)
 
   Enable Interrupts
 
   If Err = 1 Then
      Locate 1 , 1
      Lcd "TEM WEW BRAK !!!"
 
   Else
      I1 = I1 * 10
      I1 = I1 / 16
 
      If I1 > I11 Then
         I11 = I1
 
         If I1 >= 0 Then
            Ss = Str(i1)
            Gosub Formatss2
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(1)
            Gosub Znak_c_wew
 
         Elseif 0 >= I1 And I1 > -100 Then
            Ss = Str(i1)
            Gosub Formatss1
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(1)
            Gosub Znak_c_wew
 
         Else
            Ss = Str(i1)
            Gosub Formatss0
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(1)
            Gosub Znak_c_wew
            End If
 
      Elseif I11 > I1 Then
         I11 = I1
 
         If I1 >= 0 Then
            Ss = Str(i1)
            Gosub Formatss2
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(2)
            Gosub Znak_c_wew
 
         Elseif 0 > I1 And I1 > -100 Then
            Ss = Str(i1)
            Gosub Formatss1
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(2)
            Gosub Znak_c_wew
 
         Else
            Ss = Str(i1)
            Gosub Formatss0
            Gosub Wys_temp_wew
            Locate 1 , 9
            Lcd Chr(2)
            Gosub Znak_c_wew
            End If
 
      Else
         I11 = I1
 
         If I1 >= 0 Then
            Ss = Str(i1)
            Gosub Formatss2
            Gosub Wys_temp_wew
            Gosub Znak_c_wew
 
         Elseif 0 > I1 And I1 > -100 Then
            Ss = Str(i1)
            Gosub Formatss1
            Gosub Wys_temp_wew
            Gosub Znak_c_wew
 
         Else
            Ss = Str(i1)
            Gosub Formatss0
            Gosub Wys_temp_wew
            Gosub Znak_c_wew
            End If
         End If
      End If
 
   Disable Interrupts
 
   1wreset
   For B = 1 To 8 Step 1
      Tzew(b) = Ide2(b)
      Next B
   1wwrite &H55
   1wverify Tzew(1)                                         'wysylam adres drugiego czujnika
   1wwrite &HBE
 
   Enable Interrupts
 
   If Err = 1 Then
      Locate 2 , 1
      Lcd "TEM ZEW BRAK !!!"
   Else
 
      I2 = 1wread(2)
      I2 = I2 * 10
      I2 = I2 / 16
 
      If I2 > I22 Then
         I22 = I2
 
         If I2 >= 0 Then
            Ss = Str(i2)
            Gosub Formatss2
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(1)
            Gosub Znak_c_zew
 
         Elseif 0 >= I2 And I2 > -100 Then
            Ss = Str(i2)
            Gosub Formatss1
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(1)
            Gosub Znak_c_zew
 
         Else
            Ss = Str(i2)
            Gosub Formatss0
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(1)
            Gosub Znak_c_zew
            End If
 
      Elseif I22 > I2 Then
         I22 = I2
 
         If I2 >= 0 Then
            Ss = Str(i2)
            Gosub Formatss2
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(2)
            Gosub Znak_c_zew
 
         Elseif 0 > I2 And I2 > -100 Then
            Ss = Str(i2)
            Gosub Formatss1
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(2)
            Gosub Znak_c_zew
 
         Else
            Ss = Str(i2)
            Gosub Formatss0
            Gosub Wys_temp_zew
            Locate 2 , 9
            Lcd Chr(2)
            Gosub Znak_c_zew
            End If
 
      Else
         I22 = I2
 
         If I2 >= 0 Then
            Ss = Str(i2)
            Gosub Formatss2
            Gosub Wys_temp_zew
            Gosub Znak_c_zew
 
         Elseif 0 > I2 And I2 > -100 Then
            Ss = Str(i2)
            Gosub Formatss1
            Gosub Wys_temp_zew
            Gosub Znak_c_zew
 
         Else
            Ss = Str(i2)
            Gosub Formatss0
            Gosub Wys_temp_zew
            Gosub Znak_c_zew
            End If
         End If
      End If
 
  If I2 < Zewmin Then Zewmin = I2
  If I2 > Zewmax Then Zewmax = I2
  If I1 < Wewmin Then Wewmin = I1
  If I1 > Wewmax Then Wewmax = I1
  Return
 
Maxminzew:
   Locate 1 , 1
   Lcd "Min TEMP ZEW Max"
 
   Ss = Str(zewmin)
   Gosub Formatss0
   Locate 2 , 1
   Lcd Ss ; Chr(0) ; "C"
 
   Ss = Str(zewmax)
   Gosub Formatss0
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; "C"
   Return
 
Maxminwew:
   Locate 1 , 1
   Lcd "Min TEMP WEW Max"
 
   Ss = Str(wewmin)
   Gosub Formatss0
   Locate 2 , 1
   Lcd Ss ; Chr(0) ; "C"
 
   Ss = Str(wewmax)
   Gosub Formatss0
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; "C"
   Return
 
Kasuj:
   Zewmin = I2
   Zewmax = I2
   Wewmin = I1
   Wewmax = I1
 
   Gosub Skasowano
   Gosub Skasowano
   Gosub Skasowano
   Gosub Skasowano
   X = 0
   Gosub Poczatek
 
Sub Skasowano:
   Cls
   Locate 1 , 6
   Lcd "PAMIEC"
   Locate 2 , 2
   Lcd " SKASOWANO !!! "
   Waitms 500
   Cls
   Waitms 250
   End Sub
 
Formatss0:
   Ss = Format(ss , "0.0")
   Return
 
Formatss1:
   Ss = Format(ss , " 0.0")
   Return
 
Formatss2:
   Ss = Format(ss , "  0.0")
   Return
 
Wys_temp_zew:
   Locate 2 , 1
   Lcd "TEM ZEW  "
   Locate 2 , 10
   Lcd ; Ss ;
   Return
 
Wys_temp_wew:
   Locate 1 , 1
   Lcd "TEM WEW  "
   Locate 1 , 10
   Lcd ; Ss ;
   Return
 
Znak_c_wew:
    Locate 1 , 15
    Lcd ; Chr(0) ; "C  "
    Return
 
Znak_c_zew:
    Locate 2 , 15
    Lcd ; Chr(0) ; "C  "
    Return
 
Zapis_zew1:
   For B = 1 To 8 Step 1
      Ide1(b) = Dsid2(b)
      Next B
   Return
 
Zapis_zew2:
   For B = 1 To 8 Step 1
      Ide1(b) = Dsid1(b)
      Next B
   Return
 
Zapis_wew1:
   For B = 1 To 8 Step 1
      Ide2(b) = Dsid2(b)
      Next B
   Return
 
Zapis_wew2:
   For B = 1 To 8 Step 1
      Ide2(b) = Dsid1(b)
      Next B
   return




Portret użytkownika mirley

Re: Watchdog

A jak wywalisz watchdoga z programu to program działa prawidłowo? Mam wrażenie że będzie działał dziwnie. Ustawiasz niby flagę 4ms ale co z tego jak masz 10 gosub jeden z drugiego i dodatwo jeszcze waity w środku.... flaga 4ms zostanie ustawiona przez timer setki razy zanim pętla główna raz przemieli..... watchdog raczej powinien się resetować w pętli głownej na wypadek jakby się program gdzieś zwiesił... timer w takim wypadku może działać poprawnie a program dalej będzie wisiał.... Do watchdoga można zrobić flagę 1s i w pętli głównej ją sprawdzać... Skoro używasz timera to w całym programie nie powinno być ani jednego wait'a, chyba że w specjalnych wypadkach

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.