Hallo,
ich möchte eine simple Kommunikation 2er ATMega32's über UART
realisieren. Es funktioniert aber einfach nicht. Ich habe RxD mit dem
TxD des anderen verbunden und andersherum. Beide laufen mit 4MHz intern,
der Code ist folgender:
Identischer Code beider ATMegas:
1 | #ifndef F_CPU
|
2 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
3 | #define F_CPU 4000000UL // Systemtakt
|
4 | #endif
|
5 |
|
6 | #define BAUD 9600UL // USART Berechnungen
|
7 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
8 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
9 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
10 |
|
11 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
12 | #error Systematischer Fehler der Baudrate grosser 1% und damit zu hoch!
|
13 | #endif
|
14 |
|
15 | #include <avr/io.h>
|
16 | #include <util/delay.h>
|
17 |
|
18 | void uart_init(void)
|
19 | {
|
20 | UBRRH = UBRR_VAL >> 8;
|
21 | UBRRL = UBRR_VAL & 0xFF;
|
22 |
|
23 | UCSRB |= (1<<TXEN) | (1<<RXEN); //TX/RX ein
|
24 | }
|
25 | int uart_putc(unsigned char c)
|
26 | {
|
27 | while (!(UCSRA & (1<<UDRE))) {} //warten bis sender frei
|
28 |
|
29 | UDR = c; //senden
|
30 | return 0;
|
31 | }
|
Main des 1.:
1 | DDRC = 0xff;
|
2 | uart_init();
|
3 | _delay_ms(5000);
|
4 | while(1)
|
5 | {
|
6 | PORTC |=(1<<PC1);
|
7 | uart_putc('d');
|
8 | _delay_ms(1000);
|
9 |
|
10 | PORTC &=~(1<<PC1);
|
11 | uart_putc('k');
|
12 | _delay_ms(1000);
|
13 | }
|
Main des 2.:
1 | DDRC = 0xff;
|
2 | uart_init();
|
3 |
|
4 | while(1)
|
5 | {
|
6 | PORTC ^=(1<<PC1);
|
7 |
|
8 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
|
9 | {
|
10 |
|
11 | }
|
12 | uint8_t a = UDR; // Zeichen aus UDR lesen
|
13 | PORTC ^=(1<<PC0);
|
14 | }
|
Den meisten Code habe ich hier aus dem Forum. Ziel ist es einfach, PC0
des 2. im Takt von PC1 des 1. blinken zu lassen. PC1 des 2. dient als
heartbeat. Das Ergebnis ist allerdings, dass beim 2. nichts blinkt,
verstehe aber nicht wieso. Habe es auch schon mit Interrupts versucht.
Die Initialisierung des UART ist minimal, das einzige was gesetzt wird
ist die Baudrate. 8 Datenbits, keine Parität, 1 Stop ist der
Defaultwert. Ich habe leider auch kein Oszilloskop hier und kann mir
daher nicht ansehen, ob wirklich nichts auf der Leitung ankommt. Wo
liegt das Problem? Ich finds einfach nicht...