mikrocontroller.net

Forum: Compiler & IDEs Komisches Verhalten bei while Schleifem it Interrupt unterbrechung


Autor: Andy S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void Spracherkennung()
{
  //Schreibe auf Display welchen Modus:
  LCD_sprach;

  //Variablen-definitionen
  uint8_t getSpokenWord = 0;

  //Main-Loop:*********************************************************************
  while( !((getSpokenWord < 110) && (getSpokenWord > 100)) && !cancel_mode )  //Position 8
    //Führe Spracherkennung aus solang bis Beenden gesagt
    //wurde oder cancel-Mode Taste gedrückt wurde
  {
    //getSpokenWord = GetADC_8bit(7);

    if( (getSpokenWord < 10) && (getSpokenWord > 2))  //Wenn auf Position1 bekommt man einen DAC Wert von <10
    {
      Linienverfolgung();
    }
    else if( (getSpokenWord < 20) && (getSpokenWord > 10) )  //Position2
    {
      Ausweichmodus();
    }
    else if( (getSpokenWord < 30) && (getSpokenWord > 20) )  //Position3
    {
      Linienverfolgung_Ausweichmodus();
    }
    else if( (getSpokenWord < 40) && (getSpokenWord > 30) )  //Position4
    {
      Funksteuerung();
    }
    else
      ;
    lcd_setcursor(0,1);
    if(cancel_mode)
      lcd_string("true");
    else
      lcd_string("false");
  }
  //back***************************************************************************
  LCD_Mode_Verlassen;

  _delay_ms(50); //Wenn cancel gedrückt wurde dann soll entprellt werden
  cancel_mode = false;   // Damit können jetzt andere Unterprogramme ausgeführt werden
}

Wenn ich diesen Teil:
lcd_setcursor(0,1);
    if(cancel_mode)
      lcd_string("true");
    else
      lcd_string("false");
weglasse, dann komme ich auch nicht raus wenn cancel_mode true ist.

Problembeschreibung:
Ich habe eine Taste die ich auf den Interrupt führe. Wenn die steigende 
Flanke kommt, dann soll cancel_mode = true gesetzt werden.
ISR(INT0_vect)
{
  cancel_mode = true;
}

Danach springt das Programm wieder zur While() schleife.
Und ich sehe am LCD immer noch MODUS: Sprach.

erst wenn ich diesen Teil:
if(cancel_mode)
      lcd_string("true");
    else
      lcd_string("false");
wieder dazugebe dann komme ich raus und sehe am LCD MODUS Verlassen.
_____________________________________________________________________


Die Variable cancel_mode wird von sonst keinem Interrupt beeinflusst, 
also nur am Int0.
Was kann denn die Ursache dafür sein?
Kann es sein, dass das LCD einfriert aus irgendeinem Grund? Weil es ist 
wirklich nur dieser Teil, der darüber entscheidet ob ich rauskomme oder 
nicht.

Ich danke schon im Voraus für Support!

lg andy

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile vergessen.

Autor: Andy S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> volatile vergessen.

HAH, Kake, stimmt!

Danke!

lg andy

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.