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
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.
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;
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.