- Labornetzteil AliExpress         
Seite 2 von 21 ErsteErste 123412 ... LetzteLetzte
Ergebnis 11 bis 20 von 204

Thema: Library für DCF77 Dekodierung

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Softclock

    Anzeige

    Praxistest und DIY Projekte
    Henrik, vielen Dank, da habe ich ja wieder was zum Ausprobieren!

    Warum funktioniert eigentlich Albundys Lib nicht mit den internen Variablen der Softclock, also z.B. so:
    Code:
    copyright    = W.Krueger, geändert D. Ottensmeyer
    comment      = DCF 77 Decoder
    libversion   = 1.00
    date         = 02.04.2006
    statement    = ----------------------------------
    statement    = muss alle 25ms ausgeführt werden !
    statement    = ----------------------------------
    
    [Dcf77]
    Dcf77:
    .equ DCF_Port = $10    ;$10 = Pind
    .equ DCF_Pin = 3       ;3 = Pin 3
    
    .equ Imp0min = 70      ;minimale Länge des Minutenimpulses
    .equ Imp1min = 6       ;minimale Länge des "1" Impulses 
                           ;alles darunter wird als "0" Impuls gewertet
    .def Temp1   = r16
    .def Temp2   = r17
    .def Temp3   = r18
    .def _min    = r19
    .def _hour   = r20
    .def Status  = r21
                  ;Bit0 = aktueller DCF Status
                  ;Bit1 = vorheriger DCF Status
                  ;Bit2 = Uhr synchronisieren
                  ;Bit3 = 59 Impulse empfangen
                  ;Bit4 = Parität OK
    .def Impuls  = r22
    .def Zaehler = r23
    .def Buffer  = r24
    .def Pari    = r25
    ;------------------------------------
     *lds Status,{Status}         ;Status laden
      rcall Softuhr               ;Softuhr bearbeiten
     *lds Impuls,{Impuls}         ;Variablen laden
     *lds Zaehler,{Zaehler}
     *lds Buffer,{Buffer}
     *lds Pari,{Pari}    
      in temp1,Dcf_Port           ;DCF Port lesen
      bst temp1,Dcf_Pin           ;Status holen
      bld Status,0                ;aktuellen Status speichern
      inc Zaehler                 ;Impulslänge erhöhen
      bst Status,0                ;akuellen Status prüfen
      brts Puls20                 ;Status Low -> weiter
      bst Status,1                ;vorherigen Status prüfen
      brtc Puls40                 ;vorheriger Status Low -> Ende
      ldi temp1,Imp0min           ;Minutenimpuls Minimalwert laden
      cp Zaehler,temp1            ;Impulslänge Minimalwert überschritten
      brcs Puls10                 ;nein -> weiter
     *sts {Pau},Zaehler           ;--------> Minutenimpulslänge speichern für Debug
      clr Buffer                  ;Empfangspuffer löschen
      clr Impuls                  ;Impulszähler löschen
      bst Status,4                ;Parität OK ?
      brtc Puls5                  ;Nein -> weiter
      bst Status,3                ;59 Impulse empfangen ?
      brtc Puls5                  ;Nein -> weiter
      set
      bld Status,2                ;Status Uhr synchronisieren setzen
    Puls5:
      clt
      bld Status,3                ;Status 59 Impulse löschen
      bld Status,4                ;Status Parität OK löschen
    Puls10:
      clr Zaehler                 ;Impulslänge löschen
      rjmp Puls40                 ;Ende
    Puls20:
      bst Status,1                ;vorherigen Status prüfen
      brts Puls40                 ;vorheriger Status Low -> Ende
      ldi temp1,Imp1min           ;Minimalwert für "1" Impuls laden 
      cp Zaehler,temp1            ;Minimalwert unterschritten ?
      brcs Puls30                 ;ja -> weiter
     *sts {imp},Zaehler           ;--------> Impulslänge Height speichern für Debug
      cpi Impuls,28               ;beim Paritätsbit Min keine Negation
      breq Puls25
      cpi Impuls,35               ;beim Paritätsbit Std keine Negation
      breq Puls25
      ldi Temp1,1
      eor Pari,Temp1              ;Paritätsbit Negation
    Puls25:
      sec                         ;Carry setzen ( "1" empfangen )
      ror Buffer                  ;Carry in Empfangspuffer
      inc Impuls                  ;Impulszähler erhöhen
      rcall Auswerten             ;Impulse auswerten
      rjmp Puls40                 ;Ende
    Puls30:
     *sts {imp},Zaehler           ;--------> Impulslänge Low speichern für Debug
      clc                         ;Carry löschen ( "0" empfangen )
      ror Buffer                  ;Carry in Empfangspuffer
      inc Impuls                  ;Impulszähler erhöhen
      rcall Auswerten             ;Impulse auswerten
    Puls40:
      bst Status,0                ;aktuellen Status holen
      bld Status,1                ;Status speichern
     *sts {Status},Status         ;Variablen wieder speichern
     *sts {Impuls},Impuls
     *sts {Zaehler},Zaehler
     *sts {Buffer},Buffer
     *sts {Pari},Pari    
      ret
    ;-------------------------------------------------------------------------------
    Softuhr:
     *lds Temp1,{H_Sek}
     *lds Temp2,{_sec}
     *lds _min,{_min}       
     *lds _hour,{_hour} 
      bst Status,2                ;Status Uhr synchronisieren ?
      brtc Soft10                 ;nein -> weiter Softuhr
      clt
      bld Status,2                ;Status Synchron löschen ?
      clr Temp1                   ;Hundertstel löschen
      clr Temp2                   ;Sekunde löschen
     *lds Temp3,{T_Min}
      mov _min,Temp3              ;Minute auf empfangene Minute
     *lds Temp3,{T_Std}
      mov _hour,Temp3             ;Stunde auf empfangene Stunde
      rjmp Soft20                 ;empfangene Zeit übernehmem
    Soft10:
      inc Temp1                   ;Hundertstel Sek erhöhen
      cpi Temp1,40                ;1000ms erreicht ?
      brne Soft20                 ;nein -> Ende
      clr Temp1                   ;Hundertstel Sek löschen
      inc Temp2                   ;Sekunde erhöhen
      cpi Temp2,60                ;60 Sekunden erreicht ?
      brne Soft20                 ;nein -> Ende
      clr Temp2                   ;Sekunde löschen
      inc _min                    ;Minute erhöhen
      cpi _min,60                 ;60 Minuten erreicht ?
      brne Soft20                 ;nein -> Ende
      clr _min                    ;Minute löschen
      inc _hour                   ;Stunde erhöhen
      cpi _hour,24                ;24 Stunden erreicht ?
      brne Soft20                 ;nein -> Ende
      clr _hour                   ;Stunde löschen
    Soft20:
     *sts {H_Sek},Temp1           ;Basic Variablen mit empfangenen
     *sts {_sec},Temp2            ;Werten laden
     *sts {_min},_min
     *sts {_hour},_hour
      ret                         
    ;-------------------------------------------------------------------------------
    Auswerten:
      cpi Impuls, 21              ;21. Impuls
      brne Aus10                  ;nein -> weiter
      clr Buffer
      clr Pari
    Aus10:
      cpi Impuls, 28             ;28. Impuls
      brne Aus15                 ;nein -> weiter
      lsr Buffer                 ;Buffer 1x schieben, da Minute nur 7 Bit
      rcall Bcd2dez              ;in Dezimal wandeln
     *sts {T_Min},Buffer         ;Temp Minute schreiben
      clr Buffer
    Aus15:
      cpi Impuls, 29             ;Minuten Parität
      brne Aus20
      clr Temp3
      bst Buffer,7               ;Paritätsbit selektieren
      bld Temp3,0                ;Paritätsbit in Temp3 Bit0 kopieren
      cp Temp3,Pari              ;Parität überprüfen
      brne Aus26                 ;Fehler -> Ende
      clr Pari
      clr Buffer
    Aus20:
      cpi Impuls, 35             ;35. Impuls
      brne Aus25                 ;nein -> weiter
      lsr Buffer                 ;Buffer 2x schieben, da Stunde nur 6 Bit
      lsr Buffer
      rcall Bcd2dez              ;in Dezimal wandeln
     *sts {T_Std},Buffer         ;Temp Stunde schreiben
      clr Buffer
    Aus25:
      cpi Impuls, 36             ;Stunden Parität
      brne Aus30
      clr Temp3
      bst Buffer,7               ;Paritätsbit selektieren
      bld Temp3,0                ;Paritätsbit in Temp3 Bit0 kopieren
      cp Temp3,Pari              ;Parität überprüfen
      breq Aus27                 ;Pari OK -> weiter
    Aus26:
      ret                        ;Fehler -> Ende
    Aus27:
      set                        ;T-Bit setzen
      bld Status,4               ;Bit4 Status setzen (Parität)
      clr Buffer
    Aus30:
      cpi Impuls,42              ;42. Impuls
      brne Aus40
      lsr Buffer                 ;Buffer 2x schieben, da Tag nur 6 Bit
      lsr Buffer
      rcall Bcd2dez              ;in Dezimal wandeln
      *sts {_day},Buffer         ;Tag schreiben
      clr Buffer
    Aus40:
      cpi Impuls,45              ;45. Impuls
      brne Aus50
      lsr Buffer                 ;Buffer 5x schieben, da Wochentag nur 3 Bit
      lsr Buffer
      lsr Buffer
      lsr Buffer
      lsr Buffer
      rcall Bcd2dez             ;in Dezimal wandeln
     *sts {Wotag},Buffer        ;Wochentag schreiben
      clr Buffer
    Aus50:
      cpi Impuls,50             ;50. Impuls
      brne Aus60
      lsr Buffer                ;Buffer 3x schieben, da Monat nur 5 Bit
      lsr Buffer
      lsr Buffer
      rcall Bcd2dez             ;in Dezimal wandeln
     *sts {_month},Buffer       ;Monat schreiben
      clr Buffer
    Aus60:
      cpi Impuls,58             ;58. Impuls
      brne Aus70
      rcall Bcd2dez             ;in Dezimal wandeln
     *sts {_year},Buffer        ;Jahr schreiben
      clr Buffer
    Aus70:
      cpi Impuls,59             ;59. Impuls
      brne Aus80
      set                       ;T-Bit setzen
      bld Status,3              ;Bit3 Status setzen (59 Impulse)
    Aus80:
      cpi Impuls,60             ;bei mehr als 59 Impulsen (Störimpulse)
      brne Aus90          
      clt                       ;T-Bit löschen
      bld Status,3              ;Bit3 Status löschen (59 Impulse)
      bld Status,4              ;Bit4 Status löschen (Parität)  
    Aus90:
      ret
    ;-------------------------------------------------------------------------------
    Bcd2dez:
      mov Temp1,Buffer
      andi Temp1,$0F
    Bcd10:
      subi Buffer,$10
      brcs Bcd20
      subi Temp1,$F6
      rjmp Bcd10
    Bcd20:
      mov Buffer,Temp1
      ret 
    [end]
    Natürlich habe ich die Softclock im Prog konfiguriert.
    Funktioniert aber leider nicht so, wie ich mir das vorgestellt hatte (nämlich gar nicht!).

    Alternativ hatte ich schon Versuche mit dem CONFIG Clock = User gemacht, aber auch noch nicht sehr erfolgreich.

    Ich will ja eigentlich die BASCOM-Softclock mit DATE$ und TIME$ (ohne Uhrenquarz) nutzen und sie bei Bedarf (bestimme ich selbst, wann ich Bedarf habe!) mit der DCF-Zeit updaten.

    Naja, ich muss halt 'mal weiter probieren. Vielleicht geht's ja irgendwie.
    Vielen Dank nochmal!

    Gruß Dirk

  2. #12
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Hallo Dirk,

    warum sollte die Lib nicht auch mit der Bascom Softclock funktionieren ?
    Ich gehe mal davon aus, dass die Variablen _sec, _min u.s.w. dezimal vorliegen müssen und nicht BCD ???
    Dann sollte diese Lib funktionieren.
    Natürlich vorher in Bascom mit "Config Clock=Soft" die entsprechenden Variablen initialisieren.
    Ich kann es leider nicht testen, da ich im Moment kein DCF-Modul zur Verfügung habe.
    Angehängte Dateien Angehängte Dateien

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277
    Hallo,

    ohne Uhrenquarz kann Bascoms Softclock einfach nicht funktionieren. Alle Timings sind auf die 32,schlagmichtot KHz Frequenz zugeschnitten.
    Mit Uhrenquarz habe ich das in der Variation ja schon vorgeführt. Zu beachten ist allerdings, daß der von Bascom benutzte asynchrone Timer2 mit seinem Interrupt während der DCF77-Synchronisation disabled werden muss, sonst kann es Kuddelmuddel geben.

    Grüße
    Henrik

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    21.08.2004
    Beiträge
    5
    Danke Albundy,

    es funktioniert tadellos. Ich wäre nie auf invertiert gekommen!

    Gruß Thomas!

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Softclock

    Hallo Henrik,

    ohne Uhrenquarz kann Bascoms Softclock einfach nicht funktionieren. Alle Timings sind auf die 32,schlagmichtot KHz Frequenz zugeschnitten.
    Das ist genau mein Problem! Aber ich habe die Antwort noch nicht so klar wie du.
    Lt. BASCOM-Anleitung werden die Variablen _sec ... durch CONFIG CLOCK = ... dimensioniert und DATE$, TIME$ angelegt. Ich soll auch z.B. _sec ändern können, was in TIME$ berücksichtigt wird.
    Dabei ist der asynchrone Timer doch erst mal unwichtig: Die Variablen gibt es dann ja und den Timer kann ich erstmal "disablen".
    Und die Variablen möchte ich nutzen, damit ich normal in Bascom auf DATE$ und TIME$ zugreifen kann. Zur Not auch in der Form, dass ich _sec selbst in einem Unterprogramm jede Sekunde hochzähle.

    Geht das wirklich nicht?

    Gruß Dirk

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Softclock

    Hallo albundy,

    warum sollte die Lib nicht auch mit der Bascom Softclock funktionieren ?
    Leider klappt's (bei mir) nicht.

    Ich versuch's weiter.

    Gruß Dirk

  7. #17
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Lt. BASCOM-Anleitung werden die Variablen _sec ... durch CONFIG CLOCK = ... dimensioniert und DATE$, TIME$ angelegt. Ich soll auch z.B. _sec ändern können, was in TIME$ berücksichtigt wird.
    Dabei ist der asynchrone Timer doch erst mal unwichtig: Die Variablen gibt es dann ja und den Timer kann ich erstmal "disablen".
    Und die Variablen möchte ich nutzen, damit ich normal in Bascom auf DATE$ und TIME$ zugreifen kann.
    Das ist korrekt ! Und genau so, habe ich dich auch verstanden.
    Das die Variablen der Softuhr in Bascom von der Lib versorgt werden müssen (da kein Uhrenquarz angeschlossen wird) ist ja klar.
    Und dabei den OVF2 zu disablen ist auch eine gute Idee !!!

    Ich verstehe aber nicht, das die geänderte Lib so nicht funktioniert ???
    Alle Variablen werden doch durch die Lib entsprechend beschrieben.

    Wenn es dir nur um die formatierte Ausgabe von Time$ und Date$ geht, kannst du dir doch auch eine eigene Funktion dafür schreiben.

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Softclock

    Hallo albundy,

    also... mit deiner Lib wird die Zeit (in DATE$ und TIME$) durch DCF einmal aktualisiert, soll dann aber ja selbst weiterlaufen.
    Das passiert aber nicht, sondern die Zeit steht auf der aktualisierten DCF-Zeit fest.
    Eine eigene Anzeige für DATE$ und TIME$ habe ich.

    Übrigens: Ich meine ja nicht deine Original-Lib mit Demos, die bei mir super funktionieren!


    Gruß Dirk

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    70
    Beiträge
    277

    Re: Softclock

    Zitat Zitat von Dirk
    Hallo albundy,

    also... mit deiner Lib wird die Zeit (in DATE$ und TIME$) durch DCF einmal aktualisiert, soll dann aber ja selbst weiterlaufen.
    Das passiert aber nicht, sondern die Zeit steht auf der aktualisierten DCF-Zeit fest.
    Eine eigene Anzeige für DATE$ und TIME$ habe ich.
    Ja, wie soll sie den auch weiterlaufen, ohne getaktet zu werden? Nimm doch einfach die Original-Library von Albundy, bastele date$ und time$ selbst (wie in meinem oben geposteten Beispiel die SUB "Makeclockstrings()" ) und gut isses. Ich schreibe nicht umsonst, daß sich Modifikationen eher für den fortgeschrittenen Anwender eignen.

    Grüße
    Henrik

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Softclock

    Hallo Henrik,

    Ja, wie soll sie den auch weiterlaufen, ohne getaktet zu werden?
    Das habe ich schon verstanden. Meine Frage ist eigentlich, wie ich sie wieder "takten" kann. Bei der Original-Lib von albundy wird ja auch seine Softclock (mit anderen Variablen) "getaktet" (bzw. in der Interruptroutine hochgezählt), das möchte ich mit der Softclock auch machen.

    Ich schreibe nicht umsonst, daß sich Modifikationen eher für den fortgeschrittenen Anwender eignen.
    Ich lerne gern und werde dann zum fortgeschrittenen Anwender.

    Gruß Dirk

Seite 2 von 21 ErsteErste 123412 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen