PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PRO-BOT128: Probleme mit Timer0 und LED-Blinklicht



dariegel
03.01.2011, 20: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

dariegel
04.01.2011, 18:38
Die oben genannten 1,74 s Blinktakt kommen übrigens nicht bei der LED an, sie blinkt bzw. flackert um einiges schneller. Hatte das gestern einfach angenommen. Aber woran das zu schnelle Blinken/Flackern liegt, weiß ich immer noch nicht.
Keine Ideen? Ach kommt schon. :)


Habe mich nun nochmals eingehend mit der Thematik beschäftigt und wollte die LEDs probeweise mal mit Timer3 betrieben. Gesagt getan, Code angepasst, aber es rührt sich gar nichts. Die LEDs bleiben dunkel.
Frustriert suchte ich im Internet nach einer Lösung und stieß auf einen wohl bereits bekannten Bug der C-Control Pro IDE: die Funktionen Timer_T3Time() und Timer_T1Time() sind wohl falsch implementiert und setzen daher den ersten Parameter nicht richtig, d.h. es dauert ewig, bis der Interrupt ausgelöst wird - egal, was man der Funktion als Wert übergibt.

Ist da was dran? Kann mir bitte jemand einen Hinweis geben, was ich falsch mache?



(Die ISR benutzt jetzt übrigens Port_ToggleBit() zum Ein- und Ausschalten der LEDs, dann kann ich mir den Umstand mit dem Flag i ja sparen.)

dariegel
04.01.2011, 23:42
So, das ist der aktuelle Stand meines Quellcodes:


Sub main()
Dim wRC5_Code As Word
'Dim bRC5_ToggleBit As Byte
Dim wRC5_Cmd As Word


PRO_BOT128_INIT()
RC5_Init(26) 'PortBit TSOP1736

Irq_SetVect(INT_TIM3CMPA, Timer3_ISR)
Timer_T3Time(7200, 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()

'bRC5_ToggleBit = GetRC5_ToggleBit(wRC5_Code, 0)
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

'If bRC5_ToggleBit = 0 Then MOTOR_STOP() : End If
End If

End While
End Sub

Sub Timer3_ISR()
Port_ToggleBit(FLL)
Port_ToggleBit(FLR)

Irq_GetCount(INT_TIM3CMPA)
End Sub


Eigentlich müsste Timer3 doch mit


Irq_SetVect(INT_TIM3CMPA, Timer3_ISR)
Timer_T3Time(7200, PS0_1024)

die ISR alle 500 ms einmal auslösen, oder? Warum tut sich da nichts? Die LEDs bleiben dunkel. Die ISR wird aus irgendeinem Grund gar nicht erst angesprungen.

Ich bin schier am verzweifeln. ](*,)
Hier haben doch einige einen PRO-BOT128, haben die den Timer3 noch nie erfolgreich eingesetzt? Raus damit. :)

sebroos
05.01.2011, 00:46
hi!
leider kann ich dir nicht genau helfen weil das alles über mein wissen geht... genau wie ich denke den meisten hier =)
aber hier ist ein nick von jemanden der scheinbar richtig ahnung vom probot hat :
bnitram

der war nur seit dem 3.1. nichtmehr online... aber schick ihm einfach eine nachricht... dann wird er sich bestimmt bei dir melden wenn er wieder da ist...

aber vllt kannst du ja bei meinem problem (tread: "probot 128 probleme mit multithreading") weiterhelfen. allerdings wäre nicht multithreading auch interessant für dein programm? bei mir klappt das mit den leds blinken lassen wärend der motor sich bewegt einwandfrei...

dariegel
05.01.2011, 07:54
Hallo sebroos,

danke für Deine Antwort. Ich werde mich mal per PN an ihn richten. Wobei ja die Thematik nicht wirklich PRO-BOT-spezifisch ist, der ATmega128 ist ja einfach der große Bruder des ATmega32 und funktioniert timtertechnisch doch quasi analog. Vereinfacht gesagt. :)

Deinen Thread habe ich mir bereits zuvor angeschaut, kann Dir diesbezüglich aber nicht weiterhelfen. In der Programmierung habe ich allgemein etwas Erfahrung, allerdings habe ich mich bisher nicht mit Multithreading beschäftigt.

Egal wo man über Roboterprogrammierung liest, stößt man eigentlich in den seltensten Fällen auf mehrere Threads, sondern immer auf eine Lösung aus Timern und Interrupts.
So wäre das Multithreading glaube ich auch in meinem Fall mit Kanonen auf Spatzen geschossen.
Im übrigen will ich ja wissen, warum bei mir der Timer3 nicht funktioniert und nicht gleich aufgeben. :)


Weitere Lösungvorschläge werden dankend entgegengenommen. :)