Taster-Interrupt-Problem

Gast #1010407
Lesenswert?

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?
Gast #1010434
Lesenswert?

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.
Gast #1010470
Lesenswert?

>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.
#1010478
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren