PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dcf - 77 assemblercode



NickD
21.04.2005, 08:19
hi leutz....

ich programmiere schon seit 2 jahren assembler.
diesmal beschäftige ich mich, mit dem dcf 77 baustein, bei dem ich starthilfen brauche.
ich weiss bisher, das alles nach zeiten gegliedert ist und ich so auch werte ablesen kann.
nur ich habe keine ahnung wie ich beginnen soll......

hat jemand so etwas schon programmiert oder kann mir sogar programmbeispiele schicken?
das wär eine sehr große hilfe!

mfg

Nick

Klaus_0168
21.04.2005, 12:51
Hi NickD,

leider programmiere ich derzeit nicht in Assembler und habe auch keine entsprechende Bibliothek zur Verfügung. Ich poste zur Info aber mal das
Kodierschema :
http://www.dcf77.de/deutsch/kodierung.htm

und eine technische Info
http://www.prog-link.com/dcf77/dcf77-2.html#Das_DCF77_Zeitsignal

mit der Hoffnung, das es Dir weiter hilft.

Wenn Du Sourcecode haben willst währe eine wichtige Info der Prozessor, auf dem Du Dein Programm schreiben willst.

Gruß Klaus

Amri
21.04.2005, 15:54
Hi,
welchen Controller benutzt du? Für AVR hätte ich Assembler-Code zum auslesen des Signals.

Kurt Pieper
21.04.2005, 16:25
Hi NickD.

Habe eine Software für 80c535 in Assembler.
Arbeitet mit Conrad DCF Modul.

Kurt

NickD
22.04.2005, 10:52
hi leutz...

ersmal danke an euch alle, die mir weiterhelfen wollen, bzw. konnten, besonderst, an klaus, der mir mit den fachseiten, sehr heöfen konnte!

ich benutze den 80c535, mit dem asem compiler!

also wenn ihr ein beispielprogramm habt, dann wär das echt großartig.

p.s.: ich habe erst vor kurzem dieses forum endeckt udn ich bin echt überrascht, wie hoch hier, die hilfsbereitschaft ist!

vielen dank...

nick

NickD
25.04.2005, 09:38
ich bedanke mich sehr bei kurt, der mir per email ein c - programm des dcf77 geschickt hat.
leider hilft mir das nur ansatzweise weiter. leider kann ich ausbildungtechn. nicht in c arbeiten, was ich selber sehr bereue, da es mir die arbeit sehr erleichtern würde.
wir sind, bzw. ich bin schon damit beschäftig, auf einen c - cross comiler umzustellen, leider werde ich nur, in meiner ausbildungszeit, ncihts davon haben.

also ich weiss schon in welchen impulsen, was gesendet wird,, nur mich habe keine ahnung wie ich anfangen soll!

hiiiillfe *g*

Nick

NickD
25.04.2005, 11:56
eigentlich ist mein problem folgendes:

wie speicher ich die empfangenden 0 und 1 datenbit's ab?

Amri
26.04.2005, 18:49
Also, was wann gesendet wird, weiß du ja scheinbar. Hier steht es auch nochmal: http://www.giangrandi.ch/electronics/dcf77/signal.html
Das Abspeichern läuft (in Assembler) so ab:
Eine Zählvariable wird bei jeder empfangenen '0' oder '1' um 1 erhöht- wenn du das Signal der 59.Sekunde empfängst, wird die Zählvariable bei der nächsten Sekunde(0) auf 0 zurückgesetzt. Du hast damit in der Zählvariable immer die aktuelle Sekunde stehen.
Wenn zu beispielsweise die Minute wissen möchstest, dann fragst du ab, ob gerade die Minute gesendet wird (Das ist der Fall wenn deine Zählvariable im Bereich 21..27 steht). Wenn dies der Fall ist, verwendest du ein Register und schiebst per ror-Befehl das aktuell empfangene Bit "von links" ein. Wenn alle 7 Bits empfangen wurden, musst du natürlich nochmal eine '0' nachschieben, weil das Register ja nicht 7 sondern 8 Bit hat.
Danach hast du die Minute BCD-codiert in deinem Register stehen.
Genauso kannst du es auch mit Stunden, Tag, Jahr usw. machen.

Ich hoffe das war einigermaßen verständlich erklärt ;)

NickD
02.05.2005, 09:14
hi leutz....

das abspeichern ist mir jetzt möglich, danke für die hilfe.
nur ich weiss nciht, wie ich prüfe, wie lange der intervall ist. ich muss ja gucken, ob ich am minutenanfang bin.

mgf

nick

NickD
02.05.2005, 11:32
ich bin jetzt folgendermaßen forgegangen:

ich habe den dcf77 erfolgreich, an meinen microcontroller, angeschlossen.
ich gebe dich eingangssignale (von dem dcf77 auf port P1) auf P4 aus (led's zum prüfen).
ich sehe jetzt die signale.
ich habe das jetzt folgend verstanden.....ein kurzes blinken (100ms) ist eine 0 und ein langes leuchten (200ms) eine 1.
jetzt ist das so gesehen kein problem fortzufahren....nur ich kann nciht den unterschied prüfen oder weiss nciht wie ichs anstellen soll.
soll ich nebenbei ein zeitverzögerung laufen lassen und in bestimmten abständen auf 0 bzw. 1 testen? das würde auf jedenfall, meiner meinung nach, die einzige möglichkeit sein.

Amri
02.05.2005, 16:07
Den Unterschied zwischen 100ms und 200ms stellst du ganz einfach fest: Sobald du ein Signal empfängst, startest du eine Zeitschleife mit beispielsweise 150ms. Direkt danach prüfst du, ob das Signal immer noch da ist. Wenn ja, war das Signal mindestens 150ms lang => 200ms, ansonsten 100ms. Falls das Signal "lang" war, musst du dann noch mal über 50ms warten, am besten nochmal 150ms, weil dann das Signal auf jeden Fall wieder weg ist. Dann wartest du so lange, bis das Signal wieder da ist und das Ganze beginnt wieder von vorne.

NickD
23.05.2005, 12:04
ich habe folgenden source geschrieben:

$IC(sfr.def)

org 4000H //startadresse

mov p5,#0 //mache alle leds aus
weiter: mov A,P1 //schreibe das eingangssignal, des dcf77 (p1) in den akku
mov R4,#01111111B //fülle register 4, mit dem wert
SUBB A,R4 //ziehe die werte von einander ab
jz null //wenn der akku null ist, spring zum label null
jmp eins //ansonsten zum label eins


null: setb P5.0 //mache die led auf port p5.0 an
clr P5.1 //mache die led auf port p5.1 aus
jmp wait //springe zum label wait (zeitschleife)

eins: setb P5.1 //mache die led auf port p5.1 an
clr P5.0 mache die led auf port p5.0 aus
jmp wait //springe zum label wait (zeitschleife)



wait: mov R7,#3
wait2: mov R6,#25
djnz R6,$
djnz R7,wait2
jmp weiter

END

ich weiss nciht was ic hfür einen fehler gemacht hab.......ich denke mal bei der zeitschleife......ich bekomme immer eine eins auf led P5.1 und keine null!

hat jemand eine ahnung?

Sandro
23.05.2005, 13:39
Wie sind den die LEDs genau angeschlossen? Befindet sich noch ein Treiber dazwischen?
Oder hast du sie zwischen Vcc und Port angschlossen. Dann würden sie ja bei Low-Pegel leuchten.

Wenn ich das richtig verstanden habe liefert dir der Empfänger ein einzelnes Signal an P1.7. Und du möchtest die Impulslänge auswerten.
Wenn das so ist probier es mal so:


.equ lednull, P5.0
.equ ledeins, P5.1
.equ dcf77, P1.7

;--------------------------------------------------------------------
test:
jnb dcf77,$ /auf signalanfang warten
call wait150 /test ob lang oder kurz
jb dcf77,eins /ist es noch da war es wohl ne eins
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/hier war es eine null
clr lednull /eine empfangene null anzeigen
setb ledeins /fals eine eins angezeigt wurde löschen
jmp test
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
eins:
clr ledeins /eine empfangene eins anzeigen
setb lednull /fals eine null angezeigt wurde löschen
jb dcf77,$ /auf Impulsende warten
jmp test
;---------------------------------------------------------------------
wait150:
mov r7,#XX /tacktfrequenzabhängig
mov r6,#XX /selbst ausrechnen
wait150a:
djnz r7,$
djnz r6,wait150a
ret
;----------------------------------------------------------------------

Amri
23.05.2005, 20:50
Also: Du vergleichst im Prinzip Das Muster an Port mit dem vorgegebenen Muster '01111111'. Wenn du auf P5.1 immer eine 1 bekommst, dann heißt das, dass dein Muster in P1 nie diesen Wert annimmt.
So, wie du dein Programm geschrieben hast, darf an dem Port, an dem deine Antenne angeschlossen ist, nichts anderes angeschlossen werden, die anderen Pins müssen alle auf '1' liegen.
Mein Tip: Versuche es doch einfach einmal mit dem Befehl sbic oder sbis, damit kannst du ein einzelnes Bit abfragen, und außerdem wäre es auch viel einfacher. Das würde dann so aussehen (Wenn dewin DCF77-Modul an PortB.7 angescglossen ist):


sbis PIND,7
rjmp null
rjmp eins

NickD
30.05.2005, 12:45
hi leutz....

erstmal danke für eure schnelle hilfe!

ich habe es jetzt soweit geschaft:

ich kann nullen und einsen unterscheiden und auch programmintern behandeln.

mein problem:

ich habe jetzt vor, die einzelnen bits zu speichern, den minutenanfang zu finden(da hab ich schon eine ahnung) und in die aktuelle zeit umzurechnen....

wäre nett, wenn jemand ein programmbeispiel hätte oder mir anderweitig helfen könnte!

danke für eure teilnahme!

mfg

Nick

Zwickauer
05.08.2005, 20:23
Hi an alle,
wenn Du immer noch was für dcf 77 suchst, ist hier eine Internetseite (www.thelastinstance.de). Die hab ich auch benutzt und für meine Zwecke umgestrickt. Geht gut. Wenn Du noch weitere Fragen hast schreib.
bis bald Zwickauer