frage an die wissenden.....
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
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) :-b
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
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