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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thore T. (Firma: FH Westküste) (thoret)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Dir fehlt die TIMER3_IRQHandler() Funktion oder sie ist flasch benannt.

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


Bewertung
0 lesenswert
nicht 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)


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

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.