Forum: Mikrocontroller und Digitale Elektronik LPC1769 USB vcom port conflict mit timer


von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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?

von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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) {}
}

von Jim M. (turboj)


Lesenswert?

Dir fehlt die TIMER3_IRQHandler() Funktion oder sie ist flasch benannt.

von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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)
{

....

}

von conflict (Gast)


Lesenswert?

Die muss aber auch in der Interrupt-Vektortabelle gelistet werden, sonst 
nützt`s nix.

von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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
von Jim M. (turboj)


Lesenswert?

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.

von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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?

von conflict (Gast)


Lesenswert?

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

von conflict (Gast)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

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

von Thore T. (Firma: FH Westküste) (thoret)


Lesenswert?

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
Noch kein Account? Hier anmelden.