DCF77 + Timer2 Asynchron

    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!

    • DG7GJ schrieb:

      Tja...wenn ich wüsste wie:
      Die Änderungen vornehmen und dann in Bascom unter Werkzeuge den LIB Manager aufrufen. Die besagte LIB auswählen und dann auf Compile klicken -> fertig.


      DG7GJ schrieb:

      Wenn ich versuche manuell eine LIB einzubinden
      Dann darfst du aber nicht Config Dcf77 nehmen sondern musst alles selbst implementieren.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Ich würde es mal mit der 'alternativen dcf-lib' von RN probieren. Die wird im Programm mit $lib eingebunden und daher kann man die auch bequem ändern und unter neuen Namen speichern. Man vermurkst dann nicht was funktionierendes. Der Abschnitt über die softclock ist im Prinzip ein Unterprogramm, dass man auf das label und ein ret reduzieren kann. Durch die lib wird bei gültigen Empfang die Zeit-Systemvariablen geschrieben. Wenn deine 'Quarzclock' dieselben verwendet, dann ist schon alles fertig.
      Raum für Notizen

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

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

      tschoeatsch schrieb:

      Wie schaut jetzt deine softclock aus? Du hast den Quarz, timer2 mit 128 prescaler und bekommst so einen Sekundeninterrupt beim overflow vom timer2. Und dann?
      config clock=user für die Variablen, wie geht es bei dir weiter?

      Ja, die Softclock am Timer2 funktioniert - aber eben nur solange ich Config DCF nicht ausführe.
      Ich weis nicht genau weswegen, zumal die Bascom DCF77.lib ja offensichlich nur mit dem Timer1 arbeitet und den Timer2 links liegen lässt.
      Dennoch blockiert da irgend was: Die Register von Timer2 sehen alle korrekt aus, nur das von Timer2 kein Interrupt kommt.
      Entweder überlagert die Timer1-Softclock der DCF77.LIB die normale Softklock, oder aber sperrt irgendwie den Timer2-Interrupt.

      Wundert mich aber schon irgendwie das ich nirgendwo im Internet was zu diesem Thema finde. Ich dachte es wäre der natürliche Sinn einer Funkuhr nicht autonom auf gut Glück und in der Hoffnung fehlerfreien Empfangs zu arbeiten, sondern lediglich regelmässig eine Quarzuhr stellt.
      Bin ich der einzige der mit der bascom-Lib daran scheitert?

      djmsc schrieb:


      Die Änderungen vornehmen und dann in Bascom unter Werkzeuge den LIB Manager aufrufen. Die besagte LIB auswählen und dann auf Compile klicken -> fertig.

      Ahja, werde ich morgen mal probieren.


      tschoeatsch schrieb:

      Ich würde es mal mit der 'alternativen dcf-lib' von RN probieren. Die wird im Programm mit $lib eingebunden und daher kann man die auch bequem ändern und unter neuen Namen speichern. Man vermurkst dann nicht was funktionierendes. Der Abschnitt über die softclock ist im Prinzip ein Unterprogramm, dass man auf das label und ein ret reduzieren kann. Durch die lib wird bei gültigen Empfang die Zeit-Systemvariablen geschrieben. Wenn deine 'Quarzclock' dieselben verwendet, dann ist schon alles fertig.

      Nach verschiedenen Anläufen fing ich gerade eben wieder damit an und stecke gerade in der konfiguration des Timer0 als 25ms-Taktgeber.
      Wird heute aber nix mehr...:-(

      Grüße

      Jürgen
    • Dein Sekundeninterrupt von timer2 kommt nicht? Hast du den auch enabled?

      BASCOM-Quellcode

      1. Dim W As Byte
      2. Config Timer2 = Timer , ASYNC = 1 , Prescale = 128
      3. On TIMER2 Myisr
      4. ENABLE INTERRUPTS
      5. ENABLE TIMER2
      6. DO
      7. LOOP
      8. MYISR:
      9. 'get here every second with a 32768 Hz xtal
      10. RETURN
      Alles anzeigen
      Ich verstehe das schon, dass dcf deine softclock mit der in der lib eingebauten durch das Verwenden der gleichen Systemvariablen stört. Aber ich denke, das kann man abstellen. Man muss halt in der lib beim Setzen der Variablen auch einen timer2=0 einbauen, dass die Sekunde deiner softclock mit dem dcf-Signal zusammen passt.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @DG7GJ Hast du Lust zum experimentieren? Wenn ja, dann könnte man mal an der dcf77-rn-const.lib mal bisschen rumschrauben. In der lib findet man folgende Angaben:

      Quellcode

      1. ;Timer-Interruptfrequenz:
      2. .equ ISR_freq = 40 ;40 Hz
      3. ;Grenzwerte für Pausenzeit-Zähler (/ ISR_freq [s]):
      4. .equ LastBit0Max = 79 ;LastBit 0 obere Zeitgrenze + 1
      5. .equ LastBit_Mid = 74 ;LastBit-Grenze
      6. .equ LastBit1Min = 69 ;LastBit 1 untere Zeitgrenze
      7. .equ DataBit0Max = 39 ;Datenbit 0 obere Zeitgrenze + 1
      8. .equ DataBit_Mid = 34 ;Datenbit-Grenze
      9. .equ DataBit1Min = 29 ;Datenbit 1 untere Zeitgrenze
      10. .equ Spike_Limit = 3 ;Störimpulsgrenze
      Alles anzeigen
      Mein Gedanke ist jetzt mit dem Uhrenquarz das Dekodieren des Dcf zu erledigen und auch die eingebaute softclock zu betreiben. Jetzt hat man ja mit dem Uhrenquarz nicht so viele 'glatte' interrupts, aber auf eine ISR_freq=32 (Hz) kommt man hin



      BASCOM-Quellcode

      1. const Timer2Reload = 16
      2. config timer2=timer,prescale = 64
      3. load timer2 , Timer2Reload
      4. on ovf2 Timer2_isr
      5. enable ovf2
      6. start timer2
      7. enable interrupts
      wenn man jetzt noch die Zeitgrenzen der Tabelle anpasst, dann sollte! alles funktionieren und der dcf synchronisiert deine Quarzuhr.
      ZB. wäre der Wert für die Datenbit-Grenze vorher 34*0,025ms=0,85ms, neu wäre es dann 0,85/0,03125ms=27. Also die angegebenen Werte x0,025 und dann /0,03125 nehmen.
      Dateien
      Raum für Notizen

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

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

      tschoeatsch schrieb:

      Ich verstehe das schon, dass dcf deine softclock mit der in der lib eingebauten durch das Verwenden der gleichen Systemvariablen stört. Aber ich denke, das kann man abstellen. Man muss halt in der lib beim Setzen der Variablen auch einen timer2=0 einbauen, dass die Sekunde deiner softclock mit dem dcf-Signal zusammen passt.

      Grumel...habe heute morgen zum x'ten mal versucht die dcf77.lib zu interpretieren. Da stehen zwar Kommentare zur Softclock drin, aber dennoch erkenne ich nicht wo ich da was ändern muss.

      tschoeatsch schrieb:

      @DG7GJ Hast du Lust zum experimentieren? Wenn ja, dann könnte man mal an der dcf77-rn-const.lib mal bisschen rumschrauben.

      Habe ich erst mal aufgegeben mit dem DCF-Softclock-Geraffel, und mir vorgenommen mal irgendwann ein Projekt einfallen zu lassen über eine komplett neue DCF-Decoderroutine zuzüglich etwas Hardware zum Thema DCF-Empfang.

      Das fängt schon mit dem Verständniss der Signalreinheit im häuslichen Umfeld an:
      Die Ferritantennen der üblichen DCF-Module sind mit einer Resonanzbandbreite von maximal +-300Hz (77,2 - 77,8kHz) und sollten daher schon ein sauberes Signal bieten. Zumal DCF77 so ziemlich das stärkste Nutzsignal zwischen 61kHz und 136kHz ist.
      Was da tatsächlich noch an lokalen Störungen mit rein fällt wäre mal interessant zu messen.

      Aber wie gesagt - das wird demnächst mal ein eigenständiges Projekt.

      Mit dem aktuellen Projekt hier habe ich mich eben von dem Timer2 mit Uhrenquarz verabschiedet:
      Muss da eh gleich noch eine kritische Lötung vornehmen, da irgendwas am I²C-Bus nicht stimmt.

      Von insgesamt vier I²C-Slaves lässt sich nur eines sinnreich ansprechen und abfragen.
      Der Luftdrucksensor scheint tot zu sein - muss gleich nachgelötet werden.
      Zwei E²PROM's M24M02 (für Datenlogger-Zwecke) verhalten sich auch komisch.

      Der I²C-Adress-Scanner findet ein Ack bei dem funktionierenden CC2D, dann lange nichts...ab Adresse hA0 aber durchgängig bis hFE bekommt jede Adresse ein Ack?
      Vermute mal das da mit den E²PROM's noch was nicht stimmt, obwohl ich optisch da keine Probleme erkennen kann.

      Da das mit dem toten Sensor (LGA-8 mit seitlich nicht zugänglichen Pads) gleich eh eine schweißtreibende Sache wird, werde ich danach mal gucken ob ich an den ungenutzten XTAL-Pins zwei kurze CuL-Drähtchen bekomme.
      Sollte das glücken, kommt da ein 8MHz-Quarz frei fliegend drüber.
      Damit sollte Timer1 als Sekundentaktquelle hinreichend genau werden, um nur alle 24h eine DCF-Synchronisation zu brauchen.

      Grüße

      Jürgen
    • Ich hab's mal probiert, allerdings nicht mit einem Uhrenquarz, sondern mit den 16MHz und timer1. Es sollte aber genauso mit timer2 und Uhrenquarz gehen, wenn die isr von timer2 alle 31,25ms kommt. Die lib hab' ich dazu angepasst und umbenannt, den Aufruf der lib im Abteil dcf77_soft angepasst und es läuft. Dcf wird decodiert und die softclock gestellt.

      BASCOM-Quellcode

      1. 'DCF77-rn-const.lib Test Programm
      2. 'mit Arduino uno
      3. $regfile = "m328pdef.dat"
      4. $crystal = 16000000
      5. $hwstack = 64
      6. $swstack = 32
      7. $framesize = 30
      8. $baud = 9600 'serielle Schnittstelle aktivieren
      9. Led Alias Portb.5
      10. Config Led = Output 'Led des Arduino uno aktivieren
      11. $include Dcf77_soft_1.bas
      12. 'aus Dcf77-soft.bas kopiert und angepasst
      13. '---------------------- Pin für DCF Eingang definieren ---------------------
      14. 'Eingangspin für das invertierte DCF-Signal
      15. 'mit const dcf_pin_nummer=1 wird die Pinnummer festgelegt
      16. Const Dcf_pin_nummer = 7
      17. 'mit const dcf_port_hex=&H03 Wird der Port festgelegt
      18. '&H00=PortA, &H03=PortB, &H06=PortC, &H09=PortD
      19. Const Dcf_port_hex = pind
      20. 'Anzahl der gültigen Zeittelegramme infolge, damit die softclock gestellt wird
      21. Const Gueltiger_empfang_infolge = 1
      22. Dcfstatus.7 = 1 'DCF-Decoder ein
      23. Dcfstatus.6 = 0 'Softclock inaktuell
      24. const Timer1Reload = 62500
      25. config timer1=timer,prescale = 8
      26. load timer1 , Timer1Reload
      27. on ovf1 Timer1_isr
      28. enable timer1
      29. start timer1
      30. enable interrupts
      31. 'Timer value explination
      32. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
      33. ' The AVR is running at 16000000Hz, the prescaler is 8
      34. ' Each tick is 0,0005 ms - (1 / CPUSpeed in KHz ) * Prescaler
      35. ' The timer needs 62500 ticks to reach the required time ( 62500 * 0,0005 = 31,25ms)
      36. ' The start value for the timer must be set to 3036 so that it will overflow at 65536 after 62500 ticks
      37. ' NOTE: The load command does the inversion for you (256-value or 65536-value)Dim Isr_counter As Byte 'Zähler in der isr
      38. Dim Sekunde As Byte 'Vergleichssekunde, um ein Wechsel der Sekunde zu erkennen
      39. Wait 1
      40. Do
      41. Sekunde = _sec
      42. Print Time$ 'die aktuelle Zeit seriell ausgeben
      43. While Sekunde = _sec 'auf Sekundenwechsel warten
      44. Led = Pind.7 'Signal vom Dcf-Empfänger zeigen
      45. Wend
      46. Loop
      47. End
      48. 'wenn die Systemvariablen 'time$' verwendet werden sollen, dann diese subs einfügen
      49. Getdatetime:
      50. 'called when date or time is read
      51. Return
      52. Setdate:
      53. 'called when date$ is set
      54. Return
      55. Settime:
      56. 'scanned when time$ is set
      57. Return
      58. Timer1_isr:
      59. load timer1, Timer1Reload
      60. Call Dcf77_soft 'alle 31,25msec ausführen Return 'timer2 interrupt, des alle 1 msec ausgeführt wird
      61. Return
      Alles anzeigen


      BASCOM-Quellcode

      1. '###########################################################################
      2. 'Programmname: DCF77_soft.BAS
      3. 'Quelle: http://rn-wissen.de/wiki/index.php?title=DCF77-Decoder_als_Bascom-Library#Bascom_Hauptprogramm
      4. 'Aufgabe:
      5. 'Include-Programm für die dcf77-rn.lib ab Version 4.00
      6. '
      7. 'Hardware:
      8. 'DCF-Empfänger mit invertien Ausgang
      9. '
      10. 'ergänzt/angepasst durch tschoeatsch, Jan 2018
      11. '###########################################################################
      12. '(
      13. Sinn der dcf77-rn-const.lib und dieser Datei ist es,
      14. einen DCF-Empfang und eine softclock mit einem beliebigen timer
      15. zu implementieren.
      16. Dazu ist folgendes zu beachten:
      17. Es wird ein DCF-Empfänger mit invertierten Ausgangssignal benötigt.
      18. Diese Datei dcf77_soft.bas ist im Hauptprogramm mit include einzubinden.
      19. Es muss der pin und port, an dem das Dcf-Signal anliegt, als Konstanten eingetragen werden.
      20. Es muss ein 'call Dcf77_soft' alle 31,25msec aufgerufen werden, zB mit einer
      21. timer-Routine. Timer2 mit Uhrenquarz
      22. Um das Konfigurieren einfach und übersichtlich zu gestalten,
      23. können entweder die folgenden Zeilen nach Anpassung durch Entfernen des Hochkommas aktiviert
      24. werden, oder man fügt im Hauptprogramm eine Kopie dieser Zeilen ein und passt die Einstellungen dort an.
      25. Einstellungen, die zur besseren Übersicht in das Hauptprogramm kopiert werden können:
      26. ')
      27. '---------------------- Pin für DCF Eingang definieren ---------------------
      28. 'Eingangspin für das invertierte DCF-Signal
      29. 'mit const dcf_pin_nummer=1 wird die Pinnummer festgelegt
      30. 'Const Dcf_pin_nummer = 1
      31. 'mit const dcf_port_hex=&H03 Wird der Port festgelegt
      32. '&H00=PortA, &H03=PortB, &H06=PortC, &H09=PortD
      33. 'Const Dcf_port_hex = &H03
      34. 'Anzahl der gültigen Zeittelegramme infolge, damit die softclock gestellt wird
      35. 'Const Gueltiger_empfang_infolge = 2
      36. 'Dcfstatus.7 = 1 'DCF-Decoder ein
      37. 'Dcfstatus.6 = 0 'Softclock inaktuell
      38. 'Ende der Einstellungen
      39. 'Einrichten des timers mit dem Aufruf 'call dcf77_soft' nicht vergessen!
      40. Config Date = Dmy , Separator = . 'deutsches Datumsformat
      41. Config Clock = User 'Softclock einrichten, um die Zeit- und Datumsvariablen zu generieren
      42. $lib "dcf77-rn-const_1.lib" 'LIB für DCF77, angepasst für 32Hz timeraufruf Uhrenquarz an timer2
      43. $external Dcf77_init
      44. Declare Sub Dcf77_init
      45. $external Dcf77_soft
      46. Declare Sub Dcf77_soft
      47. '--------------------- Variablen der dcf77-rn.lib -----------------------------
      48. Dim _dayofweek As Byte , Dcfstatus As Byte , Dcfflags As Byte
      49. '_dayofweek -> 1..7 (Mo..So)
      50. 'Dcfstatus -> Bit0: 15. Impuls erreicht Bit4: 58 Impulse empfangen
      51. ' Bit1: Minutenparität OK Bit5: Gültiges DCF77-Telegramm
      52. ' Bit2: Stundenparität OK Bit6: Softclock nach DCF gestellt
      53. ' Bit3: Parität OK Bit7: DCF-Decoder EIN
      54. ' ACHTUNG: Bits 0..5 NUR LESEN!!!
      55. 'Dcfflags -> Bit0 (R) : Rufbit für Alarmierung der PTB-Mitarbeiter
      56. ' Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ
      57. ' Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ
      58. ' Bit3 (Z2): /
      59. ' Bit4 (A2): Ankündigung einer Schaltsekunde
      60. ' Bit5 (S) : Startbit f. Zeitinformationen (immer 1)
      61. '_sec, _min, _hour, _day, _month, _year sind die Variablen der Softclock
      62. 'Interne Variablen der dcf77-rn.lib:
      63. Dim Dcf77counter As Byte
      64. Dim Dcf77parity As Byte
      65. Dim Dcf77impulse As Byte
      66. 'Dcf77buffer(9): bits 0..7, bits 8..14, flags (= bits 15..20), min, hour,
      67. ' day, dayofweek, month, year
      68. Dim Dcf77buffer(9) As Byte
      69. Dim Dcf77shifter As Byte
      70. Dim Dcf77tal As Byte
      71. Dim Dcf77tah As Byte
      72. Dim Dcf77hsec As Byte
      73. Dim Dcf77bits0_7 As Byte 'DCF77-Bits 0..7
      74. Dim Dcf77bits8_14 As Byte 'DCF77-Bits 8..14
      75. Dim Dcf77val_cnt As Byte 'Validitäts-Zähler
      76. Dim Dcf77lastbit As Byte 'LastBit-Pausenlänge
      77. Dim Dcf77databit As Byte 'DataBit-Pausenlänge
      78. '---------------------------------------------------------------------------
      79. Call Dcf77_init 'LIB initialisieren
      Alles anzeigen
      Die lib in den lib-Ordner kopieren und das .txt entfernen.
      Dateien
      Raum für Notizen

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

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