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:
Ist das für meinen Fall überhaupt relevant? Ich nutze ihn ja nicht als Zähler, sondern als Timerfunktion, oder?Beim Mega128 ist aus Hardwaregründen die Benutzung von Timer_0 als Zähler nicht möglich!
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
Lesezeichen