-
+ Antworten
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: DS1307 RTC mit Bascom

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.05.2005
    Beiträge
    35

    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.04.2005
    Beiträge
    5

    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.05.2005
    Beiträge
    35
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.04.2005
    Beiträge
    5

    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.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.816
    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,
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.05.2005
    Beiträge
    35
    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

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.816
    Den i2cstop dazwischen schon probiert ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    22.04.2005
    Beiträge
    5

    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    09.05.2005
    Beiträge
    35
    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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    22.04.2005
    Beiträge
    5

    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).

+ Antworten
Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •