Witam, jestem początkującym programistą w bascom, chciałem przetestować wykorzystanie układu PCF 8583, napotkałem jednak na problem z którym nie mogę sobie poradzić w żaden sposób, mianowicie miesiące wyświetlają się jak chcą, tzn są to liczby z kosmosu wzięte, np 49, przeskakują razem z dniami itp. pewnie to mój błąd w kodzie, ale nie mam pojęcia gdzie, przeglądałem datasheeta, szukałem po forach, po innych kodach i nic do głowy mi nie przychodzi, oto kod:
Jest tam jeszcze obsługa DS18b20 ale nie sądzę żeby to wpływało na cokolwiek. Po za tym nie działa jeszcze ten fragment:
zawsze zmienna d jest wyświetlana bez 0, nawet jak < 0.
Prosiłbym o jakieś nakierowanie na właściwy trop, co może być nie tak.
Pozdrawiam
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.0 = Input
Config Pind.1 = Input
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portb.1 , Rs = Portc.0
Config 1wire = Portb.7
Config Sda = Portc.4
Config Scl = Portc.5
Config I2cdelay = 10
I2cinit
Set Portd.0
Set Portd.1
S1 Alias Portd.0
S2 Alias Portd.1
Declare Sub Ustawh
Declare Sub Ustawm
Config Debounce = 20
Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim M As Byte
Dim S As Byte
Dim H As Byte
Dim D As Byte
Dim Mon As Byte
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Cursor Off Noblink
Cls
Do
'1wire
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
I2 = I2 * 10
I2 = I2 / 16
Ss = Str(i2)
Ss = Format(ss , " 0.0")
'i2c
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cstart
I2cwbyte 161
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte D , Ack
I2crbyte Mon , Nack
I2cstop
H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : D = Makedec(d) : Mon = Makedec(mon)
If H < 10 Then
Lcd "0" ; H ; ":"
Else
Lcd ; H ; ":"
End If
Locate 1 , 4
If M < 10 Then
Lcd "0" ; M ; ":"
Else
Lcd ; M ; ":"
End If
Locate 1 , 7
If S < 10 Then
Lcd "0" ; S ;
Else
Lcd ; S ;
End If
Locate 1 , 11
Lcd ; Ss ; Chr(0) ; "C"
Lowerline
If D < 0 Then
Lcd "0" ; D ; "/"
Else
Lcd ; D ; "/"
End If
Locate 2 , 4
If Mon < 0 Then
Lcd "0" ; Mon
Else
Lcd ; Mon
End If
Home
Waitms 180
Debounce Pind.0 , 0 , Ustawh , Sub
Debounce Pind.1 , 0 , Ustawm , Sub
Loop
End 'end program
Ustawh:
H = H + 1
If H > 23 Then
H = 0
End If
M = Makebcd(m)
H = Makebcd(h)
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cstop
Return
Ustawm:
S = 0
M = M + 1
If M > 59 Then
M = 0
End If
M = Makebcd(m)
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cstop
Return
Jest tam jeszcze obsługa DS18b20 ale nie sądzę żeby to wpływało na cokolwiek. Po za tym nie działa jeszcze ten fragment:
If D < 0 Then
Lcd "0" ; D ; "/"
Else
Lcd ; D ; "/"
End If
zawsze zmienna d jest wyświetlana bez 0, nawet jak < 0.
Prosiłbym o jakieś nakierowanie na właściwy trop, co może być nie tak.
Pozdrawiam