Hallo, ich versuche den USART via Interrupt zu nutzen. Angesteuert werden soll ein Schieberegister einfaches Schieberegister. Mein Problem beginnt allerdings schon damit das der Interrupt vektor garnicht angesprungen wird und ich mir keinen Reim darauf machen kann warum dem so ist. Ich habe testweise eine LED an PORTC Pin 1 angehängt die ich anfangs an mache und im interrupt ausschalte. Allerdings wird dieser wie erwähnt nicht angesprungen.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <util/delay.h> |
4 | |
5 | int main(void) |
6 | {
|
7 | DDRD = 0xFF; |
8 | DDRB = 0xFF; |
9 | DDRC = 0xFF; |
10 | PORTC= 0xFF; //test led an |
11 | |
12 | //---USART config registers---
|
13 | //UCSRA |= (1<<UDRE);
|
14 | UCSRB |= (1<<TXCIE) | (1<<TXEN); //rxc interrupt enable, transmitter enable alternative: 1<<TXCIE |
15 | UCSRC |= (1<<URSEL) | (1<<UMSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); //synchron, 8-bit, Rising XCK Edge |
16 | UBRRL=25; //2400bps error 0.2% |
17 | sei(); |
18 | while(1) |
19 | {
|
20 | PORTC=0xFF; |
21 | }
|
22 | }
|
23 | |
24 | ISR(USART_TXC_vect) |
25 | {
|
26 | |
27 | UDR=0xFF; |
28 | while ( !(UCSRA & (1<<UDRE)) ); |
29 | PORTB = 0x00; |
30 | _delay_us(10); |
31 | PORTB = 0x00; |
32 | |
33 | PORTC = 0x00; //schaltet test led aus |
34 | }
|