UART - Empfangen klappt, senden nicht

Gast #3102556
Lesenswert?

Tach auch!

Ich versuche gerade eine Kommunikation zwischen PC und AVR über UART 
herzustellen. Dabei war mir der Artikel hier bei µC.net mehr als nur 
eine Hilfe.

Soweit kann ich auch Daten vom PC an den AVR senden.
Dieser gibt das richtige Bitmuster auch immer über die LEDs aus.
Direkt im Anschluss darauf soll dieses Zeichen wieder an den PC 
zurückgeschickt werden und im "Recived Data" angezeigt werden.
Letzteres funktionierte aber nicht. Ich finde auch nirgends den Fehler.
Das ganze hab ich auf dem ATmega32 mit externem Quarz (12Mhz) am laufen.
Als Terminal benutzt ich HTerm.

Der Code sieht so aus:
1
 #include <inttypes.h>
2
 #include <avr/io.h>
3

4
#ifndef F_CPU
5
#define F_CPU 12000000UL  
6
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 12Mhz"
7
#endif
8
 
9
#define BAUD 2400UL 
10
 
11
// Berechnungen
12
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
13
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
14
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)    // Fehler in Promille, 1000 = kein Fehler.
15
 
16
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
17
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
18
#endif 
19

20

21

22
/*****************************
23
******** Funktionen **********
24
******************************/
25

26
void uart_init(void)
27
{
28
  UBRRH = UBRR_VAL >> 8;
29
  UBRRL = UBRR_VAL & 0xFF;
30
  
31
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  
32
  UCSRB |= (1<<RXEN);                       
33
}
34

35

36
uint8_t uart_getc(void)
37
{
38
  while (!(UCSRA & (1<<RXC)));
39
  return UDR;
40
}
41

42
int uart_putc(unsigned char c)
43
{
44
  while (!(UCSRA & (1<<UDRE)));
45
  
46
  UDR = c;
47
  return 0;
48
}
49

50

51
/*****************************
52
****** Hauptprogramm *********
53
******************************/
54

55
int main(void)
56
{
57
  uart_init();
58
  DDRA = 0xFF; // PORTC Ausgang
59
  
60
  while (1)
61
  {
62
    uint8_t c;
63
    c = uart_getc();
64
    PORTA = ~c;
65

66
    uart_putc(~c);
67
  }
68
  return 0;
69
}

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