- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: PRO-BOT128: Probleme mit Timer0 und LED-Blinklicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    39
    Beiträge
    38

    PRO-BOT128: Probleme mit Timer0 und LED-Blinklicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    39
    Beiträge
    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.)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    39
    Beiträge
    38
    So, das ist der aktuelle Stand meines Quellcodes:

    Code:
    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

    Code:
    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.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    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...

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    39
    Beiträge
    38
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen