Gast
#411216
Hallo! Ich will über die UART meines kleinen AVR 90S2313er an den PC senden. Das klappt auch, wenn ich "polled" sende. Ich wollte aber gerne interruptgesteuert senden. Das wollte ich über die UDRE-Interrupt machen. Wenn ich nun einen sei() mache, mache, führt der Controller einen Reset aus. Verschiebe ich den sei() nach vor der Endlosschleife, wird der Text übertragen - unendlich oft (RESET halt!). #define _AVR_AT90S2313_ 1 #define BUFLEN 40 #include <avr/io.h> #include <avr/interrupt.h> char obuf[BUFLEN + 1]; char ibuf[BUFLEN + 1]; unsigned int BufCount = 0; ISR(UART_UDRE_vect) { if( obuf[BufCount] != 0 ) if( USR & 0x20 ) UDR = obuf[BufCount++]; } int main (void) { char c = 0; UBRR = 23; // 9600bps bei 3.6864 MHz (Datenblatt) UCR = 0x20 + 0x08; // UDRIE + TXEN DDRB = 0xff; PORTB = UCR; // Ist 0x2a: UDRIE + TXEN + RXB8 sei(); // hier wird ein Reset ausgeführt! obuf[0] = 'D'; obuf[1] = 'a'; obuf[2] = 's'; obuf[3] = ' '; obuf[4] = 'k'; obuf[5] = 'l'; obuf[6] = 'a'; obuf[7] = 'p'; obuf[8] = 'p'; obuf[9] = 't'; obuf[10] = '!'; obuf[11] = '\n'; obuf[12] = '\r'; obuf[13] = '\0'; while( obuf[c] != 0) if( USR & 0x20 ) UDR = obuf[c++]; BufCount = 0; while(1); return(0); }