- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: DS1307 RTC mit Bascom

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    56
    Anzeige

    Praxistest und DIY Projekte
    Das Thema ist zwar schon älter, aber ich habe ein Problem behoben. Wenn man den Code von oben verwendet, ist jede zweite Abfrage regelmäßig fehlerhaft. Die Lösung ist repeated start. Hier mein Code:
    Code:
             $regfile = "m32def.dat"
    $crystal = 4000000
    $baud = 9600
    
    Config Scl = Portc.0
    Config Sda = Portc.1
    
    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
    Waitms 100                                                  ' Diese Ansteuerung entspricht Figure 6 im Datenblatt, also erst schreiben, dann repeated start und anschließend lesen!
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    I2cstart                                                    'repeated Start
    I2cwbyte Ds1307r
    I2crbyte _sec , Ack
    I2crbyte _min , Ack
    I2crbyte _hour , Ack
    I2crbyte _weekday , Ack
    I2crbyte _day , Ack
    I2crbyte _month , Ack
    I2crbyte _year , Ack
    I2cstop
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    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

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ja,das mit dem Repeated start ist korrekt sonst gibt es jede 2-3. Runde Müll.

    Aber wofür bei der Abfrage am Ende nochmal den Pointer auf null setzen ?

    Diese Zeilen am Ende hier kannst du weglassen.

    Code:
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    I2cstop
    Und bei der Zeile "I2crbyte _year , Ack" änderst du das "Ack" in "Nack" (No Ack wie gefordert) dann klappts besser.

    Im Ganzen sieht die Unterroutine dann so aus........

    Code:
    Getdatetime:
     I2cstart
     I2cwbyte Rtcw
     I2cwbyte 0
     I2cstart
     I2cwbyte Rtcr
     I2crbyte _sec , Ack
     I2crbyte _min , Ack
     I2crbyte _hour , Ack
     I2crbyte Weekday , Ack
     I2crbyte _day , Ack
     I2crbyte _month , Ack
     I2crbyte _year , Nack
     I2cstop
     _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
     _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return
    Diese Routine findet man so fast überall im Web.
    Gruß
    Ratber

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2007
    Beiträge
    14

    85/85/85

    Hallo,
    ich versuch mich auch gerade an diesem Thema.
    Habe den ds1307 auf einer kleinen Lochrasterplatine mit quartz direkt auf mein avr_ctrl board gesteckt.
    Leider bekomme ich nur 85/85/85, manchmal auch was mit 165 raus.
    Habe schon alle Varianten des Codes, die in diesem Thread vorgestellt werden ausprobiert. An der Hardware sollte es nicht liegen. Kann vielleicht jemand nochmal über den Code drübergucken.

    Danke

    Joschi

    p.s.: ich hab keine ahnung, wie man hier so´n schickes code-fenster reinkriegt. deshalm mein code mal direkt.

    $regfile = "8535def.dat"
    $crystal = 8000000
    $baud = 9600

    Config Sda = Portd.5
    Config Scl = Portd.3
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.0 , E = Portc.2
    Config Lcdbus = 4

    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 = 19
    _month = 07
    _year = 07
    _sec = 00
    _min = 33
    _hour = 19


    _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 Ds1307w
    I2cwbyte 0
    I2cstart
    I2cwbyte Ds1307w
    I2crbyte _sec , Ack
    I2crbyte _min , Ack
    I2crbyte _hour , Ack
    I2crbyte _weekday , Ack
    I2crbyte _day , Ack
    I2crbyte _month , Ack
    I2crbyte _year , Nack
    I2cstop
    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)




    Cls
    Locate 1 , 1
    Lcd _day ; "/" ; _month ; "/" ; _year
    Locate 2 , 1
    Lcd _hour ; "/" ; _min ; "/" ; _sec


    Waitms 500

    Loop

  4. #24
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2007
    Beiträge
    14

    Korrektur

    Sorry, hatte die pullups vergessen. Habe jetzt jeweils 20 kOhm angeschlossen.
    Das Problem: Jetzt zeigt´s nur noch Nullen an. Um evtl. Hardwareprobleme auszuschalten: Muß ich eigentlich zwingend eine Batterie an den DS1307 anschließen? Im Augenblick ist dieser Pin nämlich frei.

    Gruß

    Joschi

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Meine Pullups sind 4,7 KiloOhm. Ich habe bis jetzt immer eine Batterie drangehabt, sollte aber auch ohne gehen, wäre sonst schlecht, wenn die Batterie mal leer sein sollte.
    Ich vermisse die Stackgrößen.
    Bei Zeitholen hast du statt ds1307r ein ds1307w
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #26
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2007
    Beiträge
    14

    ichgebe jetzt auf

    ich gebe jetzt auf. mir gehen echt die ideen aus. I2C schein nicht mein ding zu sein.
    habe jetzt 4,7kOhm pullups und eine 3V batterie eingesetzt.
    ich bekomme trotzdem nur nullen.
    falls jemand noch einen kompletten code hat, mit dem das funktioniert, wäre ich dafür dankbar. ansonsten erkläre ich das abenteuer ds1307 für gescheitert und wende mich anderen spannenden sachen zu. wenigstens war´s nich allzu teuer.

    gruß

    joschi

  7. #27
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Weil es nicht sofort klappt gleich die Flinte ins Korn ?

    Was kommt danach ?

    Spannende Schrittmotoren wo du dann wieder beim ersten Problem (zb. Strombegrenzung) die Flinte ins Getreide pfefferst und dich wieder "anderen spannenden sachen" zuwendest ?

    Wo soll das Enden ?

    Fang einfach mal an dich mit jedem Teilaspekt auseinanderzusetzen statt gleich "Volldampf Vorraus" zu handeln.
    Anfangen würde ich mit I2C.
    Prinzip,Geschichte,Limmits,Das Elektrische und nicht zu vergessen das Busprotokoll.


    Dein Programm ist ja nicht schlecht aber ich vermisse da einiges.

    Hinter der I2C Pinkonfiguration sollte man den I2C Takt mit zb. "Config I2cdelay = 5" definieren denn wenn du den 1307 gleich mit 400 Khz fütterst dann macht der das nicht mit weil er nur bis 100 Khz kann.

    Dann vieleicht noch "Config Clock = User" um dem Compiler mitzuteilen woher du deine Zeit beziehen möchtest.
    Dann könntest du einfacher Arbeiten.

    Einen Beispielcode kann ich dir auch noch liefern wenn du es nicht allein zusammen bekommst.
    Muß ich aber erstmal raussuchen.
    Gruß
    Ratber

  8. #28
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2007
    Beiträge
    14

    problem behoben

    hallo,

    danke für die tips. das problem ist behoben.
    anscheinend ist irgendwas mit meinem ds1307 nicht in ordnung. hab ein andere ic eingestzt und schon funzt alles.

    nochmals danke.

    viele grüße

    joschi

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Na also,geht doch
    Gruß
    Ratber

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    20.11.2005
    Beiträge
    88
    Hallo zusammen,

    bin noch nicht selber zu ausprobieren des DS1307 gekommen, aber ich habe eine grundlegende Frage. In Bascom gibt es ja die Standartroutine DS1307.bas und die ds1307clock.lib.
    Muss im code wie im Beispiel unten Abschnitt `called from ds1307 überhaupt im Code sein oder würde er bei compilen das automatisch aus der .lib so holen?

    Code:
    '-------------------------------------------------------------------------------
    '                           DS1307.BAS
    ' shows how to use the ds1307 clock on the 2313 futurlec board
    ' it also shows the CONFIG CLOCK=USER option
    '-------------------------------------------------------------------------------
    $regfile = "2313def.dat"
    $crystal = 8000000
    $baud = 19200
    $lib "mcsbyte.lbx"                                          ' for smaller code
    $lib "ds1307clock.lib"                                      ' modified lib
    $framesize = 16
    $hwstack = 24
    $swstack = 16
    
    
    'configure the scl and sda pins
    Config Sda = Portd.6
    Config Scl = Portd.5
    
    'address of ds1307
    Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
    Const Ds1307r = &HD1
    
    Config Clock = User                                         ' this will dim the bytes automatic
    'dim other needed variables
    Dim Weekday As Byte
    
    Print "DS1307"
    Waitms 100
    ' assigning the time will call the SetTime routine
    Time$ = "23:58:59"                                          ' to watch the day changing value
    Date$ = "11-13-02"                                          ' 13 november 2002
    Do
      Print "Date Time : " ; Date$ ; " " ; Time$
      Waitms 500
    Loop
    
    End
    
    'Muss das hier unbedingt im sein oder ist das Beispiel aus der LIB???????
    
    'called from ds1307clock.lib
    
    Getdatetime:
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 0                                                ' start address in 1307
    
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307r                                          ' send address
      I2crbyte _sec , Ack
      I2crbyte _min , Ack                                       ' MINUTES
      I2crbyte _hour , Ack                                      ' Hours
      I2crbyte Weekday , Ack                                    ' Day of Week
      I2crbyte _day , Ack                                       ' Day of Month
      I2crbyte _month , Ack                                     ' Month of Year
      I2crbyte _year , Nack                                     ' Year
      I2cstop
      _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return
    
    Setdate:
      _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 4                                                ' starting address in 1307
      I2cwbyte _day                                             ' Send Data to SECONDS
      I2cwbyte _month                                           ' MINUTES
      I2cwbyte _year                                            ' Hours
      I2cstop
    Return
    
    Settime:
      _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      I2cstart                                                  ' Generate start code
      I2cwbyte Ds1307w                                          ' send address
      I2cwbyte 0                                                ' starting address in 1307
      I2cwbyte _sec                                             ' Send Data to SECONDS
      I2cwbyte _min                                             ' MINUTES
      I2cwbyte _hour                                            ' Hours
      I2cstop
    Return

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

12V Akku bauen