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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.