PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DCF77 nicht invertiertes Signal verwenden



HHP
12.02.2011, 15:34
Hallo,

ich will mit einem AVR eine Zeitschaltuhr realisieren. Diese soll z.B. um 5 Uhr frühs automatisch das Licht anschalten und um 7 uhr wieder aus. Natürlich Sekundengenau ;) Bei Reichelt kostet ein DCF77 Empfänger über 10 EUR. Also habe ich mir überlegt, ob ich nicht den Funkempfänger aus Funkuhren verwenden könnte. Naja eigentlich nciht lang überlegt und eine Funkuhr ausgeschlachtet. Ein Ferritstab und eine Platine ähnlich wie die bei Reichelt viel mir in die Hände. Sogar mit beschriftung. VCC, GND, PON, Out.

Also gleich mal an den AVR Angeschlossen und den von der Bascom Hilfe bereitgestellten Code verwendet. Es tut sich selbst nach einer halben Stunde nichts. Bis ich dann herausgefunden habe, dass man PON nach Masse schalten muss, damit der DCF77 Empfänger überhaupt was macht. Und siehe da es tut sich was im Terminal. Nach bischen mehr als 1 1/2 minuten kam das dabei raus:

(Anhang)

Es funktioniert. Die freude ist groß. Aber mit dem Code kann ich so nicht viel Anfangen. Bin dann nach kurzem Surfen auf die RN Wiki gekommen und habe dort alles übernommen:
http://www.rn-wissen.de/index.php/DCF77-Decoder_als_Bascom-Library

Ich bin schon den ganzen Tag damit beschäftigt irgendetwas herauszubekommen und anzuzeigen aber es zeigt nichts an. Also nur, dass die Uhr hochzählt aber nicht, dass diese sich Stellt.

Habe einiges ausprobiert um zum Schluss dann doch den Pind.3 zu nehmen, Kann ja daran liegen, dass ich nciht alles umgeschrieben habe für den Eingang des Signals. Aber selbst da nichts. Jetzt habe ich irgendwo gelesen, dass ein invertiertes Signal verwendet wird. Und im Bascom Code (von der Hilfe) ist Standardmäßig ein nichtinvertiertes Signal eingestellt. Daraus schließe ich, da mein DCF77 Empfänger ja bei derm Bascom Code funktoiniert hat, dass dieser ein nicht Invertiertes Signal liefert.

Wie kriege ich dieses denn nun invertiert (Softwaremäßig)?

Meine Teststellung:
DCF77 Empfänger an PD.3
Atmega 8 mit 8 Mhz Quarz
Display 2x16

Hoffe ihr könnt mir helfen. Ich verzweifel langsam.

MfG

Florian

peterfido
12.02.2011, 17:07
Die neueren Bascom Versionen haben bei Config dcf einen Parameter, ob invertiert, oder nicht. Als 2. Möglichkeit lässt sich auch die DCF_77.lib anpassen.

HHP
12.02.2011, 17:36
Ja das weiß ich auch, dass man das bei der Config dcf einstellen kann, ob invertiert oder nicht. Aber in dem vom RN Wiki bereitgestellten Code finde ich kein Config DCF bzw. wo stelle ich das in der dortigen .lib ein?

peterfido
12.02.2011, 20:24
Bascom bringt seine eigene LIB mit. Schau einfach in die Hilfe.
Bei dem Code auf RN-Wiki ist doch eine gute Doku bei.
Im Prinzip alle Abfragen des Eingangpins invertieren. einfach

sbis
gegen
sbic
tauschen und umgekehrt wenn ich das richtig gesehen habe.

Dirk
12.02.2011, 21:27
@Florian:

peterfido hat Recht.

Du tauschst einfach im Code der Library, Abschnitt 2, einen Befehl (sbis) aus gegen sbic:

dcf77_start:
*lds Counter,{DCF77Counter} ;Pausenzeit-Zähler laden
*lds Parity,{DCF77Parity} ;Fehler-Flag + 1-Zähler laden
sbic PIND,PIND3 ;Input-Pin für DCF-Empfänger
rjmp dcf77_5 ;high: Bit auswerten!
inc Counter ;low: Pausenzeit zählen!
brne dcf77_3
dcf77_1:


Gruß Dirk

hardware.bas
13.02.2011, 09:53
War ja ne billige Funkuhr, die Du ausgeschlachtet hast. Das von Dir
genannte Funkuhrmodul kriegt man doch schon für unter 9 Euro und es
hat einen invertierten und nichtinvertierten Ausgang. Aber ist ja schön,
dass es bei Dir nun funktioniert. Ich habe übrigens den nichtbenutzten
nichtinvertierenden Ausgang zur Anzeige der optimalen Antennenstellung
benutzt. Ist jedoch meisst nicht notwendig. VG Micha

HHP
13.02.2011, 11:48
@harware.bas: Du kannst ja hellsehen. Ja es funktioniert jetzt. Ich danke euch für die Hilfe! Jetzt läufts.

Und ja die Funkuhr war billig. Eigentlich Gratis ;) Habe davon noch 2 Stück. Waren mal bei einer bestellung Gratis dabei und da habe ich komischerweise 3 mal hintereinander bestellt. Aber die Uhren sind nicht gerade schön. Also wieso sich nicht die 9 EUR sparen (macht bei 3 Stück schon 27 EUR).


Jetztr allersings zu einem anderen Problem: Ich will ja einen anderen Port benutzen. Habe das hier in der _soft.bas geändert:


Config Pinc.0 = Input 'DCF77 Eingang
Set Portc.0 'Pullup ein

Und das in der.lib Datei:


[Dcf77_soft]
;Eingang für DCF77-Empfänger-Anschluss:
.equ Pinc = &H10 ; Pinc
.equ Pinc0 = 0 ; 0 = Pin 0

Also ich will den Port C0 verwenden. Nur passiert jetzt wieder nichts. Kein Empfang.Muss ich noch mehr verändern? Oder hab cih zu viel verändert oder was ist hier das Problem?

Dirk
13.02.2011, 13:59
Probier mal:
.equ Pinc = &H13 ; Pinc

Gruß Dirk

hardware.bas
13.02.2011, 14:10
Also HHP! Hellsehen? Nö! Aber Deine Bemerkung, dass sich nach 1 1/2
Minuten bei Dir was tut, war eigentlich der Grund, dass es bei Dir
funktionieren müsste. Manchmal dauert die DCF-Synchronisierung
noch VIEL länger. VG Micha

HHP
13.02.2011, 14:16
@Dirk: Hm nein damit tut sich auch nach 20 min nichts.
@Hardware.bas: Liegt vll daran, dass ich auf einem Berg Wohne und das bloß nur einige 100 kM entfernt von Frankfurt. Deshalb vll. die schnelle Synchronisation.

EDIT: Oder muss es zwingend ein Interruptfähiger Eingang sein? Sehe gerade, dass PD.3 Am Atmega 8 Int1 ist. Also Interruptfähig. PC.0, also daran wo cih den Empfänger anschließen möchte, ist nciht Interruptfähig. Aber im Code steht, dass man jeden I/O Pin benutzen kann hmmm...

hardware.bas
13.02.2011, 18:38
Ich habe mir den Code noch nicht verinnerlicht, da ich das DCF-Signal
beim letzten Projekt mit einer C-Control decodiert und danach mit
einigen anderen Daten in die AVR-Schaltung übertragen habe.
In Zukunft werde ich jedoch alles über AVR machen. Deshalb kann ich
nur Vermuten, dass ein Interrupt möglicherweise nicht notwendig ist,
da ja dann jeder DCF-Impuls in den Programmablauf eingreifen würde.
Normalerweise braucht man DCF ja eh nur zur Synchronisation.
Interruptfähigkeit könnte ich mir nur vorstellen, wenn die DCF-Impulse
(erstmalig) "gesucht" werden müssen. Weiss jedoch nicht, ob ich richtig
liege. VG Micha

PICture
13.02.2011, 18:53
Hallo!

@ hardware.bas.

Du liegst bisher sicher richtig, weil permanent störungsfreier LW Empfang mit AM von DCF praktisch unmöglich ist. :)

Ich habe schon für mich perfekte Armbandfunkuhr die sich nur einmal pro 24 Stunden mit DCF synchronisiert.

Ubrigens, notwendige für fertige Programme hardwaremässige Invertierung, sollte auch kein Problem sein. ;)

MfG

peterfido
14.02.2011, 18:39
Interrupt wird normal bei DCF nicht genutzt. Bei einer DCF Uhr setze ich zusätzlich immer eine DS1307 RTC für die Gangreserve ein. So ist die Uhrzeit auch direkt nach dem Einschalten verfügbar. Billige Uhrenquarze haben allerdings auch eine gewisse Abweichung. Meine genaueste DS1307 Uhr läuft pro Tag ~1,5 Sekunden aus dem Ruder.

Meine Armbanduhr syncronisiert sich Nachts 3 mal. Die Selbstbauuhren eigentlich jede Minute, wenn der Empfang nicht gestört ist.

Ob das Signal invertiert werden muss, erkennt man an der 59.Sekunde, welche normal nicht gesendet wird. Gibt es diese lange Pause nicht, muss invertiert werden.

HHP
14.02.2011, 18:48
Naja ich habs in der zwischenzeit zum laufen gebracht mit meinem Menüprügramm usw. Nur den Port konnte ich noch nciht umstellen was jetzt aber auch egal ist. Habe eben mein Design so gelayoutet das an PD3 das Signal anliegt

HHP
14.02.2011, 22:47
PS: Wer aber trotzdem weiß, wie ich den Port umgestellt bekomme, möge sich trotzdem Melden. Kann für spätere Projekte immernoch interessant sein. Oder der, der den Wiki Artikel verfasst hat, kannes dann auch gleich mit in die Wiki tun. Wird zwar alles schön und gut beschreiben aber wie ich den Port umstelle wird verschiegen?

peterfido
15.02.2011, 17:04
Einfach die Bascom interne Routine verwenden wäre eine Möglichkeit. Ansonsten mal ins Datenblatt schauen und


.equ PIND = &H10 ;Pind
.equ PIND3 = 3 ;3 = Pin 3

hinter den '=' anpassen.

HHP
15.02.2011, 17:08
Habe ich doch schon habe es mal so probiert aber das geht nicht:

.equ Pinc = &H10 ; Pinc
.equ Pinc0 = 0 ; 0 = Pin 0

Oder meinst du das anders?

peterfido
15.02.2011, 18:35
Pind und Pind3 sind sozusagen Variablen und bleiben. Hinter dem '=' bedeutet rechts davon. Hinter dem ';' sind Bemerkungen, die werden nicht beachtet. Im Datenblatt unter Register kannst Du nachschlagen, welche Adresse für PinC gilt. Diese Adresse ist anderen Atmegas auch eine andere...

HHP
15.02.2011, 19:01
Achso OK Probier ich morgen mal aus meld mich dann nochmal

Dirk
15.02.2011, 22:40
@HHP:

Eigentlich hast du doch das Ändern des Eingangspins schon gut gelöst!

Nur bei der Definition:
.equ Pinx = &Hyy ; Pinx

... geht man so vor:

Man sucht im Datenblatt seines Controllers die "Register Summary" Tabelle. In der 2. Spalte blättert man bis "Pinx".
In der 1. Spalte findet man dort die "Address", z.B. $[highlight=red:6c3c0b9f7b]13[/highlight:6c3c0b9f7b] für PINC beim ATMEGA 32 oder 8.
Man passt dann die Definition so an:
.equ Pinc = &H[highlight=red:6c3c0b9f7b]13[/highlight:6c3c0b9f7b] ; Pinc

der, der den Wiki Artikel verfasst hat, kannes dann auch gleich mit in die Wiki tun.
Wenn ich mal Zeit habe ... O:)

Gruß Dirk

HHP
16.02.2011, 15:10
Hm also nur das hinter dem = ändern funktoiniert nicht. Habe da jezt das stehen:

[dcf77_soft]
;Eingang für DCF77-Empfänger-Anschluss:
.equ Pind = &H13 ; Pind
.equ Pind3 = 0 ; 3 = Pin 3

Da kommt dann im Hauptfile, also im Programm ein ASM Error und zwar gleich 38 Stück.

Hm wieso ist es da denn so kompliziert. Bei der Bascom Hilfdatei musste ch bloß im Hauptfile den Port ändern, ohne irgendwelche Pin Adressen zu Wissen. Einfach z.,B. PinD7 vorgegeben durch z.B. PinB3 ändern und schon funktoinierte es. Wahrscheinlich wurde es da durch Variablen gespeichert und in den anderen Files dann automatisch abgeändert.

HHP
16.02.2011, 15:38
EDIT: So wie so oft find ichs dann doch selber raus. Für alle dies auch wissen wollen: Man darf die Datei schonmal nicht in Bascom ändern. Also nicht die Lib mit Bascom öffnen, dann ändern und dann speichern, sonder diese mit dem Editor öffnen und da ändern. Denn sonst habt ihr den ASM Fehler im Hauptdokument.

Das müsst ihr alles ändern:


[Dcf77_soft]
;Eingang für DCF77-Empfänger-Anschluss:
.equ PINC = &H13 ;Pind
.equ PINC0 = 0 ;3 = Pin 3

Also entgegen der behauptung eines Mitgliedes hier, muss man das vor dem = ändern und nach dem =, das nach dem ; ist nur ein Kommentar.

Zusätzlich müsst ihr ein paar Zeilen in der Lib das hier auch noch ändern (durch Zufall gefunden)


sbic PINC,PINC0 ;Input-Pin für DCF-Empfänger

Hoffe ich konnte den anderen helfen, die vll. auch ein Problem damit haben.

PS: Ob das alles stimmt was ich sage, weis ich nicht genau. Das ist nur meine Erfahrung, welche funktioniert hat. Alle Angaben daher ohne Gewähr