Forum: Mikrocontroller und Digitale Elektronik Mal wieder ein Problem mit USART


von Roland (Gast)


Lesenswert?

Guten morgen,

ich habe ein Problem mit USART. Ich benutze einen ATmega48 und möchte 
per USART mit dem PC kommunizieren (senden und empfangen). Das senden 
klappt auch schon ganz gut aber empfangen kann ich leider nichts. Ich 
hoffe ihr könnt mir weiterhelfen. Wäre echt super...

void Init_USART(void)
{
  unsigned char x;                          //Hilfsvariable
  UBRR0 = 51;                               //Baudrate = 9600
  UCSR0B |= (1<<RXEN0) | (1<<TXEN0);       //enable Transmitter & 
Receiver
  UCSR0C |= (1<< UCSZ00) | (1<<UCSZ01);     //8 Bits, ein Stroppbit
  x = UDR0;                                 //Empfänger leeren
}

void USART_Transmit(void)
{
  unsigned char Data = 100;        //Daten die gesendet werden sollen
  while(!(UCSR0A & (1<<UDRE0)))    //warte bis Empfangsbuffer leer
  {
  }
  UDR0 = Data;                     //put data into buffer, sends the 
data
}

unsigned char USART_Receive(void)
{
  while(!(UCSR0A & (1<<UDRE0)))    //warte auf die Daten die übertragen 
werden sollen
  {
  }
  return UDR0;                              //get and return data
}

void main(void)
{

  DDRD |= (1<<DDD1);                        //PD1 output
  DDRD &= ~(1<<DDD0);                       //PD0 input
  unsigned char Data = 0;                   //Hilfsvariable

  Init_USART();                             //initialisiere USART

  while(1)
  {
    USART_Transmit();                       //USART senden
    Data = USART_Receive();                 //USART empfangen
  }
}

Danke schon mal im Vorraus!!

Gruß Roland

von Thilo M. (Gast)


Lesenswert?

Wieso benutzt du zum Empfangen nicht den RX-Complete-INT? das mit dem 
Polling wird so nicht funktionieren, da dein UDR0 direkt nach dem Senden 
'0' ist, somit läuft deine RX-Routine sofort durch.

Du könntest es so probieren:
1
void USART_Transmit(void)
2
{
3
  unsigned char Data = 100;        //Daten die gesendet werden sollen
4
  while(!(UCSR0A & (1<<UDRE0)))    //warte bis Empfangsbuffer leer
5
  {
6
  }
7
  UDR0 = Data;                     //put data into buffer, sends the data
8
  while(!(UCSR0A & (1<<UDRE0)))    //warte bis Empfangsbuffer leer
9
  {
10
  }
11
}

von Jörg X. (Gast)


Lesenswert?

Äh, probier mal das:
1
unsigned char USART_Receive(void)
2
{
3
    while(!(UCSR0A & (1<<RXC)))    //warte bis ein Byte empfangen wurde
4
        ;
5
  return UDR0;                     //get and return data
6
}
Das UDRE-Bit hat ja nicht mit dem Empfangen zu tun...

hth. Jörg
ps.: wir haben hier ein tolles AVR-GCC-Tutorial, das beantwortet solche 
Fragen doch auch

von Roland (Gast)


Lesenswert?

Ersteinmal danke für eure Antworten.

Hab eure Ratschläge befolgt aber es will sich immer noch nichts tun. 
Irgendwie funktionierts einfach nicht. Ich benutze alls Simulator Lap 
View. Kann ich eigentlich an der Hardware(PIN´s) auch messen ob gesendet 
oder empfangen wurde. Müsste doch eigentlich auf HIGH bzw LOW ziehen 
oder liege ich da falsch? So könnte ich feststellen ob es vll ein 
Inititalisierungsproblem von Lap View ist...

@Jörg:

Ja ich weiß, hab das Tutorium auch schon durchgekaut und das Datasheet 
ein paar mal gelesen, bin aber nicht fündig geworden.
Das RXN0-Bit war mal wieder einer dieser berühmt/berüchtigten 
Schreibfehler(wenn man aus einer anderen Funktion etwas kopiert und 
vergisst zu ändern) ;-)

mfg Roland

von Thilo M. (Gast)


Lesenswert?

Probier mal das Hterm als Terminalprogramm! Ist einfach und 
übersichtlich zu bedienen und muss nicht mal installiert werden!

http://www.der-hammer.info/terminal/index.htm

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.