Forum: Mikrocontroller und Digitale Elektronik Bascom RTC , Zeit schreiben


von Mario G. (rodenberger)


Lesenswert?

Bin kurz vorm zusammenbruch.

Ich nutze den DS1338 als Echtzeituhr.
Die Routine zum lesen ist mit dem DS1307 scheinbar gleich.

Das auslesen klappt super.

Aber das schreiben....

Erst mal die Routine:

'Im Hauptprogramm steht:
.......
  Config Clock = Soft

  Date$ = "01.02.03"
  Time$ = "01:02:03"

  Gosub Setdatetime
......


Setdatetime:

   _sec = Makebcd(_sec)
   _min = Makebcd(_min)
   _hour = Makebcd(_hour)

   I2cstart
   I2cwbyte Ds1338w
   I2cwbyte 0                                     'address pointer
   I2cwbyte _sec
   I2cwbyte _min
   I2cwbyte _hour
   I2cstop

   _day = Makebcd(_day)
   _month = Makebcd(_month)
   _year = Makebcd(_year)
   I2cstart
   I2cwbyte Ds1338w
   I2cwbyte 3
   I2cwbyte _weekday
   I2cwbyte _day
   I2cwbyte _month
   I2cwbyte _year
   I2cstop

  Return

###################
nun ist das Jahr aber nicht 03 , sondern 3
bei
  Date$ = "10.11.12"
  Time$ = "13:14:15"

kommt 16.17.18 und 19:20:21 RAUS, das steht plötzlich so in der 
Variablen _sec _min ......

Starte ich neu, dann ist im RTC aber das richtige gespeichert, abgesehen 
von der 03.
Mir ist nicht klar, warum der Time$ plötzlich höhere Werte annimmt.

Das Problem ist Extrem, wenn man die Uhr stellen will.
Zum BSP mit

    _min = _min + 1
      If _min = 60 Then
       _min = 00
       _hour = _hour + 1
      End If
Dann kommen schon mal Uhrzeiten raus die gibt es gar nicht.

Wie sind die Variablen _sec in Bascom überhaupt Dimensioniert?
Mal ist es ein MACEBCD und mal Byte???
Wie kann ich denn einen Wert 03 übertragen? ist ja kein STRG
Und noch was. Muss ich beim stellen den Interrupt oder sonst was 
stoppen?
Denn die Variablen werden im UP ja umgewandelt, aber auch gleichzeitig 
durch die weiterlaufende Uhr geändert???

Ich stehe echt auf dem Schlauch.
Vielen Dank fürs lesen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mario G. schrieb:
> bei
>   Date$ = "10.11.12"
>   Time$ = "13:14:15"
>
> kommt 16.17.18 und 19:20:21 RAUS, das steht plötzlich so in der
> Variablen _sec _min ......

 Natürlich, das ist BCD, wird aber als HEX angezeigt.

 Wenn es MakeBcd() gibt, sollte es auch MakeDec() geben, so dass
1
    _min = MakeDec(_min) + 1
 funktionieren sollte.

von Frank T. (frank_t40)


Lesenswert?

Wende dich mal dorthin.
https://bascomforum.de/

von Mario (Gast)


Lesenswert?

Jetzt dämmert es. In der Routine wird in BCD umgewandelt. Hmmmm aber 
nicht zurück. Warum schreibt man dann nicht mit anderen Variablen in den 
RTC?

s = Makebcd(_sec)

von Fred R. (fredylich)


Lesenswert?

Mario schrieb:
> Jetzt dämmert es. In der Routine wird in BCD umgewandelt. Hmmmm aber
> nicht zurück. Warum schreibt man dann nicht mit anderen Variablen in den
> RTC?
>
> s = Makebcd(_sec)

Hallo
So funktioniert es 100% mit DS1307.
Nur als Tipp ansehen.

Setdate:
  I2cstart                       ' Start
   I2cwbyte Ds1307w              ' DS1307 schreiben
   I2cwbyte 3                    ' DS1307 Adresszeiger auf 4 (Byte 5) 
stellen
   Byt = Dayofweek()
   I2cwbyte Byt
   _day = Makebcd(_day)
   I2cwbyte _day                 ' Tag schreiben
   _month = Makebcd(_month)
   I2cwbyte _month               ' Monat schreiben
   _year = Makebcd(_year)
   I2cwbyte _year                ' Jahr schreiben
  I2cstop
 Return
Settime:
  I2cstart                     ' Start
   I2cwbyte Ds1307w            ' DS1307 schreiben
   I2cwbyte 0                  ' DS1307 Adresszeiger auf 0 stellen
    _sec = Makebcd(_sec)
   I2cwbyte _sec               ' Sekunden schreiben
   _min = Makebcd(_min)
   I2cwbyte _min               ' Minuten schreiben
   _hour = Makebcd(_hour)
   I2cwbyte _hour              ' Stunden schreiben
  I2cstop
Return

'******* Parameter auslesen *********
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w 'Diese Ansteuerung entspricht Figure 6 im Datenblatt, 
also erst schreiben,
  I2cwbyte 0          'dann repeated start und anschließend lesen!
  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
   I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
   I2cstop
   _weekday = Makedec(_weekday)
   _day = Makedec(_day)
   _month = Makedec(_month)
   _year = Makedec(_year)
   _sec = Makedec(_sec)
   _min = Makedec(_min)
   _hour = Makedec(_hour)

Return

Werde in kürze mein Projekt „Uhr mit Kalender“ im Bascomforum 
vorstellen.

Anzeige LED(Max7219) und oder LCD
Uhrzeit wird täglich korrigiert.
Zeitumstellung automatisch.
Taster für manuelle Einstellung.
Anzeige der kirchlichen Feiertage(berechnet nach Osterkalender)
Anzeige der allg. Feiertage und Geburtstage.

Gruß

von Mario G. (rodenberger)


Lesenswert?

oh danke.
ich hab das unterprogramm geändert und am ende beim schreiben


   _sec = Makedec(_sec)
   _min = Makedec(_min)
   _hour = Makedec(_hour)

   _day = Makedec(_day)
   _month = Makedec(_month)
   _year = Makedec(_year)

hinzugefügt.

Dann stimmt es auch wieder, wenn ich ins hauptprogramm gehe.
Das hab ich übersehen, aber weiter oben den tip bekommen

in den anderen Routinen zum rtc steht es auch nicht. find ich komisch

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.