Uhr geht nach

    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!

    • Uhr geht nach

      Hallo habe mir eine Uhr gebaut mit Leuchtfelder für Stunden 1-12 und 15,30,45 Minuten
      habe es mit 4MHz Quarz und Timer probiert ,da ging die Uhr in 12 Std über 30 Minuten nach
      habe dann mit 1Hz Takt probiert , geht immer noch nach
      was habe ich falsch gemacht?



      $regfile = "m8def.dat" 'ATMEGA 8'
      $crystal = 1000000
      $hwstack = 32
      $swstack = 10
      $framesize = 40





      Dim Sekunde As Byte
      Dim Minute As Byte
      Dim Stunde As Byte



      config portb = output

      config portc = output

      Config Pind.2 = Input

      config portd.4 = output

      config portd.5 = output

      config portd.6 = output

      'stunden Einstellen
      Config Pind.0 = Input
      Portd.0 = 1
      Taster0 Alias Pind.0

      'minuten Einstellen
      Config Pind.1 = Input
      Portd.1 = 1
      Taster1 Alias Pind.1


      'Uhr Voreinstellung '
      Sekunde = 0
      Minute = 0
      Stunde = 12

      Enable Interrupts

      On Int0 Clock 'Uhr
      Config Int0 = Rising 'steigende Flanke

      Enable Int0 ' Uhr
      Disable Int1 'Uhr2

      do


      If Sekunde > 59 Then Minute = Minute + 1
      If Sekunde > 59 Then Sekunde = 0

      If Minute > 59 Then Stunde = Stunde + 1
      If Minute > 59 Then Minute = 0

      If Stunde > 12 Then Stunde = 1




      If Minute > 7 and Minute <23 Then portd.4 = 1

      If Minute > 22 and Minute <38 Then portd.4 = 0

      If Minute > 22 and Minute <38 Then portd.5 = 1

      If Minute > 37 and Minute <60 Then portd.5 = 0

      If Minute > 37 and Minute <60 Then portd.6 = 1

      If Minute = 0 then portd.6 = 0


      if Stunde = 1 Then portb = 1

      if Stunde = 2 Then portb = 2

      if Stunde = 3 Then portb = 4

      if Stunde = 4 Then portb = 8

      if Stunde = 5 Then portb = 16

      if Stunde = 6 Then portb = 32

      if Stunde > 6 Then portb = 0

      if Stunde = 7 Then portc = 1

      if Stunde = 8 Then portc = 2

      if Stunde = 9 Then portc = 4

      if Stunde = 10 Then portc = 8

      if Stunde = 11 Then portc = 16

      if Stunde = 12 Then portc = 32

      if Stunde < 7 Then portc = 0

      'Uhr einstellen Stunde
      If Taster0 = 0 Then
      Waitms 150
      If Taster0 = 0 Then
      Incr Stunde
      End If
      End If
      'Uhr einstellen minute '

      If Taster1 = 0 Then
      Waitms 150
      If Taster1 = 0 Then
      Incr Minute
      Sekunde = 0
      End If
      End If
      'Uhr komplett auf Null stellen '
      If Taster0 = 0 And Taster1 = 0 Then
      Sekunde = 0
      Minute = 0
      Stunde = 12
      Waitms 150
      End If
      '------------------------------------------------------------------------------
      Loop

      End


      Clock:
      Incr sekunde
      Return
    • Oldie schrieb:

      das 1Hz Signal ist genau ic 4521 Quarz 4,194304MHz
      Wenn der Takt genau 1Hz hat, müsste die Uhr ja genau laufen.
      Außer:
      In deiner Hauptschleife ist ein logischer Fehler beim verrechnen der Sekunden in die Uhrzeit.

      Ich würde an deiner Stelle in der ISR ein Flag setzen und das in der Hauptschleife abfragen.
      Und dann in der Hauptschleife dann bei gesetztem Flag die Uhr nachstellen und das Flag wieder löschen.

      So wird die Uhr immer nur dann (nach-)gestellt, wenn eine Sekunde verstrichen ist.
    • Oldie schrieb:

      kannst du mir mal ein Programmteil posten
      Ohne es jetzt getestet zu haben hab ich mal deinen Code etwas angepasst

      BASCOM-Quellcode

      1. 'Soft-Clock mit Uhrenquarz 32.768 KHz und internem Takt
      2. 'Uhrenquarz wird an XTal1 und XTal2 angeschlossen ohne Kondensatoren
      3. 'XTal1 = PinB.6 XTal2 = PinB.7
      4. $regfile = "m8def.dat" 'ATMEGA 8'
      5. $crystal = 1000000
      6. $hwstack = 32
      7. $swstack = 10
      8. $framesize = 40
      9. Config Portb = Output
      10. Config Portc = Output
      11. Config Pind.2 = Input
      12. Config Portd.4 = Output
      13. Config Portd.5 = Output
      14. Config Portd.6 = Output
      15. 'stunden Einstellen
      16. Config Pind.0 = Input
      17. Portd.0 = 1
      18. Taster0 Alias Pind.0
      19. 'minuten Einstellen
      20. Config Pind.1 = Input
      21. Portd.1 = 1
      22. Taster1 Alias Pind.1
      23. Config Clock = Soft , Gosub = Sectic
      24. Enable Interrupts
      25. _sec = 0
      26. _min = 0
      27. _hour = 12
      28. Do
      29. If _min > 7 And _min < 23 Then Portd.4 = 1
      30. If _min > 22 And _min < 38 Then Portd.4 = 0
      31. If _min > 22 And _min < 38 Then Portd.5 = 1
      32. If _min > 37 And _min < 60 Then Portd.5 = 0
      33. If _min > 37 And _min < 60 Then Portd.6 = 1
      34. If _min = 0 Then Portd.6 = 0
      35. If _hour = 1 Then Portb = 1
      36. If _hour = 2 Then Portb = 2
      37. If _hour = 3 Then Portb = 4
      38. If _hour = 4 Then Portb = 8
      39. If _hour = 5 Then Portb = 16
      40. If _hour = 6 Then Portb = 32
      41. If _hour > 6 Then Portb = 0
      42. If _hour = 7 Then Portc = 1
      43. If _hour = 8 Then Portc = 2
      44. If _hour = 9 Then Portc = 4
      45. If _hour = 10 Then Portc = 8
      46. If _hour = 11 Then Portc = 16
      47. If _hour = 12 Then Portc = 32
      48. If _hour < 7 Then Portc = 0
      49. 'Uhr einstellen Stunde
      50. If Taster0 = 0 Then
      51. Waitms 150
      52. If Taster0 = 0 Then
      53. Incr _hour
      54. End If
      55. End If
      56. 'Uhr einstellen minute '
      57. If Taster1 = 0 Then
      58. Waitms 150
      59. If Taster1 = 0 Then
      60. Incr _min
      61. _sec = 0
      62. End If
      63. End If
      64. 'Uhr komplett auf Null stellen '
      65. If Taster0 = 0 And Taster1 = 0 Then
      66. _sec = 0
      67. _min = 0
      68. _hour = 12
      69. Waitms 150
      70. End If
      71. Loop
      72. End
      73. Sectic:
      74. 'Falls es benötigt wird
      75. Return
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Ich nehme für Uhren seit einiger Zeit diese DS3231 - Echtzeituhren.
      Die sind über das Jahr gesehen hochgenau (wenige Sekunden) und es ist egal wie genau der Quarz für den Prozessor ist.
      IMHO wird keine Uhr die vom Quarz des Prozessors abgeleitet wird genau sein, weil gar nicht gewährleistet ist, dass der immer seine exakt z.B. 4MHz liefert sondern immer (wenn auch geringe) Abweichungen aufweisen wird was z.B. dem Temperaturunterschied geschuldet ist.
      Die DS3231 können auch gut mit den Temperaturen umgehen (in einem meiner Projekte ist die auch im "Außeneinsatz" ausreichend genau.

      Ein Nachteil mag sein, dass diese DS32131 nur per I2C anzusteuern sind. Auch gibt es davon wohl auch billige China-Chip-Replikate welche es dann mit der Genauigkeit nicht mehr so genau nehmen.
    • Oldie schrieb:

      habe dann mit 1Hz Takt probiert , geht immer noch nach
      was habe ich falsch gemacht?
      Der Takt hat dann eben nicht 1Hz.
      Falschen Quarz erwischt? 4MHz statt 4,19xx?

      Den Interupt nur für das Setzen eines Flags zu nehmen, ist hier sinnvoll.
      Wenn das Umschalten nach der ersten Abfrage passiert, dann wird die Minute gelöscht und zählt wieder von vorne und wird verschluckt, die Uhr geht nach.
      Bei 28 If-Abfragen in Dauerschleife ist die Chance gar nicht gering, dass sowas passiert.
    • Deine ganzen If-Abfragen kannst du auch in eine Select Case packen

      BASCOM-Quellcode

      1. Select Case _min
      2. Case 0 : Portd.6 = 0
      3. Case 8 To 22 : Portd.4 = 1
      4. Case 23 To 37 : Portd.4 = 0
      5. Portd.5 = 1
      6. Case 38 To 59 : Portd.5 = 0
      7. Portd.6 = 1
      8. End Select
      9. Select Case _hour
      10. Case 1 To 6 : Portc = 0
      11. Case 1 : Portb = 1
      12. Case 2 : Portb = 2
      13. Case 3 : Portb = 4
      14. Case 4 : Portb = 8
      15. Case 5 : Portb = 16
      16. Case 6 : Portb = 32
      17. Case 7 To 12 : Portb = 0
      18. Case 7 : Portc = 1
      19. Case 8 : Portc = 2
      20. Case 9 : Portc = 4
      21. Case 10 : Portc = 8
      22. Case 11 : Portc = 16
      23. Case 12 : Portc = 32
      24. End Select
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo!

      Oldie schrieb:

      das 1Hz Signal ist genau ic 4521 Quarz 4,194304MHz
      Genau diese Aussage bezweifel ich! Du gehst da von etwas aus, was niemals der Realität entsprechen kann.

      Prinzipiell hängt die exakte Frequenz eines Quarzes nicht nur vom Aufdruck ab, sondern noch primär von folgenden Faktoren:

      • Die exakte Lastkapazität CL (auf einige duzend fF genau, also Nachkommastellen von pF!)
      • Die exakte Umgebungstemperatur des Quarzes
      • Der Quarzgenauigkeit in ppm
      Irgendeinen Quarz an einen Chip hängen, egal ob ATmega oder einem CMOS 4xxx oder TTL 74xx führt nur zu einer "ungefähren" Frequenz weit ausserhalb der Herstellerspezifikation.

      Sämtliche Herstellerspezifikationen wie z.B. den Frequenzfehler in ppm über den spezifizierten Temperaturbereich gelten z.B. nur wenn die vom Hersteller spezifizierte Lastkapazität am Quarz vorliegt.

      Beispiel ATmega CLK oder TOSC-Pins haben neuerdings (seit Übernahme Atmel's von Microchip) laut Datenblätter eine interne Last von 4pF.
      Hängt man dort ein Quarz dran welches für 12,5pF Last spezifiziert ist, bekommt man ihn nur mit zwei zusätzlichen Kapazitäten von 12,5pF - 4pF = 8,5pF gegen GND auf die spezifizierte Frequenz +-xxppm.
      Erschwerend kommt hinzu, das diese externe Kapazitäten nicht einfach diskret sind, denn es ist die erforderliche Restkapazität inklusive der Chip-Pins (je nach Gehäuse anders) und den Signalpfaden bis zu den Quarzbeinchen.

      Speziell Uhren kann man auch nicht mehr verlässlich abgleichen mit Meßgeräten wie Frequenzzähler oder Oszilloskopen.
      Denn wenn solche Geräte beispielsweise 1kHz oder auch 32768kHz anzeigen, ist diese Anzeige maximal sogenau wie die Zeitbasis solcher Geräte.
      RTC's kann man daher mit solchen Meßmitteln höchstens grob auf Funktion prüfen, und den feinabgleich dann über die Laufzeit testen.
      Also so lange laufen lassen bis sich ein eindeutiger Fehler aufsummiert hat.
      Dann entscheiden...läuft sich nach ner Woche 1s zu schnell, dann 0,xpF zulöten, geht sie 1s zu spät, eben 0,xpF weg nehmen.

      Das Problem anders aber eindrücklich zusammengefasst, liegt in der Fehlersummierung.
      In einer Momentaufnahme ist eine Sekunde eben eine Sekunde. Ist sie nur 998ms oder auch 1002ms lang, dann geht das meißt in den Meßtolleranzen der gewählten Meßauflösung unter.
      Über einen längeren Zeitraum addiert sich jedoch der Fehler:

      Eine Woche besteht aus 7 Tage x 24 Stunden x 60 Minuten x 60 Sekunden = 604.800 Sekunden.
      Bei 998ms x 604800 würden aber nur 603590,4 Sekunden gemessen und
      bei 1002ms x 604800 würden bereits 606009,6 Sekunden gemessen.
      Das entspräche eine Differenz von +-1209,6 Sekunden entsprechend +- 20 Minuten und 9,6 Sekunden.

      Ausgehend dieser Grundlagen muss sich jeder der eine Uhr bauen will fragen, wo seine Genauigkeitsansprüche liegen. Hat man Ansprüche in Richtung hochwertiger, komerzieller Uhren, die maximal eine handvoll Sekunden im Jahr an Meßfehler haben, oder eher +- 30 Minuten je Jahr, wird schnell herrausfinden wie man sich dort ranarbeiten muss.
      Bei Quarzuhren reicht dann kein simples 32,768kHz Quarz mit 20ppm mehr, sondern hochpräzise und eng tollerrierte Spezialquarze.
      Ansonsten kämen noch DCF77 sowie GPS in Frage.

      Grüße

      Jürgen
    • Hallo!

      Oldie schrieb:

      der 1Hz takt ist genau .Wenn ich die Uhr mit Timer1 und 4MHz Quarz betreibe geht sie auch
      in 12 Std mehr als 30 minuten nach

      Wie kannst du da so sicher sein?
      Wenn ich dich richtig verstehe, hast du eine Schaltung aufgebaut wie in Fig. 7 auf Seite 10 des Datenblattes hier:
      assets.nexperia.com/documents/data-sheet/HEF4521B.pdf

      Das 1Hz-Signal nimmst du dann am Pin Q22 (Pin 14) ab, korrekt?

      Welche Kondensatorwerte hast du für Cs und Ct genommen?
      Wie sieht die Schaltung aus? Optimale Platine, kurze Leiterbahnen, zweifelsfreie Lötstellen, oder waghaltiger Testaufbau auf Steckbrett mit mindestens ebenso fragwürdigen Jumperlitzen?
      Welche CL verlangt das Quarz gemäß Datenblatt?

      Wenn der 4521 vernünftig arbeitet, läuft dein Qaurz amok:
      in 12h ganze 30 Sekunden zu spät hieße:
      Statt 12h x 60 Minuten x 60 Sekunden = 43200 Sekunden zählt dein 4521 nur 42000s. Also 1800s (30min) zu wenig.
      Dein Quarz läge demnach auf 4,077795555MHz statt 4,194304MHz und somit stolze 116,5khz zu tief!
      Warscheinlicher: Dein Quarz liegt eher 50kHz zu tief und reißt gelegentlich ab, weil er aufgrund falscher beschaltung nicht anständig laufen kann.

      Und deine exakte Sekunde scheint rechnerisch eher 972,222ms lang zu sein.

      Grüße

      Jürgen

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