- LiFePO4 Speicher Test         
Seite 8 von 21 ErsteErste ... 67891018 ... LetzteLetzte
Ergebnis 71 bis 80 von 204

Thema: Library für DCF77 Dekodierung

  1. #71
    Neuer Benutzer Öfters hier
    Registriert seit
    01.09.2006
    Beiträge
    6

    frage an die wissenden.....

    Anzeige

    Praxistest und DIY Projekte
    muss vorausschicken, dass ich novize bin, also wahrscheinlich ist der fehler einfach zu finden (hoffe ich zumindest)

    ich habe die lib von dirk in der version 2.50 in verwendung, samt zugehörigen include-code

    auf meinem mega128 mit 16MHz und uhrenquarz + conrad dcf77.

    interner pullup, invertierter ausgang des CDF, sauberes DCF-signal (mit oszi geprüft)
    Timer ist der 16bit-timer, prescale und stratwert angepasst an die taktfrequenz, interupts an diesen timer1 angepasst, port A0 im code und der LIB eingetragen.

    bei inbetriebnahme wird staus.7 auf 1 gesetzt, detto status.2 (seltsam- sofort nach status.7- in der selben sekunde) und status.0 (keine ahnung was der tut)
    die variable dcfcounter läuft von 0-256 in etwa 6-7sek, dcfbuffer und dcfparity bleiben auf 0, dcfpulse steht auf 1, dcfpau auf 0, dcfimp auf 1 (beide in der lib enabled).

    was sagt euch dieses fehlverhalten? bin ratlos und hoffe auf eure hilfe

    grüsse aus wien
    günter

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

    Details

    Hallo Günter,

    manchmal liegt das Prob im Detail:
    Poste doch 'mal deine Änderungen!
    Zur Sicherheit: Uhrenquarz 32768 Hz an TOSC1/2 wirklich vorhanden?

    Gruß Dirk

  3. #73
    Neuer Benutzer Öfters hier
    Registriert seit
    01.09.2006
    Beiträge
    6
    ja, der uhrenquarz ist mit 32,nochwas kHZ vorhanden, die interne Soft-clock des atmel geht auch brav.

    habe das glück mit dem farb-grafik-display relativ viel auf einmal anzeigen zu können, daher sehe ich auch alle angeben des vorigen posts auf einmal.
    ich sehe auch, dass ich das signal tatsächlich am pin ankommt zumal ich das signal des input-pins auf einen output mit LED dahinter "hinüberspiegle"
    der pin als eingang ist der A0, das reister für die A-ports ist lt. bescheibung des M128 das $19 wenn ich das alles richtig interpretiert habe.

    so nun aufgelistet:
    deine lib v2.50, register $19, pin0 also port A0 am prozessor
    uhrenquarz aus TOSC, softclock läuft auch
    timer Timer1 wegen 16bit aufgrund 16MHz prozessortakt
    interupt auf Timer1 geändert, prescale auf 8, start auf 15536
    signalform des DCF ist so wie's sein soll, timings des DCF habe ich mit Oszi nachgemessen, alles wie es sein soll


    wenn ich nicht alles schon 7x nachgeprüft und überlegt hätte, hätte ich nie gepostet, ich habe auch diese thread schon quasi auswendig gelernt aber keinen hinweis darauf gefunden was ich falsch mache.

    vielen dank für deine hilfe!
    günter

  4. #74
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Günter,

    das was du schreibst, klingt alles richtig.

    Ich würde als nächstes Folgendes machen:
    Nimm einen anderen Eingangspin nicht aus PortA, weil PortA ja zunächst als ADC definiert ist (z.B. Pind.0),- evtl. ist das die Ursache.

    Als Timer-Startwert habe ich 15543, aber 15536 müßte auch gehen.

    Hier noch meine LIB V2.52, da ist ein Fehler in der Softclock ausgebügelt, der in die V2.50 reingerutscht war:
    Code:
    copyright    = W.Krueger
    comment      = DCF77-Decoder und Softclock
    libversion   = 2.52 (D. Ottensmeyer)
    date         = 07.10.2006
    statement    = ----------------------------------
    statement    = muss alle 25ms ausgeführt werden !
    statement    = Neu: komplette Paritätsprüfung
    statement    = Neu: Auswertung der Bits 15..20 
    statement    = Neu: erweiterte Softclock
    statement    = ----------------------------------
    
    [Dcf77_soft]
    .equ DCF_Port = $10   ;$10 = Portd
    .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 Status   = r18
                   ;Bit0 = aktueller DCF Status
                   ;Bit1 = vorheriger DCF Status
                   ;Bit2 = 58 Impulse empfangen
                   ;Bit3 = Parität OK
                   ;Bit4 = Stundenparität OK
                   ;Bit5 = Uhr nach DCF gestellt
                   ;Bit6 = Datum nach DCF gestellt
                   ;Bit7 = Uhr nach DCF stellen
    .def Impulse  = r19
    .def Counter  = r20
    .def Buffer   = r21
    .def Parity   = r22
    
    Dcf77_soft:
     *lds Status,{Dcfstatus}      ;Status laden
      rcall Softclock             ;Softclock bearbeiten  
      bst Status,7                ;Status Uhr nach DCF stellen ?
      brts Puls0                  ;ja -> weiter
     *sts {Dcfstatus},Status
      ret
    ;-------------------------------------------------------------------------------
    [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 Status   = r18
                   ;Bit0 = aktueller DCF Status
                   ;Bit1 = vorheriger DCF Status
                   ;Bit2 = 58 Impulse empfangen
                   ;Bit3 = Parität OK
                   ;Bit4 = Stundenparität OK
                   ;Bit5 = Uhr nach DCF gestellt
                   ;Bit6 = Datum nach DCF gestellt
                   ;Bit7 = Uhr nach DCF stellen
    .def Impulse  = r19
    .def Counter  = r20
    .def Buffer   = r21
    .def Parity   = r22
    
    Dcf77:
     *lds Status,{Dcfstatus}      ;Status laden
      bst Status,7                ;Status Uhr nach DCF stellen ?
      brts Puls0                  ;ja -> weiter
      ret
    Puls0:
     *lds Impulse,{Dcfimpulse}    ;Variablen laden
     *lds Counter,{Dcfcounter}
     *lds Buffer,{Dcfbuffer}
     *lds Parity,{Dcfparity}    
      in temp1,Dcf_Port           ;DCF Port lesen
      bst temp1,Dcf_Pin           ;Status holen
      bld Status,0                ;aktuellen Status speichern
      inc Counter                 ;Impulslänge erhöhen
      bst Status,0                ;aktuellen 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 Counter,temp1            ;Impulslänge Minimalwert überschritten
      brcs Puls10                 ;nein -> weiter
     *sts {Dcfpau},Counter        ;--------> Minutenimpulslänge speichern für Debug
      clr Buffer                  ;Empfangspuffer löschen
      clr Impulse                 ;Impulszähler löschen
      bst Status,3                ;Parität OK ?
      brtc Puls15                 ;Nein -> weiter
      bst Status,2                ;58 Impulse empfangen ?
      brtc Puls15                 ;Nein -> weiter
      rcall Stellen               ;empfangene Zeit übernehmen
    Puls5:
      clt
      bld Status,2                ;Status 58 Impulse löschen
      bld Status,3                ;Status Parität OK löschen
      bld Status,4                ;Status Stundenparität OK löschen
    Puls10:
      clr Counter                 ;Impulslänge löschen
      rjmp Puls40                 ;Ende
    Puls15:
      bst Status,4                ;Stundenparität OK ?
      brtc Puls5
      rcall Zeitstellen           ;nur Uhrzeit übernehmen
      rjmp Puls5
    Puls20:
      bst Status,1                ;vorherigen Status prüfen
      brts Puls40                 ;vorheriger Status Low -> Ende
      ldi temp1,Imp1min           ;Minimalwert für "1" Impuls laden 
      cp Counter,temp1            ;Minimalwert unterschritten ?
      brcs Puls30                 ;ja -> weiter
     *sts {Dcfimp},Counter        ;--------> Impulslänge High speichern für Debug
      cpi Impulse,28              ;beim Paritätsbit Min keine Negation
      breq Puls25
      cpi Impulse,35              ;beim Paritätsbit Std keine Negation
      breq Puls25
      cpi Impulse,58              ;beim Paritätsbit Datum keine Negation
      breq Puls25  
      ldi Temp1,1
      eor Parity,Temp1            ;Paritätsbit Negation
    Puls25:
      sec                         ;Carry setzen ( "1" empfangen )
      ror Buffer                  ;Carry in Empfangspuffer
      rcall Auswerten             ;Impulse auswerten
      inc Impulse                 ;Impulszähler erhöhen
      rjmp Puls40                 ;Ende
    Puls30:
     *sts {Dcfimp},Counter        ;--------> Impulslänge Low speichern für Debug
      clc                         ;Carry löschen ( "0" empfangen )
      ror Buffer                  ;Carry in Empfangspuffer
      rcall Auswerten             ;Impulse auswerten
      inc Impulse                 ;Impulszähler erhöhen
    Puls40:
      bst Status,0                ;aktuellen Status holen
      bld Status,1                ;Status speichern
     *sts {Dcfstatus},Status      ;Variablen wieder speichern
     *sts {Dcfimpulse},Impulse
     *sts {Dcfcounter},Counter
     *sts {Dcfbuffer},Buffer
     *sts {Dcfparity},Parity    
      ret
    ;-------------------------------------------------------------------------------
    Softclock:                    ;muss 40x pro Sekunde aufgerufen werden
     *lds Temp1,{Dcfhsec}
      inc Temp1                   ;Hundertstel Sek erhöhen
      cpi Temp1,40                ;1000ms erreicht ?
      breq Soft10                 ;ja -> weiter
     *sts {Dcfhsec},Temp1
      ret                         ;sonst Ende
    Soft10:
      clr Temp1                   ;Hundertstel Sek löschen
     *sts {Dcfhsec},Temp1
     *lds Temp1,{_sec}
      inc Temp1                   ;Sekunde erhöhen
      cpi Temp1,60                ;60 Sekunden erreicht ?
      breq Soft20                 ;ja -> weiter
     *sts {_sec},Temp1
      ret
    Soft20:
      clr Temp1                   ;Sekunde löschen
     *sts {_sec},Temp1
     *lds Temp1,{_min}       
      inc Temp1                   ;Minute erhöhen
      cpi Temp1,60                ;60 Minuten erreicht ?
      breq Soft30                 ;ja -> weiter
     *sts {_min},Temp1
      ret
    Soft30:
      clr Temp1                   ;Minute löschen
     *sts {_min},Temp1
     *lds Temp1,{_hour}
      inc Temp1                   ;Stunde erhöhen
      cpi Temp1,24                ;24 Stunden erreicht ?
      breq Soft40                 ;ja -> weiter
     *sts {_hour},Temp1  
      ret
    Soft40:
      clr Temp1                   ;Stunde löschen
     *sts {_hour},Temp1
     *lds Temp1,{_dayofweek}
      inc Temp1                   ;Wochentag erhöhen
      cpi Temp1,8                 ;letzter Wochentag erreicht ?
      brne Soft50                 ;nein -> weiter
      ldi Temp1,1                 ;Wochentag auf "1" (Montag)
    Soft50:
     *sts {_dayofweek},Temp1
     *lds Temp1,{_day}            ;Tag holen
     *lds Temp2,{_month}          ;Monat holen
      ldi zl,low(Tagdaten*2)
      ldi zh,high(Tagdaten*2)     ;Anzahl Tage pro Monat holen
      add zl,Temp2                ;Zeiger auf aktuellen Monat
      lpm                         ;Anzahl Tage holen
      cp Temp1,r0                 ;Monatsende erreicht ?
      brne Soft90                 ;nein -> weiter
      cpi Temp2,2                 ;Monatsende Februar ?
      brne Soft60                 ;nein -> weiter
      clt                         ;Evtl. Schaltjahr mit 29.2.
      bld Status,6                ;Status Datum nach DCF gestellt löschen
    Soft60:
      cpi Temp2,6                 ;Monatsende Juni ?
      brne Soft70                 ;nein -> weiter
      clt                         ;Zur Jahresmitte evtl. Schaltsekunde
      bld Status,5                ;Status Uhr nach DCF gestellt löschen
    Soft70:
      ldi Temp1,1                 ;Tag auf 1
      cpi Temp2,12                ;Jahresende erreicht ?
      brne Soft100                ;nein -> weiter
      clt                         ;Zum Jahreswechsel evtl. Schaltsekunde
      bld Status,5                ;Status Uhr nach DCF gestellt löschen
     *lds Temp2,{_year}           ;Jahr holen
      inc Temp2                   ;Jahr erhöhen
      cpi Temp2,100               ;Jahr 100 erreicht ?
      brne Soft80                 ;nein -> Ende
      clr Temp2                   ;Jahr 00 setzen
    Soft80:
     *sts {_year},Temp2           ;speichern
      ldi Temp2,1                 ;Monat auf 1
      rjmp Soft110  
    Soft90:
      inc Temp1                   ;Tag erhöhen
      rjmp Soft110                 
    Soft100:
      inc Temp2                   ;Monat erhöhen
    Soft110:
     *sts {_day},Temp1            ;Datum speichern
     *sts {_month},Temp2    
      ret
    
    Stellen:
     *lds Temp1,{Dcftemp+2}
     *sts {_day},Temp1            ;Tag auf empfangenen Tag
     *lds Temp1,{Dcftemp+3}
     *sts {_dayofweek},Temp1      ;Wochentag auf empfangenen Wochentag  
     *lds Temp1,{Dcftemp+4}
     *sts {_month},Temp1          ;Monat auf empfangenen Monat
     *lds Temp1,{Dcftemp+5}
     *sts {_year},Temp1           ;Jahr auf empfangenes Jahr
      set
      bld Status,6                ;Status Datum nach DCF gestellt setzen
    Zeitstellen:
      ldi Temp1,1                 ;Hundertstel zurücksetzen
     *sts {Dcfhsec},Temp1         ;(1. Intervall 25ms kürzer !)
      clr Temp1
     *sts {_sec},Temp1            ;Sekunde auf 0 setzen
     *lds Temp1,{Dcftemp}
     *sts {_min},Temp1            ;Minute auf empfangene Minute
     *lds Temp1,{Dcftemp+1}
     *sts {_hour},Temp1           ;Stunde auf empfangene Stunde
     *lds Temp1,{Dcftemp+6}
     *sts {Dcfflags},Temp1        ;DCF77-Bits 15..20 aktualisieren
      set
      bld Status,5                ;Status Uhr nach DCF gestellt setzen
      ret
    Tagdaten:
    .db 00, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31  
    ;-------------------------------------------------------------------------------
    Auswerten:
      cpi Impulse,14              ;14. Impuls
      brne Aus5                   ;nein -> weiter
      clr Buffer 
    Aus5:
      cpi Impulse,20              ;20. Impuls
      brne Aus10                  ;nein -> weiter
      bst Buffer,7                ;Startbit 20 (S) selektieren
      brtc Aus26                  ;Fehler -> Ende
      lsr Buffer                  ;Buffer 2x schieben, da 6 Bit
      lsr Buffer
     *sts {Dcftemp+6},Buffer      ;Temp DCF77-Bits 15..20 schreiben
       ;Inhalt Buffer -> Bit0 (R) : Reserve-Antenne des DCF77-Senders
       ;                 Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ
       ;                 Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ
       ;                 Bit3 (Z2): /
       ;                 Bit4 (A2): Ankündigung einer Schaltsekunde
       ;                 Bit5 (S) : Startbit f. Zeitinformationen (immer 1)
      clr Buffer 
      clr Parity
    Aus10:          
      cpi Impulse,27              ;27. Impuls
      brne Aus15                  ;nein -> weiter
      lsr Buffer                  ;Buffer 1x schieben, da Minute nur 7 Bit
      rcall Bcd2dez               ;in Dezimal wandeln
     *sts {Dcftemp},Buffer        ;Temp Minute schreiben
      clr Buffer   
    Aus15: 
      cpi Impulse,28              ;Minuten Parität
      brne Aus20
      clr Temp1
      bst Buffer,7                ;Paritätsbit selektieren
      bld Temp1,0                 ;Paritätsbit in Temp1 Bit0 kopieren
      cp Temp1,Parity             ;Minutenparität überprüfen
      brne Aus26                  ;Fehler -> Ende
      clr Parity
      clr Buffer
    Aus20:  
      cpi Impulse,34              ;34. Impuls
      brne Aus25                  ;nein -> weiter
      lsr Buffer                  ;Buffer 2x schieben, da Stunde nur 6 Bit
      lsr Buffer
      rcall Bcd2dez               ;in Dezimal wandeln
     *sts {Dcftemp+1},Buffer      ;Temp Stunde schreiben
      clr Buffer
    Aus25: 
      cpi Impulse,35              ;Stunden Parität
      brne Aus30
      clr Temp1
      bst Buffer,7                ;Paritätsbit selektieren
      bld Temp1,0                 ;Paritätsbit in Temp1 Bit0 kopieren
      cp Temp1,Parity             ;Stundenparität überprüfen
      breq Aus27                  ;Parität OK -> weiter
    Aus26:
      ret                         ;Fehler -> Ende 
    Aus27:
      set
      bld Status,4                ;Bit4 Status setzen (Stundenparität) 
      clr Parity
      clr Buffer  
    Aus30:                
      cpi Impulse,41              ;41. Impuls
      brne Aus40          
      lsr Buffer                  ;Buffer 2x schieben, da Tag nur 6 Bit
      lsr Buffer          
      rcall Bcd2dez               ;in Dezimal wandeln 
     *sts {Dcftemp+2},Buffer      ;Temp Tag schreiben
      clr Buffer 
    Aus40:       
      cpi Impulse,44              ;44. 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 {Dcftemp+3},Buffer      ;Temp Wochentag schreiben  
      clr Buffer              
    Aus50: 
      cpi Impulse,49              ;49. Impuls
      brne Aus60           
      lsr Buffer                  ;Buffer 3x schieben, da Monat nur 5 Bit
      lsr Buffer          
      lsr Buffer          
      rcall Bcd2dez               ;in Dezimal wandeln 
     *sts {Dcftemp+4},Buffer      ;Temp Monat schreiben
      clr Buffer         
    Aus60:           
      cpi Impulse,57              ;57. Impuls
      brne Aus70          
      rcall Bcd2dez               ;in Dezimal wandeln 
     *sts {Dcftemp+5},Buffer      ;Temp Jahr schreiben
      clr Buffer     
    Aus70:
      cpi Impulse,58              ;Restparität
      brne Aus80          
      set                         ;T-Bit setzen
      bld Status,2                ;Bit2 Status setzen (58 Impulse)
      clr Temp1
      bst Buffer,7                ;Paritätsbit selektieren
      bld Temp1,0                 ;Paritätsbit in Temp1 Bit0 kopieren
      cp Temp1,Parity             ;Restparität überprüfen
      brne Aus90                  ;Fehler -> Ende
      set                         ;T-Bit setzen
      bld Status,3                ;Bit3 Status setzen (Parität) 
    Aus80:
      cpi Impulse,59              ;mehr als 58 Impulse (d.h. Störimpulse)
      brne Aus90          
      clt                         ;T-Bit löschen
      bld Status,2                ;Bit2 Status löschen (58 Impulse)
    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]
    Viel Erfolg!
    Dirk

  5. #75
    Neuer Benutzer Öfters hier
    Registriert seit
    01.09.2006
    Beiträge
    6

    des rätsels lösung und eine neue ungewissheit.....

    zunächst mal der grund warum der code zunächst nicht funktioniert hat:

    wenn man einen 16MHz-quarz verbaut dann sollte man _nicht_ crystal=8000000 drinstehen haben .....
    kaum macht man's richtig geht's auch schon (besser)

    nun habe ich den fehler gefunden und behoben nur um vor einer neuen ungewissheit zu stehen, die ich mir schon wieder nicht erklären kann.

    verwende mittlerweile deine lib 2.52. die statusbits für parity und stundenparity gehen nach einiger zeit beide auf high, das flag für zeit und datum stellen (bit7) steht auch auf high, nur nachdem das flag für 58 impulse nicht kommt wird die zeit natürlcih nicht übernommen (sofern ich den assembler richtig lese).
    was ich aber nicht verstehe- der zähler für die impulse läuft bis 255 und nix passiert- eigentlich sollte der doch irgendwann gezielt gelöscht werden?
    die frage ist jetzt die- stimmt irgendwo im hauptprogramm von mir was nicht, empfang (schliesse ich eigentl. aus)?, lib (???)

    (wieder) ratlose grüße
    günter

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

    DCF klappt nicht

    Hallo Günter,

    der Impulszähler darf nicht bis 255 hochzählen!
    Ich würde erst nur ein "Minimalprogramm" zur Anzeige ausprobieren. Ich habe mal so ein Kurzprog hier eingestellt,- du müßtest noch deine Timer-Variante anpassen:

    Code:
    'Hauptprogramm:
    Cls
    Cursor Off
    
    Date$ = "01.01.00"
    Time$ = "00:00:00"
    
    Sekunde = 0
    
    '* HAUPTPROGRAMMSCHLEIFE *
    
    Do
      If Sekunde <> _sec Then
        Cls
        Call Showtime()
        Sekunde = _sec
      End If
      If _min = 0 And Dcfstatus.7 = 0 Then            '1x pro Stunde:
        Dcfstatus.5 = 0                               'Zeit inaktuell
        Dcfstatus.6 = 0                               'Datum inaktuell
      End If
      'Wenn Uhr oder Datum inaktuell, dann nach DCF stellen:
      'Timer0 ist nur aktiv, solange DCF-Empfang läuft!!!
      If Dcfstatus.5 = 0 Or Dcfstatus.6 = 0 Then
        Dcfstatus.7 = 1
        Enable Timer0
      Else
        Dcfstatus.7 = 0
        Disable Timer0
      End If
    Loop
    
    End
    
    '* ENDE HAUPTPROGRAMM *
    
    Sub Showtime()
      Locate 1 , 1                                    'Zeile 1:
      Lcd Time$                                      'Uhrzeit
      Locate 2 , 1                                    'Zeile 2:
      Lcd Date$                                       'Datum
    End Sub

  7. #77
    Neuer Benutzer Öfters hier
    Registriert seit
    01.09.2006
    Beiträge
    6

    und der impuls-sounter läuft und läuft.......

    weiss jetzt nicht, wie ich den code so poste wie ihr, daher mache ich das so als text.



    $regfile = "m128def.dat"
    $framesize = 32
    $swstack = 256
    $hwstack = 64
    $lib "dcf77.lib" 'LIB für DCF77
    $external Dcf77


    Declare Sub Dcf77
    Declare Sub Lcd_print(byval Lcd_text As String , Byval Lcd_posx As Byte , Byval Lcd_posy As Byte , Byval Fontsize As Byte , Byval Lcd_fcolor As Byte , Byval Lcd_bcolor As Byte)


    '----------------------------------------------------------------------
    Lcd_port Alias Portb 'Port B
    Ddrb = &B01100110 'Port B: 4 Pins output

    Const Kommando = 0 'Eine folgendes Kommando wird durch "1" eingeleitet
    Const Parameter = 1 'Eine folgende Parameterübergabe wird durch "0" eingeleitet

    Const Rs = 6
    Const Cs = 5
    Const Sdata = 2
    Const Sclk = 1 'd.h. Port B.1


    Const Blau = &B00000011 'Vordefinierte Konstanten für die Farbwerte machen das Programmiererleben leichter:
    Const Gelb = &B11111100
    Const Rot = &B11100000
    Const Gruen = &B00011100
    Const Schwarz = &B00000000
    Const Weiss = &B11111111
    Const Hellgruen = &B00111110
    Const Dunkelgruen = &B00010100
    Const Dunkelrot = &B10100000
    Const Dunkelblau = &B00000010
    Const Hellblau = &B00011111
    Const Orange = &B11111000

    '================================================= ==========================
    ' Includes für DCF77

    Config Date = Dmy , Separator = . 'deutsches Datumsformat
    Config Clock = Soft 'Softclock aktivieren
    ' (läuft mit Timer2!)
    Config Timer1 = Timer , Prescale = 8 'Timer 40Hz
    Const Startwert = 15543 'Für 16MHz
    Timer1 = Startwert
    On Timer1 Tim1_isr 'Überlauf 40x/s
    Enable Interrupts
    Disable Timer1 'zunächst ausschalten

    '---------------------- Pin für DCF Eingang definieren ---------------------
    'Jeder Portpin kann benutzt werden.
    'Auch in der "Dcf77.lib" entsprechend anpassen !!!

    Config Pind.3 = Input 'DCF77 Eingang
    Portd.3 = 1 'Pullup ein

    Config Pind.5 = Output
    Set Portd.5

    Config Pind.7 = Input
    Portd.7 = 1


    Dim Count As Word
    Count = 0

    '--------------------- Variablen der DCF77.lib -----------------------------

    Dim _dayofweek As Byte , Dcfstatus As Byte , Dcfflags As Byte
    '_dayofweek -> 1..7 (Mo..So)
    'Dcfstatus -> Bit0: intern Bit4: Stundenparität OK
    ' Bit1: intern Bit5: Uhr nach DCF gestellt
    ' Bit2: 58 Impulse empfangen Bit6: Datum nach DCF gestellt
    ' Bit3: Parität OK Bit7: Uhr nach DCF stellen
    ' ACHTUNG: Bits 0..4 NUR LESEN!!!
    'Dcfflags -> Bit0 (R) : Reserve-Antenne des DCF77-Senders
    ' Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ
    ' Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ
    ' Bit3 (Z2): /
    ' Bit4 (A2): Ankündigung einer Schaltsekunde
    ' Bit5 (S) : Startbit f. Zeitinformationen (immer 1)

    'Interne Variablen der DCF77.lib:
    Dim Dcfcounter As Byte , Dcfbuffer As Byte , Dcfimpulse As Byte
    Dim Dcfparity As Byte , Dcfhsec As Byte , Dcftemp(7) As Byte
    Dim Dcfpau As Byte , Dcfimp As Byte 'Nur für Debug!
    Dim Helper As String * 3
    '---------------------------------------------------------------------------

    Dcfstatus = 0

    Dcfstatus.7 = 0 'Uhr nach DCF stellen: AUS
    Dcfstatus.5 = 1 'Uhrzeit inaktuell
    Dcfstatus.6 = 1 'Datum inaktuell

    ' End für DCF77
    '================================================= ==========================
    Date$ = "01.01.06"
    Time$ = "01:00:00"


    Gosub Lcd_init
    Gosub Lcd_cls 'Display löschen



    '-------------------------------------------------------------------------------
    'Hauptprogramm
    '-------------------------------------------------------------------------------


    Do 'endless loop

    Call Lcd_print( "started" , 1 , 10 , 0 , Weiss , Blau)

    ' If _min = 0 And Dcfstatus.7 = 0 Then '1x pro Stunde:
    If Pind.7 = 0 Then
    Dcfstatus.5 = 0 'Zeit inaktuell
    Dcfstatus.6 = 0 'Datum inaktuell
    End If
    'Wenn Uhr oder Datum inaktuell, dann nach DCF stellen:
    'Timer1 ist nur aktiv, solange DCF-Empfang läuft!!!
    If Dcfstatus.5 = 0 Or Dcfstatus.6 = 0 Then
    Dcfstatus.7 = 1
    Enable Timer1
    Call Lcd_print( "Ena" , 1 , 3 , 0 , Weiss , Blau)

    Helper = Str(dcfstatus)
    Call Lcd_print(helper , 1 , 4 , 0 , Rot , Weiss)

    Else
    Dcfstatus.7 = 0
    Disable Timer1
    Call Lcd_print( "Dis" , 5 , 3 , 0 , Weiss , Rot)

    End If

    Call Lcd_print(time$ , 1 , 1 , 0 , Weiss , Blau)
    Call Lcd_print(date$ , 1 , 2 , 0 , Weiss , Blau)

    Helper = Str(dcfstatus)
    Call Lcd_print(helper , 1 , 4 , 0 , Rot , Weiss)

    Helper = Str(dcfcounter)
    Call Lcd_print(helper , 1 , 6 , 0 , Rot , Weiss)
    Helper = Str(dcfbuffer)
    Call Lcd_print(helper , 6 , 6 , 0 , Rot , Weiss)
    Helper = Str(dcfimpulse)
    Call Lcd_print(helper , 11 , 6 , 0 , Rot , Weiss)
    Helper = Str(dcfparity)
    Call Lcd_print(helper , 16 , 6 , 0 , Rot , Weiss)
    Helper = Str(dcfpau)
    Call Lcd_print(helper , 1 , 7 , 0 , Gruen , Weiss)
    Helper = Str(dcfimp)
    Call Lcd_print(helper , 6 , 7 , 0 , Gruen , Weiss)

    If Pind.3 = 0 Then
    Portd.5 = 0
    Else
    Portd.5 = 1
    End If

    Loop

    End 'end program


    '================================================= ==============================


    Tim1_isr:
    Call Dcf77
    Return

    die restlichen definitionen für dasd farbdisplay habe ich weggelöscht, weil die tun nichts zur sache. sonst wars das aber.
    mit pinD.7 starte ich den DCF, später mal wird das dann über die zeit erfolgen (aber das wäre für die tests jetzt recht unpraktisch)
    ich kann mir leider nicht erklären warum der impulse-counter über die 58 hinausläuft obwohl zu diesem zeitpunktdie zwei parity's auf 1 stehen.

    vielen dank für allfällige tips
    günter

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

    Decoder will nicht

    Hallo Günter,

    für Codeblöcke kannst du oben "Code" anklicken, dann den Code einfügen und wieder auf "Code" klicken. Am Anfang wird dann (Code) und am Ende (/Code) eingefügt (hier runde Klammern anstelle der eckigen!).

    Zu deinem Prog:
    1. Ich kann nicht erkennen, wie du Pind.7 beschaltet hast. Wenn er dauerhaft auf GND liegt, müßte der Decoder ständig AN sein und die Zeit irgendwann übernehmen.

    2. Die ISR ist nicht richtig! Sie muss so aussehen:
    Tim1_isr:
    [highlight=red:19a9190e4a]Timer1 = Startwert[/highlight:19a9190e4a]
    Call Dcf77
    Return

    Gruß Dirk

  9. #79
    Neuer Benutzer Öfters hier
    Registriert seit
    01.09.2006
    Beiträge
    6

    DAAAANKEEEE

    hallo dirk,

    vielen dank für deine nachhilfe. kleine ursache, grosse wirkung.
    deine letzter tip mit dem startwert war's.
    funktioniert bestens!

    lg günter

  10. #80
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Hallo Günter,
    habe auch das Display von Display3000.
    Ich würde gern den funktionierenden Code mit Displayansteuerung erben.
    Ist es möglich den Code zubekommen?
    MfG

Seite 8 von 21 ErsteErste ... 67891018 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress