dariegel
03.01.2011, 21:17
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. 8-[ :)
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).
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. :cheesy: :roll:
Grüße,
dariegel
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. 8-[ :)
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).
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. :cheesy: :roll:
Grüße,
dariegel