Abend zusammen,

ich lese schon seit geraumer Zeit in diesem Forum und besitze seit etwa 1-2 Monaten den PRO-BOT128 mit dem C-Control PRO Mega 128 an Bord. Mit diesem mache ich nun meine ersten Gehversuche im Bereich Mikrocontroller.

Derzeit habe ich mich in die Timer verbissen und dabei tauchte auch mein erstes ernsthaftes Problem auf. Die Gelegenheit nutze ich auch gleich, um mich vorzustellen.

Folgendes: Ich habe den PRO-BOT auf eigene Faust und mit eigenen Routinen so programmiert, dass ich ihn mit einer RC5-Fernbedienung steuern kann, die ich irgendwo noch in der Schublade hatte. Soweit so gut.
Zusätzlich hätte ich gerne, dass die vier Positions-LEDs blinken, und zwar immer, egal ob der Roboter steht oder ich ihn mittels Fernbedienung steuere.
Dafür bediene ich mich Timer0 und nutze dessen Interrupt, um in der ISR die LEDs abwechselnd ein- und wieder auszuschalten (siehe Code).

Code:
Dim i As Integer

Sub main()
    Dim wRC5_Code As Word
    Dim wRC5_Cmd As Word
 
    PRO_BOT128_INIT()
    RC5_Init(26)		'PortBit TSOP1736

    Irq_SetVect(INT_TIM0COMP, Timer0_ISR)
    Timer_T0Time(25000, PS0_1024)



    Do While True
		wRC5_Code = RC5_Read()

        If wRC5_Code = 0 Then
        	'Motoren stoppen, wenn FB-Taste losgelassen wird
            MOTOR_STOP()
            DRIVE_OFF()
        Else
        	DRIVE_ON()

            wRC5_Cmd = GetRC5_Command(wRC5_Code, 0)

            Select Case wRC5_Cmd
                Case RC5_CMD_FWD
					DRIVE_FWD(180, 0)
                Case RC5_CMD_BWD
					DRIVE_BWD(180, 0)
                Case RC5_CMD_RIGHT
					TURN_RIGHT(180, 0)
                Case RC5_CMD_LEFT
					TURN_LEFT(180, 0)
            End Select

    End While
End Sub


Sub Timer0_ISR()
	Dim bIRQcnt As Byte

	If i = 1 Then
    	i = 0
        FLL_OFF()
        FLR_OFF()
    Else
    	i = 1
    	FLL_ON()
        FLR_ON()
    End If

	bIRQcnt = Irq_GetCount(INT_TIM0COMP)
End Sub

Demnach müssten die LEDs alle 25000 * 69,44 μs = 1736000 μs = 1,74 s blinken. Das funktioniert wunderbar, allerdings treten nach einigen Sekunden des Blinkens Rhythmusstörungen auf. Die Abstände werden deutlich kürzer oder länger, es scheint, als würde der μC stolpern. Besonders schlimm wird es, wenn ich den Roboter dann "parallel" noch per Fernbedienung fahren lasse, dann flackern die LEDs mehr als dass sie blinken. Woran liegt das? Vor allem: was hat der Antrieb damit zu tun, das PWM-Signal der DC-Motoren wird doch mittels Timer1 erzeugt (in der PRO-BOT128_Lib_V2.cbas)?!

Nun habe ich durch Zufall über den Rückgabewert von Irq_GetCount() gelesen. Dieser ist größer 1, wenn der IRQ öfter ausgelöst wird, als er ausgeführt werden kann. Konkret heißt das doch, dass meine ISR zu lang ist. Habe ich das richtig verstanden? Bei mir schwankt dieser Wert zwischen 1 und ~16. Hat dieser Umstand mit dem LED-Flackern zu tun?

Dann noch eine Kleinigkeit: in der Online-Doku zur C-Control PRO steht unter Timer0 der Vermerk:

Beim Mega128 ist aus Hardwaregründen die Benutzung von Timer_0 als Zähler nicht möglich!
Ist das für meinen Fall überhaupt relevant? Ich nutze ihn ja nicht als Zähler, sondern als Timerfunktion, oder?


Für's Lesen und Eure Hilfe bedanke ich mich schon einmal. Da hier offenbar sehr interessierte und fähige Leute mitlesen, hoffe ich das Beste.


Grüße,
dariegel