Kampi
04.04.2012, 20:16
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:
'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.
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:
'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.