-         

Ergebnis 1 bis 2 von 2

Thema: Rückfrage: Uart ISR stört die If then abfrage

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    23

    Rückfrage: Uart ISR stört die If then abfrage

    Anzeige

    Hallo zusammen,

    ist das korrekt, dass die ISR(USART_RXC_vect) eventuell nach mehrfacher Eingabe von
    Zeichen über die Tastatur, die Ausgabe einer if then Abfrage "überschreibt"??

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #define F_CPU       7372800
    #define BAUD        9600
    #define UBRR_VAL    F_CPU/16/BAUD-1
    
    volatile unsigned char receive_char;
    volatile int buffersize = 8;
    
    ISR(USART_RXC_vect)
    {
        receive_char = UDR;
    }
    
    void init_uart(unsigned int ubrr)
    {
        UBRRH = (unsigned char)(ubrr>>8);
        UBRRL = (unsigned char)(ubrr);
        UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
        UCSRC = (1<<URSEL)|(1<<UCSZ0) | (1<<UCSZ1);
    }
    
    void send_char(unsigned char data)
    {
        while (!(UCSRA & (1<<UDRE)));
        UDR = data;
    }
    
    void send_string(char *data)
    {
        while (*data)
        {
            send_char(*data);
            data++;
        }
    }
    
    int main(void)
    {
        DDRB |= (1<<PB1);
        init_uart(UBRR_VAL);
        send_string("TESTING");
        sei();
        PORTB |= (1<<PB1);
        _delay_ms(300);
        PORTB &=~ (1<<PB1);
        uint8_t i;
        while (1)
        {
            //i = strlen(receive_char);
    
            cli();
            if (receive_char == 100)
            {
                send_string("Yes, we wrote e");
            }
    
            if (receive_char == 114)
            {
                send_string("Yes, we wrote r");
            }
    
            if (receive_char == 116)
            {
                send_string("Yes, we wrote t");
            }
    
            receive_char = "";
            sei();
        }
        return 0;
    }
    Erst nach der Definition von cli() und sei() wurde das Ergebnis besser, ist das euch auch schon vorgekommen?

    Vielen Dank!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2014
    Beiträge
    7
    Hallo,

    Sieht nach einem sehr klaren Fall von einer Race-Condition aus.

    Du schreibst mehrere Zeichen über die UART an den Mikrocontroller. Als erstes Zeichen schreibst du ein 'e'. Die erste if-Abfrage evaluiert zu true, folglich wird der String "Yes, we wrote e" über die UART an den PC geschrieben. Da du die UART-Übertragung blockierend implementiert hast, dauert der Aufruf der Funktion send_string("Yes,we wrote e") (1/(Baudrate/10))*AnzahlZeichenVon"Yes,we wrote e". Das ist auf jeden Fall länger, als es dauert bis das nächste Zeichen empfangen wird. Der Effekt: Während deine Hauptprogrammabarbeitung noch in der Funktion send_string "festhängt", werden mehrere Zeichen empfangen, die dann jeweils die Variable receive_char überschreiben. Für dich macht das den Eindruck, als ob die if-Abfrage nicht evaluiert werden würde, da nur das Zeichen evaluiert wird.

    Die Verwendung von cli() und sei() verbessert das Verhalten, da damit Interrupts während der Übertragung gesperrt werden, damit kannst du aber ebenso empfangene Zeichen verlieren.

    Die beste Methode wäre die Implementierung eines Empfangs- und Sende-Ringbuffers, hierfür verweise ich auf die weiterführende Literatur z.B. hier und hier

Ähnliche Themen

  1. Inkey(#5)-Abfrage bei SW-Uart funktioniert nur manchmal
    Von otto richter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 14.06.2010, 15:20
  2. Abfrage von 2 Ports die die selbe Funktion ausführen sollen
    Von Misterbrot im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 20.08.2007, 12:18
  3. UART Sendepuffer-Abfrage mit Bascom
    Von Heideltrudel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.08.2007, 22:12
  4. die erste isr so kann das doch niemals laufen
    Von magic33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 26.02.2007, 17:13
  5. Habe Probleme, die ISR zu meinem Timer zum laufen zu bringen
    Von LC-HC im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 28.04.2006, 00:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •