mikrocontroller.net

Forum: Compiler & IDEs while / Interrupt - Problem


Autor: Markus Wentker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe eine UART-Senderoutine, die abwarten soll, ob der vorherige
Befehl korrekt empfangen wurde.
Es gibt also im UART-Receive-Interrupt eine Überprüfung, ob ein "OK"
zurückempfangen wurde. Ist dies der Fall, so wird eine Variable auf 1
gesetzt. Außerdem wird ein Timer gestartet, der bei einem Overflow
ebenfalls die Variable auf 1 setzt, um den Programmablauf nicht
aufzuhalten.

In meiner Senderoutine warte ich zunächst darauf, dass die Variable 1
wird.
Ich habe
while (pc_answer == 0);   und
for (; pc_answer == 0;);

pc_answer ist natürlich als volatile deklariert.

Das Programm bleibt aber in der while- bzw. for-Schleife hängen und
wird nicht durch den Interrupt unterbrochen, so dass die Variable auf 1
gesetzt werden kann.

Was ist falsch? Oder gibt es schönere Lösungen, die auf eine korrekte
Antwort warten, bevor der nächste Befehl gesendet wird?

Gruß
Markus

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Markus,

"Ich habe eine UART-Senderoutine, die abwarten soll, ob der vorherige
Befehl korrekt empfangen wurde.
Es gibt also im UART-Receive-Interrupt eine Überprüfung, ob ein "OK"
zurückempfangen wurde. "

In Interrupt-Routinen darf nicht gewartet werden.
Die sind nur wie der Postbote - die liefern die Post ab, und schon sind
sie wieder weg.
Das Warten muß in das Hauptprogramm verlegt werden.

Ciao
Wolfgang

Autor: Markus Wentker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Oh, habe mich da vielleicht etwas umständlich ausgedrückt:

Ich warte in der Senderoutine, welche eine "normale" C-Funktion ist.
Diese Funktion hat als erste Zeile eben ein
while (!flag); oder eben die for-Variante.

Diese Endlosschleife soll eigentlich durch einen Timer-Overflow (oder
der Empfangsroutine) unterbrochen werden, der das flag setzt und damit
nach dem Rücksprung die Endlosschleife unterbrochen wird.

Gruß
Markus

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal etwas mehr Code.

Autor: Markus Wentker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile int pc_answer;

Sende-Funktion:
void send_PC(int E, int L, int W)
  while (!pc_answer);          //um diese Zeile geht es
  pc_answer=0;

  while (!(UCSR0A & (1<<UDRE0)));
  UDR0 = 'E';

        usw.

Die Timer-Overflow-Routine:
SIGNAL (SIG_OVERFLOW3)
{
  lcd_clrscr();
  lcd_command(LCD_DISP_ON);
  lcd_puts("PC CommError!");
  pc_answer=1;
  TCCR3B=(0<<CS32)|(0<<CS31)|(0<<CS30);  // Timer stoppen
  TCNT3H=TCNT3L=0;
};

Wenn ich die while-Schleife rausnehme, erscheint der Display-Text, d.h.
die Interrupt-Routine wird angesprungen, sonst nicht.

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"In Interrupt-Routinen darf nicht gewartet werden."
Das kann ich nur bestätigen, deshalb keine zeitintensiven Funktionen
wie lcd_clrscr() in der Interrupt-Routine ausführen !

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.