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
Hallo Josef, bitte englisch posten, dann wird dir auch geholfen. Und nicht die Hinweise zum Posten übersehen (besonders bei eingefügtem Quelltext). Jakob
Danke für den Tipp ... ich werds mal übersetzen^^
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.