PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Denkfehler bei einer DS1307?



Kampi
04.04.2012, 19: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.

MagicWSmoke
04.04.2012, 19:31
Kann mir jemand auf die Sprünge helfen und mir sagen wo der Fehler ist?
Deine Kommunikation ist einseitig, vom und hin zum DS1307 muss jeweils Dez/BCD gewandelt werden, bei Dir nur nach BCD.
Im Bascom\Samples\I2C Ordner ist genau ein Beispiel zur 1307, woran Du Dich orientieren kannst.

Kampi
04.04.2012, 19:42
Deine Kommunikation ist einseitig, vom und hin zum DS1307 muss jeweils Dez/BCD gewandelt werden, bei Dir nur nach BCD.
Im Bascom\Samples\I2C Ordner ist genau ein Beispiel zur 1307, woran Du Dich orientieren kannst.

Super! Dank dir ich schau es mir direkt mal an.

Kampi
04.04.2012, 19:51
Ok es scheint nun zu funktionieren. Dank dir nochmals :D

Kampi
06.04.2012, 20:27
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:



'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

'------------------------------------------------------------------------------



Ich finde da einfach keinen Fehler.... aber es funktioniert nicht.
Kann mir da jemand helfen (ist sicher wieder was total banales -.-)?
Danke schonmal!

MagicWSmoke
06.04.2012, 22:30
... dass ich beim Mega32 an diesem Pin den Pull-Up aktiviere
Einen Pullup aktiviert man nicht, indem man den Pin auf Ausgang setzt.

Kampi
06.04.2012, 22:33
Einen Pullup aktiviert man nicht, indem man den Pin auf Ausgang setzt.

Naja selbst wenn ich den auf Input stelle gehts nicht :/

MagicWSmoke
06.04.2012, 22:51
Input ist schon richtig, aber einen Pullup brauchst Du trotzdem. Den musst Du entweder intern einschalten oder extern dranlöten.

Kampi
06.04.2012, 23:08
Input ist schon richtig, aber einen Pullup brauchst Du trotzdem. Den musst Du entweder intern einschalten oder extern dranlöten.

Ja ich wollte den internen Pull-Up verwenden, da mir hier gesagt wurde das das gehen würde ;)
Den aktiviere ich doch mit

PINB.2 = 1

oder?

MagicWSmoke
06.04.2012, 23:29
Den aktiviere ich doch mit

PINB.2 = 1

oder?
Gerade auch blind gewesen...

PortB.2 = 1
wäre richtig.
Aber ohne


Config Portb.2 = Output
denn sonst röstet was.

Kampi
07.04.2012, 00:04
Gerade auch blind gewesen...

PortB.2 = 1
wäre richtig.
Aber ohne

denn sonst röstet was.

Oh mein Gott es funktioniert.....DANK DIR! :D
Keine Ahnung wieso ich da nicht selber drauf gekommen bin. Ich habe irgendwie wohl gedacht das ich das schon probiert habe und es nicht ging.
Aber naja nun funktioniert es.
Danke für die Lösung :D