PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer/Interupt - Wo ist der Fehler im Programm



erik_wolfram
24.05.2010, 16:37
Hallo,
ich bin am verzweifeln - das Programm funktioniert einfach nicht, aber ich finde den Fehler nicht:


$regfile "m8def.dat"
$crystal = 16000000
$framesize = 24
$swstack = 8
$hwstack = 32

Config Timer1 = Timer , Prescale = 64
Enable Timer1
Timer1 = 65500

On Timer1 Servoirq

Enable Interrupts


Config Portb.1 = Output
Config Portb.2 = Output
Portb.1 = 1
Portb.2 = 0

Waitms 500
Portb.1 = 1 'gruen
Portb.2 = 1 'rot

'Program-Time
Waitms 1000

'################################################# ##############################
'main

Do

Portb.2 = 0

Loop


'################################################# ##############################
'Interupt
Servoirq:
If Portb.1 = 0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
Timer1 = 5

Return
End

Ich kann jeden beliebigen Wert für "Timer1 = x" (im Interupt) schreiben, aber die angeschlossene LED leuchtet immer im gleichen Sekundentakt.

Hoffe ihr könnt mir helfen!

MFG Erik

peterfido
24.05.2010, 17:25
Der "neue" Timerwert sollte am Anfang der IRQ-Routine gesetzt werden. Ich habe es mal an mein Board angepasst und getestet.

Es blinkt unterschiedlich schnell. Je nachdem, welchen Wert Timer1 im Interrupt bekommt.


$regfile "m32def.dat"
$crystal = 16000000
$framesize = 24
$swstack = 8
$hwstack = 32

Config Timer1 = Timer , Prescale = 64
Enable Timer1
Timer1 = 65500

On Timer1 Servoirq

Enable Interrupts
Led1 Alias Portd.5
Led2 Alias Portd.6

Config Led1 = Output
Config Led2 = Output
Set Led1
Reset Led2

Waitms 500
Set Led2

'Portb.1 = 1 'gruen
'Portb.2 = 1 'rot

'Program-Time
Waitms 1000

'################################################# ##############################
'main

Do
Reset Led2

Loop
End

'################################################# ##############################
'Interupt
Servoirq:
Timer1 = 30000

Toggle Led1

Return


Du musst nur die LED-Ports und den richtigen Prozessor angeben.

erik_wolfram
24.05.2010, 18:04
Danke für den Hinweis,
allerdings hatte ich auch vergessen, dass die Timer aufwärtszählend sind...
jetzt funktioniert es!