Popełniłem taki oto kod jak poniżej. W założeniu ma to być zegarek stawiany pilotem, oraz z dwoma DS18B20.
Założyłem sobie, że nie użyję żadnego Wait, ani Gosub.
Mam jednak jeden problem z odświeżaniem czasu na LCD. Niby dwukropki migają co sekundę, ale sekundy nie są wyświetlane poprawnie. Przez pewien czas jest niby dobrze, ale czasem jakby pomija niektóre sekundy. Np jest 21,22,23,26,27,31 itp.
Nie wiem jak to rozwiązać. Kompletne zaciemnienie jakieś mnie dopadło.
Może mi coś doradzicie ? Może też znacie inne sposoby na cykliczne wyświetlanie
na LCD używając sekundowegoprzerwania od timera ?
Założyłem sobie, że nie użyję żadnego Wait, ani Gosub.
Mam jednak jeden problem z odświeżaniem czasu na LCD. Niby dwukropki migają co sekundę, ale sekundy nie są wyświetlane poprawnie. Przez pewien czas jest niby dobrze, ale czasem jakby pomija niektóre sekundy. Np jest 21,22,23,26,27,31 itp.
Nie wiem jak to rozwiązać. Kompletne zaciemnienie jakieś mnie dopadło.
Może mi coś doradzicie ? Może też znacie inne sposoby na cykliczne wyświetlanie
na LCD używając sekundowegoprzerwania od timera ?
'$sim
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 16
$framesize = 32
Config Pind.7 = Output 'przekaźnik
Config 1wire = Portb.0
Config Rc5 = Pind.2
Config Timer1 = Timer , Prescale = 256
Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portc.5
On Int0 Rc5get
On Timer1 Odmierz_1s
Dim Sekunda As Byte 'zmienne czasu
Dim Minuta As Byte
Dim Pauza As Byte
Dim I As Byte
Dim Godzina As Byte
Dim Dsilosc As Integer
Dim Tempa As Single
Dim Tempw As Integer
Dim Address As Byte 'adres RC5
Dim Command As Byte ' nr komendy RC5
Dim Tekst1 As String * 10
Dim Tekst2 As String * 10
Dim Tgodzina As String * 4
Dim Tminuta As String * 4
Dim Tsekunda As String * 4
Dim Dsadres1(8) As Byte
Dim Dsadres2(8) As Byte
Dim Lsb As Byte
Dim Msb As Byte
Dim Rc5flag As Bit 'zmienna isr INT0
Dim Capture As Bit
Dim Odd As Bit 'zmienna zmieniająca stan na przeciwny co 1 s
Dim Show As Bit
Dim Wyswietlanie As Byte
Enable Timer1
Enable Int0
Enable Interrupts
Cursor Off Noblink
Counter1 = 34286
'-----------------------Inicjalizacja czujnikow---------------------------------
'Dsilosc = 1wirecount()
'If Dsilosc = 2 Then
' Lcd "Czujniki obecne"
' Else
' Lcd "Brak czujnika"
'End If
Dsadres1(1) = 1wsearchfirst()
1wverify Dsadres1(1)
If Err = 1 Then
Lcd "Brak czujnika"
Err = 0
End If
For I = 1 To 8
Lcd Hex(dsadres1(i))
Next
Dsadres2(1) = 1wsearchnext()
1wverify Dsadres2(1)
If Err = 1 Then
Lcd "Brak czujnika"
Err = 0
End If
'Deflcdchar 0 , 2 , 5 , 5 , 2 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
'----------------------Pętla główna---------------------------------------------
Do
If Odd = 0 And Capture = 0 Then
Disable Int0
1wreset
1wwrite &HCC 'skip ROM
1wwrite &H44
Capture = 1
Enable Int0
End If 'start konwersji
If Odd = 1 And Capture = 1 Then 'sprawdzanie flagi
Disable Int0
1wreset
1wwrite &H55
1wwrite Dsadres1(1) , 8
1wwrite &HBE
Tempw = 1wread(2)
Tempw = Tempw * 10
Tempw = Tempw / 16
Tekst1 = Str(tempw)
Tekst1 = Format(tekst1 , "+0.0")
1wreset
1wwrite &H55
1wwrite Dsadres2(1) , 8
1wwrite &HBE
Tempw = 1wread(2)
Tempw = Tempw * 10
Tempw = Tempw / 16
Tekst2 = Str(tempw)
Tekst2 = Format(tekst2 , "+0.0")
1wreset
Capture = 0
Enable Int0
End If
If Rc5flag = 1 Then 'odbior RC5
Getrc5(address , Command)
If Address = 5 Then
Command = Command And &B01111111
End If
Select Case Command 'ustawianie czasu pilotem
Case 32 : Incr Godzina
Case 33 : Decr Godzina
Case 16 : Incr Minuta
Case 17 : Decr Minuta
Case 12 : Toggle Portd.7
Case 13 : Sekunda = 0
Case 1 : Incr Wyswietlanie
End Select
Reset Rc5flag
Command = 0
End If
Tgodzina = Str(godzina) 'zmiana liczb na tekst
Tminuta = Str(minuta)
Tsekunda = Str(sekunda)
Tgodzina = Format(tgodzina , "00")
Tminuta = Format(tminuta , "00")
Tsekunda = Format(tsekunda , "00")
If Wyswietlanie = 0 Then 'wyświetlanie na LCD
If Odd = 0 And Show = 0 Then '
Cls
Lcd "W " ; Tekst1 ; " " ; "Z " ; Tekst2
Set Show
Elseif Odd = 1 And Show = 1 Then
Cls
' Lcd "Z " ; Tekst2 ; Chr(0) ; "C"
Lcd " " ; Tgodzina ; ":" ; Tminuta ; ":" ; Tsekunda
Reset Show
End If
End If
If Wyswietlanie = 1 Then
If Odd = 0 And Show = 0 Then
Cls
Lcd "W " ; Tekst1 ; " " ; "Z " ; Tekst2
Set Show
Elseif Odd = 1 And Show = 1 Then
Cls
Lcd "W " ; Tekst1 ; " " ; "Z " ; Tekst2
Reset Show
End If
End If
If Wyswietlanie = 2 Then 'wyświetlanie czasu na LCD
If Odd = 0 And Show = 0 Then ' w założeniu miało wyświetlać na przemian co sekundę
Set Show 'no i "niby działa" ale sekundy są dziwne
Cls
Lcd " " ; Tgodzina ; ":" ; Tminuta ; ":" ; Tsekunda 'ale czas generowany jest dobry
Elseif Odd = 1 And Show = 1 Then ' i na dobę nie różni się nawet o sekundę
Cls
Reset Show
Lcd " " ; Tgodzina ; " " ; Tminuta ; " " ; Tsekunda
End If
End If
Enable Int0
If Wyswietlanie = 3 Then
Wyswietlanie = 0
End If
Loop
End
'---------------------------Koniec pętli ---------------------------------------
'--------------------------Obsługa Isr timera1 ---------------------------------
Odmierz_1s:
Counter1 = Counter1 + 34286
Incr Sekunda
Toggle Odd ' tego używam do wykrywania zmian sekundy
If Sekunda >= 60 Then
Sekunda = 0
Incr Minuta
End If
If Minuta >= 60 Then
Minuta = 0
Incr Godzina
End If
If Godzina >= 24 Then
Godzina = 0
End If
Return
'-----------------------Odbiór RC5----------------------------------------------
Rc5get:
Disable Int0
Enable Interrupts
Set Rc5flag
Return