PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bremst Waitms Timer1 aus?



Testus2K
22.05.2013, 18:58
Hey,
Der Timer sollte doch so wie ich das verstanden habe unabhängig vom rest des Avr laufen können, oder?
Ich meine festgestellt zu haben, dass mein Timer, der Einmal Pro Sekunde aufgerufen wird, den Sekundentakt nicht mehr einhält, wenn ich den wait Befehl nutze.
Das passiert, obwohl die Pause deutlich kleiner ist, als eine Sekunde.

Hab hier mal ein Beispiel reingemacht. Bilde ich mir das nur ein, oder friert wait wirklich alles ein, sogar den unabhängigen Timer?



$regfile = "m8def.dat"
$crystal = 4000000
Dim Zähler As Integer
Zähler=0

Config Portb.7 = Output
Portb.7=1

Config Timer1 = Timer , Prescale = 256
Disable Timer1
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 49500

do
Enable Timer1
loop

Isr_von_timer1:
Incr Zähler
if Zähler=10 Then
Timer1 = 49500
Portb.7=0 'Led an
waitms 200
Portb.7=1 'Led aus
End if
return

Che Guevara
22.05.2013, 19:16
Hi,

normalerweise sollte das Waitms keine Auswirkungen auf den Timer haben! Aber mir fallen mehrere Punkte auf, die du ändern solltest:
1. Definiere in JEDEM Programm Framesize, HWStack und SWStack.
2. Solche Sachen wie "Enable Timer1" gehören im Normalfall nicht in die Mainloop, sondern davor!
3. Die Neuzuweisung des Timerwertes gehört an den Anfang der ISR.
4. Die Variable Zähler musst du auch irgendwann mal wieder zurücksetzen, außer du rechnest mit dem Überlauf.
5. Wenn du schon einen Zähler in der ISR hast, nutze doch diesen, um die LED blinken zu lassen.
In etwa so:


Isr_von_timer1:
Timer1 = 49500
Incr Zähler
If Zähler = 8 Then
Portb.7 = 0
Elseif Zähler = 10 Then
Zähler = 0
Portb.7 = 1
Endif
Return


Das wars mal von mir, wenn du Fragen hast, hau rein ;)

Gruß
Chris

malthy
22.05.2013, 19:26
vor allem kein wait in die ISR!

Testus2K
22.05.2013, 20:32
Hey,
Danke für die Tips. Einige davon habe ich jetzt nur nicht eingehalten, weil ich das "Programm" nur als Beispiel eben so hingeschrieben hab, da hätte ich wohl etwas sorgfältiger sein können :).

dremler
22.05.2013, 20:37
Davon unabhängig: 1. ISR so kurz wie möglich machen, am besten werden nur Flags gesetzt 2. Prüfe, ob nicht die Bascom Delay Funktion Timer 1 nutzt und da etwas durcheinander kommt.