supertux
16.12.2007, 14:22
Hallo
bin noch einigermaßen neu in Sachen Mikrocontroller. Einige Sprünge habe ich schon hinter mir. Nun habe ich aber Probleme mit dem auslesen des Uhrenbausteines DS1307 über I2C.
'---------- AVR Einstellungen ----------
$regfile = "m8def.dat" 'AVR ATMega 8...
$crystal = 8000000 '...mit 8 MHz
'---------- I²C Einsatellungen ----------
Config Twi = 100000 'i2c Frequenz einstellen
Config Sda = Portd.1 'i2c Port SDA am AVR
Config Scl = Portd.0 'i2c Port SCL am AVR
'---------- LCD Einstellungen ----------
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , Rs = Portc.4 , E = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4 '4 Bit Modus
Cursor Off Noblink 'LCD = Cursor aus
Dim Wochentag As Byte
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
Wochentag = 7
Tag = 16
Monat = 12
Jahr = 07
Sekunde = 00
Minute = 28
Stunde = 13
Rem Zeitsetzen
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 0
'I2cwbyte Sekunde
'I2cwbyte Minute
'I2cwbyte Stunde
'I2cstop
Rem Datumsetzen
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 3
'I2cwbyte Wochentag
'I2cwbyte Tag
'I2cwbyte Monat
'I2cwbyte Jahr
'I2cstop
Cls
Do
Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte Sekunde , Ack
I2crbyte Minute , Ack
I2crbyte Stunde , Ack
I2crbyte Wochentag , Ack
I2crbyte Tag , Ack
I2crbyte Monat , Ack
I2crbyte Jahr , Nack
I2cstop
Upperline
Home
If Tag < 9 Then
Lcd "0" ; Tag ; "-"
Else
Lcd Tag ; "-"
End If
If Monat < 9 Then
Lcd "0" ; Monat ; "-"
Else
Lcd Monat ; "-"
End If
If Jahr < 9 Then
Lcd "200" ; Jahr
Else
Lcd "20" ; Jahr
End If
Lowerline
If Stunde < 9 Then
Lcd "0" ; Stunde ; ":"
Else
Lcd Stunde ; ":"
End If
If Minute < 9 Then
Lcd "0" ; Minute ; ":"
Else
Lcd Minute ; ":"
End If
If Sekunde < 9 Then
Lcd "0" ; Sekunde
Else
Lcd Sekunde
End If
Waitms 500
Loop
Im Moment "verschluckt" sich die Uhr, d.h. sie zählt die Sekunden bis 89 und die Minuten springen dann auch in größeren Schritten. Von der Beschaltung des DS1307 ist ja nicht viel falsch zu machen.
Quarz an 1 und 2, Batterie 3 und 4
5 SDA, 6 SCL
der Quarz ist ein Uhrenquarz mit 0,032768 Hz, die Sekundenlänge stimmt. Nur "addiert" der Baustein nicht richtig.
Kann es sein, das sich der I2C Bus nicht so schnell abfragen lässt?
Im Moment weiß ich keinen Rat.
Gruß
Michael
PS Weiß noch nicht, wie man das Listing in ein separates Fenster zum scrollen bekommt, sorry für die Länge
bin noch einigermaßen neu in Sachen Mikrocontroller. Einige Sprünge habe ich schon hinter mir. Nun habe ich aber Probleme mit dem auslesen des Uhrenbausteines DS1307 über I2C.
'---------- AVR Einstellungen ----------
$regfile = "m8def.dat" 'AVR ATMega 8...
$crystal = 8000000 '...mit 8 MHz
'---------- I²C Einsatellungen ----------
Config Twi = 100000 'i2c Frequenz einstellen
Config Sda = Portd.1 'i2c Port SDA am AVR
Config Scl = Portd.0 'i2c Port SCL am AVR
'---------- LCD Einstellungen ----------
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , Rs = Portc.4 , E = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4 '4 Bit Modus
Cursor Off Noblink 'LCD = Cursor aus
Dim Wochentag As Byte
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
Wochentag = 7
Tag = 16
Monat = 12
Jahr = 07
Sekunde = 00
Minute = 28
Stunde = 13
Rem Zeitsetzen
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 0
'I2cwbyte Sekunde
'I2cwbyte Minute
'I2cwbyte Stunde
'I2cstop
Rem Datumsetzen
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 3
'I2cwbyte Wochentag
'I2cwbyte Tag
'I2cwbyte Monat
'I2cwbyte Jahr
'I2cstop
Cls
Do
Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte Sekunde , Ack
I2crbyte Minute , Ack
I2crbyte Stunde , Ack
I2crbyte Wochentag , Ack
I2crbyte Tag , Ack
I2crbyte Monat , Ack
I2crbyte Jahr , Nack
I2cstop
Upperline
Home
If Tag < 9 Then
Lcd "0" ; Tag ; "-"
Else
Lcd Tag ; "-"
End If
If Monat < 9 Then
Lcd "0" ; Monat ; "-"
Else
Lcd Monat ; "-"
End If
If Jahr < 9 Then
Lcd "200" ; Jahr
Else
Lcd "20" ; Jahr
End If
Lowerline
If Stunde < 9 Then
Lcd "0" ; Stunde ; ":"
Else
Lcd Stunde ; ":"
End If
If Minute < 9 Then
Lcd "0" ; Minute ; ":"
Else
Lcd Minute ; ":"
End If
If Sekunde < 9 Then
Lcd "0" ; Sekunde
Else
Lcd Sekunde
End If
Waitms 500
Loop
Im Moment "verschluckt" sich die Uhr, d.h. sie zählt die Sekunden bis 89 und die Minuten springen dann auch in größeren Schritten. Von der Beschaltung des DS1307 ist ja nicht viel falsch zu machen.
Quarz an 1 und 2, Batterie 3 und 4
5 SDA, 6 SCL
der Quarz ist ein Uhrenquarz mit 0,032768 Hz, die Sekundenlänge stimmt. Nur "addiert" der Baustein nicht richtig.
Kann es sein, das sich der I2C Bus nicht so schnell abfragen lässt?
Im Moment weiß ich keinen Rat.
Gruß
Michael
PS Weiß noch nicht, wie man das Listing in ein separates Fenster zum scrollen bekommt, sorry für die Länge