Forum: Mikrocontroller und Digitale Elektronik UART - Empfangen klappt, senden nicht


von WilliS (Gast)


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
}

von Karl H. (kbuchegg)


Lesenswert?

>   UCSRB |= (1<<RXEN);


WEnn der AVR senden soll, musst du auch den Transmitter freigeben

von WilliS (Gast)


Lesenswert?

Danke. Shame on me :(

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.