Ich habe ein Problem mit meinem Port1-Interrupt
Also im normalen (Netzteil) Betrieb funktioniert alles wunderbar wie ich
es mir vorstelle, doch wenn ich dann die Speisung wegnehme (Batterie)
wechselt der MSP in den LPM4 wie ich das auch wünsche.
Nun kommt jetzt im Batteriemodus ein Port 1 Interrupt, indem ich kurz
etwas mache und dann soll er gleich wieder in den Sleep Modus.
Am Anfang der ISR lösche ich das P1IFG gleich wieder und schalte GIE
frei, weil es auch eine Verschachtelung geben könnte (im Batteriemodus
allerdings nicht). Das funktioniert alles im Normalen Betrieb nur eben
im Batteriebetrieb löscht er das P1IFG nicht (im Debugger obwohl er
sollte) und nachdem ich GIE wieder freischalte springt er dann gleich
wieder in die ISR, wenn ich GIE nicht freischalte springt er einfach am
Schluss der ISR wieder rein, da das P1IFG eben noch gesetzt ist.
Das merkwürdige daran ist allerdings, dass während ich debugge und er
mitten in der ISR steckt und ich dann das Netzteil einschalte, dass er
von da an das P1IFG wieder löschen kann, obwohl er noch immer im LPM4
ist (da kann er erst raus, wenn die Port1-ISR fertig ist und dann die
Port2-ISR kommt wo er aufgeweckt wird).
Also liegt es irgendwie nicht am LPM4, aber verstehen tu ich es trotzdem
nicht, denn im Batteriemodus hat der MSP noch immer 2.3V (zu 3.3V im
normalbetrieb).
Habt ihr da Ideen was das sein könnte?
1 | #pragma vector=PORT1_VECTOR
|
2 | __interrupt void Port_1(void)
|
3 | {
|
4 | if (P1IFG & 0x04) // Wenn SSI-Interrupt ...
|
5 | {
|
6 | TACCR0 = 0x140; // 20us Monoflop Timer neu starten
|
7 | ssi_value = ssi_value << 1; // Wert schieben
|
8 | while (!(P1IN & 0x04)); // Warte bis SSI-CLK pos. Flanke
|
9 | P1OUT |= (((ssi_value & 0x80000000)>>28) & 0x08);
|
10 | // Bit n ausgeben
|
11 | P1IFG &= ~0x04; // SSI Interrupt freigeben
|
12 | } else
|
13 | {
|
14 | P1IFG &= ~0x03; // Hier sollte er das BIT eigentlich löschen
|
15 | __bis_SR_register(GIE); // Interrupt auf pos. Flanke
|
16 | // Multiturn Position anpassen
|
17 | par.reed1 = P1IN & 0x01; // REED 1 einlesen
|
par.reed2 = P1IN & 0x02; // REED 2 einlesen