Fehler in Softclock-Variablen Time$ und Date$ ?!?

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

    • Fehler in Softclock-Variablen Time$ und Date$ ?!?

      Hallo Leute!
      Habe hier schon die Forumssuche befragt, aber meinen sehr merkwürdigen Sachverhalt nirgendwo gefunden.

      Schon zig mal habe ich unter Bascom die "Config Clock = Soft" im Zusammenhang mit dem Asynchronen Timer2 mit 32,768kHz-Uhrenquarz genutzt, was immer auf Anhieb funktionierte.
      Seit gestern Abend versuche ich das selbe auf einer umfangreicheren neuen Platine an einem ATmega1284.
      Haupttakt kommt von einem Baud-Quarz 11,0592MHz, an den TOSC1&2 hängt ein LFXTAL002996:
      32,768kHz
      CL = 12,5pF
      Co = 2,5pF
      Drive: 1,0µW
      ESR max. 50k

      Das selbe Uhrenquarz läuft auf verschiedenen Projekten zuverlässig.
      Eine Messung eben zeigte an TOSC1 und TOSC2 eine saubere und korrekte 32,768kHz mit ca. 300mV.
      Der Hauptquarz läuft auf 11,059xMHz mit etwa 2,6V.
      Beide Quarze laufen, der Sectic wird auch sekündlich angesprungen und ausgeführt:

      BASCOM Source Code

      1. $Regfile="m1284def.dat"
      2. $Crystal=11059200
      3. $hwstack=400
      4. $swstack=200
      5. $framesize=320
      6. $Baud=115200
      7. $Baud1=38400
      8. Open "COM1:" for Binary as #1 ' Öffne Com1 zum ESP-WLAN
      9. Open "COM2:" for Binary as #2 ' öffne Com2 zur Serviceschnittstelle
      10. Config Clock = Soft , Gosub = Sectic
      11. config Date = DMY , Separator = DOT
      12. Date$ = "13.05.19"
      13. Time$ = "14:42:40"
      14. enable Interrupts
      15. Do
      16. waitms 500
      17. Loop
      18. Sectic:
      19. Print #2 , "Sectick ";Date$;" ";Time$;" _sec:";_sec
      20. return
      Display All


      Was aber neu ist, und was ich mir nicht erklären kann:
      In den ersten Anläufen war die Ausgabe für Date$ nicht wie in Zeile 15 vorgegeben nicht "13.05.19" sondern kurioser weise "05.19.00" und die Time$ verhaarte auf den in Zeile 16 vorgegebenen Wert "14:42:40".

      Nach mehrfachen Versuchen und neuprogrammierungen, inklusive löschen der Projekt.cfg stimmt nun augenscheinlich zumindest die Ausgabe von Date$.
      Jedoch Time$ verhaart noch immer auf den Vorgabewert.
      Genauer betrachtet über längere Zeiträume ändert sie sich doch, jedoch sind die Sekunden dort als Minuten gezählt!

      Statt "hh:mm:ss" wird in Time$ ausgegeben "??:hh:mm".
      Daher habe ich in Sectic noch testweise die _sec mit rein gepackt, und siehe da:

      Source Code

      1. Sectick 13.05.19 00:14:43 _sec:0
      2. Sectick 13.05.19 00:14:43 _sec:1
      3. Sectick 13.05.19 00:14:43 _sec:2
      4. Sectick 13.05.19 00:14:43 _sec:3
      5. Sectick 13.05.19 00:14:43 _sec:4
      6. Sectick 13.05.19 00:14:43 _sec:5
      7. Sectick 13.05.19 00:14:43 _sec:6
      8. Sectick 13.05.19 00:14:43 _sec:7
      9. Sectick 13.05.19 00:14:43 _sec:8
      10. Sectick 13.05.19 00:14:43 _sec:9
      11. Sectick 13.05.19 00:14:43 _sec:10
      12. Sectick 13.05.19 00:14:43 _sec:11
      13. Sectick 13.05.19 00:14:43 _sec:12
      14. Sectick 13.05.19 00:14:43 _sec:13
      15. Sectick 13.05.19 00:14:43 _sec:14
      16. Sectick 13.05.19 00:14:43 _sec:15
      17. Sectick 13.05.19 00:14:43 _sec:16
      18. Sectick 13.05.19 00:14:43 _sec:17
      19. Sectick 13.05.19 00:14:43 _sec:18
      20. Sectick 13.05.19 00:14:43 _sec:19
      21. Sectick 13.05.19 00:14:43 _sec:20
      22. Sectick 13.05.19 00:14:43 _sec:21
      23. Sectick 13.05.19 00:14:43 _sec:22
      24. Sectick 13.05.19 00:14:43 _sec:23
      25. Sectick 13.05.19 00:14:43 _sec:24
      26. Sectick 13.05.19 00:14:43 _sec:25
      27. Sectick 13.05.19 00:14:43 _sec:26
      28. Sectick 13.05.19 00:14:43 _sec:27
      29. Sectick 13.05.19 00:14:43 _sec:28
      30. Sectick 13.05.19 00:14:43 _sec:29
      31. Sectick 13.05.19 00:14:43 _sec:30
      32. Sectick 13.05.19 00:14:43 _sec:31
      33. Sectick 13.05.19 00:14:43 _sec:32
      34. Sectick 13.05.19 00:14:43 _sec:33
      35. Sectick 13.05.19 00:14:43 _sec:34
      36. Sectick 13.05.19 00:14:43 _sec:35
      37. Sectick 13.05.19 00:14:43 _sec:36
      38. Sectick 13.05.19 00:14:43 _sec:37
      39. Sectick 13.05.19 00:14:43 _sec:38
      40. Sectick 13.05.19 00:14:43 _sec:39
      41. Sectick 13.05.19 00:14:43 _sec:40
      42. Sectick 13.05.19 00:14:43 _sec:41
      43. Sectick 13.05.19 00:14:43 _sec:42
      44. Sectick 13.05.19 00:14:43 _sec:43
      45. Sectick 13.05.19 00:14:43 _sec:44
      46. Sectick 13.05.19 00:14:43 _sec:45
      47. Sectick 13.05.19 00:14:43 _sec:46
      48. Sectick 13.05.19 00:14:43 _sec:47
      49. Sectick 13.05.19 00:14:43 _sec:48
      50. Sectick 13.05.19 00:14:43 _sec:49
      51. Sectick 13.05.19 00:14:43 _sec:50
      52. Sectick 13.05.19 00:14:43 _sec:51
      53. Sectick 13.05.19 00:14:43 _sec:52
      54. Sectick 13.05.19 00:14:43 _sec:53
      55. Sectick 13.05.19 00:14:43 _sec:54
      56. Sectick 13.05.19 00:14:43 _sec:55
      57. Sectick 13.05.19 00:14:43 _sec:56
      58. Sectick 13.05.19 00:14:43 _sec:57
      59. Sectick 13.05.19 00:14:43 _sec:58
      60. Sectick 13.05.19 00:14:43 _sec:59
      61. Sectick 13.05.19 00:14:44 _sec:0
      62. Sectick 13.05.19 00:14:44 _sec:1
      63. Sectick 13.05.19 00:14:44 _sec:2
      64. Sectick 13.05.19 00:14:44 _sec:3
      65. Sectick 13.05.19 00:14:44 _sec:4
      66. Sectick 13.05.19 00:14:44 _sec:5
      67. Sectick 13.05.19 00:14:44 _sec:6
      68. Sectick 13.05.19 00:14:44 _sec:7
      69. Sectick 13.05.19 00:14:44 _sec:8
      70. Sectick 13.05.19 00:14:44 _sec:9
      Display All

      Rechner schon mehrfach gestartet, den µC zigmal neu programmiert...alles ohne Erfolg.
      Wo könnte da der Fehler liegen?

      Jürgen
    • Ist wirklich komisch. Time$ ist ja ein string, der aus _hour, _min und _sec zusammengebastelt wird. Wie verhält es sich mit diesen Variablen? Diese werden natürlich mit dem time$ auch gesetzt. Also mal _hour... setzen und dann das time$ anzeigen lassen und auch mal umgekehrt.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Teste mal das.
      Musst im Simulator Sim Timer aktivieren und den interrupt auslößen.

      BASCOM Source Code

      1. $regfile = "m16def.dat"
      2. $crystal = 11059200
      3. $hwstack = 80
      4. $swstack = 80
      5. $framesize = 80
      6. $baud = 115200
      7. '$baud1 = 38400
      8. 'Open "COM1:" for Binary as #1 ' Öffne Com1 zum ESP-WLAN
      9. 'Open "COM2:" for Binary as #2 ' öffne Com2 zur Serviceschnittstelle
      10. Config Timer1 = Timer , Prescale = 256 'Timer konfigurieren
      11. On Timer1 Timer_irq 'Timerinterrupt Subroutine zuweisen
      12. Enable Timer1 'Timer aktivieren
      13. Start Timer1 'Timer starten
      14. Config Clock = User 'Use USER to write/use your own code
      15. Config Date = Dmy , Separator = . 'deutsches Datumsformat
      16. Dim Timer_1sec As Byte , Second_tick As Long
      17. Date$ = "13.05.19"
      18. Time$ = "23:59:40"
      19. Second_tick = Syssec()
      20. enable Interrupts
      21. Do
      22. If Timer_1sec = 0 Then
      23. Timer_1sec = 1
      24. Time$ = Time(second_tick)
      25. Date$ = Date(second_tick)
      26. Print "Sectick " ; Date$ ; " " ; Time$ ; " _sec:" ; _sec
      27. End If
      28. Loop
      29. '------------[ Timer IRQ]------------
      30. Timer_irq: 'Beginn Subroutine
      31. Timer1 = 22336 'Timer auf neuen Startwert einstellen
      32. Incr Second_tick
      33. If Timer_1sec >= 0 Then Decr Timer_1sec
      34. 'Programmbefehle einfügen
      35. Return 'Ende Subroutine
      36. '---------------------------------------
      37. '---------------------------------------
      38. Getdatetime:
      39. 'called when date or time is read
      40. Return
      41. Setdate:
      42. 'called when date$ is set
      43. Return
      44. Settime:
      45. 'scanned when time$ is set
      46. Return
      47. '---------------------------------------
      Display All


      Die Zählschritte des Timers betragen nun: Quarzfrequenz / Prescale = 11.0592 MHz / 256 = 43200 Hz - also alle 0.023148148148148147 ms.
      Der Timer benötigt insgesamt bis die 65536 Schritte voll gezählt sind: 0.023148148148148147 ms x 65536 = 1.517037037037037 Sekunden.
      Stellt man nun den Timer im Unterprogramm gleich auf einen Startwert ein(nicht auf 0), dann zählt er von dort ab bis er die vollen 65536 Schritte erreicht hat und dann auf 0 umschlägt.
      So verkürzt man die Interrupts des Zählers.


      Will man nun den Takt statt alle 1.517037037037037 Sekunden genau auf 1 Sekunden einstellen, dann darf der Timer nur noch 1 Sekunden / 0.023148148148148147 ms = 43200 Zählschritte zählen.
      Zieht man jetzt diesen Wert vom Maximalwert 65536 ab, ergibt das dann den Startwert von: 22336.
      Der Timer zählt jetzt also immer von 22336 bis 65536 und der Interrupt wird dann alle 1 Sekunden angesprungen, also mit 1 Hz.
      Das Voreinstellen auf den Startwert sollte man gleich als erstes im Unterprogramm erledigen.
      Der Timer kann dann im Hintergrund schon korrekt weiterzählen, während man andere Befehle ausführen lässt.
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___

      The post was edited 2 times, last by Trexis5 ().

    • Hallo!

      tschoeatsch wrote:

      Ist wirklich komisch. Time$ ist ja ein string, der aus _hour, _min und _sec zusammengebastelt wird. Wie verhält es sich mit diesen Variablen? Diese werden natürlich mit dem time$ auch gesetzt. Also mal _hour... setzen und dann das time$ anzeigen lassen und auch mal umgekehrt.
      Ja eben drum. Sieht so aus als ob genau dort der Fehler liegt, wo aus den Einzelbytes _hour, _min und _sec der String Time$ zusammengesetzt wird.
      Nur wo? Die LIB's und LBX "datetime" und "eurotimedate" sind original und unverändert, bliebe nicht in Bascom selber was eingebautes.

      Habe die Sectic-Ausgabe mal erweitert:

      BASCOM Source Code

      1. $Regfile="m1284def.dat"
      2. $Crystal=11059200
      3. $hwstack=400
      4. $swstack=200
      5. $framesize=320
      6. $Baud=115200
      7. $Baud1=38400
      8. Open "COM1:" for Binary as #1 ' Öffne Com1 zum ESP-WLAN
      9. Open "COM2:" for Binary as #2 ' öffne Com2 zur Serviceschnittstelle
      10. Config Clock = Soft , Gosub = Sectic
      11. config Date = DMY , Separator = DOT
      12. Date$ = "13.05.19"
      13. Time$ = "14:42:40"
      14. enable Interrupts
      15. Do
      16. waitms 500
      17. Loop
      18. Sectic:
      19. Print #2 , "Sectick ";Date$;" ";Time$;" Einzeln: ";_day;".";_month;".";_year;" ";_hour;":";_min;":";_sec
      20. return
      Display All
      Die Ausgabe sieht dann so aus:


      Source Code

      1. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:37
      2. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:38
      3. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:39
      4. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:40
      5. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:41
      6. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:42
      7. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:43
      8. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:44
      9. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:45
      10. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:46
      11. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:47
      12. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:48
      13. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:49
      14. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:50
      15. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:51
      16. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:52
      17. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:53
      18. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:54
      19. Sectick 13.05.19 00:14:43 Einzeln: 13.5.19 14:43:55
      Display All
      Die Einzelvariablen _day, _month, _year, _hour, _min und _sec funktionieren perfekt wie es soll. Wenn ich diese Manuell ändere dann werden die neuen Werte weiterhin an der falschen Stelle in dem Time$-String eingesetzt.
      Ändere ich z.B. _hour von 14 auf 16, dann ändert sich Time$ von "00:14:43" auf 00:16:43".
      Ändere ich _min auf 50 dann ändert sich Time$ von "00:16:43" auf "00:16:50".

      Ich glaube ich krame gleich mal nen anderes Projekt aus wo der kleinere aber der selben Familie angehörenden Mega 324 und dem selben Uhrenquarz dran hängt.
      Allerdings glaube ich nicht wirklich an einem µC-Defekt, denn die RTC funktioniert ja, nur der Zusammenbau zum String verufallt.

      Sehr merkwürdig...


      Trexis5 wrote:

      Teste mal das.
      Musst im Simulator Sim Timer aktivieren und den interrupt auslößen.
      Hmm, und was für eine Erwartung sollte ich damit haben?
      Den Timer1 via Mainclock laufen zu lassen wäre m.E. nur zielführend um zu testen ob es an einem defekten Timer2 liegt.
      Genau das gilt aber bereits als ausgeschlossen, denn die Sectic wird exakt jede Sekunde ausgeführt und _sec hoch gezählt.
      Wenn Timer2 nicht laufen würde (bereits getestet durch kapazitive Belastung der TOSC-Pins) würde beides nicht funktionieren.

      Mein Fehler liegt offenbar genau an der Stelle wo die korrekten Variablen _hour, _min und _sec zu dem Time$-String zusammengesetzt werden.
      Nur wo ist das?
      Nicht in meinem Quelltext, sondern irgendwo im Hintergrund von Bascom oder einer Lib.
      Die verdächtigen Lib bzw. LBX datetime.* und eurodatetime.* sind offenbar unverändert in Originalfassung - sicherheitshalber aber bereits nochmals durch originale ersetzt.

      Jürgen
    • Ist das jetzt ein verkürztes Programm, oder der erste Test, ob es mit der softclock geht? Wenn letzteres, dann dim doch mal paar Variablen, dass nicht nur _sec... als Variablen abgelegt werden. Das time$ scheint ja irgendwie daneben zu greifen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo!

      Ihr seid Helden! Das war's!!!
      Hab eben das andere Projekt rausgekramt und siehe da: Softclock geht wie immer!
      Doch ein Dachschaden der ATmega1284?
      Als ich dann eben den Link von Tales gelesen habe, musste ich mir die Augen reiben.
      Versucht...und läuft!

      Bevor ich anfange darüber zu murren das dieser offenbar bekannte Fehler nirgendwo im BASCOM-Handbuch (weder PDF noch online) erwähnt wird, mache ich lieber Feuerabend für heute und freue mich das ich den µC nicht wieder runter löten muss.

      Danke!

      Jürgen