Forum: Mikrocontroller und Digitale Elektronik UART - ATMEGA32 empfängt nicht richtig


von Maik (Gast)


Lesenswert?

Hallo,
ich weiß das das ein leidiges Thema ist aber mittlerweile bin ich echt 
am Verzweifeln.
Ich bekomme kein Senden und Empfangen mit dem UART des ATMEGA32 hin.

Hardwaretechnisch müsste es in Ordnung sein, denn wenn ich den Mega aus 
dem Sockel nehme und RXD und TXD verbinde, bekomme ich auf meinem 
Terminalprogramm das Zeichen als Echo wieder.

In dem unteren Programm versuche ich ein Zeichen an den Mega zu senden, 
und dieses dann binär an den PORTA, an welchem 8 LEDs angeschlossen 
sind, auszugeben. Sobald ich allerdings das erste Zeichen mit dem PC 
sende, leuchten alle LED's bis der Controller resettet wird.

Für Hilfe wäre ich sehr dankbar.
1
/*
2
 *
3
 *
4
 * Created: 28.03.2014 15:42:50
5
 * 
6
 */ 
7
#ifndef F_CPU
8
#define F_CPU 16000000UL
9
#endif
10
11
#define BAUD 9600UL
12
13
//UBRR Berechnung
14
#define UBRR_Val ((F_CPU/(16*BAUD))-1)
15
16
17
#include <avr/io.h>
18
#include <util/delay.h>
19
#include <stdint.h>
20
#include <stdlib.h>
21
#include <avr/interrupt.h>
22
#include <inttypes.h>
23
24
void UARTinit(void);
25
uint8_t uart_getc(void);
26
27
28
int main(void)
29
{
30
  //UART Initialisieren
31
  UARTinit();
32
  //PORTA Ausgang
33
  DDRA=0xff;
34
  
35
    while(1)
36
    {
37
     uint8_t c;
38
     c = uart_getc();
39
40
     PORTA = c;
41
    }
42
}
43
44
void UARTinit(void)
45
  {
46
    //UBRR set
47
    UBRRH=UBRR_Val >> 8;
48
    UBRRL=UBRR_Val  & 0xFF;
49
    //Transmitter Enable
50
    UCSRB|=(1<<TXEN);
51
    //Receiver Enable
52
    UCSRB|=(1<<RXEN);
53
    //8bit,1Stop,No Parity
54
    UCSRC|=(1<<UCSZ1)|(1<<UCSZ0);
55
  }
56
  
57
uint8_t uart_getc(void)
58
{
59
  while (!(UCSRA & (1<<RXC)));
60
  return UDR;                  
61
}

von Paul Baumann (Gast)


Lesenswert?

Ich verstehe nichts von C, denke aber, daß es daran liegt, daß man
über das Bit RXC im Register UCSRA abfragen sollte, ob ein neues Zeichen
im Empfangsregister liegt und man das dann dort holen kann.

Vielleicht wartet diese "Uart_get_C" ja auch auf eine neues Zeichen und
daraufhin hängt der ganze Ablauf?

MfG Paul

von g457 (Gast)


Lesenswert?

> UCSRC|=(1<<UCSZ1)|(1<<UCSZ0);

Hier fehtl das URSEL und das | ist überzählig.

von der alte Hanns (Gast)


Lesenswert?

Der 'Initial Value' von UCSRC passt doch, also das eigene Setzen am 
besten weglassen.

von der alte Hanns (Gast)


Lesenswert?

Setze nie zum Spaß 'nen Wert,
weil der Rechner sich sonst wehrt!

von Thomas E. (thomase)


Lesenswert?

der alte Hanns schrieb:
> Der 'Initial Value' von UCSRC passt doch, also das eigene Setzen am
> besten weglassen.

Da URSEL fehlt, setzt er das Register gar nicht und der Wert landet im 
UBRRH-Register und setzt die Baudrate auf einen Wert, den er garantiert 
nicht haben möchte.

mfg.

von der alte Hanns (Gast)


Lesenswert?

Das hatte ich zwar gemeint, aber schlecht formuliert.
Und ich hoffe noch auf was Gereimtes von Paul Baumann.

von Maik (Gast)


Lesenswert?

Vielen Dank an alle,
Dank URSEL geht es jetzt.

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.