PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Demo und DCF77



martin66119
28.12.2006, 17:53
EInen schönen gute Abend,

ich bin dabei mich mit Microcontroller zu beschäftigen und such eine Mglichkeit mit der Demoversion von Bascom eine DCF77 Uhr hinzbekommen. In den Foren oder sonstwo im Netz habe ich nicht finden können. Ich verwende myavr (USB) hat jemand eine Lösung die mit der Bascom Demo geht. Am besten wäre es wenn der Code so klein ist wiemöglich um das ein oder andere noch um die Uhr herum realisieren zu können (z.B. Schalten und einlesen von Messwerten über den AD-Wandler).

Danke für eure Hilfe

Martin

linux_80
28.12.2006, 18:07
Hallo,

auf den Seiten von MCS gibts eine AN in der das gemacht wird, denke das das auch mit der Demo geht.
http://www.mcselec.com
dann auf Application Notes auf der Linken Seite,
weiter bei Bascom-AVR,
dann kommt eine Liste, in der die ganzen ANs stehen, da ist auch was für den DCF77 dabei.

Rofo88
28.12.2006, 18:12
Was für ein DCF77 Modul hast Du??

albundy
28.12.2006, 18:21
sieh dir mal meine Library mit Beispielcode an.
Nimmt mit LCD Ausgabe in der Demo ca. 60% ein.
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=320

martin66119
28.12.2006, 18:22
ich habe das von conrad mit der Artikel-Nr.: 641138 - 62

martin66119
28.12.2006, 18:57
Hallo!

Danke schonmal für deine Hilfe.

Wenn ich deinen Code nehme und mit der Bascom-Demo Compiliere bekomme ich eine Fehlermeldung. Ich denke die ist darauf zurückzuführen, dass ich den ATmega8L 8MHz verwende. Ich habe deinen code wie folgt angepasst.

'$regfile = "m8535.dat"
'$crystal = 4000000

$regfile = "m8def.dat"
$crystal = 3686400

Die Felermeldung betrifft die Zeilen 32 und 33:

Config Pina.7 = Input 'DCF 77 Eingang
Set Porta.7 'Pullup einschalten

DIe Fehlermeldungen lauten.

Zeile 32: Variable can not be used with RESET[DDRA] in DCF_BSP.BAS
Zeile 33: Variable can not be used with SET[PORTA] in DCF_BSP.BAS

Was muss ich tun um das zu korrigieren.

Danke für die Hilfe

Martin

BT
28.12.2006, 19:03
hallo,

nja der M8 hat nun mal keinen PORTA... den code musst du schon entsprechend anpassen zum beispiel auf PORTB

cu BT

Rofo88
28.12.2006, 19:04
Der Mega 8 hat keinen Port A. Das mußte auf den Port anpassen den Du verwenden willst.

MfG

edit : BT war schneller 8-[

albundy
28.12.2006, 19:25
und nicht vergessen, die Library entsprechend anzupassen und neu zu kompilieren.
... für Pinb $16, Pinc $13 oder Pind $10

martin66119
28.12.2006, 19:29
? was muss ic in der lib ändern wenn ich den Portb.5 verwende

Das hätte ich als Anfänger auch sehen/wissen können. Danke für euer Verständnis und auch für die Hilfe

Ich habe nun die entsprechenden Zeilen angepasst.

Config Pinb.5 = Input 'DCF 77 Eingang
Set Portb.5 'Pullup einschalten

Es erscheint nun keine Fehlermeldung und das LCD Display läuft in Sekundenschritten von 00:00:00 aufwärts. Nur die DCF-77 Uhr läuft nicht so wie sie soll.

Ich habe das DCF-77 Conrad Modul mit GND an LO und + an HI des myavr Board angeschaltet. Den DCF-Ausgang( nicht invertiert) habe ich an Portb.5 angelegt.

Wo liegt nun der Fehler?
Martin

PS: Vielen Dank für die Hilfe/n

albundy
28.12.2006, 19:44
? was muss ic in der lib ändern wenn ich den Portb.5 verwende


Dcf77:
.equ DCF_Port = $19 ;$19 = Pina
.equ DCF_Pin = 7 ;7 = Pin 7

ändern in:
Dcf77:
.equ DCF_Port = $16 ;$16 = Pinb
.equ DCF_Pin = 5 ;5 = Pin 5



und dann in Bscom "Tools" und "LIB Manager", dort die dcf77.lib auswählen und auf "Compile".


Den DCF-Ausgang( nicht invertiert) habe ich an Portb.5 angelegt.

du musst den invertierten Ausgang vom DCF Modul nehmen.

martin66119
28.12.2006, 19:56
ich habe nun den invertierenden AUsgang des DCF77-Moduls an PINB.5 angeschlossen und in der LIB die Codezeilen wie folgt geändert

'.equ Dcf_port = $19 ; $19 = Pina
'.equ Dcf_pin = 7 ; 7 = Pin 7

.equ Dcf_port = $19 ; $19 = Pinb
.equ Dcf_pin = 7 ; 7 = Pin 5

Und nun, wie du geschrieben hast in Bascom unter Tools den LIB-Manager geöffnet und die lib DCF77.lib geöffnet und compiliert. Es erschien kurz die Meldung ... in LBX object File.

War das alles richtig so? Oder mache ich och einen Fehler, da die Urzeit noch nicht angezeigt wird.

albundy
28.12.2006, 20:09
ich habe nun den invertierenden AUsgang des DCF77-Moduls an PINB.5 angeschlossen und in der LIB die Codezeilen wie folgt geändert

'.equ Dcf_port = $19 ; $19 = Pina
'.equ Dcf_pin = 7 ; 7 = Pin 7

.equ Dcf_port = $19 ; $19 = Pinb
.equ Dcf_pin = 7 ; 7 = Pin 5


du solltest schon etwas aufmerksamer lesen, sonst wird das nie etwas.
Was du geändert hast ist nur der Kommentar der Codezeilen.

.equ DCF_Port = $16 ;$16 = Pinb
.equ DCF_Pin = 5 ;5 = Pin 5

Wichtig ist, was vor dem Semikolon steht.

nach dem Kompilieren der Lib, musst du natürlich den Bascomcode auch neu kompilieren, da dort die geänderte Lib eingebunden werden muss.

martin66119
29.12.2006, 10:07
Guten Morgen!

Danke für die Mühe die du/ dir Ihr euch mit mir nehmt. Jedoch komme ich nicht weiter.

- Die Zeit mit Timer0 läuft soweit
- Die Zeit mit DCF-77 geht nicht

ALso was habe ich gemacht. Den im Code eingebauten Debugger bemüht. Nur in der Zeile

Debounce Pinb.5 , 0 , Uhrzeit ' , Sub

kommt eine Fehlermeldung beim compilieren (Label not found [Uhrzeit].
Dieser Label kann auch nicht gefunden werden, so meine ich den gibt es ja nicht im Programm. Aber was muss da stehen damit es geht.

Wenn ich diese ganze Zeile (Debounce....) lösche dann geht das compilieren und linken. Nur die im Display angezeigte Pausenlänge, Impulszahl und die Pari ist gleich Null.

in der dcf.lib habe ich

.equ Dcf_port = $ 16; $16 = Pinb
.equ Dcf_pin = 5; 5 = Pin 5

angepasst.

Sowohl die Lib als auch das Hauptprogramm habe ich neu compiliert und dann gebrannt.

Ich komme da nicht weiter. Auch wenn es wie so oft am richtigen lesen bei mir hängen mag.

Martin








'************************************************* ******************************
'* DEMO für DCF77 Library *
'* *
'* Funktion der Library im "Readme.txt" *
'************************************************* ******************************
$regfile = "m8def.dat"
$crystal = 3686400

$lib "dcf77.lib"
$external Dcf77
Declare Sub Dcf77

Config Timer0 = Timer , Prescale = 1024 'Timer für 40Hz (25ms)
Const Startwert = 170
Timer0 = Startwert
On Timer0 Tim0_isr 'Überlauf alle 25ms
Enable Interrupts
Enable Timer0

'Lcd ansteuerung
Config Lcd = 16 * 4
Config Portd = Output
Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

'------------------------ Pin für DCF Eingang definieren -----------------------
Config Pinb.5 = Input 'DCF 77 Eingang
Set Portb.5 'Pullup einschalten

'--------------------- Variablen für DCF Routine -------------------------------

Dim Status As Byte , Zaehler As Byte , Buffer As Byte , Impuls As Byte
Dim H_sek As Byte , Sekunde As Byte , T_min As Byte , T_std As Byte
Dim Minute As Byte , Stunde As Byte , Wotag As Byte , Tag As Byte
Dim Monat As Byte , Jahr As Byte , Pari As Byte , Pau As Byte , Imp As Byte

'------------ Wichtig bei internem RC Oszillator !!! ---------------------------
'Osccal = 184 'int. Oszillator kallibrieren
'-------------------------------------------------------------------------------


'******************** HAUPTPROGRAMM ********************************************

'Cls
'Cursor Off
'Do
'
'Locate 1 , 7
'If Stunde < 10 Then Lcd "0" ; Stunde ; ":" Else Lcd Stunde ; ":"
'If Minute < 10 Then Lcd "0" ; Minute ; ":" Else Lcd Minute ; ":"
'If Sekunde < 10 Then Lcd "0" ; Sekunde Else Lcd Sekunde
'
'If H_sek > 20 Then 'Doppelpunkt blinken lassen
' Locate 1 , 12
' Lcd " "
'End If
'
'Locate 2 , 1
'If Status.3 = 1 And Status.4 = 1 Then
' Lcd Lookupstr(wotag , Wochentag) ; ", "
' If Tag < 10 Then Lcd " " ; Tag ; "." Else Lcd Tag ; "."
' If Monat < 10 Then Lcd " " ; Monat ; "." Else Lcd Monat ; "."
' Lcd "20"
' If Jahr < 10 Then Lcd "0" ; Jahr Else Lcd Jahr
'End If
'
'Loop

'---------------------- nur für DEBUG nötig ------------------------------------

Cls

Do
Debounce Pinb.5 , 0 , Uhrzeit ' , Sub

If Imp > 0 Then
Locate 1 , 1
Lcd "Impulslaenge: " ; Imp
If Imp < 6 Then Lcd " = 0" Else Lcd " = 1"
End If

Locate 1 , 1
Lcd "Pausenlaenge: "
If Pau < 10 Then Lcd "0" ; Pau Else Lcd Pau
Locate 2 , 1
Lcd "ImpZ: "
If Impuls < 10 Then Lcd "0" ; Impuls Else Lcd Impuls

Locate 2 , 10
Lcd "Pari=" ; Status.4 ; " Imp_OK=" ; Status.3

Loop

'---> Die Impulslänge sollte zwischen 2 und 8 liegen
'---> Die Pausenlänge sollte zwischen 70 und 90 liegen
'---> Der Impulszähler sollte gleichmässig im Sekundentakt bis 59 hochzählen
'---> Die Parität sollte ab dem 36.Impuls auf "1" gehen

End
'*************** ENDE HAUPTPROGRAMM ********************************************

'------------------------ Interrupt Routine ------------------------------------

Tim0_isr:
Timer0 = Startwert
Call Dcf77
Return

'------------------------ Daten für Wochentag ----------------------------------
Wochentag:
Data " " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"

albundy
29.12.2006, 11:56
Debounce Pinb.1 , 0 , Uhrzeit , Sub

Sorry, gehört da eigendlich nicht rein, war noch von meinen Tests.
kannst du einfach weglassen.


Config Timer0 = Timer , Prescale = 1024 'Timer für 40Hz (25ms)
Const Startwert = 170


das war für einen 4 MHz Quarz ausgerechnet.
Bei dir muss der Startwert 166 betragen.


Nur die im Display angezeigte Pausenlänge, Impulszahl und die Pari ist gleich Null.


dann liegen bei dir an Portb.5 keine DCF Impulse an.
Prüfe das mal mit einem Meßinstrument an Portb.5 (gegen GND messen).
Es müssen im Sekundentakt 5V Impulse zu sehen sein.

martin66119
29.12.2006, 13:20
Danke für die Hilfe! Du hast recht, am DCF-77 Ausgang passiert nichts. ENtweder ist erdahin oder irgendwas abderes ist mit dem Teil. Wobei eigentlich nichts anderes als "dahin" sein kann.

Noch ein Punkt zu deinem Code. Da ich den Timer mal länger laufen ließ, ist folgendes aufgetreten. Die Sekunden zählten hoch. nach 60 Sek erfolgte die Anzeige ((00:01:00) wie zu erwarten war. Doch wenn der Timer länger läuft, dann schaut die Anzeige so aus:

00:12:520

Die Sekunden zählen hoch aber die "0" als letzte Stelle die da eigentlich nicht hinsoll bleibt da stehen.

Martin

albundy
29.12.2006, 13:56
Wobei eigentlich nichts anderes als "dahin" sein kann.


das muß nicht sein.
In der Nähe von TV, Monitor, Computer, Funktelefon, etc. hat man meistens sowieso keinen Empfang.


Die Sekunden zählen hoch aber die "0" als letzte Stelle die da eigentlich nicht hinsoll bleibt da stehen.

das passiert schon mal ...
Mache einfach nach den Sekunden noch ein Leerzeichen rein, dann passiert es nicht mehr.

If Sekunde < 10 Then Lcd "0" ; Sekunde ;" " Else Lcd Sekunde;" "

Rofo88
29.12.2006, 15:52
das muß nicht sein.
In der Nähe von TV, Monitor, Computer, Funktelefon, etc. hat man meistens sowieso keinen Empfang.


Kann ich nur bestätigen. Ging bei mir auch nichts bis ich rausbekommen hab das mein CRT alles im Umkreis von 5m lahmlegt.

MfG