PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dcf77-empfang mit bascom...?



sleepy
19.08.2004, 10:17
hallo zusammen

ich versuche gerade, eine simple funkuhr mit display hinzukriegen, schaffe es aber nicht so richtig, mich in das dcf77-protokoll einzuarbeiten. besser gesagt; ich kapier's einfach nicht... :(

kann mir bitte jemand mit dem quelltext für eine dcf77-funkuhr für avr und bascom weiterhelfen?

19.08.2004, 10:51
Scahu mal hier.

http://www.mcselec.com/an_122.htm

MFG

artools
30.08.2004, 00:06
Hallo,

kann nicht mal einer der Profis eine LIB schreiben, wobei im Hauptprogramm automatisch die DCF-Uhrzeit in Variablen übergeben werden, z.B. DCF_hour usw. ?

Gruss
A. Arndt

sensor
03.09.2004, 14:08
Hi,

versuche mich auch schon seit Tagen daran, kriegs aber auch nicht zum laufen, habs mit diesem code probiert. aber auser der Meldung "Time Date" passiert nicht viel. Ab und zu bekomme ich noch das aufs display:
1 Zeile: Time Date
2 Zeile: 00:00 00.00.2000

aber das ist nicht reproduzierbar, auserdem kommt nie die eigentliche Zeit.

Habe mein Display mit Bascom auf portB angepasst und den eingang auf porta.0 und mit config porta = input die internen pullups eingestellt.

Geht aber trotzdem nicht :((

Hat nicht jemand schon was fertiges in Bascom?? Habe die Versuche an einem At90S8535 mit 4 MHz gemacht.

Noch ne frage:
Die Angabe:
$crystal = 11059000
$baud = 9600
sind 11 MHz nach Adam Riese, doofe frage: Packt das der 90S8535?? der geht doch nur bis 8MHz oder lieg ich da falsch und die Uhr tut deshalb nicht??!! Mit 8MHz hab ichs auch probiert aber das ging auch nicht.

Würde mich riesig über eine Antwort/Hilfe freuen.

Gruss sensor

http://www.mcselec.com/an_28.htm

03.09.2004, 16:24
Ich habe das ganze in avrgcc implementiert, wird euch nur leider nicht weiter helfen ...

Gruß, Alex

Frank
03.09.2004, 18:26
Ich hab vor einer Weile mal angefangen das Signal zu decodieren. Bin aber dann nicht mehr dazu gekommen das fertig zu machen. Wenn ich mal wieder eine größere Zeitlücke hab werde ich mal versuchen ein Bascom Beispiel für den rn-Control zu posten. Ich will das ohnehin irgendwann privat einsetzen, dafür hatte ich mir ursprünglich auch rn-digi (https://www.roboternetz.de/phpBB2/viewtopic.php?p=29027#29027) für die Anzeige entworfen.
Wenn´s jemand anders vorher mit dem Code schafft, ist es natürlich auch gut.
Ich verwende aber einen Timer im Code!

Gruß
Frank

Wastl
03.09.2004, 20:38
Hallo,

ich habe vor kurzem eine solche Applikation geschrieben.

Ausgangslage:
Board RN-Control 1.1 mit folgenden Erweiterungen:
- Standard-LCD mit 20 * 2 Zeichen
- DS1307, Real Time Clock, mit Lithium-Zelle (3V)
- DCF77-Modul von Conrad

Funktionsweise:
- Der RTC läuft mit der 3V-Zelle autonom, auch ohne Stromversorgung des Boards.
- Er (der RTC) generiert jede Sekunde einen Interrupt und gibt dem Controller die Möglichkeit, die Register auszulesen und die aktuelle Zeit auf dem LC-Display anzuzeigen

- Eine spezielle Routine liest auf Knopfdruck das DCF77-Signal ein und decodiert es
- Das DCF77- Signal wird auf seine Qualität geprüft und, falls ungenügend, mit dem Empfang neu begonnen. Die Decodierung ist ziemlich aufwändig, scheint aber zu funktionieren.


Für diejenigen, die es interessiert, habe ich den BASCOM-Source angehängt. Er sollte eigentlich so dokumentiert sein, dass es diesbezüglich keine Fragen geben sollte.

Gruss
Wastl

Frank
03.09.2004, 23:16
Fein dokumentierter Code! Die Dekodierung hast du ganz anders gelöst als ich, ich hatte das mit Timer und Interrupt im Hintergrund gemacht. Aber es so zu machen ist auch ne Idee, vor allem übersichtlicher und besser zu kapseln. Nachteil ist nur das die Zeitabfrage dann min. 1 Minute dauert und solange Controller nix anderes machen kann.
Wenn ihr so schöne Beispiele zu Rn-Control oder rnbfra-Board habt, dann bitte ab und zu hier https://www.roboternetz.de/phpBB2/dload.php?action=category&cat_id=18 uploaden

Wäre doch schön wenn sich da etwas mehr austauschbarer Quelltext ansammeln würde.

Vielleicht sollten wir auch noch einen Upload Bereich für Codeschnipsel (kleine Unterroutinen in Bascom/Assembler und C anlegen. Was meint ihr?

08.11.2004, 13:15
Scahu mal hier.

http://www.mcselec.com/an_122.htm

MFG

nur mit was für einem Chip wurde die schaltung gemacht?

ich hab einen atmel, geht das mit diesem auch?

08.11.2004, 13:23
Na klar!

PeterK
20.11.2004, 14:57
...Für diejenigen, die es interessiert, habe ich den BASCOM-Source angehängt. Er sollte eigentlich so dokumentiert sein, dass es diesbezüglich keine Fragen geben sollte.

Ich habe genau das gleiche Problem und versuche gerade DCF77 mittels Bascom auf einem Mega16 dekodiert zu bekommen.
Aber wo ist denn nun der oben genannte Code ? Ich sehe ihn hier nicht und auch nichts zum Downloaden.
Ja bin ich denn blind? ](*,)
Die beiden Beispiele von Bascom helfen leider nur bedingt weiter, denn die Beispiele sind für ältere Prozessoren. Ein funktionierender Code für die Mega-Serie wäre SUPER!

Danke
Peter

Spunky
15.01.2005, 23:16
Hallo, bin der Neue. Musst mich grad mal anmelden, weil ich das gesuchte soeben fertig gestellt habe.

Habe gerade einen DCF77-Decoder fertig, der mit Timer und Interrupt arbeitet.

Er passt so eben in einen 2313. In den Compiler-Optionen muss der HW-Stack auf 22 gestellt werden, sonst passen die Variablen nicht mehr ins RAM.
Ich habe nur die Demo von Bascom, deswegen die Code-Ökonomie.

Der Signalausgang vom DCF77-Empfänger hängt an INT0.
Das Display hängt im 4-Bit-Modus am Port.

Hier die Ausgabe mit kontrolle der Sekundenzahl unten in der Ecke.
http://spunky.m-faq.de/dcf77_04.jpg
Ich hoffe ihr werdet schlau draus.

Das DCF77-Signal ist einfach kodiert. Man muss die Länge der Impulse messen. Eine 1 ist 200ms lang, eine 0 100ms. Die Daten sind im BCD kodiert. Ab der 20. Sekunde (von 0 an gezählt) beginnt die Zeitangabe. Sekunde 20 ist immer 1, dann die Minuten. Man nimmt nicht alle 8 Bit, sondern nur soviel wie notwendig. Es gibt ja nur 60 min oder 7 Wochentage.
Ich habe die Impulse mit einem Timer und einem Zähler gemessen und reagiere per Interrupt auf die Impulse vom Funkempfänger. Mit steigender oder fallender Flanke werden die Zähler ausgewertet und der Timer zurück gesetzt. Zur Speicherersparnis speichere ich nur 42 Impulse. Wenn die Minute um ist und eine lange Pause gemessen wird (59. Sekunde fehlt), dann prüfe ich die Validität (Anzahl der Sekunden und die 3 Prüfbits). Passt alles, gebe ich es auf Display aus. Man könnt im Fehlerfall einfach die Zeit manuell weiter zählen, aber dafür reicht der Platz nicht mehr.

Die Werte für die die Messung Pausen und Impulse habe ich experimentell ermittelt. Ich hatte keine Lust auf Rechnen und wollte mit BASCOM spielen.

Später soll anstelle eines LCD die Zeit an einen anderen Controller übergeben werden.

HTH
Spunky

albundy
16.01.2005, 20:23
Hallo Spunky,

Ich habe deinen Code heute mal auf meinem Testboard mit 90S8515 getestet. Da ich andere Belegung für Display und LED's habe und vor allen Dingen einen anderen Quarz, habe ich das Programm entsprechend mal geändert.

-Timerstartwert hinzugefügt, damit auch andere Quarzfrequenzen gehen.
-Umstellung der Interruptflanke weggelassen, da unnötig.
(gemessen wird doch von 1.Flanke (fallend oder steigend) bis 2.Flanke, somit hat man in einem Rutsch bei DCF-Eingang "Low" die Impuls und bei DCF Eingang "High" die Pausenzeit)
-Reset des Tifr weggelassen, wird doch automatisch gelöscht
-Sperrung der Interrupts weggelassen (ich verstehe den Sinn auch nicht)

Was mir noch aufgefallen ist, die Sekunden gehen nur bis 58 ?
Ansonsten funktioniert es auf meinem Testboard einwandfrei !

Ich hoffe, du hast nichts dagegen, das ich das geänderte Programm mal mit anfüge ?

Spunky
16.01.2005, 21:23
Och, manchmal gehen die Sekunden sogar bis 64 *g* (schlechter Empfänger).
Das mit 58 ist richtig, weil ich nur die Impulse anzeige. Die 59. Sekunde fehlt im DCF-Signal zur syncronisation der Minuten. (dmait man weiss, wann eine neue Minute beginnt)
Man merkt auch die Verzögerung, wenn die 58 angezeigt wird.
Ich hätte die 59. natürlich auch simulieren können.

Natürlich darfst du den Code verbessern. Dafür habe ich ihn hier rein gestellt.

Das mit den Flanken, kann sein, daß es vielleicht überflüssig ist. Hatte damit ein bisschen experiemtiert und der Code hat eine ordentliche Evolution durch gemacht. Da bleiben schon mal Reste zurück.

Edit: Die Idee mit dem If in der Tim0_isr-Routine ist gut. Die Messung zwar nicht so präziese, aber ich denke ausreichend. Obwohl *grübel* so ganeu war meine ja auch nicht. *g*

Spunky

HUGCO
17.01.2005, 20:22
Hallo,
mit dcf77_test.bas habe ich auch Erfolg (Mega8)!!
Danke !

Ich bin Neuling und werde den Code jetzt studieren !


Mfg =D>

Spunky
17.01.2005, 23:00
Ich habe jetzt ne 59. Sekunde drin. Wenn die Pause etwa ne Sekunde und nicht 0,9 dauert, malt er ne 59 in die Sekunden.

Morgen werde ich den RAM-Bedarf optimieren. Dann kann ich ne Korrektur für verlorene Minuten einbauen. Mein Empänger liefert manchmal Störimpulse und dann bekommen ich falsche Daten. Vielleicht kann ich die Puls/Pausen genauer messen und die Abfrage in ein Fenster packen und falsche Impulse ignorieren.

Der Speicher ist sowohl im SRAM als auch im FLASH bei etwa 98% Ausnutzung.

Spunky

albundy
18.01.2005, 13:15
Ich habe jetzt ne 59. Sekunde drin. Wenn die Pause etwa ne Sekunde und nicht 0,9 dauert, malt er ne 59 in die Sekunden.

Wenn es denn unbedingt in einen 2313 passen muß, wäre es nicht besser, Wochentag und Jahr wegzulassen und dafür eine Softuhr mit einzubauen ? Dann ist das Sekundenproblem vom Tisch.

Mein Empänger liefert manchmal Störimpulse und dann bekommen ich falsche Daten. Vielleicht kann ich die Puls/Pausen genauer messen und die Abfrage in ein Fenster packen und falsche Impulse ignorieren.

Wenn du dir die Impuls und Pausenzeiten ansiehst, wirst du feststellen, dass sie nur minimal differieren. (Bei mir: Impuls 0 = 110 - 120 ms / Impuls 1 = 260 - 270 ms) Pausenzeiten sind ja eh nur für den Minutenanfang wichtig. Und wenn du schlechten Empfang hast, kannst du das Datenpaket nur verwerfen, oder was meinst du mit "ignorieren" ?
Man kann ja auch als zusätzliche Kontrolle das gerade empfangene Paket + 1 Minute mit dem nächsten vergleichen und nur bei Gleichheit gelten lassen.

Der Speicher ist sowohl im SRAM als auch im FLASH bei etwa 98% Ausnutzung.

Beim Aufruf der Int0 OVF Routine brauchen die Register auch nicht gesichert werden, spart wieder FLASH !

Ich habe mich Anfang 2004 ausführlich mit dem DCF77 Signal beschäftigt und in dem Zusammenhang ein Tool geschrieben, um einerseits die Empfangsverhältnisse zu überprüfen und andererseits den Aufbau und Impulsverhältnisse zu demonstrieren.
Du kannst ja damit mal deine Empfangsverhältnisse überprüfen.

<sorry an die Mod's, das sollte eigendlich zu den Downloads, hat aber irgendwie nicht funktioniert>

Spunky
19.01.2005, 20:46
Kurzer zwischenstatus: Code mächtig aufgeräumt und jetzt runter auf 72%
Teste grade neuen Code, sind aber noch mächtig Bugs drin :-s

UPDATE: Böser Denkfehler. :oops: Klappt doch nicht so, wie ich dachte. Die Bits kommen einfach in der falschen Reihenfolge. Muss noch weiter forschen, wie ich den Code komprimiere.


wenn du schlechten Empfang hast, kannst du das Datenpaket nur verwerfen
Ich meinte mit Ignorieren, wenn ein Fehlimpus kommt, einfach Pause und Impuls weiter zählen lassen und nix verarbeiten. Nur wenn Impuls und Pause ins Raster passen, diese Auswerten und die beiden Zähler zurück setzen. Damit eliminiere ich zumindest die Spitzen.

Spunky

tobiasrie
25.03.2005, 21:22
Hallo HUGCO,

ich möchte dein projekt gene selbst nachbauen.
Kannst du mir einen Schaltpaln geben?

06.04.2005, 21:35
Hallo Leute,
ich bastel im mom auch an einer uhr ... dann lese ich ....


Hallo,

ich habe vor kurzem eine solche Applikation geschrieben.

Ausgangslage:
Board RN-Control 1.1 mit folgenden Erweiterungen:
- Standard-LCD mit 20 * 2 Zeichen
- DS1307, Real Time Clock, mit Lithium-Zelle (3V)
- DCF77-Modul von Conrad

Funktionsweise:
- Der RTC läuft mit der 3V-Zelle autonom, auch ohne Stromversorgung des Boards.
- Er (der RTC) generiert jede Sekunde einen Interrupt und gibt dem Controller die Möglichkeit, die Register auszulesen und die aktuelle Zeit auf dem LC-Display anzuzeigen

- Eine spezielle Routine liest auf Knopfdruck das DCF77-Signal ein und decodiert es
- Das DCF77- Signal wird auf seine Qualität geprüft und, falls ungenügend, mit dem Empfang neu begonnen. Die Decodierung ist ziemlich aufwändig, scheint aber zu funktionieren.


Für diejenigen, die es interessiert, habe ich den BASCOM-Source angehängt. Er sollte eigentlich so dokumentiert sein, dass es diesbezüglich keine Fragen geben sollte.

Gruss
Wastl

wo finde ich diesen bascom-source ??? oder hat einer diesen source und kann ihn mir mailen ??

grüße
mike

krygi
06.04.2005, 21:52
Hallo Mike,
Du mußt dich erst im Forum anmelden, dann wird auch der Download sichtbar und die Datei kann runtergeladen werden !

Gruß
Mario

Claus Mehrholz
18.04.2005, 15:30
schau mal unter

https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=221

StePfl
02.05.2005, 17:47
Hallo zusammen,

bin neu hier und dies ist mein erster Beitrag. Ich benötige für ein kleines Projekt eine DCF-Uhr, die ich per I2C-Bus von einem anderen Microkontroller nach Bedarf abfragen/auslesen kann. Ein Display ist ganz nett - aber eigentlich nicht notwendig.
Hat jemand von Euch schon mal so etwas realisiert ?

bin Dankbar für jede Hilfe

Claus Mehrholz
02.05.2005, 17:57
Hallo StePfl,
das DCF Signal habe ich schon mal decodiert und zur Zeit-Anzeige gebracht, das funktiopniert auch gut und bei stationärem Einsatz auch zuverlässig. Allerdings fehlt da noch der DCF-Signal unabhängige Uhrenbetrieb und so steht die Uhrzeit bei schlechtem Empfang nicht zur Verfügung.
Grüße Claus

sebastian.heyn
28.07.2005, 13:23
Hallo, hat sie hier schon was getan?
Macht es nicht sinn, bei programmstart die uhr einmal von dcf zu lesen, und dann nachts um 2 oder so nochmal nachzustellen? (also komplett softuhr, die sich nur nachstellt)

Hat schonmal jemand mit der rtc die in den größeren ATMEGAs drin ist rumgespielt? (würde sich vielleicht anbieten)

pod32
09.12.2005, 22:00
das tool das als diagnose für den PC diehnt ist schon und gut nur wie verdrahte ich das DCF77 Modul mit meinem Mega32?!?

Danke!

cure
01.02.2006, 10:03
Hi !

Der Timerstartwert ist falsch:
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

Das wären 156 Hz.
Für 100 Hz wäre Startwert = 156 richtig.

Es funktioniert bei bei sogar noch mit 10 Hz perfekt.
(Nur noch 10 Interrupts pro Sekunde)

Aber sonst toller Code - Danke

Holger

albundy
01.02.2006, 15:53
Der Timerstartwert ist falsch:
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

Das wären 156 Hz.
Für 100 Hz wäre Startwert = 156 richtig.

Ich muss dich enttäuschen, mein Wert stimmt !
Lade dir mal das Prog runter, damit kannst du es überprüfen.
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

cure
01.02.2006, 17:43
Ja, im Prinzip ist es richtig (richtig gerechnet :-).
Aber hier mal ein kleiner Auszug aus der 'BASCOM-HELP':

LOAD TIMER , value
[...]
So LOAD TIMER0, 10 will load the TIMER0 with a value of 246 so that it will overflow after 10 ticks.


"LOAD TIMER0,100" startet den Timer nicht bei 100, sondern zählt 100 ticks bis zum Overflow.

Gruß Holger

albundy
01.02.2006, 20:15
@cure,
Sorry, du hast Recht, ich habe meinen Fehler jetzt erst gesehen. :-#
Es sollte natürlich heissen Timer0 = Startwert und nicht
Load Timer0, Startwert ](*,)

Papsi
14.02.2006, 02:29
Hallo,

meine Augen fallen gleich zu aber ich wollte es noch schaffen...

Leider zeigt mein Display nur "-- --.--.-- --:--:--" an und die LED blinkt (ich sage mal im sekundentakt)

Wenn ich den Empfänger ein wenig bewege, geht die LED auch mal ganz aus.

Wie muß den die LED blinken und wie muß der Empfänger gelagert sein.

Kann es sein, das es aber einweing dauert, bis da was auf dem Display erscheint. Bei mir steht seit 5 Minuten "-- --.--.-- --:--:--" und die LED blinkt nur.

???

albundy
14.02.2006, 12:47
@Papsi


... und die LED blinkt (ich sage mal im sekundentakt)


Das ist schon mal sehr gut.
Nimm mal im Code die 2 auskommentierten Zeilen unter "Zaehle:" mit rein.
Dann siehst du auf dem Display die gemessenen Impuls und Pausenzeiten.
Bei einem Minutenanfang ( der grösste Pausenwert ) muss die Pausenzeit kurz auf einen Wert zwischen 200 und 300 kommen.
Wenn nicht, ändere den Code bei "if Pause<300 and Pause>200 then", sodass dein gemessener Pausenwert dort reinpasst.
Das gleiche dann mit den Impulszeiten.
Die müssten mal <17 und mal >17 sein. Wenn nicht, bei "if Impuls >17 then" entsprechend anpassen.

Papsi
14.02.2006, 14:16
Habe eine Frequenz von 8Mhz und die Daten so angeglichen:

Config Timer0 = Timer , Prescale = 1024 '8000000 / 1024 = 7812,5 Hz
Const Startwert = 178 'Überlauf 256 - Startwert 178 = 78 ( 7812,5 Hz / 78 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

Vorher hatte ich da deine Angabe drin stehen und er ist immer zu Marke Check_parity gesprungen.
Nachdem ich die Daten wie oben im Code geändert habe, zeigt er mir die Sekunde unten nicht mehr an.

Der Impuls schwankt immer so bei 3 4 und die Pause nur so bei 40

???

albundy
14.02.2006, 14:50
Load Timer0 , Startwert

Sorry, das ist falsch (siehe weiter oben).
Timer0 = Startwert ist richtig.
Auch in der Interruptroutine ändern !

Papsi
14.02.2006, 18:27
Hat trotzdem nichts geholfen. :(

???

cure
15.02.2006, 09:14
>Der Impuls schwankt immer so bei 3 4 und die Pause nur so bei 40

Das ändere mal das:

If Sekunde > 3 Then
K = Sekunde - 18
If Impuls > 17 Then
Minute(k) = 1
Else
Minute(k) = 0
End If
End If
Locate 1 , 19
Wert = Makebcd(sekunde) ' Umweg ueber BCD, dann fuehrende 0
Lcd Bcd(wert) ' Sekunde anzeigen
If Pause < 43 And Pause > 37 Then 'Minutenanfang

albundy
15.02.2006, 16:23
@cure


If Sekunde > 3 Then
K = Sekunde - 18
If Impuls > 17 Then


If Sekunde > 18 Then muss so bleiben, da das bestimmt, von welchem Bit an das Telegramm verarbeitet wird.

@Papsi


Der Impuls schwankt immer so bei 3 4 und die Pause nur so bei 40

Ich habe den Code mal kurz mit 8MHz getestet.
Meine Impulswerte liegen zwischen 6 und 18.
Bei Minutenanfang ist der Pausenwert 170 bis 180.

cure
15.02.2006, 19:00
@albundy

Klar, hast recht. Ich hab mich in der Zeile vertan.

so meinte ich das:

If Sekunde > 18 Then
K = Sekunde - 18
If Impuls > 3 Then
Minute(k) = 1
Else
Minute(k) = 0
End If
End If
Locate 1 , 19
Wert = Makebcd(sekunde) ' Umweg ueber BCD, dann fuehrende 0
Lcd Bcd(wert) ' Sekunde anzeigen
If Pause < 43 And Pause > 37 Then 'Minutenanfang

Papsi
15.02.2006, 19:30
Hallo,

ich habe mir den halben Tag den Code um die Ohren gehaueb und probiert.

Bei mir zeigt er nur immer keine Uhrzeit an.

Die Werte habe ich entsprechend den Debugausgaben angepasst.
Ich sehe auch, wenn die Minute zu Ende ist und die LED für eine Sekunde aussetzt.
Dabei geht auch der Pausen...


HALT STOPP - ES G E H T

auf einmal fängt die "Schei..e" an zu funktionieren, während ich hier schreibe

JUHU

Danke nochmal

Papsi
15.02.2006, 21:33
Hallo nochmal,

wie kann ich denn die Variablen der Stunde und der Minute in weiterverwendbare Variablen umwandeln.

Ich habe die hier versucht:


Dim Meinestunde as Byte
Dim Meineminute as Byte
...
Locate 1 , 3 : Lcd Temp ; " " ; Bcd(minute(19)) ; "." ; Bcd(minute(28)) ; "." ; Bcd(minute(33))
Locate 2 , 6 : Lcd Bcd(minute(12)) ; ":" ; Bcd(minute(4))

(minute(12)) = Meinestunde
(minute(4)) = Meineminute

Locate 3,1 : Lcd Meinestunde ; ":" ; Meineminute


aber es wird immer 0:0 an und oben wird die berechnete Uhrzeit korekkt angezeigt

albundy
16.02.2006, 12:51
Hi Papsi,

Schön, dass es jetzt funktioniert.
Bei der Übernahme der Variablen machst du einen Fehler.


Meinestunde = minute(12)
Meineminute = minute(4)

Locate 3,1 : Lcd bcd(Meinestunde) ; ":" ; bcd(Meineminute)

Bei der Ausgabe daran denken, dass die Uhrzeit BCD-codiert ist.

Papsi
16.02.2006, 12:59
Danke Meister der Schuhverkäufer...

hat mal wieder geklappt.

albundy
16.02.2006, 18:56
Null Problemo, wenn du mal wieder ein Paar Schuhe brauchst ...

Papsi
16.02.2006, 19:01
Hallo,

Schuhe brauche ich nicht, aber mal wieder deine Hilfe.

Wie kann ich es denn machen, das mir z.B. um 19.45Uhr ein bestimmter Port gesezt wird und ich damit weitere Sachen machen kann.

albundy
17.02.2006, 11:25
Mit Bytevariablen ...

If Makedec(Meinestunde) = 19 And Makedec(Meineminute) = 45 Then Portx=Y
oder mit String ...

If Hex(Meinestunde) = "19" And Hex(Meineminute) = "45" Then Portx=Y

helimike0705
13.02.2008, 21:09
hallo
wie kann ich den bcd-code der variablen z.b. Wert = Makebcd(sekunde) in zwei byte aufteilen.wenn es z.b. die 59-zigste sekunde ist,brauche ich eine byte für die fünf und eins für die neun.beispiel 59: &b00000101 ist die fünf und &b00001001 ist die neun.
habe schon versucht mit teilen a=wert durch 10,dann wieder b=a mal 10 und jetzt c= wert minus b.es sollten ja ganze zahlen herauskommen da das a als word deklariert ist.oder liege ich da falsch. brauche dies,damit ich dies in einen cd4094 shiften kann,die anzeigen sind schon fertig und ich muss den code dann in einer data-schleife anpassen.es sind die schieberegister nicht der reihe nach belegt,wie reg1 mit led a reg2 mit led b ......einer 7 segment anzeige.leider durcheinander ,aber das ist ja nicht schlimm.wenn ich mir die ausgabe auf dem lcd bei dem obigen code anschaue,ist dies ja mit den stunden und minuten sowie sekunden alles bcd codiert.

mike

helimike0705
14.02.2008, 18:58
oder anders gefragt, wie sieht der bcd code für die zahl 59 aus.
wieviele stellen hat er, ist er 8 bit lang oder 12 oder 16 oder..?
wäre mir schon geholfen,würde dann schon darauf kommen,wie ich ihn für meine zwecke entschlüssel.
danke.

mfg mike

Dirk
14.02.2008, 19:47
wie sieht der bcd code für die zahl 59 aus.

&b01011001

Gruß Dirk

helimike0705
15.02.2008, 18:46
danke, habe mich gestern noch informiert und denke das die minuten in 7 bit also die 59 dann &B101 1001 und die stunden in 6 bit also die 19 dann &B01 1001 ausgeben werden. habe mein programm mal angehängt.
ist aber nicht mehr der stand der einzelnen versuche sondern der letzte.hatte einiges in der schift left usw. schleife versucht und komme einfach nicht weiter, wollt als versuch die sekunden auswerten.sollen später weg und nur die minuten und stunden rein.

Dirk
16.02.2008, 08:56
Hallo helimike0705,

deine 1. Frage war ja:
... wie kann ich den bcd-code der variablen z.b. Wert = Makebcd(sekunde) in zwei byte aufteilen.wenn es z.b. die 59-zigste sekunde ist,brauche ich eine byte für die fünf und eins für die neun.

Z.B. so:
Zehner = Shift Wert , RIGHT , 4
Einer = Wert And &b00001111

Gruß Dirk

helimike0705
16.02.2008, 10:49
danke für die info,dirk.
wenn ich einmal nach links shifte, 4 mal.
ausgang so &B01011001 shiften &B10010000
und wieder nach rechts ist der bin code doch &B00001001
oder nicht.
ich muss mir mal ein nullmodem-kabel zulegen und die bin werte mir
auf dem terminal anschauen,habe den verdacht das die cd4094 nicht i.o. sind.wiederum habe ich ein prog geschrieben um mir die zahlen 1-9 und alles andere anzeigen zu lassen,das funktioniert auch.wenn du den letzten abschnitt meines prog anschaust wirst du sehen das ich die zahlen die durch makedec herauskommen, in der read-data schleife umwandle in meine binär version für die cd4094.nur kommt da auf dem display nur mist raus.ich weis auch nicht ob die umwandlung richtig erfolgt,es fehlt ja wie gesagt noch der terminal anschluss.

gruß mike

Dirk
16.02.2008, 12:25
Hallo helimike0705,

ich habe mir dein Prog im groben angesehen, ohne die Gesamtfunktion testen zu können. Dazu eine Frage:

Wenn du in diesem Teil ...

Sek1:
Shift Wert , Left , 4
Shift Wert , Right , 4
Dual1 = Makedec(wert)
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Return
... die Einzelziffern der Sekunde ausgeben willst (passiert ja dann letztlich über die Bytevariable B1), dann must du ja wohl über B1 die Zehner und Einer der Sekunde nacheinander (abhängig von deiner Hardware) ausgeben, oder?

Dann brauchst du ja auch einen 2-fachen Aufruf von Shiftout ...:

Sek1:
Dual2 = Makedec(wert)
Dual1 = Dual2
Shift Dual1 , RIGHT , 4 ' Zehner ausgeben
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Dual1 = Dual2 And &b00001111 ' Einer ausgeben
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Return
... oder erst Einer, dann Zehner je nach deiner Hardware-Verschaltung, d.h. davon, ob erst Einer oder Zehner hineingeschoben werden müssen.

Oder habe ich dein Prob ganz falsch verstanden???

Gruß Dirk

helimike0705
16.02.2008, 17:41
hallo dirk,
das ist richtig,deine vermutung.habe dies auch 4 mal vorgesehen,aber zur zeit weggelassen um den code übersichtlich zu machen.es sollten in dem falle erstmal nur die sekunden einer angezeigt werden,was aber leider fehl schlägt.ich denke das ich auf dem richtigem weg bin nur macht die anzeige nicht was sie soll.jeder cd4094 ist für eine anzeige zuständig,die 8 register sollten mit meinem bin-code geladen werden und dann ausgeben.poblem ist,ich weiss nicht wie der bin-code der bei shiftout heraus kommt aus sieht.denke das da der hase im pfeffer liegt. mit einem anderen testprog läuft die anzeige einwandfrei. siehe anhang.
es werden die einzelnen zahlen richtig ausgegeben.
'************************************************* ******************************
'* demo für 7 segment platine mit CD4094"
'* anschluss des steckers: 1=plus ,2=minus ,3=output enable=plus
'* 4=stobe ,5=clock ,6=date´n
'* 4 und 5 können auf einen pin gelegt werden
'* steckeranschluss 1 ist unten ,neben dem kondensator
'************************************************* ******************************

$regfile = "attiny2313.dat"
$crystal = 4000000

Config Portb = Output
Clock Alias Portb.1 ' anschluss 4 und 5
Outpin Alias Portb.0 ' anschluss 6


'**** variablen für die Zahle 1-9 und den punkt sowie alles aus ***
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
Dim G As Byte
Dim H As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte

Dim M As Byte

A = &B00111111 '1
B = &B10101000 '2
C = &B00111000 '3
D = &B00011101 '4
E = &B01011000 '5
F = &B01001000 '6
G = &B00111110 '7
H = &B00001000 '8
I = &B00011000 '9
J = &B00001010 '0
K = &B11110111 'punkt
L = &B11111111 'alles aus


'**** start der anzeige mit nullen ****

For M = 1 To 4
Shiftout Outpin , Clock , J , 0 , 8 , 100
Next
Wait 1

'**** jetzt die zahlen und den punkt sowie alles aus
'**** nacheinander darstellen

Main1:

Shiftout Outpin , Clock , A , 1 , 8 , 100
Shiftout Outpin , Clock , B , 1 , 8 , 100
Shiftout Outpin , Clock , C , 1 , 8 , 100
Shiftout Outpin , Clock , D , 1 , 8 , 100

Wait 2

Shiftout Outpin , Clock , E , 1 , 8 , 100
Shiftout Outpin , Clock , F , 1 , 8 , 100
Shiftout Outpin , Clock , G , 1 , 8 , 100
Shiftout Outpin , Clock , H , 1 , 8 , 100

Wait 2

Shiftout Outpin , Clock , I , 1 , 8 , 100
Shiftout Outpin , Clock , J , 1 , 8 , 100
Shiftout Outpin , Clock , K , 1 , 8 , 100
Shiftout Outpin , Clock , L , 1 , 8 , 100

Wait 2

Goto Main1 ' zurück an den start
End

helimike0705
17.02.2008, 19:29
Hallo Dirk,

Habe die Uhr zu laufen gebracht,derzeit sind nur die Minuten und Stunden erfasst.Der Rest kommt später dran.Das ganze Probelm lag am ATtiny2313,der hat zu wenig Speicher für die Variablen,denke ich.Habe jetzt einen Mega8 benutzt und Funtioniert.Der momentane laufende Code
ist im Anhang zu sehen,wer möchte,soll ihn Erweitern und mir den Code mal zukommen lassen, Danke.

Mike
P.S. Dauertest ist noch am laufen,Code ist eventuell noch nicht fehlerfrei


'************************************************* ******************************
'* DCF77 - 7 Segment Uhr mit Anzeige-Platine CD 4094, dadurch das die
'* 8 register des CD 4094 nicht mit Register 1 mit Segment A und Reg 2
'* mit Segment b usw verbunden sind, muss mit der Code angepaast werden
'*
'* Die Steckerbelegung ist wie folgt
'* Pin1=Plus, Pin2=Minus, Pin3=Enabel Output, Pin4=Strobe, Pin5=Takt, Pin6=Daten
'*
'* Erstellt am 17.02.2008 durch Mike Köppl
'* Bascom: 1.11.9.0.
'************************************************* ******************************


$crystal = 4000000
$regfile = "m8def.dat"
$framesize = 128

Config Pind.2 = Input
Config Pind.5 = Output

Set Portd.2
Set Portd.5

Config Timer0 = Timer , Prescale = 256 '4000000 / 256 = 15625 Hz
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

Dim Zahl As Byte
Dim Minute1 As Byte
Dim B1 As Byte
Dim A As Word
Dim B As Word
Dim C As Word
Dim Count As Byte

Dim I As Byte
Dim J As Byte
Dim K As Byte

Dim Impuls As Byte
Dim Pause As Integer
Dim Sekunde As Byte
Dim Wert As Byte
Dim Paritaet As Byte
Dim Checker As Byte
Dim Wochentag As String * 14
Dim Temp As String * 2

Wochentag = "MoDiMiDoFrSaSo" ' String mit Kuerzel der Wochentage

Dim Werte_bit(6) As Byte
Dim Werte_start(6) As Byte
Dim Minute(42) As Byte ' Enthaelt die Sekunden-Impulse 0 und 1

'**** Arrays für Startposition und Länge der Daten im Array Minute() **********
Werte_start(1) = 4 'Minuten
Werte_bit(1) = 6
Werte_start(2) = 12 'Stunden
Werte_bit(2) = 5
Werte_start(3) = 19 'Tag
Werte_bit(3) = 5
Werte_start(4) = 25 'Wochentag
Werte_bit(4) = 2
Werte_start(5) = 28 'Monat
Werte_bit(5) = 4
Werte_start(6) = 33 'Jahr
Werte_bit(6) = 7

Impuls = 0
Pause = 0
Sekunde = 0
Checker = 0
Config Int0 = Rising

Enable Interrupts
Enable Int0
Enable Timer0 'enable the interrupt
On Int0 Zaehle Nosave
On Ovf0 Tim0_isr
'************************************************* ******************************
Do
nop
Loop
End

'************************************************* ******************************
'***** Routine zählt Sekunden und wertet Impuls- und Pausenzeit aus ***********
Zaehle:
Disable Interrupts
Stop Timer0


If Pind.2 = 1 Then ' Pruefen, ob Signal 0 oder 1. 0=aktiv
Set Portd.5
Incr Sekunde
If Sekunde > 18 Then
K = Sekunde - 18
If Impuls > 10 Then
Minute(k) = 1
Else
Minute(k) = 0
End If
End If
Config Int0 = Falling ' Interrupt regiert auf fallende Flanke
Else

Wert = Makebcd(sekunde) ' Umweg ueber BCD, dann fuehrende 0

Reset Portd.5
If Pause > 100 Then ' Wenn die Pause groesser 100 war, dann wars der Minutentrenner
If Checker = 0 Then ' Checker-Flag setzen
Checker = 1
Else
Checker = 2
Gosub Check_parity
End If
Sekunde = 0 ' Sekunde 0 setzen
End If
Config Int0 = Rising

If Checker = 2 Then ' wenn Daten korrekt scheinen, dann Dekodieren und Anzeigen
Gosub Dekoder
Checker = 1
End If
End If
Start Timer0
Enable Interrupts
Impuls = 0
Pause = 0
Return

'************************************************* ******************************
Tim0_isr: ' Timer incrementiert die Zaehler
Incr Impuls
Incr Pause
Return
'************************************************* ******************************
Check_parity: ' Ueberprufung der empfangenen Daten

If Sekunde <> 59 Then ' Stimmt die Zahl der Sekunden?
Checker = 1
End If

Paritaet = 0 'pruefe Minutenparitaet
For I = 4 To 10
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(11) Then
Checker = 1
End If
Paritaet = 0

For I = 12 To 17 'pruefe Stundenparitaet
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(18) Then
Checker = 1
End If
Paritaet = 0

For I = 19 To 40 'pruefe Rest
Paritaet = Paritaet + Minute(i)
Next I

Paritaet = Paritaet And 1
If Paritaet <> Minute(41) Then
Checker = 1
End If

Return

'************************************************* ******************************
Dekoder: ' Daten im Minuten-Array dekodieren und ausgeben.

For K = 1 To 6 ' Schleife, weil kompakter
Wert = 0
J = Werte_start(k) + Werte_bit(k)
For I = J To Werte_start(k) Step -1
Shift Wert , Left
Wert = Wert + Minute(i)
Next I
J = Werte_start(k)
Minute(j) = Wert
Next K

K = Minute(25) * 2 ' Wochentag aus String schneiden.
K = K - 1
Temp = Mid(wochentag , K , 2)

'************************************************* ******************************
'********* Minutenauswertung und Umwandlung ************************************

Minute1 = Bcd(minute(4))
Minute1 = Makedec(minute(4))
A = Minute1 / 10
B = A * 10
C = Minute1 - B
Zahl = C
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
Zahl = A
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1

'************************************************* ******************************
'******* Stundenauswertung und Umwandlung ***************************************

Minute1 = Bcd(minute(12))
Minute1 = Makedec(minute(12))
A = Minute1 / 10
B = A * 10
C = Minute1 - B
Zahl = C
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
Zahl = A
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1

Reset Portb.2
Waitms 10
Set Portb.2

Return

'************************************************* ******************************
'**** Daten der Zahlendarstellung Zahlen aussuchen *****************************
Zahlendaten:

Restore Dta1
For Count = 0 To Zahl
Read B1
Next
Return

'***** Zahlen Darstellungsdaten ***********************************************
Dta1:
Data &B00001010 , &B00111111 , &B10101000 , &B00111000 , &B00011101 , &B01011000 , '0,1,2,3,4,5
Data &B01001000 , &B00111110 , &B00001000 , &B00011000 , &B11111111 , &B11110111 , 0, '6,7,8,9,alles-aus,d-punkt

helimike0705
18.02.2008, 19:29
Nachtrag:
das Programm läuft auch auf dem tiny 2313,mein Problem war das Steckbrett.Es hatte Kontaktschwierigkeiten,jetzt ist es behoben und siehe da es läuft auf dem Tiny2313.Habe aber mit diesem Programm wieder viel gelern. Danke noch mal an alle.

mfg Mike

P.S.7 Segment LED Anzeige LEDTECH 1.06 LA1571-21 T [ROT] bei eBay.de: Bauteile (endet 24.02.08 17:02:16 MEZ) (300195658940)

das sind die Anzeigen die ich benutzte,prima Teile. Laufen schon mit 5 Volt und sind bei 8 - 12 Volt schön hell.