mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt nicht mehr Deaktivierbar - Endloses While :(


Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich empfange per RS232 Eine Zeichenkette.

Ich überprüfe nach jedem empfangenen /r ob ein bestimmter Text enthalten 
ist

Dies löse ich so:
ISR(USART_RX_vect)
{
    unsigned char buffer;
  
    // Daten aus dem Puffer lesen
    buffer = UDR0;

    
    if (buffer!='\r' && buffer!='\n' && uart_str_count<uart_maxstrlen-1){
      uart_string[uart_str_count]=buffer;
      uart_str_count++;
    } 
    else {       //String komplett
      uart_string[uart_str_count]='\0';
      uart_str_count=0;
      
      if( strcmp( uart_string, "OK" ) == 0 ) 
      {
        cli();        //Interrupt Deaktivieren
        status(3);    //Lässt LED's Blinken
        Acknowledge = 1;
      }
      
    }

}


Wie man Sieht, warte ich auf das String Ende welches mir durch
/r angezeigt wird.

Enthält der String nun OK so weiss ich das mein GSM Modem alles 
verstanden hat. Deshalb setze ich die Global Definierte Variable 
Acknowledge auf 1


Mein Aufruf sieht so aus:
Acknowledge = 0;
              while(Acknowledge != 1)  //Befehl soll solange gesendet werden bis OK empfangen wird!!!
              {
                uart_puts("AT+CMGD=1");
                uart_putc('\r');
                uart_putc('\n');
              }
              sei();
              status(2);
              Acknowledge = 0;

Das merkwürdige ist, die LED's Blinken beim Empfang von OK
jedoch springt mein Programm NIE!!! aus der While Schleife.

Selbst CLI() Innerhalb des Interrupts brachte keine Hilfe..

Ich bin echt ratlos
hoffe ihr könnt mir helfen

Danke schonmal

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die zugehörige Info fehlt, aber ich tippe mal auf volatile.

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Die zugehörige Info fehlt, aber ich tippe mal auf volatile.

Hi

was meinst du damit?

Die Variable wurde so definiert:
unsigned char Acknowledge = 0;

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das meinte ich.  Es fehlt das volatile.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NB: CLI in einer ISR ist witzlos. Die Interrupts sind sowieso 
abgeschaltet. Umgekehrt kommt das SEI hinter der Warteschleife etwas 
spät.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:
> Selbst CLI() Innerhalb des Interrupts brachte keine Hilfe..

Klar.  Die sind ja innerhalb der ISR sowieso abgeschaltet und werden
nach dem Verlassen selbiger wieder zugeschaltet.

Wenn schon, dann musst du das RXCIEn-Bit deiner USART dort abschalten,
damit sie bei künftigen Zeichen keinen Interrupt mehr generiert.

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Genau das meinte ich.  Es fehlt das volatile.

Geilooooomaaaat :)

Danke... das war der hinweis der fehlte...

Ich bin Zwar elektroniker und wir haben jeenstes C Programmier aber
beim Volatile hab ich wohl ein bisschen gepennt :)

Vielen Dank...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

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.