Forum: Compiler & IDEs Problem mit Uart Receive Interrupt


von Thomas (Gast)


Lesenswert?

Hallo,

Ich hab gerade angefangen mit dem Thema µC und bin dabei mein erstes 
Projekt zu realiseren. Es soll eine RGB Led über den PC gesteuert 
werden.
Dazu benutze ich die UART Library von Peter Fleury. Als µC benutze ich 
einen Atmega8.

Mein Problem ist, wenn ich folgende Zeilen einfüge:

ISR(USART_RXC_vect)
{
  //tue etwas
}

Schreibt kommt beim compilieren der Fehler

PFAD/uart.c:248: multiple definition of `__vector_11'
PFAD/befehl_auswerten_test.c:460: first defined here



in "uart.c" Zeile 248 steht:

SIGNAL(UART0_RECEIVE_INTERRUPT)
/*********************************************************************** 
**
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
************************************************************************ 
**/
{
    unsigned char tmphead;
    unsigned char data;
    unsigned char usr;
    unsigned char lastRxError;


    /* read UART status register and UART data register */
    usr  = UART0_STATUS;
    data = UART0_DATA;

usw
usw

}

und in "befehl_auswerten_test.c" Zeile 460 steht:

ISR(USART_RXC_vect)
{
  //tue etwas
}


Ich hoffe mir kann jemand erklären wie ich es hinbekomme auf das 
Interrupt zu reagieren.

Danke im Voraus

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

UART0_RECEIVE_INTERRUPT und USART_RXC_vect bedeuten das gleiche.

Warum implementierst du die gleiche ISR mehrfach? Eine ISR kann 
höchstens 1x implementiert werden.

von Thomas (Gast)


Lesenswert?

Okay dann habe ich etwas grundlegendes nicht verstanden.
Aber wie kann ich jetzt auf das Interrupt reagieren?
Anscheinend wurde es in der Library von Peter Fleury ja schon behandelt, 
aber ich blick nicht ganz durch wie das Interrupt weiterverarbeitet 
wird. Also der ganze Code sieht so aus:

SIGNAL(UART0_RECEIVE_INTERRUPT)
/*********************************************************************** 
**
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
************************************************************************ 
**/
{
    unsigned char tmphead;
    unsigned char data;
    unsigned char usr;
    unsigned char lastRxError;


    /* read UART status register and UART data register */
    usr  = UART0_STATUS;
    data = UART0_DATA;

    /* */
#if defined( AT90_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART0 )
    lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
#elif defined ( ATMEGA_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#endif

    /* calculate buffer index */
    tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;

    if ( tmphead == UART_RxTail ) {
        /* error: receive buffer overflow */
        lastRxError = UART_BUFFER_OVERFLOW >> 8;
    }else{
        /* store new index */
        UART_RxHead = tmphead;
        /* store received data in buffer */
        UART_RxBuf[tmphead] = data;
    }
    UART_LastRxError = lastRxError;
}

von Stefan E. (sternst)


Lesenswert?

Thomas schrieb:
> Aber wie kann ich jetzt auf das Interrupt reagieren?

Direkt eigentlich gar nicht. Du rufst die entsprechende GetChar-Funktion 
(keine Ahnung, wie die bei Fleury konkret heißt) auf, und bekommst ein 
entsprechendes Ergebnis geliefert. Entweder das nächste empfangene 
Zeichen, oder die Info, dass kein Zeichen im Empfangspuffer ist, oder 
auch die Info, dass es beim Empfang einen Fehler gab.

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.