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
|
|||








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.