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 | }
|