-
DS1307 RTC mit Bascom
Hallo,
ich habe ein Problem mit der Ansteuerung der RTC DS 1307. Hier mal mein Code:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Sda = Portc.4
Config Scl = Portc.5
Dim _date As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
_date = 23
_month = 6
_year = 05
_sec = 10
_min = 10
_hour = 13
_date = Makebcd(_date)
_month = Makebcd(_month)
_year = Makebcd(_year)
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte &H00
I2cwbyte &B0 , _sec
I2cwbyte &H01
I2cwbyte &B0 , _min
I2cwbyte &H02
I2cwbyte &B01 , _hour
I2cwbyte &H04
I2cwbyte &B00 , _date
I2cwbyte &H05
I2cwbyte &B000 , _month
I2cwbyte &H06
I2cwbyte _year
I2cstop
Do
I2cstart
I2cwbyte Ds1307r
I2cwbyte &H00
I2crbyte _sec , Ack
I2cwbyte &H01
I2crbyte _min , Nack
I2cwbyte &H02
I2crbyte _hour , Nack
I2cwbyte &H04
I2crbyte _date , Nack
I2cwbyte &H05
I2crbyte _month , Nack
I2cwbyte &H06
I2crbyte _year , Ack
I2cstop
_sec = Makedec(_sec)
_min = Makedec(_min)
_hour = Makedec(_hour)
_date = Makedec(_date)
_month = Makedec(_month)
_year = Makedec(_year)
Print _date ; "/" ; _month ; "/" ; _year
Print _hour ; "/" ; _min ; "/" ; _sec
Print "---------------------------------------"
Waitms 500
Loop
Pullups hab ich dran, 4k7 an SDA und SCL.
Hab echt keine Ahnung woran dass noch liegen könnte. Ich krieg immer für jeden Wert 165 raus.
Gruß
Florian
-
DS1307 Auslesen
Hier der ausgebesserte Code. Sollte funktionieren. Ich arbeite damit.
Wichtig daß die Taktfrequenz stimmt - $crystal.
Viel Spaß noch beim programmieren
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Sda = Portc.4
Config Scl = Portc.5
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
_day = 23
_month = 6
_year = 05
_sec = 10
_min = 10
_hour = 13
Rem Zeitsetzen
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Rem Datumsetzen
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte _weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Do
Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte _weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
Print Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
Print "---------------------------------------"
Waitms 1000
Loop
Edit: Code-Tags eingesetzt, sieht besser aus dein Moddy
-
Hallo,
danke für die Antwort, es funkioniert aber immer noch nicht. Mir ist noch ein anderer Gedanke gekommen, ich verwende ein 6pf Uhrenquarz, im Datasheet wird zu 12,5 pf Quarzen geraten. Könnte das ein Problem sein? könnte ich die Kapazität des Quarzes evtl. durch paralell schalten von einem Kondensator anpassen?
Gruß
Florian
-
DS1307
Ich verwende ein Board (ATMEGA32) welches ich aus einer Vorlage von www.kreatives-chaos.com gebaut habe. Ich betreibe den ATMEGA mit einem internen Takt von 8MHz da ich bei externen Quarzen in der Vergangenheit Probleme hatte (Sie schwangen nicht richtig). Wenn ich einen externen Takt verwende dann nur einen Quarz-Resonator. Ich würde es auf jeden Fall einmal mit dem internen Takt probieren damit man sieht ob der Fehler am externen Quarz liegt.
-
Code:
Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
--------------------------Sollt' da nicht noch ein "stop" rein ?
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _
Wenn es nix nutz, schaden kann's auch nicht,
-
Hallo,
danke für die Antworten, ich mein die Quarze von der RTC, der Mega8 läuft bei mir mit dem internen 8 MHZ Oszillator. Es funktioniert aber immer noch nicht, irgendwie blöd. Hat jemand ne Idee, wie ich das Problem eingrenzen könnte, liegts nun HW-technisch an der RTC oder an der Software?
Gruß
Florian
-
Den i2cstop dazwischen schon probiert ?
-
DS1307
Ich verwende folgende Pinbelegung des DS1307:
Pin 1 und Pin 2 - Quarz 32,768kHz ohne Kondensatoren
Pin 4 GND
Pin 5 SDA
Pin 6 SCL
Pin 8 +5V
-
Hallo,
danke für die Tipps, jetzt funktionierts so halb, hier erstmal mein code
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Sda = Portc.4
Config Scl = Portc.5
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim ___lcdno As Bit
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
_day = 29
_month = 6
_year = 05
_sec = 15
_min = 25
_hour = 20
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte _weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Do
Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstop
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte _weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Ack
I2cstop
_day = Makedec(_day)
_month = Makedec(_month)
_year = Makedec(_year)
_sec = Makedec(_sec)
_min = Makedec(_min)
_hour = Makedec(_hour)
Print _day ; "/" ; _month ; "/" ; _year
Print _hour ; "/" ; _min ; "/" ; _sec
Print "-----------------------------------------"
Waitms 2000
Loop
ich kriege jetzt im Terminal folgendes raus:
Code:
.
.
.
.
165/165/165
165/165/45
-----------------------------------------
29/6/5
20/37/2
-----------------------------------------
0/2/2
120/40/1
-----------------------------------------
165/165/165
165/165/45
-----------------------------------------
29/6/5
20/37/8
-----------------------------------------
.
.
.
.
Also immer jede dritte AUsgabe stimmt, der Rest ist Müll. Hat jemand ne Ahnung, woran dass liegen kann? Ne niedrigere waitms am Ende hab ich auch schon probiert, bringt nix.
Gruß
Florian
-
DS1307
Ich werde morgen meinen Code hochladen.
Habe ihn heute bei einem Freund ausprobiert und er funktioniert einwandfrei. Er hat auch einen anderen Quarz (Mechanisch gesehen ist er größer, nur die Taktfrequenz ist die gleiche).
Er hat auch herausgefunden daß bei ihm die Uhr nicht funktioniert hat wenn die Leitungen der I2C zu lange waren (ca. 20cm lose Drahtleitung). So haben wir den IC direkt neben dem ATMEGA32 auf den Print gesetzt (Kupferleitung nur mehr 2-3cm lang).