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.