Hallo,
ich möchte mit einem ATMega8 über die USART Schnittstelle Zeichen lesen
und das ganze im Interrupt Betrieb. Ein anderer ATMega8 sendet Zeichen,
was ich mit dem LogicAnalyzer auch überprüft habe. Die Sendefrequenz,
Parity, Stopbits etc sind natürlich identisch.
Hab schon in anderen Threads gestöbert aber konnte noch nicht finden
warum das bei mir nicht funktioniert.
Hier der code:
1 | #include <avr/io.h>
|
2 |
|
3 | #define F_CPU 8000000L
|
4 |
|
5 | #include <util/delay.h>
|
6 | #include <avr/interrupt.h>
|
7 | #define BAUD 9600L
|
8 |
|
9 | #define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1) //clever runde
|
10 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) //reale Baudrate
|
11 |
|
12 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) //Fehler in Promille
|
13 |
|
14 | #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
|
15 | #error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
|
16 | #endif
|
17 |
|
18 |
|
19 | ISR (USART_RXC_vect) {
|
20 | uint8_t dummy;
|
21 | dummy = UDR;
|
22 | PORTB ^= (1<<PB0);
|
23 | }
|
24 |
|
25 |
|
26 | int main(void)
|
27 | {
|
28 |
|
29 | UBRRH = UBRR_VAL >> 8;
|
30 | UBRRL = UBRR_VAL & 0xFF;
|
31 |
|
32 |
|
33 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); //Asynchron 8N1
|
34 | UCSRA = (1<<U2X);
|
35 | UCSRB = ( 1 << RXEN ) | (1 << RXCIE);
|
36 | sei();
|
37 |
|
38 | while (1)
|
39 | {
|
40 |
|
41 | }
|
42 |
|
43 | return 0;
|
44 | }
|