Forum: Mikrocontroller und Digitale Elektronik Problem UART Kommunikation 2er AVRs


von bobberjahn (Gast)


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...

von katastrophenheinz (Gast)


Lesenswert?

Mal ne blöde Frage: GND ist auch verbunden???

von bobberjahn (Gast)


Lesenswert?

katastrophenheinz schrieb:
> Mal ne blöde Frage: GND ist auch verbunden???

Ja, das ganze ist auf einem Steckbrett aufgebaut, gleiche Masse, sogar 
exakt gleiche Beschaltung der beiden. Es blinkt aber immer nur der 
Heartbeat vom Sender. Die Rollen können vertauscht werden, es ändert 
nichts.

von Jan G. (jan80)


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.

von katastrophenheinz (Gast)


Lesenswert?

Noch ein Versuch: Baudrate weit runterdrehen (1200 oder weniger), LED an 
die RX-Leitung des ersten und gucken, ob's flackert.
Welche LEDs des zweiten leuchten und sind die gegen Masse oder Vdd 
angeschlossen?

von bobberjahn (Gast)


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!

von Ingo (Gast)


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?

von Jan G. (jan80)


Lesenswert?

Das war jetzt aber kleinlich. ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.