Liste der Anhänge anzeigen (Anzahl: 1)
Denkfehler bei einer DS1307?
Hallo Forum,
ich schreibe gerade den Quellcode für meine Uhr. Und ich habe einen Denkfehler aber ich finde ihn nicht.
Ich habe einen Mega32 der mit 8MHz getaktet ist. Am I²C hängt ne DS1307 RTC wo die Uhrzeit ausgelesen wird. Die Kommunikation funktioniert auch und das auslesen funktioniert auch zu 99%. An den Ports A und D hängen 4 71414 die die Uhrzeit auf meinen Röhren anzeigen. Ich hab es aber eben z.B. gehabt das bis 20:10 die Uhrzeit richtig als 20:10 angezeigt wurde aber sobald es 20:10 war, war auf den Röhren 20:16 zu lesen. Und die Uhr läuft dann auch mit der Zeit weiter. Es wird also nicht 20:15 angezeigt sondern 20:21.
Ich finde den Fehler einfach nicht >.<
Mein bisheriger Code sieht so aus:
Code:
'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 8000000
'Stackgröße festlegen
$hwstack = 200
$swstack = 200
'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz
'Unterprogramme
Declare Sub Uhrzeit
Declare Sub Read_dcf
Declare Sub Rtc_einstellen
Declare Sub Enable_sqw
'Ports konfigurieren
Config Porta = Output 'Port für die Stunden
Config Portd = Output 'Port für die Minuten
Config Pinb.2 = Input 'Input für die SQW der RTC
Porta = 0
Portd = 0
Pinb.2 = 1 'Pull-Up aktivieren
'Variablen
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Integer
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Dim Stunde As Byte
Dim Minute As Byte
Dim Ds1307_config As Byte 'Controllregister der RTC
'Uhrzeit voreinstellen
_sec = 00
_min = 04
_hour = 20
'Adresse der DS1307
Ds1307w = &HD0 'Schreibadresse der RTC
Ds1307r = &HD1 'Leseadresse der RTC
'Interrupts einstellen
Config Int2 = Falling
Enable Int2
On Int2 Ds1307_int
'Interrups aktivieren
Enable Interrupts
'Call Rtc_einstellen
Do
Call Uhrzeit
Porta = Stunde
Portd = Minute
Wait 1
Loop
End
'------------------------------------------------------------------------------
'RTC auslesen
Sub Uhrzeit
I2cstart 'TWI Start
I2cwbyte Ds1307w 'Übergabe der Slaveadresse
I2cwbyte 0 'Registerzähler wird auf Null gesetzt
I2cstart 'Zweite Startkondition
I2cwbyte Ds1307r 'Übergabe der Leseadresse
I2crbyte _sec , Ack 'Auslesen des Sekundenregisters
I2crbyte _min , Ack 'Auslesen des Minutenregisters
I2crbyte _hour , Nack 'Auslesen des Jahresregisters
I2crbyte _weekday , Ack
I2crbyte _day , Ack 'Auslesen des Tagesregisters
I2crbyte _month , Ack 'Auslesen des Monatsregisters
I2crbyte _year , Nack 'Auslesen des Jahresregisters
I2cstop 'TWI Stoppkondition
Minute = Makebcd(_min) 'Umwandeln in BCD Code
Stunde = Makebcd(_hour)
End Sub
'------------------------------------------------------------------------------
Sub Read_dcf
Return
End Sub
'------------------------------------------------------------------------------
'Einstellen Der Zeit
Sub Rtc_einstellen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
End Sub
'------------------------------------------------------------------------------
Sub Enable_sqw
I2cstart
I2cwbyte Ds1307w
I2cwbyte 7
I2cwbyte Ds1307_config
I2cstop
Return
End Sub
'------------------------------------------------------------------------------
Ds1307_int:
Return
'------------------------------------------------------------------------------
Anbei noch der Schaltplan meines Aufbaus.
Kann mir jemand auf die Sprünge helfen und mir sagen wo der Fehler ist?
Danke für die Hilfe!
Edit: Und statt 20:20 steht da 20:32.