This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Timerinterrupt Problem mit LPC2106

Hallo Leute, ich hab schon fleißig im Forum gesucht, hab aber leider für
mein Problem keine Lösung gefunden. Daher hoffe ich, dass mir irgendwer
weiterhelfen kann. Hab leider mit ARM Kontrollern noch keine bzw. wenig Erfahrung.

Ich versuche schon seit längerer Zeit bei einem LPC2106 den Timer0 so zu
konfigurieren, dass dieser bei 5 Mikrosekunden einen IRQ auslöst. Der
ARM stellt den Mikrokontroller von einer CMUCam3 dar, welche um
zusätlich Funktionen erweitert wurde. Nur leider gibt es Probleme mit
dem Timer wenn dieser in Kombination mit Interrupts genutzt wird. Der
Timer wird aktuell nur für eine "wait()" Funktion benützt - ohne
Interrupts.

//Grundeinstellung des Timer0 bei der CMUCam3
TIMER0_TCR = 0;
TIMER0_MCR = 0;
TIMER0_TC = 0;
TIMER0_PC = 0;
TIMER0_PR = (int)(((FOSC*PLL_M)/1000)/1000); // jede us
TIMER_TCR = 1;

//Interrupt Init für Timer0
VICIntEnClear = 0xFFFFFFFF;
VICIntSelect = 0x00000000;
VICINtEnable = 16; //Kanal 4
VICVectAddr4 = (unsigned long)timertickISR;
VICVectAddr4 = (1<<5) | 4;

//Timer0 (der Timer läuft bereits; soll lediglich neugestartet werden
und um die Interrupt-Funktionalität erweitert werden)
TIMER0_TCR = 0; //turn off timer
TIMER0_TC = 0; //clear counter
TIMER0_PC = 0; //clear prescale count
//TIMER0_TCR = 2; hab ich auch schon versucht ... sollte ja das gleiche
bewirken wie die zwei Zeilen darüber
TIMER_MC0 = 5; //5 mikros
TIMER_MCR = 3; //enable interrupt, clear MCO reg

TIMER0TCR = 1; //sollte den Timer0 wieder starten ....

Leider gibt es ein Problem, wenn ich den Timer0 wieder starten will.
Nach der Zeile "TIMER0TCR = 1" kommen keine meiner Debug-Ausgaben mehr
an, bzw. mein Programm macht nicht mehr was es sollte....

Gibt es eine Reihenfolge die eingehalten werden muss, wie man Timer oder
Interrupt initialisieren sollte?

Muss ich meine StartUp.s-Datei anpassen um Interrupts zu enablen? Wenn
ja, wie???

Ist der hier aufgeführte Code soweit richtig?

Hoffentlich kann mir jemand weiterhelfen .... hab schon soviel erfolglos
rumprobiert!!!

Viele Grüße
Josef

Parents
  • Note that 5us is a very high interrupt frequency - 200 000 interrupts / second. It will result in a very high CPU load. You haven't told us what core speed you run the processor in, but at 72MHz, you have 360 instruction cycles between each interrupt.

    It does not work well to use the same timer for both interrupts and for a busy-waiting wait() function. If you want to use a busy-loop for delays, it's best to not reset the timer. Then you can implement a wait function with:

    void delay_us(unsigned us) {
        unsigned t = T0TC;
        while ((T0TC - t) < us) ;
    }
    

    I don't know if you may have any other problems with your interrupt handling - you haven't shown us your interrupt handler for the timer interrupt.

Reply
  • Note that 5us is a very high interrupt frequency - 200 000 interrupts / second. It will result in a very high CPU load. You haven't told us what core speed you run the processor in, but at 72MHz, you have 360 instruction cycles between each interrupt.

    It does not work well to use the same timer for both interrupts and for a busy-waiting wait() function. If you want to use a busy-loop for delays, it's best to not reset the timer. Then you can implement a wait function with:

    void delay_us(unsigned us) {
        unsigned t = T0TC;
        while ((T0TC - t) < us) ;
    }
    

    I don't know if you may have any other problems with your interrupt handling - you haven't shown us your interrupt handler for the timer interrupt.

Children
No data