Problem UART Kommunikation 2er AVRs

Gast #2985339
Lesenswert?

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...
#2985425
Lesenswert?

Versuch es mal mit einem externen Quarz. Mit dem internen kann es 
funktionieren, muss aber nicht! Alternativ kannst du ja mal auf beiden 
MCs eine Schleife laufen lassen, die eine LED, z.B. 1 x pro Sekunde 
blinken lässt. Wenn du dann beide gleichzeitig einschaltest, siehst du 
ja, ob das parallel läuft oder langsam auseinander driftet.
Gast #2985487
Lesenswert?

Hmm, nach Runtersetzen der Baudrate auf 1200 funktionierts nun. Die 
blinkenden LEDs laufen schon gut auseinander mit dem internen Takt. 
Einen externen Oszillator habe ich nicht, aber werde mir wohl nun einen 
Anschaffen.

Danke euch!
Gast #2985504
Lesenswert?

Jan Gatzke schrieb:
> Versuch es mal mit einem externen Quarz. Mit dem internen kann es
> funktionieren, muss aber nicht! Alternativ kannst du ja mal auf beiden
> MCs eine Schleife laufen lassen, die eine LED, z.B. 1 x pro Sekunde
> blinken lässt. Wenn du dann beide gleichzeitig einschaltest, siehst du
> ja, ob das parallel läuft oder langsam auseinander driftet.

Seit wann hat ein AVR einen internen Quart? Er hat einen internen 
Oszillator, welcher mit 8MHz läuft. Wenn der Clock-Divider drinnen ist 
läuft er sogar nur auf 1MHz.

Könnte hier der Fehler liegen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren