USART1_RX_vect programm hängt nach auslösen

OP #3806951
Lesenswert?
• ▲
▼
Hallo liebe Gemeinde,

Ich möchte über den PC das Zeichen 'C' senden, dann soll der Interrupt 
ausgelöst werden und die Variable flag_UART_PC auf True setzen.

Wenn nun flag_UART_PC auf true gesetzt ist soll die Funktion 
empfangen_von_PC() abgearbeitet werden.

Was funktioniert ist, das der Interrupt beim Senden von 'C' ausgelöst 
wird und die Variable auch auf true gesetzt wird... (ist über Display zu 
kontrollieren)

ABER die funktion empfangen_von_PC() wird nicht aufgerufen, scheinbar 
die ganze while(1) nicht mehr, nur noch der Timer interrupt funktioniert 
und wird ausgelöst.

Muss ich noch irgendeine Flag zurücksetzten damit UART1 wieder empfangen 
kann?
1
    while(1)
2
    {     
3

4
            BCtoglobals();
5
            
6
            if(flag_UART_PC==true)
7
            {
8
                 empfangen_von_PC();
9
                 
10
            }
11
            
12
                         
13
    }       
14
        
15
          
16

17
}
18

19

20
ISR( USART1_RX_vect )
21
{
22
    if(UDR1=='C')
23
        flag_UART_PC=true;
24
    
25
        
26
     
27
}
#3807011
Lesenswert?
• ▲
▼
Übrigens. So etwas
1
            if(flag_UART_PC==true)
ist meist keine gute Idee.

Als Wahrheitswert für 'wahr' ist in C alles definiert, was nicht 0 ist. 
D.h. wenn flag_UART_PC den Wert 5 hat, dann ist das ebenfalls 'wahr'.

Wenn du den Vergleich so schreibst, dann nagelst du die Variable darauf 
fest, dss sie genau den Wert 1 haben muss (denn 'true' ist nichts 
anderes als 1).

In C ist weniger oft mehr. Vergleiche auf true oder false schreibt man 
nicht, indem man explizit mit einem Wert vergleicht, sondern indem man 
ausnutzt, dass automatisch ein Wert von 0 als false gilt und alle 
anderen Werte als true.

Man schreibt also
1
    if( flag_UART_PC )

bzw. in der Umkehrung
1
    if( ! flag_UART_PC )

und ist damit flexibler als mit den Versionen
1
   if( flag_UART_PC == true )
bzw.
1
   if( flag_UART_PC == false )

und mit entsprechend vernünftig gewählten Variablennamen, liest sich das 
dann auch dementsprechend gut und weniger holprig als mit den expliziten 
Vergleichen.
Die Variante
1
   if( flag_UART_PC == true )
hat so etwas vom 'weißen Schimmel'. Wenn flag_UART_PC sowieso ein 
boolscher Wert ist, dann ist es doppelt gempoppelt, wenn man den mit 
true (bzw. false) vergleicht. flag_UART_PC selbst ist bereits ein 
boolsches Ergebnis. Das braucht man nicht mit 'true' zu vergleichen um 
daraus dann wieder einen boolschen Wert zu generieren. Selbst wenn 
flag_UART_PC tatsächlich immer nur die Werte true bzw. false haben wird, 
kann das Ergebnis des Vergleichs mit true nie anders ausfallen als das, 
was sowieso schon in der Variablen steht (es sei denn, da steht zb 5 
drinnen)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.