ATTiny: RX Interrupt wird nicht erreicht

Gast #4906556
Lesenswert?
• ▲
▼
Hallo,

ich verzweifle gerade an dem RX-Interrupt meiner USART0.
Ich nutze bei einem ATTiny841 die USART0 (RXD0 an PB2 und TXD0 an PA7).

Initialisierung:
#define F_CPU 8000000UL

#define BAUD 9600UL
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
#endif

void UART_init(void)
{
  UBRR0H = UBRR_VAL >> 8;
  UBRR0L = UBRR_VAL & 0xFF;
  UCSR0C = (1<<UCSZ00) | (1<<UCSZ01); 8N1
  UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
}

meine Main:
int main(void)
{
        DDRB = 0b00000101;
  PORTB = 0b00000101;

  DDRA  = 0b00111111;
  PORTA = 0b00100000;

  UART_init();
  sei();
        while(1)
        {...}
}

ISR:
ISR(USART0_RX_vect)
{
  PORTA = 0b00000000;
}

Mittlerweile möchte ich in meiner ISR nur noch eine LED ausschalten um 
zu schauen ob der µC noch da rein springt. Tut er nicht, und ich 
verstehe nicht warum. Hab mit nem Oszi nachgemessen, die Daten liegen 
definitiv an. Zusätzlich hab ich mal den INT0 getestet, da funktioniert 
alles wie gewünscht. Weiß jemand Rat?
(Firma: matzetronics) #4906612
Lesenswert?
• ▲
▼
> (RXD0 an PB2 und TXD0 an PA7).
In diesem Fall solltest du noch das REMAP Register beschreiben, da der 
Normalfall PA2 (RXD0) und PA1(TXD0) benutzt. Also
1
REMAP |= (1 << U0MAP);

Siehe Abschnitt 18.12.7 im Datenblatt.
Ob es sinnvoll ist, RXD vorher als Ausgang zu definieren, bleibt die 
Frage. Das Freigeben des Empfänger überschreibt die normale I/O Funktion 
des Portes, aber sinnvoll ist es m.E. nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren