PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer1- Probleme mit timer Startwert



C2H6O
06.11.2009, 21:37
Hallo
Ich brauche mal wieder eure Hilfe:
Ich will, dass ich die Abstände, in denen das Interrupt ausgeführt wird, ändern kann.
Das Problem ist jetzt, dass wenn ich den Taster langsam und regelmäßig drücke, der Wert auch erhöht wird, wie ich im Terminal gut sehen kann. Manchmal passiert es aber, dass der Wert plötzlich wieder bei 0 ist, oder krummer Werte wie 1045 kriegt, was eigentlich nicht sein kann. Hat jemand ne Idee?

$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'LEDs konfigurieren
Config Pind.5 = Output
Led1 Alias Portd.5
Config Pind.6 = Output
Led2 Alias Portd.6

'Taster konfigurieren
Config Pind.2 = Input
Config Pind.3 = Input
Taster1 Alias Portd.2
Taster2 Alias Portd.3

'Pieper
Config Pind.7 = Output

'Timer einstellen
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer_irq
Timer1 = 30000
Enable Timer1
Enable Interrupts

'Variablen
Dim Tempo As Word

'#######################
'Hauptprogramm #
'#######################
Do
'schalter entprellen
Debounce Pind.2 , 1 , Langsammer , Sub
Debounce Pind.3 , 1 , Schneller , Sub

Loop
End

'Interruptroutine
Timer_irq:
Timer1 = Tempo
Print "Piep"
Print Tempo

Toggle Led1

Portd.7 = 1
Portd.7 = 0
Return


'entprell routinen
Schneller:
Tempo = Tempo + 1000
Return

Langsammer:
Tempo = Tempo - 1000
Return
Mfg und Danke fürs ansehen

for_ro
06.11.2009, 22:05
Ich könnte mir vorstellen, dass die Timer_Isr die Debounce Sub unterbricht, während die Variable Tempo geändert wird. Das wird bei Word Operationen (braucht 16 Takte) möglich sein. Besonders bei schnell aufeinanderfolgenden Timer Overflows steigt die Wahrscheinlichkeit.
Du könntest mal das Addieren bzw. Subtrahieren durch Disable Interrupts schützen. Also so:

Disable Interrupts
Tempo = Tempo + 1000
Enable Interrupts

C2H6O
09.11.2009, 18:44
Hallo
Danke für den Tipp, hilft aber leider nichts.
Noch wer Ideen?
Ich werd mal probieren die Taster mit einem Timer-Interrupt abzufragen, vielleicht hilft das.

Sauerbruch
09.11.2009, 23:05
"Krumme" Werte könnten auch dadurch entstehen, dass der Wert von Tempo beim Addieren irgendwann mal größer als 65535 wird und überläuft (oder analog dazu beim Subtrahieren kleiner wird als 0). Das könntest Du vermeiden, indem Du in den Subroutinen die Addition bzw. Subtraktion nur dann ausführen lässt, wenn Tempo kleiner als 64535 bzw. größer als 1000 ist:



Schneller:
If Tempo < 64535 then
Tempo = Tempo + 1000
End if
Return

Langsamer:
If Tempo > 1000 then
Tempo = Tempo - 1000
End if
Return


Btw.: Du fragst die Eingangspins nach "1" ab - gehen die Taster denn auch nach (+)? Und hast Du ordentliche PullDown-Widerstände angeschlossen?

C2H6O
13.11.2009, 23:07
Hallo
Hardwaremäßig passt alles.
@Sauerbruch
Mit den krummen Werten beim Überlauf hast du recht.
Allerdings klappt dass erhöhen immer noch nicht, es wird immer wieder zurückgesetzt.
mfg