Forum: Mikrocontroller und Digitale Elektronik IRQ Priorität MSP430


von Marcel (Gast)


Lesenswert?

Hallo
ich stehe gerade vor einem schwewigenden problem....
ich möchte den msp alle 8s aus dem lpm3 wecken (mittels wdtirq) das geht 
soweit auch sehr gut! das problem ist ich warte während des wdt irq auf 
einen uart irq der nicht ausgelöst wird. ich vermute das hängt mit der 
priorität zusammen.... gibt es einen weg dies zu umgehen?

mfg marcel

von Christian R. (supachris)


Lesenswert?

Beim Start der WDT-ISR gleich wieder _EINT(); einfügen.
Besser ist aber, in der ISR des WDT den Stack zu verändern, dass nach 
dem Reti kein LPM mehr aktiv ist. Gibts einen Befehl, weiß aber grade 
nich ausm Kopf. BIC_SR_IRQ...irgendwas....

von Jörg S. (Gast)


Lesenswert?

Ich glaube da hilft nur umbauen.
Z.B. in der WDT Routine:
1
while (1)
2
{
3
  if (IFG1 & URXIFG0) // RX aktivität?
4
  {
5
    // mach was mit UART
6
  }
7
}

Oder die WDT Routine beenden und danach auf den UART IRQ warten.

Und natürlich darauf achten das der UART auch mit dem DCO läuft, oder 
den Quarz (falls vorhanden) vorher aktivieren.

von Jörg S. (Gast)


Lesenswert?

> Beim Start der WDT-ISR gleich wieder _EINT(); einfügen.
Ich mag mich irren, aber ich glaube in den ISRs sind die Interrupts eh 
schon aktiviert. Da der Watchdog aber eine sehr hohe Priorität hat, 
lässt der sich einfach nicht durch einen anderen unterbrechen.

> Gibts einen Befehl, weiß aber grade nich ausm Kopf.
> BIC_SR_IRQ...irgendwas....
LMP3_EXIT wäre es für IAR Compiler.

von Marcel (Gast)


Lesenswert?

hi

erstmal danke für die infos! ich werde das mal mit dem _EINT(); 
probieren. ich werde über meine erfolge/misserfolge berichten.....

meine bisherige idee war folgendes:

wdt irq kommt:

...
-    sende zeichen über uart
while(flag==0)
{
-    gehe in lpm3
}

-   auswertung
ende wdt irq

uartrx irq
-   rxdaten sichern
-   8 daten byte empfangen?

ja:
-     geh nicht in den lpm3
-     flag = 1;

nein:
-     gehe in den lpm3

end uartrx irq

Problem jetzt läuft der stack über und die auswertung geht net :(. ich 
ahbe 80 byte für den stack (laut iar fenster)......



von Christian R. (supachris)


Lesenswert?

Die Priorätät spielt nur eine Rolle, wenn mehrere Interrupts 
gleichzeitig anstehen. Da wird dann der WDT zuerst angesprungen und dann 
der niederpriore. Ich mach das immer so, und es funktioniert.

Man sollte allerdings die ISR immer so kurz wie möglich halten, und in 
der main-schleife dann die Auswertung machen. Mit Exit_LPMx kann man den 
Prozessor am Leben lassen, nach dem der Int beendet ist, ansonsten geht 
er in den LPM, der vorher war.

Es sei hier besonders auf die SLAA294A verwiesen.

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.