www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster-Interrupt-Problem


Autor: Nat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Patrick (Gast)
Datum:

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

Autor: Nat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und das macht er nicht.
Kann er auch nicht. Er bleibt bei
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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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:
_BIC_SR_IRQ(LPM3_bits);

Je nachdem, welchen LPM du hast, musst du das natürlich anpassen.

Autor: Nat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten. Es funktioniert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.