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.
Was für ein DCF77 Modul hast Du??
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
hallo,
nja der M8 hat nun mal keinen PORTA... den code musst du schon entsprechend anpassen zum beispiel auf PORTB
cu BT
Der Mega 8 hat keinen Port A. Das mußte auf den Port anpassen den Du verwenden willst.
MfG
edit : BT war schneller 8-[
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
? 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.
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"
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
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;" "
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.