mikrocontroller.net

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


Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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
  while(!(UCSR0A & (1<<UDRE0)))    //warte bis Empfangsbuffer leer
  {
  }
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, probier mal das:
unsigned char USART_Receive(void)
{
    while(!(UCSR0A & (1<<RXC)))    //warte bis ein Byte empfangen wurde
        ;
  return UDR0;                     //get and return data
}
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

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.