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


von C. H. (hedie)


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:
1
ISR(USART_RX_vect)
2
{
3
    unsigned char buffer;
4
  
5
    // Daten aus dem Puffer lesen
6
    buffer = UDR0;
7
8
    
9
    if (buffer!='\r' && buffer!='\n' && uart_str_count<uart_maxstrlen-1){
10
      uart_string[uart_str_count]=buffer;
11
      uart_str_count++;
12
    } 
13
    else {       //String komplett
14
      uart_string[uart_str_count]='\0';
15
      uart_str_count=0;
16
      
17
      if( strcmp( uart_string, "OK" ) == 0 ) 
18
      {
19
        cli();        //Interrupt Deaktivieren
20
        status(3);    //Lässt LED's Blinken
21
        Acknowledge = 1;
22
      }
23
      
24
    }
25
26
}


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:
1
Acknowledge = 0;
2
              while(Acknowledge != 1)  //Befehl soll solange gesendet werden bis OK empfangen wird!!!
3
              {
4
                uart_puts("AT+CMGD=1");
5
                uart_putc('\r');
6
                uart_putc('\n');
7
              }
8
              sei();
9
              status(2);
10
              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

von Hc Z. (mizch)


Lesenswert?

Die zugehörige Info fehlt, aber ich tippe mal auf volatile.

von C. H. (hedie)


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:
1
unsigned char Acknowledge = 0;

von Hc Z. (mizch)


Lesenswert?

Genau das meinte ich.  Es fehlt das volatile.

von (prx) A. K. (prx)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von C. H. (hedie)


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...

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

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.