Hi, ich arbeite an einem Projekt um 3 Servos mit dem LPC1769 zu steuern. Zur kommunikation mit dem PC benutze ich einen usb virtual com port. Wenn ich mein PWM Signal nach der initialisierung der USB vcom Schnitstelle initialisiere, bekomme ich keine Verbindung. Wenn ich die beiden Initialisierungen tausche funktioniert es. Jetzt benötige ich einen Timer, wenn ich diesen nur initialisiere bekomme ich keine usb vcom Verbindung. Egal ich ich die Vertausche. Ich verwende die cmsisv2p00 libary. Für den usb vcom port habe ich die Beispiele: RDB1768cmsis2_usb_serial und RDB1768cmsis2_usbstack in mein Projekt implementiert. Hat jemand eine Idee wie ich das Problem lösen kann?
Ok, ich bin noch ma etwas auf Fehlersuche gegangen: Nachdem ich mein Timer initialisiert habe: LPC_SC->PCONP |= 1 << 23; //Power up Timer 0 LPC_SC->PCLKSEL0 |= 1<<1; //100 MHz LPC_TIM3->MR0 = 1000000; // Set Matc0 to 100000. That means 1 ms. LPC_TIM3->MCR |= 1 << 0; // Interrupt on Match0 compare LPC_TIM3->MCR |= 1 << 1; // Reset timer on Match 0 LPC_TIM3->TCR |= 1 << 1; // Reset Timer0 NVIC_EnableIRQ(TIMER3_IRQn); //Enable Interrups for Timer 0 LPC_TIM3->TCR = 1; // Start timer Hängt das Programm in dieser Schleife fest: //********************************************************************** ******* // // Processor ends up here if an unexpected interrupt occurs or a specific // handler is not present in the application code. // //********************************************************************** ******* _attribute_ ((section(".after_vectors"))) void IntDefaultHandler(void) { while(1) {} }
Dir fehlt die TIMER3_IRQHandler() Funktion oder sie ist flasch benannt.
Jim M. schrieb: > Dir fehlt die TIMER3_IRQHandler() Funktion oder sie ist flasch benannt. Danke für deine Antwort Jim. Hatte ich auch schon gedacht, leider nicht. Habe unter der initialisierung: void TIMER3_IRQHandler (void) { .... }
Die muss aber auch in der Interrupt-Vektortabelle gelistet werden, sonst nützt`s nix.
conflict schrieb: > Die muss aber auch in der Interrupt-Vektortabelle gelistet werden, sonst > nützt`s nix. Meinst du die Tabelle in der "cr_startup_lpc177x_8x.c" ? .... // Forward declaration of the specific IRQ handlers. These are aliased // to the IntDefaultHandler, which is a 'forever' loop. When the application // defines a handler (with the same name), this will automatically take // precedence over these weak definitions // //********************************************************************** ******* void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); ....
:
Bearbeitet durch User
Schau mal im Debugger nach wie der Eintrag in der Vektor Tabelle genau aussieht. Der Name muss übrigens genau übereinstimmen. Es gibt auch noch eine Falle falls das C++ Code ist - das hatten wir hier grade in einem anderen Beitrag. Ach ja: Mit Libraries (*.a) funktioniert das weak binding AFAIK nicht, der Timer Handler darf also nicht in einer Lib ausgelagert sein beim Linken.
Jim M. schrieb: > Der Name muss übrigens genau übereinstimmen. Es gibt auch noch eine > Falle falls das C++ Code ist - das hatten wir hier grade in einem > anderen Beitrag. > Ich arbeite in einem C++ Projekt. Wahrscheinlich liegt da der Fehler. Wie finde ich diesen Beitrag oder ist die Sache mit den Libraries(*.a) die Lösung? > Ach ja: Mit Libraries (*.a) funktioniert das weak binding AFAIK nicht, > der Timer Handler darf also nicht in einer Lib ausgelagert sein beim > Linken. Was meinst mit ausgelagert?
>Wie finde ich diesen Beitrag oder ist die Sache mit den Libraries(*.a) >die Lösung? Die Sache dürfte toolchain-abhängig sein. Ich kenne Deine jetzt nicht, aber ich vermute stark, dass es genügen dürfte, in der Zeile >void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); den ALIAS-Schwanz zu entfernen. Der Kommentar legt das jedenfalls nahe. Also dann: void TIMER3_IRQHandler(void); >Was meinst mit ausgelagert? Er meint: die entsprechende Funktion nicht aus einer Lib linken, sondern direkt aus einem Object-File.
P.S:
das was Du oben gepastet hast, ist nicht die Vektortabelle selbst,
sondern
eine
> // Forward declaration of the specific IRQ handlers.
d.h. die Funktionsprototypen.
Vielleicht hängst Du die komplette cr_xxxx.c mal hier an.
Die Alias Deklaration ist kein Problem, eher das C++ name mangeling. In den Header deiner TimerIRQ Definition gehört ein extern "C" wenn es mit dem cpp compiler übersetzt wird:
1 | #ifdef __cplusplus
|
2 | extern "C" { |
3 | #endif
|
4 | |
5 | void TIMER3_IRQHandler(void); |
6 | |
7 | #ifdef __cplusplus
|
8 | }
|
9 | #endif
|
LÖSUNG: Beim Aufruf des Interrups ein --extern "C"-- davor. Also sieht der Aufruf denn so aus: extern "C" void TIMER0_IRQHandler (void){ .... } Danke für eure Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.