Forum: Mikrocontroller und Digitale Elektronik USART1_RX_vect programm hängt nach auslösen


von René K. (tesla24)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Wahrscheinlich ist deine Variable flag_UART_PC nicht als volatile 
definiert.

von René K. (tesla24)


Lesenswert?

war sie nicht, aber leider noch das selbe Problem

von Karl H. (kbuchegg)


Lesenswert?

Heiko K. schrieb:
> war sie nicht, aber leider noch das selbe Problem

Dann auf zum nächsten Fehler.
Und spätestens jetzt ist es an der Zeit, das komplette(!), 
gegebenenfalls abgespeckte, Programm zu posten und nicht nur 
nichtssagende Ausschnitte, in denen der Fehler ziemlich sicher nicht 
sitzt (sonst hättest du ihn auch selber gesehen)

von René K. (tesla24)


Lesenswert?

habe jetzt etwas herausgefunden: es wurde eine if-Anweisung angenommen, 
die eigentlich nicht "true" sein kann......

if(flag_UART_PC==0)
{
}


habe flag_UART_PC jetzt als uint8 mit 1 bzw.0 umgeändert

von Route_66 H. (route_66)


Lesenswert?

Heiko K. schrieb:
> if(UDR1=='C')

Dir ist aber schon klar, daß nach dieser Zeile das 'C' weg, und das 
Empfangsregister leer ist?

von Karl H. (kbuchegg)


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)

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.