Forum: Mikrocontroller und Digitale Elektronik Taster-Interrupt-Problem


von Nat (Gast)


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?

von Patrick (Gast)


Lesenswert?

Hast Du in Deiner Port-ISR das Interrupt-flag gelöscht? Poste doch mal 
den Codeteil.

von Nat (Gast)


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.

von Falk B. (falk)


Lesenswert?

@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

von Patrick (Gast)


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.

von Christian R. (supachris)


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.

von Nat (Gast)


Lesenswert?

Danke für die schnellen Antworten. Es funktioniert.

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.