Hallo zusammen,
Ich teste gerade ein Programm für den Atmega8 das gewünschte Zeitpausen
per Timer erzeugt. Im Beispiel unten wird mit dem Timer per Interrupt
ein 1 sek takt generiert, der wiederum das Zählerregister temp5(r20) bei
jeder Sekunde erhöht.
Will ich jetzt zum beispiel für eine Funktion 5 Sekunden Wartezeit, muss
ich nur temp5 mit 0 laden, und warten bis das Register den wert 5
enthält. Folglich sind 5 Sekunden vergangen. Das mache ich in der
Hauptschleifen mit:
1
main:
2
3
cpitemp5,5;5Sekunden
4
breqled_stat
5
rjmpmain
6
7
led_stat:
8
9
sbisPINC,0
10
sbiPORTC,0
11
sbicPINC,0
12
cbiPORTC,0
13
14
lditemp5,0;Wiederauf0undvonvorne...
15
16
rjmpmain
Momentan lasse ich damit noch ein LED blinken, damit ich mit dem Oszi
den Zeitabstand messen kann.
Leider bekomme ich jedes mal nur den 1Hz Takt auf den Oszi, was ja
eigentlich nicht sein dürfte, da ja temp5 erst die 5 errechen muss,
damit led_stat ausgeführt wird. Und ich hab keine Ahnung an was das
liegen mag.
Noch mein gesamter Testcode...
Atmega läuft mit 4MHz, Fuses (E:FF, H:D9, L:E3)
Lukas G. schrieb:> muss ich nur temp5 mit 0 laden, und warten bis das Register> den wert 5 enthält.
Nicht ganz. Den Zählerstand 5 erreichst du möglicherweise schon nach
4,01 Sekunden. Du weißt ja nicht, wann nach dem Zurücksetzen der erste
Interrupt stattfindet.
Es hat tatsächlich daran gelegen....
SREG gesichert und funktioniert wie gewünscht!
Scheinbar hat mir der Timer die Prüfung CPI immer
unterbrochen/verfälscht.
Kenne zwar die SREG Sicherung bei Interrupts, bis jetzt habe ich sie
jedoch nur mäßig angewandt. Muss ich wohl in Zukunft Standardmäßig
einbauen, um Konflikte zu vermeiden.
Schon wieder was gelernt....
Vielen Dank!
Ja ist mir bewusst, darum messe ich auch immer mit dem Oszi nach. Dann
kann ich gegeben falls die zu erreichenden Zählerstände anpassen. Hab
ich auch bein 1Hz Takt nachgemessen, und musste ein wenig anpassen.
Vielen Dank.
SREG sichern ist das eine:
Schön, wenn du das jetzt als "Ohne geht's nicht!" verinnerlicht
hast.
Deine 5 Sekunden Verzögerung sind (unabhängig von SREG & Co.)
vom Prinzip her nur irgendwas von 4...5 Sekunden.
Wenn dir das reicht, OK. Wenn es genauer sein soll, muss dein
Zähler mit Steps von z.B. ms von Null bis 5000 gezählt haben.
Jacko schrieb:> Wenn dir das reicht, OK. Wenn es genauer sein soll, muss dein> Zähler mit Steps von z.B. ms von Null bis 5000 gezählt haben.
Meist ist es deutlich günstiger, den Zähler mit dem Wert für die Dauer
zu initialisieren und dann runter zu zählen. Der Vergleich kann dann
immer gegen die 0 stattfinden und ist damit unabhängig von der
gewünschten Verzögerung.
Wolfgang schrieb:> Meist ist es deutlich günstiger, den Zähler mit dem Wert für die Dauer> zu initialisieren und dann runter zu zählen.
Ich denke nicht, dass das irgend etwas an der Ungenauigkeit von 4 bis 5
Sekunden ändert. Auch beim herunterzählen weißt du nicht, wann der erste
Interrupt stattfindet.
Stefanus F. schrieb:> Ich denke nicht, dass das irgend etwas an der Ungenauigkeit von 4 bis 5> Sekunden ändert.
Das ändert nichts am Jitter durch die Zeitdiskretisierung, aber es
erlaubt die Routine so aufzubauen, dass man sich den Speicher für den
Endwert sparen kann.
Ich würde hier einfach 250x 20ms zählen, dann wäre der Jitter mit +-10ms
vermutlich in tolerlierbarem Rahmen und der Zähler passt noch in ein
Byte.
Oder gleich den großen Koffer auspacken, und mit einem 1ms Zyklus und 2
Bates auf 5000 zählen. Dann wäre der Jitter mit +-500µs vermutlich
vernachlässigbar...
... da kann man viel von der Ungenauigkeit durch viel zu
geringe Zeitauflösung erzählen...
Die Leute, die Erfolgserlebnisse suchen, werden irgendwann schon
durch Erfahrung klüger werden. Bei den anderen ist es eh Wurscht.
- Oder habt ihr jeden Einwand von nörgelnden Lehrern Eltern
Tanten beherzigt? DANN wärt ihr jetzt so dumm, wie damals! ;-)