MCP7940N (RTC) kennt das Jahr "2020" nicht...

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • MCP7940N (RTC) kennt das Jahr "2020" nicht...

      Hallo liebes Forum und eine erfolgreiches 2020!

      Ich hätte eine Frage über besagte RTC aus dem Titel:

      Die Uhr hat irgendein Problem mit dem Jahr "20".
      Der Fehler viel uns gerade auf, sie hat nicht korrekt auf das Jahr "20" incrementiert.
      Wir haben danach versucht, das Datum per "Hand" einzugeben, doch das nimmt die RTC nicht an.
      Andere Jahrgänge, auch Zehner wie z.B. "30" und "10", sowie alle Jahrgänge dazwischen lassen sich ohne Probleme einstellen, nur die "20" nicht.
      Die Daten werden per MakeBCD und MakeInt gewandelt, die Variable zum Auslesen und Umwandeln ist ein Byte.
      Die Jahreszahl wird nicht übernommen

      Was bitte kann das sein?

      Hat Jemand eine Idee?

      Die Vars für Tag, Monat und Jahr usw. sind als Byte deklariert...

      Source Code

      1. Sub Clock_start_osc()
      2. Disable Interrupts
      3. '************ Inis der Uhr
      4. I2cstart
      5. I2cwbyte &B11011110 'Schreiben 0...
      6. I2cwbyte 0
      7. I2cwbyte &B10000000 'st(art)-bit in Sekunde muss gestartet werden
      8. I2cstop
      9. Enable Interrupts
      10. End Sub
      11. Sub Clock_trimmung()
      12. Local Platzhalter As Byte
      13. If Rtc_trimmung > 128 Then
      14. Platzhalter = Rtc_trimmung - 128
      15. Platzhalter.7 = 0
      16. Else
      17. Platzhalter = 128 - Rtc_trimmung
      18. Platzhalter.7 = 1
      19. End If
      20. Disable Interrupts
      21. I2cstart
      22. I2cwbyte &B11011110 'Schreiben 0...
      23. I2cwbyte &H08 'Speicheradresse
      24. I2cwbyte Platzhalter
      25. I2cstop
      26. Enable Interrupts
      27. End Sub
      28. Sub Clock_write_time
      29. Dim Xs As Byte
      30. '***************** schreibe Daten ***************
      31. 'Sekunden = 0 '&B10000000
      32. 'Xs = Makebcd(sekunden)
      33. 'Xs = Xs Or &B10000000 'Bit 7 setzten
      34. Disable Interrupts
      35. Xs = &B10000000
      36. '************ Inis der Uhr
      37. I2cstart
      38. I2cwbyte &B11011110 'Schreiben 0...
      39. I2cwbyte 0
      40. I2cwbyte &B10000000 'st(art)-bit in Sekunde muss gestartet werden
      41. I2cstop
      42. '************ Uhrzeit eintragen ***************
      43. I2cstart
      44. I2cwbyte &B11011110 'Schreiben 0...
      45. I2cwbyte 0 'Speicheradresse
      46. I2cwbyte Makebcd(xs)
      47. I2cwbyte Makebcd(minuten)
      48. I2cwbyte Makebcd(stunden)
      49. I2cstop
      50. Enable Interrupts
      51. End Sub
      52. Sub Clock_write_date
      53. Local Wochentag_akku As Byte
      54. Wochentag_akku = Wochentag 'Batt activate
      55. Wochentag_akku.3 = 1
      56. '***************** schreibe Daten ***************
      57. Disable Interrupts
      58. '************ Inis der RTC
      59. I2cstart
      60. I2cwbyte &B11011110 'Schreiben 0...
      61. I2cwbyte 0
      62. I2cwbyte &B10000000 'st(art)-bit in Sekunde muss gestartet werden
      63. I2cstop
      64. '************ datum eintragen ***************
      65. I2cstart
      66. I2cwbyte &B11011110 'schreiben 0...
      67. I2cwbyte 3 '...ab Adresse...
      68. I2cwbyte Wochentag_akku
      69. I2cwbyte Makebcd(tag)
      70. I2cwbyte Makebcd(monat)
      71. I2cwbyte Makebcd(jahr)
      72. I2cstop
      73. Enable Interrupts
      74. End Sub
      75. Sub Clock_read
      76. Local Error_counter As Byte
      77. Error_counter = 0
      78. Disable Interrupts
      79. Read_time_start:
      80. I2cstart
      81. I2cwbyte &B11011110 'schreiben: 0
      82. I2cwbyte 0
      83. I2cstart
      84. I2cwbyte &B11011111 'Lesen: 1
      85. I2crbyte Sekunden , Ack
      86. I2crbyte Minuten , Ack
      87. I2crbyte Stunden , Ack
      88. I2crbyte Wochentag , Ack
      89. I2crbyte Tag , Ack
      90. I2crbyte Monat , Ack
      91. I2crbyte Jahr , Nack
      92. I2cstop
      93. Enable Interrupts
      94. 'Sekunden = Sekunden And &B01111111 'Bit 7 löschen
      95. Sekunden.7 = 0
      96. Sekunden = Makedec(sekunden) ' - 80
      97. Minuten = Makedec(minuten)
      98. Stunden = Makedec(stunden)
      99. Wochentag.5 = 0
      100. Wochentag.4 = 0
      101. Wochentag.3 = 0
      102. Wochentag = Makedec(wochentag)
      103. Tag = Makedec(tag)
      104. Monat = Makedec(monat)
      105. Jahr = Makedec(jahr)
      106. If Error_counter < 5 Then
      107. If Monat = 0 Or Monat > 12 Or Tag = 0 Or Tag > 31 Or Err > 0 Then
      108. Incr Error_counter
      109. Waitms 30
      110. Goto Read_time_start
      111. End If
      112. End If
      113. If Error_counter = 5 Then
      114. Stunden = Stunde_alt
      115. Minuten = Minute_alt
      116. Sekunden = Sekunde_alt
      117. Wochentag = Wochentag_alt
      118. Tag = Tag_alt
      119. Monat = Monat_alt
      120. Jahr = Jahr_alt
      121. Else
      122. Stunde_alt = Stunden
      123. Minute_alt = Minuten
      124. Sekunde_alt = Sekunden
      125. Wochentag_alt = Wochentag
      126. Tag_alt = Tag
      127. Monat_alt = Monat
      128. Jahr_alt = Jahr
      129. End If
      130. Gosub Tages_name
      131. End Sub
      Display All
    • ja, mag sein, aber warum gehen die anderen Jahre alle, nur die Schaltjahre nicht?
      OK, es ist ein Bit vorhanden, in dem angezeigt wird, ob ein Jahr ein Schaltjahr ist, das kann ich aber nur lesen, insofern hat es ja keine Auswirkungen, oder?
      Im Datenblatt steht zur Sache nichts, nur eben das die im Chip gespeichert sind bis irgendwas um 2399 oder so. Nicht relevant, weil das BCD-Coding nur bis 2099 geht.
    • Pluto25: alle anderen Schaltjahre gehen auch nicht, alle "Nichtschaltjahre" funktionieren, das ist ja das seltsame.
      Ob das Schaltjahrbit stehen bleibt, keine Ahnung, müsste ich auslesen.

      Tatsächlich springt das Ding beim Rollover auf ein kleineres Jahr. Scheinbar chaotisch.
      Da geht richtig was schief.

      Vor allem:
      Es kann nichts mit der Laderoutine zu tun haben, denn das passiert auch, wenn das Teil ein ganz normalen Rollover aufs nächste (Schalt-)Jahr machen soll.
      Das Schaltjahrbit kann ich auch nicht beschreiben, also händisch, ist nur zum Lesen.
      ich werde nochmal versuchen, das Bit trotzdem mit einem Wert zu beschreiben, wird aber nichts, denke ich.
    • Machst Du Deine momentanen Tests in Deiner Komplettumgebung oder mit einem kleinen Testprogramm mit dem MCP790N?

      Es kann ja nur an drei Ecken hängen:
      Deine Kompletthardware
      Dein BASCOM-Programm
      Der MCP790N

      Die Kompletthardware schien ja bisher zu laufen, also das Ansprechen der RTC scheint ja hardwaremäßig zu funktionieren.
      Ich würde jetzt das wahrscheinlich große BASCOM-Programm zur Seite tun und nur ein minimales BASCOM-Programm nehmen. Damit die RTC auf 31.12.2019 23:58 stellen, drei Minuten warten und dann Datum/Zeit auslesen.
      Dieses kleine Programm kannst Du ja auch hier posten und das muss erst einmal funktionieren. Es ist m.E. schwer vorstellbar, dass ein Bug in der RTC ist. Irgendetwas ist eher in Deinem Gesamtprogramm versteckt. Daher Test mit Minimalprogramm.
    • Hi Stefan,
      ist wohl der einzige, sinnvolle Weg. Muss an der Software hängen.
      Allerdings ist das schon komisch, weil der Rollover ja auch nicht funktioniert.

      Aber es wird irgendwas an den Registern sein, ich beschreibe da was falsch oder so in der Art.

      Ich specke das Programm mal auf die RTC ab und poste es dann.
      Ist zwar ein Heidenaufwand, aber sonst komme ich nicht voran.

      Edit: Das mit den letzten Minuten Sylvester mache ich schon ständig. Die RTC verliert dann einfach den Zähler und springt auf die letzten, hochgeladenen Registereinträge.
      Die Zeit wird im Chip offensichtlich mit einem Counter incrementiert. Soviel ist schon mal klar. Im Falle der Schaltjahre scheint die RTC den counter zu "verlieren".
    • ha, die ganzen Kommentare von Euch haben mich auf den Fehler gebracht, es ist (fast) immer man selbst, klar, aber manchmal muss man das erneut gesagt bekommen!
      Ich habe mich da in eine Fehlerkonstruktion begeben, die in sich logisch war, aber das Problem nicht richtig erfasst hat.

      Es ist auslesen bzw. interpretieren der Bytes und dann die Wandlung mit MakeDEC.
      Da habe ich die Nullung einiger Bits im Byte übersehen.
      Das Problem taucht dann nur mit dem Schaltjahrbit auf, dann stimmt die Übersetzung mit MakeDEC nicht mehr, klar.
      Aber das ganze hat sich so merkwürdig dargestellt, dass mir alles verquer vorkam...

      Vielen Dank für Eure Kommentare, Anregungen und Vorschläge.
      Das hat es dann gebracht!

      Gruss

      The post was edited 1 time, last by Peer Gehrmann ().