Forum: Mikrocontroller und Digitale Elektronik MSP430 UART + Timer Problem


von beaker (Gast)


Lesenswert?

Hi,

hatte schon mal jemand das Problem, dass bei eingeschaltetem Timer der 
UART RX IRQ nicht mehr auslöst? Ich hab auch versucht längere 
Wartezeiten in die Hauptschleife mit _DINT() und _EINT() zu packen. Aber 
es geht nur wenn ich CCR0 = 0 setz.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das wird nicht des Problemes Ursache sein.

Hast Du Dir mal die Interruptprioritäten angesehen? Was machst Du im 
Timerinterrupt?

von beaker (Gast)


Lesenswert?

Interruptprioritäten... auf die Idee bin ich noch gar nicht gekommen. 
Gleich mal nachlesen. Im Timerinterrupt wird vorerst nur eine LED 
getoggelt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das dürfte nicht stören.

von beaker (Gast)


Lesenswert?

#define USART1TX_VECTOR     4   /* 0xFFF4 USART 1 Transmit */
#define USART1RX_VECTOR     6   /* 0xFFF6 USART 1 Receive */
#define PORT1_VECTOR        8   /* 0xFFE8 Port 1 */
#define TIMERA1_VECTOR      10  /* 0xFFEA Timer A CC1-2, TA */
#define TIMERA0_VECTOR      12  /* 0xFFEC Timer A CC0 */

Laut Datenblatt müsste USART1 den ich verwende eine höhere Priorität 
haben.
TimerB hab ich auch versucht und der steht noch weiter unten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was genau für ein MSP430 ist das?

Bei den mir bekannten* Varianten sind die Interruptprioritäten klar 
anhand der Adresse des Vektors zuzuordnen; je höher die Adresse, desto 
höher die Priorität.

Die Tabelle im Datenblatt ist auch entsprechend aufgebaut.

Dein Beispiel aber lässt auf die beiden USART-Vektoren Vektoren mit 
niedrigerer Adresse folgen ...

Das ist merkwürdig.


*) 14x 15x 16x und 5438

von beaker (Gast)


Lesenswert?

Ist ein 1611.

Ok die Tabelle im Datenblatt ist genau umgekehrt zur Auflistung im .h 
File.

Mein Fehler ;)

von beaker (Gast)


Lesenswert?

Aber wie ist es dann möglich auf UART IRQ´s zu reagieren und nebenbei 
einen Timer laufen zu lassen?

von Jörg S. (joerg-s)


Lesenswert?

In Interrupts ist man i.d.R. nur sehr kurz. Wenn man in Interrupts 
längere Zeit verbringt muss man halt die Software so anpassen das sie 
damit zurecht kommt.
Du könntest z.B. im Timer Interrupt die globalen Interrupts wieder 
freischalten, dann würde der UART den Timer Interrupt unterbrechen. Da 
musst du dann aber aufpassen das nicht mitten drin wieder ein Timer 
Interrupt kommt, sonst gibt's 'nen schönen Stack-Überlauf :)
Oder erst mal den Timer Interrupt abschalten und dann die globalen 
Interrupts an, oder..., oder..., oder ... :)

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.