PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer lässt sich nicht mehr abschalten



Foooob
06.02.2007, 18:05
Hallo

Ich habe folgendes Problem.
Auf Knopfdruck (bzw. über die RS-232) soll meine Luxeon anfangen zu blinken. Genauso soll sich das geblinke aber auch wieder abschalten lassen, die Luxeon soll dann ausgehen. Aber genau daran scheitere ich.

Mein Code sieht folgendermaßen aus:



Dim T As Bit
Dim Tw As Word
Dim Luxstatus As Word

Config Timer3 = Timer , Prescale = 256
On Timer3 Isr_lux_t3
Timer3 = Tw
Enable Interrupts

Config Pinb.4 = Output 'Pin der Lux

'....

Do

If Mid(zeichen , 1 , 4) = "lumb" Then 'Luxeon-Status
Luxstatus = Mid(zeichen , 5 , 2)

If Luxstatus = "01" Then
'1Hz Blinken
Enable Timer3
Tw = 30000
End If

If Luxstatus = "00" Then
'LUX ausschalten
Disable Timer3
Portb.4 = 0
Ocr0 = 0
End If
End If

Waitms 50
Loop
End

Isr_lux_t3:
Timer3 = Tw
Toggle T
If T = 0 Then Ocr0 = 255 'PWM Wert der Lux
If T = 1 Then Ocr0 = 0
Toggle Portb.4
Return


Sobald die Zeichenkette "lumb01" einfliegt fängt die Luxeon an zu blinken, alles paletti. Wenn jetzt aber die Zeichenkette "lumb00" einfliegt soll die Luxeon aufhören, dazu habe ich wie man sieht versucht den Timer zu deaktivieren, den Port auf Low zu setzen und den PWM-Wert auf 0 gesetzt. Interessiert meine Luxeon aber wenig, die blinkt weiter akkurat vor sich hin.

Wenn man sich das genau auf dem Display anschaut sieht man, dass wenn man "lumb01" und _sofort_ danach "lumb00" sendet die Luxeon aus bleibt, wartet man aber dazwischen etwas nimmt der AVR von außen nichts mehr entgegen. Auch andere Befehle (zum Beispiel zur Motoransteuerung) lassen ihn kalt, einzigst die Luxeon lässt er noch blinken.

Ich habs schon mit allerlei Mitteln probiert aber entweder blinkt dann die Luxeon nicht mehr oder es gibt sonst irgendwelche Probleme. Nutze Timer leider nicht so oft, drum könnts auch an was ganz trivialem liegen :-b

digitali
06.02.2007, 18:35
Hallo,

versuche es mal mit
"Stop Timer3"
und
"Start Timer3"

In irgendeinen Projekt von mir schalte ich damit nen Timer von einen ATMega128 an und aus.

Mit freundlichen Gruessen
Digitali

Foooob
06.02.2007, 18:52
Nun funktionierts anders rum ;-)
Will ich die Luxeon blinken lassen geht das nicht, da reagiert die nicht.
Wenn ich die Luxeon zuerst NICHT über den Timer anschalte (Code dazu ist nicht im Codeausschnitt oben enthalten) und dann ausschalten will geht das wunderbar, auch kann ich sie danach wieder einschalten. Nur das Blinken geht nicht.

Vitis
06.02.2007, 21:34
was noch fehlt ist die Routine, die du für den Datenempfang

Foooob
20.02.2007, 20:48
Muss das hier nochmal ausgraben, kam nun wieder dazu mich dem Problem anzunehmen und habe es immer noch nicht gelöst. Ich verstehe aber beim besten Willen nicht warum.

Habe den Code nun etwas umgeschrieben.
Der Timer ist nun IMMER an, die IRS führt jedoch nur Anweisungen aus, wenn eine Bit-Variable auf 1 gesetzt ist.

Hier der Code:



'***DEKLARATIONEN***
Dim T As Bit
Dim Tw As Word
Dim Checkstatus_lux As Bit

Checkstatus_lux = 0
Tw = 0

Enable Interrupts
Enable Timer3
Config Timer3 = Timer , Prescale = 256
Timer3 = Tw
On Timer3 Isr_lux_t3


'***IM HAUPTPROGRAMM***
If Luxstatus = "10" Then
Checkstatus_lux = 1
End If


'***ISR****
Isr_lux_t3:
If Checkstatus_lux = 1 Then
Timer3 = Tw
Toggle T
If T = 0 Then Ocr0 = 255
If T = 1 Then Ocr0 = 0
Toggle Portb.4
End If
Return


Folgendes:
Wenn ich die Variable Checkstatus_lux in der Deklaration auf 1 setze, dann geht die Luxeon an-aus-an-aus und das Hauptprogramm läuft ebenfalls munter weiter...
Wenn ich diese Variable jedoch wie im Codebeispiel in der Deklaration auf 0 setze und dann im Hauptprogramm die If-Bedingung erfülle (und damit diese Variable auf 1 setze) blinkt die Luxeon zwar ebenfalls, aber das Hauptprogramm macht überhaupt gar nix mehr....

An was liegt das?

Ach und ja, da fehlt einiges an (nicht relevantem) Code, die 800 anderen Zeilen wollte ich euch mal ersparen *g*