Hallo Leute,
ich bekomm meine zweite UART auf einem atmega 1284P einfach nicht mit 
Empfangsinterrupt zum laufen. Die "Uart enabled!" Meldung und die Punkte 
alle 100ms bekomme ich, aber immer wenn ich das RXCIE Flag setze hängt 
sich der uC beim ersten empfangenen Zeichen auf.
Ich hab im Manual gelesen, dass der Interrupt so lange feuert bis das 
RXC1 Flag gelöscht wird, aber das sollte ja in der ISR mit nextChar = 
UDR1 automatisch passieren, oder hab ich das missverstanden?
Hab auch versucht ISRs für sämtliche Vektoren zu definieren, falls da 
was im avr header faul ist, nutzt aber auch nix. Hat jemand einen Tipp? 
Überseh ich was?
Danke, Lukas
avr-gcc-4.3.5
avr-libc_1.6.8-2
1  | #include <util/delay.h>
  | 
2  | #include <avr/io.h>
  | 
3  | #include <avr/interrupt.h>
  | 
4  | 
  | 
5  | #ifndef F_CPU
  | 
6  | #define F_CPU       20000000UL
  | 
7  | #endif
  | 
8  | 
  | 
9  | #define BAUD    9600
  | 
10  | #define bauddivider  (unsigned char)(1.0 * F_CPU / BAUD / 16 - 0.5)
  | 
11  | 
  | 
12  | unsigned char nextChar = '.';
  | 
13  | 
  | 
14  | void u1putchar( char c )
  | 
15  | {
 | 
16  |   while( !(UCSR1A & (1<<UDRE1)));
  | 
17  |   UDR1 = c;
  | 
18  | }
  | 
19  | 
  | 
20  | 
  | 
21  | void u1puts( char *s )
  | 
22  | {
 | 
23  |   while( *s )
  | 
24  |     u1putchar( *s++ );
  | 
25  | }
  | 
26  | 
  | 
27  | ISR(_VECTOR(28))
  | 
28  | {
 | 
29  |   nextChar = UDR1;
  | 
30  | }
  | 
31  | 
  | 
32  | int main( void )
  | 
33  | {
 | 
34  |     UBRR1 = bauddivider;
  | 
35  |     UCSR1B |= _BV( TXEN1 ) | _BV( RXEN1 ) | _BV( RXCIE1 ); // enable TX, RX and Receive Interrupt
  | 
36  |     sei();
  | 
37  |      u1puts("Uart enabled!\n");
 | 
38  |      for(;;) {
 | 
39  |          if (nextChar != '.'){
 | 
40  |             u1putchar(nextChar);
  | 
41  |             nextChar='.';
  | 
42  |          } else {
 | 
43  |             u1putchar(nextChar);
  | 
44  |          }
  | 
45  |          _delay_ms(100);
  | 
46  |      }
  | 
47  | 
  | 
48  |     return 0;
  | 
49  | }
  |