Batterietester für NiMh und LiIon mit AVR-DOS Datenlogger

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

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Ach und nochwas:
      wie wirken sich "wait", "waitms", "waitus" und ggf. auch "getadc", "Encoder( )" auf die Timer und hier in dem Beispiel insbesondere auf Timer1 und Timer3 aus?
      Das ist mir leider nicht ganz klar.
      Führen "wait"'s zum Pausieren irgendwelcher Timer?
      Vor "getadc" kann noch ein Powermode gesetzt werden um so wenig wie möglich Störungen "mitzumessen". Hierdurch werden doch aber bestimmt Timer pausiert, oder? (Alle? Oder: welche?)
      In diesem Fall müßte ich auf powermode vor dem AD-Wandeln verzichten, denn für die AD-Wandlerei (je 8x verteilt über 20ms zur Unterdrückung des 50Hz Brumms) wird in Summe der Wandlungszeiten zwar nur je etwa je 8x100us, insgesamt für alle "Kanäle", Ströme und Spannungen aber 160ms beanspruchen, was schon eine ganze Menge ist und sich auf die Erfassung gemessener "mAh" auswirken würde.
    • laase schrieb:

      DCF77 kommt für mich nicht in Frage
      Muß es nicht. Aber sie zu configuriereen richtet eine Clock und die dazugehörigen Date$ und Time$ ein. Die laufen dann mit dem onchip Timer und würden gestellt wenn ein dcf da wäre. Einmal gestellt (Time$ = "12:34:56" : Date$ = "01.02.03") lauft die Zeit einfach weiter.
      Wie sie dargestellt wird (Print oder LCD ) kann mit Config eingestellt werden z.B Config Date = Dmy , Separator = .

      djmsc schrieb:

      mit einer RTC
      falls jemand eine hat die brauchbar ist würde ich gerne den Chip wissen. Die ich versucht hatte waren erheblich schlechter als die billigte Armbanduhr mehrere Sekunden/Minuten am Tag ;( das schafft der Avr ohne Quarz.
      Einziger Vorteil war das er die ungefähre Zeit sofort nach dem Stromausfall hatte, der mit der DCF erst nach Minuten dafür aber richtig.

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

    • Finger zu schnell

      hab folgendes reingepfriemelt, sorry, ist wirklich gepfriemelt.
      Unschön, ich weiß a_28_2c02f089

      am Anfang

      Quellcode

      1. ' begin Time_Date Definitions #########################
      2. Config Clock = User
      3. Config Date = Dmy , Separator = .


      ganz am Ende wo es nicht stört

      Quellcode

      1. Settime:
      2. Return
      3. Getdatetime:
      4. Return
      5. Setdate:
      6. Return

      Und vor Erzeugen der Mess-Datei die Systemvariablen betanken


      Quellcode

      1. Gosub Rtc_time
      2. date$=Bcd(tag)+ "." + Bcd(monat) + "." + Bcd(jahr)
      3. time$=Bcd(stunden) + ":" + Bcd(minuten) + ":" + Bcd(sekunden)
      4. Str16 = Str(dateizaehler) + ".txt"
      5. Open Str16 For Append As #20
      6. Waitms 50
      7. Str16 = "Messung Nr " + Str(dateizaehler)
      8. Print #20 , Str16
      Alles anzeigen
      Den Rest erledigt AVR-DOS
      Dateien

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

    • Danke euch allen!
      Ich habe es zuerst mit BEIDEN probiert, Config Clock UND Config DCF77, das ging nicht ("Variable already dimesnioned"). Danach nur mit Config DCF77, weil mir das für meine Anwednung (keine RTC vorhanden) vielversprechender erschien.
      Erst einmal: ja, das geht. Auch ohne DCF77. Aber es gibt Probleme:
      1. die Zeitzählung erscheint mir zu langsam. Nach 6min "fehlten" bereits 4sec. So ungenau ist der Quarz auf dem Arduino Mega2560 board meiner Meinung nach nicht.
      2. Das Jahr "21" wird bei der Übernahme nicht erkannt. Stattdessen macht die Routine in der LCD Ausgabe "15" daraus.
      3. Die Stunde "18" wird in der Übernahme nicht erkannt. Stattdessen macht die Routine "12" daraus. (Fehlt mir hier eine Option 24h?)
      4. Da die Routine DCF77 auch auf den Timer1 zugreift, hatte ich meiner Meinung nach nur die Wahl zwischen
      a) ich lasse meine Timer1_ISR NICHT laufen (so war es, als ich die Zeile "Enable Timer1" auskommentiert hatte.) Das fürhte dazu, daß ich nicht mit "IstneueSekunde" aus Zeitfressendenden Untermenüs rausspringen konnte. Und somit dazu, daß mir die Zeit nur alle zwei bis drei Sekunden per LCD angezeigt wurde. Wäre unzufriedenstellend im späteren Programm, da ich die Mainloop für alle "Kanäle", in denen momentan gerade nichts per Encoder eingestellt wird, ja schon sekündlich durchlaufen will.

      b) ich enable den Interrupt Timer1 mit der Zeile s.o., dann läuft aber die DCF77 nicht und die Zeit bleibt dauernd bei 12:00:00. Mehr als unzufriedenstellend


      Wie kann ich BEIDES zusammenbringen, meine ISR und den korrektem Zeitlauf mit der DCF77 Routine? Muß ich wirklich einen dritten 16Bit Timer bemühen (hat der Mega2560 überhaupt drei 16Bit Timer?)

      DIe Speicherung der vier Dateien (4 Kanäle mit jeweils einer Zelle dran ...) bin ich noch nicht angegangen, das kommt, wenn die Zeit "sauber läuft" ...

      Woher werden Speicherzeit und Speicherdatum letzlich bezogen? Von Date$ und Time$? Dann sollte ich vielleicht doch die DCF77 wieder rausnehmen und wieder zur Config Clock und eigener "Uhrerzeugung" wechseln? die DCF77 "nimmt" auch ca. 600Byte mehr. Nicht, daß das am Mega2560 superwichtig wäre, aber erwähnen kann man es ja schon einmal.
      Hier noch der Code von b)

      BASCOM-Quellcode

      1. 'Konfiguration
      2. $regfile = "m2560def.dat"
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 120
      6. $crystal = 16000000 'Quarzfrequenz
      7. Dim Seconds As Byte
      8. Dim Secondsold As Byte
      9. Dim Minutes As Byte
      10. Dim Hours As Byte
      11. Dim Days As Byte
      12. Dim Startsecond As Byte
      13. Dim Startminute As Byte
      14. Dim Starthour As Byte
      15. Dim Startday As Byte
      16. Dim Startmonth As Byte
      17. Dim Startyear As Byte
      18. 'Sind durch config clock eingeführt:
      19. '_sec As Byte
      20. '_min As Byte
      21. '_hour As Byte
      22. '_day As Byte
      23. '_month As Byte
      24. '_year As Byte
      25. Dim Istneuesekunde As Bit 'Flag dafür, daß man in irgendwelchen langwierigen Encoder-Menü-Operationen jetzt unbedingt zur Hauptroutine zurückspringen muß
      26. 'Config Clock = User
      27. Config Date = Dmy , Separator = Dot
      28. '702 Byte OHNE Config DCF77, aber mit Config Clock. 1378 Byte mit Config DCF77, aber ohne Config Clock. -> Config DCF77 "braucht" 676 Byte mehr!
      29. 'DCF77 soll für die Funktionalität auch dann genutzt werden, wenn gar kein DCF77 Empfänger vorhanden ist:
      30. Config Dcf77 = Pinc.7 , Timer = 1 , Timer1sec = 1 'C.7 wird hier als Dummyeingang missbraucht (daran ist nichts angeschlossen)
      31. Const Timer1reload = 15625
      32. 'Config Timer1 = Timer , Prescale = 1024 'Timer1 wurde schon mit Config DCF77 geladen!
      33. Load Timer1 , Timer1reload
      34. On Ovf1 Timer1_isr
      35. Enable Timer1 'wichtig: hier geht es um das Enablen des INTERRUPTS, nicht des Timers ... (muß ein sein, damit die ISR auch wirklich ausgeführt wird)
      36. Start Timer1
      37. Enable Interrupts
      38. 'wichtig für LCD-Anzeige! (ohne ...=Output ging es nicht!)
      39. Config Porta.1 = Output : Config Porta.3 = Output : Config Porta.5 = Output : Config Porta.7 = Output : Config Porth.0 = Output : Config Porth.1 = Output
      40. Config Lcdpin = Pin , Db4 = Porta.1 , Db5 = Porta.3 , Db6 = Porta.5 , Db7 = Porta.7 , E = Porth.0 , Rs = Porth.1 'in der nä Zeile kommen die zugehörigen Arduino Mega2560 Pinnumerierungen
      41. 'Config Lcdpin = Pin , Db4 = D23 , Db5 = D25 , Db6 = D27 , Db7 = D29 , E = D17 , Rs = D16 'befinden sich alle bis auf Rs und E auf der rechten (Außen)Seite der 2-reihigen Pfostenbuchse. (wenn ohne Ramps-Adpaterstecker)
      42. Config Lcd = 20 * 4 'Chipset = Ks077 'LCD-Initialisierung, eigtl. 8x2
      43. Cls 'ist wichtig als Reset des LCD nach der Definition
      44. 'hier jetzt das Programm
      45. '...
      46. 'darin:
      47. Gosub Alte_zeit_aus_dem_eeprom_holen
      48. Gosub Neue_zeit_per_encoder_einstellen
      49. '...
      50. Do
      51. Hierherzurueck:
      52. Istneuesekunde = 0
      53. 'Gosub Zeitweiterstellen 'das entfällt dann durch die Config Clock bzw DCF77
      54. Gosub Wichtige_zeitkritische_sachen
      55. '...
      56. Gosub Superlangedauernde_einstellerei
      57. If Istneuesekunde = 1 Then Goto Hierherzurueck
      58. Waitms 500
      59. '...
      60. Loop
      61. Wichtige_zeitkritische_sachen:
      62. '...
      63. 'Spannung und Strom sekündlich messen und ins SRAM speichern
      64. 'ggf. Werte per LCD auf den anderen (nicht gerade zu parametrierenden) Kanälen anzeigen
      65. 'ggf. richtige Datei öffen, auf SD speichern, wenn xyz Byte in einem Kanal "voll"
      66. Locate 1 , 1 : Lcd Date$ ; " " ; Time$
      67. '...
      68. Return
      69. Alte_zeit_aus_dem_eeprom_holen:
      70. 'readeeprom ...
      71. Return
      72. Neue_zeit_per_encoder_einstellen:
      73. 'bietet letztbekanntes Altdatum als Startwert an
      74. 'hier ein längeres Einstellmenü, das u.a. den Timer 3 (auch ein 16Bit Timer) nutzt
      75. 'nehmen wir mal an, dabei käme folgendes raus:
      76. Startsecond = 0
      77. Startminute = 0
      78. Starthour = 18
      79. Startday = 7
      80. Startmonth = 2
      81. Startyear = 21
      82. Date$ = Bcd(startday) + "." + Bcd(startmonth) + "." + Bcd(startyear)
      83. Time$ = Bcd(starthour) + ":" + Bcd(startminute) + ":" + Bcd(startsecond)
      84. Return
      85. 'das brauche ich mit Config DCF77 bzw. RTC nicht mehr:
      86. Zeitweiterstellen:
      87. If Seconds >= 60 Then
      88. Seconds = 0
      89. Incr Minutes
      90. End If
      91. If Minutes >= 60 Then
      92. Minutes = 0
      93. Incr Hours
      94. End If
      95. If Hours >= 24 Then
      96. Hours = 0
      97. Incr Days
      98. End If
      99. 'usw.
      100. Return
      101. Superlangedauernde_einstellerei:
      102. '...
      103. If Istneuesekunde = 1 Then Goto Sofortraushier
      104. Waitms 500 'nur für die Simulation!
      105. If Istneuesekunde = 1 Then Goto Sofortraushier
      106. Waitms 500 'nur für die Simulation!
      107. If Istneuesekunde = 1 Then Goto Sofortraushier
      108. Waitms 500 'nur für die Simulation!
      109. If Istneuesekunde = 1 Then Goto Sofortraushier
      110. Waitms 500 'nur für die Simulation!
      111. If Istneuesekunde = 1 Then Goto Sofortraushier
      112. '...
      113. Sofortraushier:
      114. Return
      115. 'das hier ganz zuletzt hinter den Subs:
      116. Timer1_ISR:
      117. Load Timer1 , Timer1reload
      118. Incr Seconds
      119. Istneuesekunde = 1
      120. 'Add your ISR code here
      121. Return
      122. 'Timer value explination
      123. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
      124. ' The AVR is running at 16000000Hz, the prescaler is 1024
      125. ' Each tick is 0,064 ms - (1 / CPUSpeed in KHz ) * Prescaler
      126. ' The timer needs 15625 ticks to reach the required time ( 15625 * 0,064 = 1000ms)
      127. ' The start value for the timer must be set to 49911 so that it will overflow at 65536 after 15625 ticks
      128. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
      Alles anzeigen
    • Config DCF77 ist auf Timer1, den kannst du nicht nochmal benutzen.
      Klar, dass es da Probleme gibt.


      laase schrieb:

      Das Jahr "21" wird bei der Übernahme nicht erkannt. Stattdessen macht die Routine in der LCD Ausgabe "15" daraus.
      3. Die Stunde "18" wird in der Übernahme nicht erkannt. Stattdessen macht die Routine "12" daraus. (Fehlt mir hier eine Option 24h?)
      der BCD Wert von 21 ist?
      Der BCD Wert von 18 ist? :D
    • Nur überflogen: Das ist "doppelt gemoppelt". Die config Dcf richtet ihren Timer selbst ein eine weiter "Verbiegung" ist Kontraproduktiv.

      laase schrieb:

      Date$ = Bcd(startday) + "." + Bcd(startmonth) + "." + Bcd(startyear)
      Time$ = Bcd(starthour) + ":" + Bcd(startminute) + ":" + Bcd(startsecond)
      Warum nicht einfach Date$="01:02:04" Das "reperiert" sich bei dummen Eingaben (_min=78 bleibt 1min falsch)
      Date$ nicht ich habe heute den "date 35.15.27"
    • @Michael: aber wie kriege ich meine Byte Variablen denn sonst in die Date$ und Time$ rein?
      Mit

      Startsecond = 0
      Startminute = 0
      Starthour = 18
      Startday = 7
      Startmonth = 2
      Startyear = 21
      Date$ = Str(startday) + "." + Str(startmonth) + "." + Str(startyear)
      Time$ = Str(starthour) + ":" + Str(startminute) + ":" + Str(startsecond)

      klappt es jedenfalls auch nicht.

      @Pluto25: die "dummen Eingangen" kann ich in der Eingabe-Menüroutine einfach ausschließen. Das funktioniert soweit auch schon (nicht hier im Beispiel enthalten ...)
    • laase schrieb:

      Wie kann ich BEIDES zusammenbringen
      In dem du bei der Config Dcf77.. noch die Sub mit aufrufst.

      BASCOM-Quellcode

      1. Config Dcf77 = Pinc.7 , Timer = 1 , Timer1sec = 1 , Gosub = Timer1_isr
      Den Rest von Timer1 einfach rausschmeissen.
      Also das hier:

      BASCOM-Quellcode

      1. Const Timer1reload = 15625
      2. Config Timer1 = Timer , Prescale = 1024
      3. Load Timer1 , Timer1reload
      4. On Ovf1 Timer1_isr
      5. Enable Timer1
      6. Start Timer1
      und auch in der ISR folgendes rausnehmen

      BASCOM-Quellcode

      1. Load Timer1 , Timer1reload
      2. Incr Seconds
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • laase schrieb:

      aber wie kriege ich meine Byte Variablen denn sonst in die Date$ und Time$ rein?
      In dem du folgendes machst


      BASCOM-Quellcode

      1. Startsecond = 0
      2. Startminute = 0
      3. Starthour = 18
      4. Startday = 7
      5. Startmonth = 2
      6. Startyear = 21
      7. _sec = Startsecond
      8. _min = Startminute
      9. _hour = Starthour
      10. _day = Startday
      11. _month = Startmonth
      12. _year = Startyear
      Alles anzeigen
      oder gleich direkt die Variablen _sec, _min usw benutzen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @djmsc: doppelt danke!!! (und natürlich auch @Pluto25!)
      Beides geht, Aufruf "meiner" ISR und die Zuweisung direkt an die _sec usw. Variablen! Jetzt kann ich mit Timer1 klarkommen und brauche nicht noch einen weiteren bemühen!
      Für Nachnutzer erwähnenswert wäre, daß die gosub unbedingt 'sectic' heißen muß. 'gosub Timer1_ISR' wurde nicht akzeptiert und es kam eine Fehlermeldung.
      Hier nochmal der jetzt funktionierende Code: (für alle, die KEINE real time clock (RTC) haben und auch KEINEN Uhrenquarz nutzen und trotzdem eine Zeit im Programm haben wollen, die auch zusammen mit der SD-Datei gespeichert wird. Über die Variablen _sec, _min, _hour hat man stets Zugriff auf die aktuelle Zeit, kann Differenzen bilden usw.)

      BASCOM-Quellcode

      1. 'Konfiguration
      2. $regfile = "m2560def.dat"
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 120
      6. $crystal = 16000000 'Quarzfrequenz
      7. Dim Seconds As Byte
      8. Dim Secondsold As Byte
      9. Dim Minutes As Byte
      10. Dim Hours As Byte
      11. Dim Days As Byte
      12. Dim Startsecond As Byte
      13. Dim Startminute As Byte
      14. Dim Starthour As Byte
      15. Dim Startday As Byte
      16. Dim Startmonth As Byte
      17. Dim Startyear As Byte
      18. 'Sind durch config clock eingeführt:
      19. '_sec As Byte
      20. '_min As Byte
      21. '_hour As Byte
      22. '_day As Byte
      23. '_month As Byte
      24. '_year As Byte
      25. Dim Istneuesekunde As Bit 'Flag dafür, daß man in irgendwelchen langwierigen Encoder-Menü-Operationen jetzt unbedingt zur Hauptroutine zurückspringen muß
      26. 'Config Clock = User 'nur als Alternative zu Config DCF77. Hier jetzt letztlich nicht erfolgreich verwendet, da keine real time clock und kein 32kHz Uhrenquarz vorhanden
      27. Config Date = Dmy , Separator = Dot
      28. '702 Byte OHNE Config DCF77, aber mit Config Clock. 1378 Byte mit Config DCF77, aber ohne Config Clock. -> Config DCF77 "braucht" 676 Byte mehr!
      29. 'DCF77 soll für die Funktionalität auch dann genutzt werden, wenn gar kein DCF77 Empfänger vorhanden ist:
      30. Config Dcf77 = Pinc.7 , Timer = 1 , Timer1sec = 1 , Gosub = Sectic 'C.7 wird hier als Dummyeingang missbraucht (daran ist nichts angeschlossen)
      31. 'Const Timer1reload = 15625
      32. 'Config Timer1 = Timer , Prescale = 1024 'Timer1 wurde schon mit Config DCF77 geladen!
      33. 'Load Timer1 , Timer1reload
      34. 'On Ovf1 Timer1_isr
      35. 'Enable Timer1 'wichtig: hier geht es um das Enablen des INTERRUPTS, nicht des Timers ... (muß ein sein, damit die ISR auch wirklich ausgeführt wird)
      36. 'Start Timer1
      37. Enable Interrupts
      38. 'wichtig für LCD-Anzeige! (ohne ...=Output ging es nicht!)
      39. Config Porta.1 = Output : Config Porta.3 = Output : Config Porta.5 = Output : Config Porta.7 = Output : Config Porth.0 = Output : Config Porth.1 = Output
      40. Config Lcdpin = Pin , Db4 = Porta.1 , Db5 = Porta.3 , Db6 = Porta.5 , Db7 = Porta.7 , E = Porth.0 , Rs = Porth.1 'in der nä Zeile kommen die zugehörigen Arduino Mega2560 Pinnumerierungen
      41. 'Config Lcdpin = Pin , Db4 = D23 , Db5 = D25 , Db6 = D27 , Db7 = D29 , E = D17 , Rs = D16 'befinden sich alle bis auf Rs und E auf der rechten (Außen)Seite der 2-reihigen Pfostenbuchse. (wenn ohne Ramps-Adpaterstecker)
      42. Config Lcd = 20 * 4 'Chipset = Ks077
      43. Cls 'ist wichtig als Reset des LCD nach der Definition
      44. 'hier jetzt das Programm
      45. '...
      46. 'darin:
      47. Gosub Alte_zeit_aus_dem_eeprom_holen
      48. Gosub Neue_zeit_per_encoder_einstellen
      49. '...
      50. Do
      51. Hierherzurueck:
      52. Istneuesekunde = 0
      53. 'Gosub Zeitweiterstellen 'das entfällt dann durch Config DCF77
      54. Gosub Wichtige_zeitkritische_sachen
      55. '...
      56. Gosub Superlangedauernde_einstellerei
      57. If Istneuesekunde = 1 Then Goto Hierherzurueck
      58. Waitms 500
      59. '...
      60. Loop
      61. Wichtige_zeitkritische_sachen:
      62. '...
      63. 'Spannung und Strom sekündlich messen und ins SRAM speichern
      64. 'ggf. Werte per LCD auf den anderen (nicht gerade zu parametrierenden) Kanälen anzeigen
      65. 'ggf. richtige Datei öffen, auf SD speichern, wenn xyz Byte in einem Kanal "voll"
      66. Locate 1 , 1 : Lcd Date$ ; " " ; Time$
      67. '...
      68. Return
      69. Alte_zeit_aus_dem_eeprom_holen:
      70. 'readeeprom ...
      71. Return
      72. Neue_zeit_per_encoder_einstellen:
      73. 'bietet letztbekanntes Altdatum als Startwert an
      74. 'hier ein längeres Einstellmenü, das u.a. den Timer 3 (auch ein 16Bit Timer) nutzt
      75. 'nehmen wir mal an, dabei käme folgendes raus:
      76. Startsecond = 0
      77. Startminute = 0
      78. Starthour = 18
      79. Startday = 7
      80. Startmonth = 2
      81. Startyear = 21
      82. 'Jetzt die Zuweisung an die internen Variablen:
      83. _sec = Startsecond
      84. _min = Startminute
      85. _hour = Starthour
      86. _day = Startday
      87. _month = Startmonth
      88. _year = Startyear
      89. 'Date$ = Bcd(startday) + "." + Bcd(startmonth) + "." + Bcd(startyear) 'war nicht zielführend
      90. 'Time$ = Bcd(starthour) + ":" + Bcd(startminute) + ":" + Bcd(startsecond)
      91. 'Date$ = Str(startday) + "." + Str(startmonth) + "." + Str(startyear) 'mit str() auch nicht!
      92. 'Time$ = Str(starthour) + ":" + Str(startminute) + ":" + Str(startsecond)
      93. Return
      94. 'das brauche ich mit Config DCF77 bzw. RTC nicht mehr:
      95. Zeitweiterstellen:
      96. If Seconds >= 60 Then
      97. Seconds = 0
      98. Incr Minutes
      99. End If
      100. If Minutes >= 60 Then
      101. Minutes = 0
      102. Incr Hours
      103. End If
      104. If Hours >= 24 Then
      105. Hours = 0
      106. Incr Days
      107. End If
      108. 'usw.
      109. Return
      110. Superlangedauernde_einstellerei:
      111. '...
      112. If Istneuesekunde = 1 Then Goto Sofortraushier
      113. Waitms 500 'nur für die Simulation!
      114. If Istneuesekunde = 1 Then Goto Sofortraushier
      115. Waitms 500 'nur für die Simulation!
      116. If Istneuesekunde = 1 Then Goto Sofortraushier
      117. Waitms 500 'nur für die Simulation!
      118. If Istneuesekunde = 1 Then Goto Sofortraushier
      119. Waitms 500 'nur für die Simulation!
      120. If Istneuesekunde = 1 Then Goto Sofortraushier
      121. '...
      122. Sofortraushier:
      123. Return
      124. 'das hier ganz zuletzt hinter den Subs:
      125. 'Timer1_ISR:
      126. Sectic:
      127. 'Load Timer1 , Timer1reload 'wird nicht mehr gebraucht
      128. 'Incr Seconds 'wird nicht mehr gebraucht
      129. Istneuesekunde = 1 'für meinen eigenen Code verwendet; für DCF77 nicht erforderlich
      130. 'Add your ISR code here
      131. Return
      132. 'Timer value explination
      133. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
      134. ' The AVR is running at 16000000Hz, the prescaler is 1024
      135. ' Each tick is 0,064 ms - (1 / CPUSpeed in KHz ) * Prescaler
      136. ' The timer needs 15625 ticks to reach the required time ( 15625 * 0,064 = 1000ms)
      137. ' The start value for the timer must be set to 49911 so that it will overflow at 65536 after 15625 ticks
      138. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
      Alles anzeigen

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von laase ()

    • ein Problem bleibt allerdings: der ungenaue Quarz. Nach 18min ca. 10s zu langsam. Das ist mir dann doch etwas viel bzw. zu ungenau.
      Mit dem Timer1reload hätte ich eine Trimm-Möglichkeit gehabt. Gibt es so etwas zufälligerweise auch bei der Config DCF77? Eine library-interne Variable vielleicht, die ich einfach überschreiben kann?
      Wenn das nicht geht, muß ich wohl nach boards mit "echtem Quarz" Ausschau halten. Könnte nämlich auch ein Resonator sein, der da auf dem chinesischen Board verbaut ist ...
    • laase schrieb:

      Nach 18min ca. 10s zu langsam
      Versuch ohne Sectic. Die Main kann es anders erfahren z. B.
      Do
      If wichtig Then reagiere
      Loop Until Altsec <> _sec
      Altsec = _sec

      laase schrieb:

      eine Trimm-Möglichkeit
      ocr1a=irgendwas
      oder decr ocr1a
      (Nach dem Cofig Dcf, einmalig, vor dem Do der Main)

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Pluto25 ()

    • Hallo Pluto,

      aber ist ocr1a nicht das "output compare register" für die PWM-Generierung? Kann ich damit auch den Timer dauerhaft "vorspannen", damit er schneller überläuft und einen Interrupt erzeugt? Ohne das Setzen weiterer Register?
      Ich probiere es nachher mal. Momentan läuft noch ein Vergleichstest mit der "alten Uhrzeit", ohne DCF77 und nur mit Timer-Interruptroutine, manueller Zeitfortzählung usw.
      Klar ist bisher schon, daß der Takt auch damit zu langsam ist. Auf 100 Realminuten fehlen dem µC 40 Sekunden. Ich habe daher jetzt '15625 Ticks * 0.064s = 1000ms' auf 15522 Ticks (15625 /1.00666667) verringert und schaue gerade. ob das hinkommt. Bisher (nach 10min) sieht es noch sehr gut aus.

      Das mit dem decr ocr1a verstehe ich nicht. Würde ich den OCR1a Wert denn nicht nur einfach um den Wert 1 verringern? Ich probiere es nachher lieber erst einmal mit dem Wert 15522. also 'OCR1A = 15522' oder eben dem "Inverswert" davon, also 65536-15522=50014.

      Viele Grüße, Lars
    • Habe nochmal nachgeschaut: auf den "Mega2560" boards ist übrigens ein 1x4mm großes Bauteil mit Metallkappe drauf. Da zwei Kondensatoren daneben aufgelötet sind, tippe ich doch auf Quarz und nicht auf Resonator, denn dort sind sie ja meist schon integriert. Vielleicht ist die Abweichung von 0.67% ja normal für einen Quarz, ich weiß es nicht. Wenn ich es "wegtrimmen" kann, wäre es für mich in Ordnung.
      Auf allen "Uno" boards bei mir (aus mehreren Entwicklungsstufen der letzten ca. 10 Jahre) ist dagegen überall immer ein "richtiger" Quarz drauf, einer im HC irgendwas Gehäuse. Nur die 2560er boards haben bei mir diese Microquarze.
    • So, jetzt Dein 'OCR1A=....' in den obigen Code direkt hinter dem Config DCF77 eingesetzt.
      Es funktioniert tatsächlich! Danke!
      Erst habe ich, wie oben beschrieben, nicht 15625 (wie von AVRTimer.exe vorgeschlagen) eingesetzt, sondern 15522 (siehe oben). Als es damit scheinbar überhaupt nicht ging, habe ich den Inverswert genommen, also 50014. Damit ging es scheinbar auch nicht, bis ich merkte, daß es einfach nur tierisch lange dauerte, bis die erste Sekunde umschaltete.
      Dann OCR1A ohne Neuzuweisung einfach mal ausgelesen: 1249. Warum nun genau dieser Wert weiß ich nicht. Verwendet der Befehl Config DCF77 vielleicht doch nicht den größtmöglichen Teilerwert? Wie auch immer, ich teste gerade mit 1249/1.006667 = 1241. Bis jetzt (7min) hinkt die Uhr noch nicht ganz eine Sekunde hinterher. Mal sehen, ob ich noch auf 1240 heruntergehe oder es bei den 1241 belasse.