DS3231 bleibt stehen?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • DS3231 bleibt stehen?

      Hallo,
      ich habe vorgestern gegen 19 Uhr dies RCT-Modul beschrieben und gestern morgen gegen 7 Uhr meinte es 01:50. Es blieb nach ca 5 Stunden stehen? Dann hab ich um 8,15,16 Uhr nachgefragt. Es lief durch aber ging ca 1 Minute Pro Stunde nach. Heute Morgen wieder richtig gestellt und gerade meinte es 14:01? Die Batt-Spannung liegt bei 3,2V ohne Betriebsspannung mit bei3,6V, Jetzt meint es 0:07. Es sieht aus als vertrüge es keine Spannugsausfälle. Aber ist es nicht genau dafür da ohne Spannung klarzukommen evt über Wochen? Wie betreibt Ihr Eure?
      Hat jemand Langzeiterfahrungen? Können sie justiert werden, 1min Fehler pro Stunde ist nicht glücklich.
    • Ich denke nicht das es ein Software Problem ist. Hier die relevanten Zeilen.

      Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = $40
      4. $swstack = $40
      5. $framesize = $100
      6. $eepleave
      7. $baud = 9600
      8. '$sim
      9. Config Base = 0
      10. Config Timer0 = Timer , Prescale = 1024 '250ms
      11. Config Clock = soft
      12. Config Date = Dmy , Separator = .
      13. Time$ = "12:34:56" : Date$ = "04.01.19"
      14. dim _weekday as byte
      15. dim Tagstr as String*14
      16. _weekday = 1
      17. Tagstr = "MoDiMiDoFrSaSo"
      18. '---------------------- I2C config
      19. $lib "i2c_twi.lbx" 'Use Hardware I2C
      20. Config Scl = Portc.5 'Platine außen: Gnd,Vdd, SDA,SCL
      21. Config Sda = Portc.4
      22. Config Twi = 50000 'Normal 100000=100kHz
      23. Const Ds3231w = $d0
      24. Const Ds3231r = $d1
      25. Dim I2cbuf(16) As Byte , I2c_typ As Byte , I2c_err As Byte
      26. i2cinit
      27. ...
      28. '232 Abfrage get..
      29. Case Is = Rdate
      30. Send = Date$
      31. Case Is = adatu
      32. send = "Wird Ausgelesen"
      33. gosub ds_getdate
      34. '232 Anweisung set..
      35. Case Is = Rdate
      36. if l=8 then
      37. Date$=Rwert
      38. n=0
      39. else
      40. Send=Rwert
      41. n=1
      42. end if
      43. Case Is = adatu
      44. send = "Wird Übergeben"
      45. gosub ds_setdate
      46. 'send wird ausgegeben
      47. ...
      48. ds_gettime:
      49. #if _sim =0
      50. I2cstart
      51. I2cwbyte Ds3231w
      52. I2cwbyte 0 'Aktuelle Daten ab Register 0 lesen
      53. I2cstop
      54. I2cstart
      55. I2cwbyte Ds3231r
      56. I2crbyte i2cbuf(0),ack
      57. I2crbyte i2cbuf(1),ack
      58. I2crbyte i2cbuf(2),nack
      59. I2cstop
      60. i2cbuf(0)=i2cbuf(0)and $7f
      61. _sec= makedec(i2cbuf(0))
      62. _min=makedec(i2cbuf(1))
      63. _hour=makedec(i2cbuf(2))
      64. #endif
      65. if debg=1 then
      66. Print Hex(_sec);" ";hex(_min);" ";hex(_hour)
      67. end if
      68. return
      69. ds_getdate:
      70. I2cstart
      71. I2cwbyte Ds3231w
      72. I2cwbyte 3 'Aktuelle Daten ab Register 3 lesen
      73. I2cstop
      74. I2cstart
      75. I2cwbyte Ds3231r
      76. I2crbyte _weekday , Ack
      77. I2crbyte i2cbuf(4) , Ack
      78. I2crbyte i2cbuf(5) , Ack
      79. I2crbyte i2cbuf(6) , Nack
      80. I2cStop
      81. _day= makedec(i2cbuf(4))
      82. _month=makedec(i2cbuf(5))
      83. _year=makedec(i2cbuf(6))
      84. if debg=1 then
      85. Print Hex(_weekday);" ";hex(_day);" ";hex(_month);" ";hex(_year)
      86. end if
      87. return
      88. ds_settime:
      89. i2cbuf(0)=makebcd(_sec)
      90. i2cbuf(1)=makebcd(_min)
      91. i2cbuf(2)=makebcd(_hour)
      92. I2cstart
      93. I2cwbyte Ds3231w
      94. I2cwbyte 0 'Schreiben Zeit ab Register 0
      95. I2cwbyte i2cbuf(0)
      96. I2cwbyte i2cbuf(1)
      97. I2cwbyte i2cbuf(2)
      98. I2cstop
      99. return
      100. ds_setdate:
      101. i2cbuf(4)=makebcd(_day)
      102. i2cbuf(5)=makebcd(_month)
      103. i2cbuf(6)=makebcd(_year)
      104. I2cstart
      105. I2cwbyte Ds3231w
      106. I2cwbyte 3 'Schreiben Datum ab Register 3
      107. I2cwbyte _weekday
      108. I2cwbyte i2cbuf(4)
      109. I2cwbyte i2cbuf(5)
      110. I2cwbyte i2cbuf(6)
      111. ' Vielleicht doch Hier fehlt das Stop
      112. return
      Alles anzeigen
      Die Uhr im Programm läuft natürlich so nicht. Das Config Clock nur um die Dim und Umrechnung zu sparen.
      Das Stop beim Datum Schreiben fehlt. Dennoch wurde es richtig geschrieben und stimmt seit dem.
    • Was mir jetzt aber schon mal aufgefallen ist sind die I2cstop Befehle in Ds_getdate und Ds_gettime. Also die ersten I2cstop Befehle.
      Die solltest du mal raus nehmen.

      BASCOM-Quellcode

      1. ds_gettime:
      2. #if _sim =0
      3. I2cstart
      4. I2cwbyte Ds3231w
      5. I2cwbyte 0 'Aktuelle Daten ab Register 0 lesen
      6. 'I2cstop
      7. I2cstart
      8. I2cwbyte Ds3231r
      9. I2crbyte i2cbuf(0),ack
      10. I2crbyte i2cbuf(1),ack
      11. I2crbyte i2cbuf(2),nack
      12. I2cstop
      13. i2cbuf(0)=i2cbuf(0)and $7f
      14. _sec= makedec(i2cbuf(0))
      15. _min=makedec(i2cbuf(1))
      16. _hour=makedec(i2cbuf(2))
      17. #endif
      18. if debg=1 then
      19. Print Hex(_sec);" ";hex(_min);" ";hex(_hour)
      20. end if
      21. return
      22. ds_getdate:
      23. I2cstart
      24. I2cwbyte Ds3231w
      25. I2cwbyte 3 'Aktuelle Daten ab Register 3 lesen
      26. 'I2cstop
      27. I2cstart
      28. I2cwbyte Ds3231r
      29. I2crbyte _weekday , Ack
      30. I2crbyte i2cbuf(4) , Ack
      31. I2crbyte i2cbuf(5) , Ack
      32. I2crbyte i2cbuf(6) , Nack
      33. I2cStop
      34. _day= makedec(i2cbuf(4))
      35. _month=makedec(i2cbuf(5))
      36. _year=makedec(i2cbuf(6))
      37. if debg=1 then
      38. Print Hex(_weekday);" ";hex(_day);" ";hex(_month);" ";hex(_year)
      39. end if
      40. return
      Alles anzeigen
      Also die oben auskommentierten.

      Hast du mal ein anderes funktionierendes Beispiel getestet?
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von djmsc ()

    • Nein, Ich hatte es mitbestellt als es vor einer Ewigkeit mal Thema war und bin nun erst dazu gekommen es zu testen.
      Es permanent abfragen um den (sec)takt zu sparen? Wär ich jetzt nicht drauf gekommen. Macht man das so?
      Ich habs ausprobiert einmal ohne Stop und einmal mit Repstart. Es ist da nicht kleinlich und funktioniert in allen drei Fällen gleich. Scheint aber immer noch zu langsam zu sein.
    • Hast du ein fertiges Modul? Soll dieser Spannungsteiler ein Art Ladeschaltung sein? Bei diesen Ladungsschaltungen bin ich sehr skeptisch und bau das Zeug gleich aus. Nur Batterie an bat, sonst nix.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Pluto25:
      hier ein wichtiger Auszug aus dem Verkaufsprospekt dieser Module:
      Die RTC kann zur Zeiterhaltung mit einer Batterie versorgt werden. Allerdings kann dann kein Alarm mehr ausgelöst werden. Auf dem Modul ist der Einsatz einer wiederaufladbaren LIR2032 Knopfzelle vorgesehen. Die Batterie wird über einen Widerstand aufgeladen, wenn die Versorgungsspannung vorhanden ist. Soll eine (billigere) nicht aufladbare Knopfzelle (CR2032) zum Einsatz kommen muss der Widerstand entfernt werden.

      Anmerkung meinerseits: Diese "Ladeschaltung" ist großer Mist, raus damit und nur eine CR2032 verwenden.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von oscar ()