Forum: Mikrocontroller und Digitale Elektronik USART per ISR


von Basti (Gast)


Lesenswert?

Hallo,

ich gehe gerade die "UART über Interrupts" aus dem Tutorial durch, 
bekomme aber leider noch zwei Warnmeldungen...

warning: 'USART_RXC_vect' appears to be a misspelled signal handler
1
// UART RX complete interrupt
2
 
3
// hier werden Daten vom PC empfangen und in einem String zwischengespeichert
4
// Wird ein Stringterminator empfangen, wird ein Flag gesetzt, welches dem 
5
// Hauptprogramm den kompletten Empfang signalisiert
6
 
7
ISR(USART1_RXC_vect) {
8
    
9
    static uint8_t uart_rx_cnt;     // Zähler für empfangene Zeichen
10
    uint8_t data;
11
 
12
    // Daten auslesen, dadurch wird das Interruptflag gelöscht              
13
    data = UDR1;
14
    
15
    // Ist Puffer frei für neue Daten? 
16
    if (!uart_rx_flag) {
17
        // ja, ist Ende des Strings (RETURN) erreicht?
18
        if (data=='\r') {
19
            // ja, dann String terminieren
20
            uart_rx_buffer[uart_rx_cnt]=0;              
21
            // Flag für 'Empfangspuffer voll' setzen
22
            uart_rx_flag=1;
23
            // Zähler zurücksetzen
24
            uart_rx_cnt=0;
25
        }
26
        else if (uart_rx_cnt<(uart_buffer_size-1)) {     
27
            // Daten in Puffer speichern
28
            // aber durch if() Pufferüberlauf vermeiden
29
            uart_rx_buffer[uart_rx_cnt]=data;          
30
            uart_rx_cnt++; // Zähler erhöhen
31
        }
32
    }
33
}
34
/*******************************************************************************************************/
35
// UART TX data register empty interrupt
36
// hier werden neue Daten in das UART-Senderegister geladen
37
 
38
ISR(USART1_UDRE_vect) {
39
    // Zeiger auf Sendepuffer
40
    static char* uart_tx_p = uart_tx_buffer;    
41
    uint8_t data;
42
 
43
    // zu sendendes Zeichen lesen, 
44
    // Zeiger auf Sendepuffer erhöhen
45
    data = *uart_tx_p++;
46
    
47
    // Ende des nullterminierten Strings erreicht?
48
    if (data==0 ) {        
49
        UCSR1B &= ~(1<<UDRIE1);       // ja, dann UDRE Interrupt ausschalten        
50
        uart_tx_p = uart_tx_buffer; // Pointer zurücksetzen
51
        uart_tx_flag = 1;           // Flag setzen, Übertragung beeendet
52
    }
53
    else UDR1 = data;                // nein, Daten senden
54
}

Hat vielleicht jemand eine Idee, was da falsch sein könnte? Die zweite 
ISR habe ich ja auf die selbe Art und Weise angeglichen...

Gruss, Basti

von Basti (Gast)


Lesenswert?

Ps.: Ich meinte natürlich "eine" Warnmeldung.^^

von Schnurpsel (Gast)


Lesenswert?

schau mal im datenblatt nach wie genau der isr-vektor heist
bei meinem atmega 644P ist es zb USART0_RX_vect
bei meinem 32 so wie in deinem Beispiel

von AVerr (Gast)


Lesenswert?

Etwas mehr vom Code wäre gut, da ich glaube, der Fehler sitzt etwas vor 
diesem Ausschnitt, oder ganz woanders.

Übrigens, über welchen Controller reden wir hier ? ATmega8 ?
Je nach Modell sind die Registernamen anders.

von Guru (Gast)


Lesenswert?

>warning: 'USART_RXC_vect' appears to be a misspelled signal handler

Mmmh. Und nu? Sollen wir einen Gegen-Warnungstanz aufführen, oder was?
Korrigiere doch einfach den Fehler. Oder schreib', was das Problem ist.

von Stefan E. (sternst)


Lesenswert?

Basti schrieb:
> warning: 'USART_RXC_vect' appears to be a misspelled signal handler

Die bekommst du aber nicht bei dem gezeigten Quellcode.

von Matze (Gast)


Lesenswert?

Falls du AVR Studio/WinAVR benutzt, würde ich es für den ATmega8 mit
USART_RX_vect probieren.
MfG

von Basti (Gast)


Lesenswert?

Hui, das ging ja schnell.^^

Ja, ich hatte einen kleinen Schreibfehler drin.

Das Datenblatt sagte mir jetzt ISR(USART1_RX_vect)... DANKE!^^

Gruss, Basti

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.