Hallo! Hier mal ein simples U(S)ART-Programm zum testen. Seitdem ich es auf RX-Seite auf Interrupts umgebaut habe, empfängt es nichts mehr, es geht ja noch nicht mal in die ISR. vorher mit "Warten auf erfolgreichen Empfang" ging es. mc ist atmega8.
1 | #include <avr\io.h> |
2 | #include <avr\interrupt.h> |
3 | #define F_CPU 3686400
|
4 | #define UART_BAUD_RATE 9600
|
5 | #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
|
6 | |
7 | void cominit(void); |
8 | void send(char val); |
9 | |
10 | int main(void) { |
11 | sei(); |
12 | DDRC=0xff; |
13 | PORTC=0x00; |
14 | |
15 | |
16 | cominit(); |
17 | |
18 | send('s'); |
19 | |
20 | |
21 | PORTC++; |
22 | |
23 | |
24 | for(;;) { |
25 | |
26 | |
27 | |
28 | |
29 | }
|
30 | |
31 | }
|
32 | |
33 | |
34 | |
35 | void cominit() { |
36 | |
37 | |
38 | UCSRB |= (1<<TXEN); // UART TX einschalten |
39 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 |
40 | UCSRB |= ( 1 << RXEN ); //rx anschalten |
41 | |
42 | UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 ); |
43 | UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ); |
44 | |
45 | }
|
46 | |
47 | void send(char val) { |
48 | |
49 | |
50 | UDR = val; |
51 | while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich |
52 | */
|
53 | /* schreibt das Zeichen x auf die Schnittstelle
|
54 | */
|
55 | |
56 | }
|
57 | |
58 | |
59 | ISR (USART_RXC_vect) { |
60 | cli(); |
61 | unsigned char recv; |
62 | |
63 | recv=UDR; //Zeichen vom Register holen |
64 | send(recv); //Zeichen zurücksenden |
65 | PORTC++; |
66 | sei(); |
67 | }
|
danke im voraus