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

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.