Hallo Leute! Kann mir jemand helfen. Ich arbeite mit dem MSP430F2012. Ich lasse den uC solange schlafen bis ich den Taster drücke, danach geht er in die ISR des Ports. In der ISR wird ein Programm aufgerufen, welches ein PWM-Signal erzeugt. Der Timer, der das PWM erzeugt, löst auch ein Interrupt aus, wenn er überläuft. Ich habe folgendes Problem. Da er sich in der ISR des Ports befindet, geht er nicht in die ISR des Timers rein. Wenn er aber mit der ISR des Ports fertig ist, geht er wieder schlafen. Ich habe nachgesehen, dass die Priorität des Port-Interruptes größer ist als des Timers. Liegt das Problem daran? Wie kann ich das Problem lösen?
Hast Du in Deiner Port-ISR das Interrupt-flag gelöscht? Poste doch mal den Codeteil.
Ich lösche die Flag. Das Codeteil sieht so aus: __interrupt void taster (void); PORT1_ISR (taster) __interrupt void taster (void) { if (P1IFG & BIT1) { P1IFG &= 0x00; adc_init(); pwm_init(50); do { adc(); pwm(); } while (flag == 0); } } und wenn der Timer überläuft, soll er diese ISR ausführen: __interrupt void Timer_A (void); TIMERA0_ISR (Timer_A) __interrupt void Timer_A (void) { if (zeit > 0) { zeit--; } else { flag = 1; } } und das macht er nicht.
@Nat (Gast) > while (flag == 0); AUA. Sowas in einem Interrupt ist fast schon strafbar. Das macht man anders, über Steuersignal in der Hauptschleife, siehe auch Sleep Mode. MFG Falk
>und das macht er nicht.
Kann er auch nicht. Er bleibt bei
1 | while (flag == 0); |
hängen. Dadurch kommt er auch nicht aus der Port-ISR in die Timer-ISR. Versuch es doch mal, die do/while Schleife ins main zu verlagern. D.h. diese z.B. mit flag = 0 in der Port-ISR freigeben und dann, wie gehabt, durch den Timer A mit flag = 1 ausschalten.
Wenn du das schon so machen willst, musst du natürlich in der Taster-ISR den gloablen Interrupt wieder freigeben. Ist aber wie gesagt nicht sinnvoll. Mach das in der Main, und hol den µC in der Taster ISR nur aus dem Sleep raus:
1 | _BIC_SR_IRQ(LPM3_bits); |
Je nachdem, welchen LPM du hast, musst du das natürlich anpassen.
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.