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:
Anbei noch der Schaltplan meines Aufbaus.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 '------------------------------------------------------------------------------
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.
Geändert von Kampi (04.04.2012 um 20:21 Uhr) Grund: Was ergänzt.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Ok es scheint nun zu funktionieren. Dank dir nochmals
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
So also das mit der Uhrzeit funktioniert nun einwandfrei, allerdings klappt das auslesen in der ISR nicht.
Ich hab den SQW Pin der RTC direkt mit Pin B.2 verbunden. Der Plan ist nun gewesen, dass ich beim Mega32 an diesem Pin den Pull-Up aktiviere und den Interrupt und der SQW Pin der RTC auf 1Hz gestellt wird.
Das klappt allerdings nicht.
Mein Code ist folgender:
Ich finde da einfach keinen Fehler.... aber es funktioniert nicht.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 Settime Declare Sub Read_dcf Declare Sub Enable_sqw 'Ports konfigurieren Config Porta = Output 'Port für die Stunden Config Portd = Output 'Port für die Minuten Config Portb.2 = Output Ds1307 Alias Pinb.2 Porta = 0 Portd = 0 Ds1307 = 1 'Pull-Up aktivieren 'Variablen Dim Zaehler As Byte Dim _hour As Byte Dim _min As Byte Dim _sec As Byte Dim _weekday As Byte Dim _day As Byte Dim _month As Byte Dim _year As Byte Dim Ds1307w As Byte Dim Ds1307r As Byte Dim Stunde As Byte Dim Minute As Byte Dim Sekunde As Byte 'Adresse der DS1307 Ds1307w = &HD0 'Schreibadresse der RTC Ds1307r = &HD1 'Leseadresse der RTC 'Interrups aktivieren Enable Interrupts 'Interrupts einstellen On Int2 Ds1307_int Config Int2 = Rising Enable Int2 'Uhrzeit voreinstellen _hour = 16 _min = 01 _sec = 00 'Call Settime Call Enable_sqw 'SQW der RTC aktivieren Do 'Call Uhrzeit Porta = Zaehler 'Porta = Stunde 'Portd = Minute Wait 1 Loop End '------------------------------------------------------------------------------ 'RTC auslesen Sub Uhrzeit I2cstart I2cwbyte Ds1307w ' Schreibadresse senden I2cwbyte 0 ' Startadresse auf Register 0 setzen I2cstart I2cwbyte Ds1307r ' Adresse übermitteln I2crbyte Sekunde , Ack I2crbyte Minute , Ack I2crbyte Stunde , Ack I2crbyte _weekday , Ack I2crbyte _day , Ack I2crbyte _month , Ack I2crbyte _year , Nack I2cstop End Sub '------------------------------------------------------------------------------ Sub Read_dcf Return End Sub '------------------------------------------------------------------------------ Sub Enable_sqw I2cstart I2cwbyte &HD0 I2cwbyte 7 I2cwbyte &B00010001 I2cstop End Sub '------------------------------------------------------------------------------ Ds1307_int: Incr Zaehler Return '------------------------------------------------------------------------------ Sub Settime _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cwbyte _sec I2cwbyte _min I2cwbyte _hour I2cstop End Sub '------------------------------------------------------------------------------
Kann mir da jemand helfen (ist sicher wieder was total banales -.-)?
Danke schonmal!
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Input ist schon richtig, aber einen Pullup brauchst Du trotzdem. Den musst Du entweder intern einschalten oder extern dranlöten.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Lesezeichen