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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren