PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr zu langsam?



Dj_Beat
21.11.2007, 09:16
](*,)
hallo! ich habe jetzt ein Funkuhr gebaut.
wenn sie kein Signal bekommt, geht die zu langsam. ca. 1 sek/5 minuten.
woran kann es ligen?
als Quarz habe ich einen 6.4000Mhz Quarz.
gerade nachgemessen. Stimmt, der schwingt mit dieser Frequenz.

das Programm sieht so aus:




$regfile = "2313def.dat"
$crystal = 6400000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Cls
Cursor Off
Config Dcf77 = Pind.6 , Inv = 0 , Upd = 0 , Timer = 1 , Timer1sec = 0 , Debug = 1 , Check = 2 , Switchpower = 0 , Powerlevel = 1


Enable Interrupts

Config Date = Dmy , Separator = .

Dim I As Integer

Dim Sec_old As Byte , Dcfsec_old As Byte

Sec_old = 99 : Dcfsec_old = 99


Do

For I = 1 To 78

Waitms 10

If Sec_old <> _sec Then

Exit For

End If

If Dcfsec_old <> Dcf_sec Then

Exit For

End If

Next

Waitms 220


Sec_old = _sec

Dcfsec_old = Dcf_sec

Locate 1 , 5
Lcd Time$ ; " "
Locate 2 , 5
Lcd Date$ ; " "
Locate 2 , 15
Lcd Bdcf_impuls ; " "


Loop

End



weiss jemand, was hier für ein Problem da ist?

Sauerbruch
21.11.2007, 11:44
"Waitms" kann mit ziemlichen Ungenauigkeiten behaftet sein. Das steht sogar in der Bascom-Hilfe:


No accurate timing is possible with this command.

In addition, the use of interrupts can slow this routine.



Wobei 1 Sek auf 5 Min ja weniger als 0,3% entspricht - das ist für einen mit Waitms erzeugten Takt schon ziemlich gut! Du kannst ja spaßeshalber im Forum mal rumstöbern, über was für Abweichungen hier schon berichtet wurde =P~

genaue Zeiten sollte man mit ´nem Timer generieren, den Du auf einen entsprechenden Vorwert vorlädst und die gewünschte Aktion (z.B. Hochzählen von Sekunden o.ä.) vom Überlauf-Interrupt erledigen lässt.

Wenn´s um Uhrzeit geht, könnten Dir ein 32,768kHz-Quarz und der Befehl "Config Clock" ebenfalls ungeahnte Möglichkeiten eröffnen! Würd´ ich mir mal in der Hilfe ansehen!!

Dj_Beat
21.11.2007, 11:55
wie es mit Timer geht, habe ich keine Ahnung.
damit könnte vielleicht jemand anderer helfen.
der Befehl "Config Clock" ist ja nur um die Uhr laufen zu lassen.
ich möchte die aber noch synchronisieren, so oft, wie es geht.
ich habe mal was entdeckt. und zwar, wenn ich dem Compiler erzähle dass es ein 1000000Mhz Quarz ist, dann läuft sie zu schnell.
habe mal überlegt, und sowas geschreiben:
"$crystal = 6370100"
jetzt läuft alles etwas schneller. :)
ich will jetzt 2 Stunden Abwarten, dann gucke ich mal, wieviel abweichung er dann noch hat.
ich kann schon mit sichercheit sagen, es ist schon viiiiiiiiel genaur geworden ;)

jeffrey
21.11.2007, 13:47
Hi,
das halte ich nicht für sehr sinnvoll, weil dann die anderen timings nicht mehr stimmen. tipp arbeite dich mal in die timer ein. ist nicht kompliziert. schau am besten bei den beispiel programmen.
mfg jeffrey

Dj_Beat
21.11.2007, 13:50
>schau am besten bei den beispiel programmen.
wo sind die?

jeffrey
21.11.2007, 14:26
hi,
der ordner heißt sample, glaube ich.
mfg jeffrey

Dj_Beat
21.11.2007, 14:37
ok, ich gucke mal.
danke

Dj_Beat
21.11.2007, 18:54
so, leute, so Leid es mir tut, aber die Uhr ist echt für´n arsch.
die geht ab und zu zu schnell, dann auf einmal zu langsam..
kann man echt nichts anfangen mit so einer Uhr.
wie muss ich mit Timer abreiten? vielleicht hilft es dann.
muss man den Code komplett neu schreiben, oder kann ich diesen noch bearbeiten?
ich brauche jetzt echt eure Hilfe... ohne- geht nicht.
habe zwar verstanden was ein Timer ist, und wozu er da ist, weiss aber nicht wie ich das bei mir einsetzen könnte!
bitte, helft mir. *enttäuscht*

recycle
21.11.2007, 19:21
muss man den Code komplett neu schreiben, oder kann ich diesen noch bearbeiten?


Bei den Mengen an Code die dein oben gepostetes Programm enthält, sollte das wohl keinen grossen Unterschied machen.



ich brauche jetzt echt eure Hilfe... ohne- geht nicht.
habe zwar verstanden was ein Timer ist, und wozu er da ist, weiss aber nicht wie ich das bei mir einsetzen könnte!
bitte, helft mir. *enttäuscht*


Naja, wenn es darum geht, dass du unbedingt eine Funkuhr brauchst, wäre es wohl einfacher dir eine zu kaufen. So teuer sind die Dinger ja nicht mehr und du hättest dann den Vorteil, dass du dein vermutlich teureres Controllerboard mit Zubehör weiterhin zum Experimentieren verwenden könntest.

Sollte es darum gehen, dass du die Funkuhr unbedingt SELBER entwickeln willst, ist das Vorhaben spätestens in dem Moment wo dir jemand den fertigen Programmcode schickt gescheitert ;-)

Lad dir mal das Tool zur AVR-Timer Berechnung herunter:
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

Das generiert dir einen Bascom-Code, der per Timer in festen Intervallen eine Interrupt Routine aufruft.

Wenn du den Intervall z.B. auf 1 Hz setzt, hast du schon mal einen Taktgeber für die Sekunde.

Über die Interruptroutine kannst du dann sekündlich deine Routinen zum Hochzählen von Sekunden, Minuten usw. aufrufen......


Und noch was zum Trost:

Ich habe vor einiger Zeit mal meinen "fertig gekauften" Funkwecker auf eine Dienstreise ins Ausland mitgenommen.

Beim Versuch den Wecker auf die Zeitverschiebung anzupassen, habe ich ihn dann irgendwie resettet.
Anschliessend hat er 5 Tage lang in Stellung 00:00:00 versucht ein Funksignal zu bekommen und war somit als Wecker erst mal gestorben.

Da funktioniert deine Funkuhr doch jetzt schon besser ;-)

Dj_Beat
21.11.2007, 19:45
>Sollte es darum gehen, dass du die Funkuhr unbedingt SELBER entwickeln willst


selbst entwickeln natürlich nicht, aber zumindestens die Ausschnitte aus verschidenen Codes richtig anpassen und zusammenzufügen. Also halt selberbauen.
wie gesagt, wozu der Timer da ist, habe ich schon verstanden, aber wie ich den Ansetzten kann - ist mir immer noch nicht klar.
also das Tool hat mir sowas ausgegeben:

--------------------------------------------------------------------
'wenn mega 32, dann ändern in $regfile = "m32def.dat"
$regfile = "m16def.dat"

'Quarzfrequenz, entsprechend ihren Angaben
'der passende Quarz muss in die Fassung gesteckt werden
$crystal = 16000000

'nur notwendig wenn rs232 benutzt werden soll
$baud = 9600

'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer, Prescale = 256

'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
Config Pinc.2 = Output
'Hier geben wir der Definition einen schöneren Namen
Led3 Alias Portc.2

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 3036


'Hier werden die Timer aktiviert
Enable Timer1
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop



'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe

'Hier könnte nun ihre beliebige IRQ-Routine stehen
'Dabei sollte man darauf achten das diese nicht mehr Zeit
'benötigt, als das Intervall zuläßt

'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
Toggle Led3

Return
-------------------------------------------------

woeit klar.. aber was hat jetzt MEIN sode damit zu tun? bzw. wie kann ich das integrieren?
Mein Quellcode habe ich nicht selbst geschrieben, sondert von der AVR-Bascom-hilfe kopiert und angepasst. weiter oben könnt ihr ihn sehen.
wie soll ich weiter vorgehen? Ich möchte jetzt diese komische Uhr nicht hinschmeissen an der Stelle. dann würde ich sicherlich nichts mehr mit µC machen. sonst macht das ja Spass, aber wenn man weiss, was man machen muss.
wenn das einer kann, würde ich dafür sogar noch bezahlen. es geht mir jetzt mehr um das Prizip.
danke

jeffrey
21.11.2007, 21:51
Hi,
dein Code kommt dahin wo steht hauptprogramm und in der timer_irq zählst du die sekunden hoch.


selbst entwickeln natürlich nicht, aber zumindestens die Ausschnitte aus verschidenen Codes richtig anpassen und zusammenzufügen.
wenn das deine einstellung ist wäre es vielleicht doch besser es sein zu lassen. so geht programieren nun mal nicht. mal meine meinung dazu.
mfg jeffrey

Dj_Beat
21.11.2007, 23:07
[quote="jeffrey"]
dein Code kommt dahin wo steht hauptprogramm
/quote]
auch mit "waitms rein? einfach alles kopieren?

[quote="jeffrey"]
in der timer_irq zählst du die sekunden hoch.
/quote]
wie macht man das?

Danke für deine hilfreichen Beiträge

tooltime
28.11.2007, 11:26
Ich würde Dir das Buch von Roland Walter empfehlen.
Unter www.rowalt.de kannst Du dir einen kleinen Einblick verschaffen.
Das Buch ist erschwinglich und wirklich verständlich geschrieben.
Mir hat es jedenfalls ziemlich viel gebracht.

Gruß
tooltime

MeckPommER
28.11.2007, 11:38
@Dj_Beat

Ich glaube dein Weg, das Programmieren zu erlernen ist der schwere und derjenige, der am öftesten dazu führt, das der Lernende alles in die Ecke knallt. Du machst zwar viel, aber so recht Ahnung von dem was du machst, hast du nicht. Mit dieser Methode wirst du kaum jemals zu für dich befriedigenden größeren Lösungen kommen.

Dann lieber eine Nummer kleiner Anfangen, einfach eine LED blinken lassen und erst viel später mit Interrupts & Co beginnen aber dafür richtig verstehen was sich wann und wo wie abspielt im Controller.

merlin63
24.03.2008, 22:44
tja leute....so ist die ungeduldige jugend nun mal....tz tz

mensch mr beat....schaue dir mal das wicki an da steht ein schönes beispiel, wie man den timer benutzt um eine led im sekundentackt blinken zu lassen. was will man mehr.
aber bei dir habe ich den eindruck, du willst dir alles von anderen machen lassen und das geht einfach nicht....ganz klar...du hast das mit so einem forum falsch verstanden.
also tue dir den gefallen und fange an das zu verstehen was du da machst...sonst wird das nichts. auch die so genanten "profis" hier haben bestimmt mit einer blinkenen led angefangen.....aber ich weiß ja, ausdauer ist eine schwere tugend.
LG thomas

helimike0705
25.03.2008, 17:52
So , damit du auch weisst ob dein modul richtig arbeitet ,teste das prog. mal auf deinem 2313, aber lerne musst du trotzdem noch viel.
Bei diesem programm siehst du an der LED wenn sie blinkt das alles okay ist und du erkennst bei der 59 sekunde eine lange pause, das ist der minutentrenner,sprich der wechsel zur neuen minute.

'************************************************* **********
'Programm zum prüfen eines DCF77 Moduls
'Am Pind.2 wird das Modul angeschlossen,geht aber auch jeder andere
'Pin.Man muss dann nur den "Config Pind.2 = Input"
'entsprechend Konfigurieren.Bsp. Config Pind.4 = Input.
'Auch den PIND.4 entspechend in der Do - Loop schleife
'Portd.5 ist der Ausgang wo die LED angeschlossen wird
'Hier ist auch jeder andere möglich,also auch entsprechend programmieren


$regfile = "2313def.dat"
$crystal = 4000000

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

Set Portd.2
Set Portd.5

' Empfangsstatus auf LED ausgeben, damit man sieht,
' ob das DCF77 Modul arbeitet

Do
If Pind.2 = 0 Then
Set Portd.5
Else
Reset Portd.5
End If
Waitms 50
Loop