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
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....
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.
> 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.
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)......
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.