PCF8583 - Odczyt dnia w tygodniu


Napisałem oto taki program niestety nie mogę sobie poradzić z odczytem dnia tygodnia,cały czas wyświetla "0".Dni miesiąca
zmieniają się bez problemu.
Z góry dziękuję wszystkim z pomoc :)

$regfile = "m8def.DAT"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portd.6 , Rs = Portd.5
Config Scl = Portc.5
Config Sda = Portc.4
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Set Portd.0
Set Portd.1
Set Portd.2
S1 Alias Pind.0
S2 Alias Pind.1
S3 Alias Pind.2
Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
 
Declare Sub Odczyt_rtc
Declare Sub Odczyt_daty
Declare Sub Zapis_rtc
Cursor Off
 
Do
Debounce S1 , 0 , Ustaw , Sub
Call Odczyt_rtc
Call Odczyt_daty
Cls
Lcd "    "
If Godziny < 10 Then Lcd "0"
Lcd Godziny ; ":"
If Minuty < 10 Then Lcd "0"
Lcd Minuty ; ":"
If Sekundy < 10 Then Lcd "0"
Lcd Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
Loop
End
 
'***************************** ODCZYT RTC **************************************
 
Sub Odczyt_rtc
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Ack
I2crbyte Dzien , Ack
I2crbyte Miesiac , Nack
I2cstop
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
End Sub
 
'**************************** ZAPIS RTC ****************************************
 
Sub Zapis_rtc
Godziny_bcd = Makebcd(godziny)
Minuty_bcd = Makebcd(minuty)
Sekundy_bcd = Makebcd(sekundy)
I2cstart
I2cwbyte 162
I2cwbyte 0
I2cwbyte 8
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte Sekundy_bcd
I2cwbyte Minuty_bcd
I2cwbyte Godziny_bcd
I2cstop
End Sub
 
'***************************** ODCZYT DATY *************************************
 
Sub Odczyt_daty
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
End Sub
 
'******************************USTAWIENIA***************************************
 
Ustaw:
Cls
Lcd " Teraz ustawiam "
Lowerline
Lcd "Godziny i Minuty"
Wait 3
Do
Cls
Lcd "** USTAW CZAS **"
Lowerline
Lcd "    "
If Godziny < 10 Then Lcd "0"
Lcd Godziny ; ":"
If Minuty < 10 Then Lcd "0"
Lcd Minuty ; ":"
If Sekundy < 10 Then Lcd "0"
Lcd Sekundy
Waitms 100
Call Odczyt_rtc
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Incr Godziny
Sekundy = 0
If Godziny = 24 Then
Godziny = 0
End If
End If
End If
If S3 = 0 Then
Waitms 25
If S3 = 0 Then
Incr Minuty
Sekundy = 0
If Minuty = 60 Then
Minuty = 0
End If
End If
End If
Call Zapis_rtc
If S1 = 0 Then
Waitms 50
If S1 = 0 Then
Cls
Lcd "Zapis do pamieci"
Lowerline
Lcd "*** PCF 8583 ***"
Wait 3
Return
End If
End If
Loop




Portret użytkownika mirley

Re: Zegar RTC

Popatrz sie na ustawienia rejestru kontrolnego w karcie katalogowej http://www.nxp.com/documents/data_sheet/PCF8583.pdf Na stronie 6 jest napisane:

mask flag:
0 read locations 05 to 06
unmasked
1 read date and month count
directly

Wydaje mi się że poprostu masz ustawione wartość tej flagi na 1 i dni tygodnia i lata są kasowane, żeby dziesiątki dni i miesięcy dobrze się przeliczały. Nie analizowałem twojego kodu narazie więc spróbuj na początek zmienic konfigurację PCF'a

-

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.