www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART senden und empfangen


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich hab mal wieder ein Problem bei dem ich nicht alleine weiterkomme und 
deshalb hoffe hier einen guten Rat zu bekommen...

Es handelt sich um folgendes: Ich möchte per USART an meinen uC 
(ATmega48) senden und danach das gesendete wieder empfangen.
Das Senden senden klappt auch schon ganz gut(regelmäßige PWM am Pin), 
aber der Pin fürs senden bleibt unberührt auf 5V Versorgungsspannung, 
sprich empfangen funktioniert nicht.

Hier mein Quellcode:

void Init_Transmit(void)
{
  unsigned char Data = 100;
  //USART initialisieren
  UBRR0 = 49;                             //Baudrate 10000
  UCSR0B |= (1<<TXEN0);                   //enable transmitter
  UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);    //8 Bit character size
  while(!(UCSR0A & (1<<UDRE0)))         //wait for empty transmit buffer
    {
    }
    UDR0 = Data;                          //put data into buffer, sends 
the data
}

unsigned char Init_Receive(void)
{
  unsigned char Data = 0;
  //USART initialisieren
  UBRR0 = 49;                             //Baudrate 10000
  UCSR0B |= (1<<RXEN0);                   //enable reveiver
  UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);    //8 Bit character size
  while(!(UCSR0A & (1<<UDRE0)))          //wait for data to be received
   {
   }
   return Data;                           //get and return reveived data 
from buffer
}

void main(void)
{
  DDRD |= (1<<DDD1);                      //TX output
  DDRD &= ~(1<<DDD0);                     //RX input
  unsigned char Data = 0;
  while(1)
  {
  Init_Transmit();
  Data = Init_Receive();
  }
}

Vielen Dank schon mal im Vorraus für eure Beiträge...

Gruß Daniel

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1/ UDR0 enthält dein empfangenes Zeichen ;-)

2/ (für den Schönheitspreis) Ziehe den Initialisierungsteil in eine 
eigene Routine, die du vor der eigentlichen Arbeitsschleife ausführst.
void init_uart(void)
{
  //USART initialisieren
  UBRR0 = 49;                             //Baudrate 10000
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);      //enable transmitter+receiver
  UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);    //8 Bit character size
}

void Init_Transmit(void)
{
  unsigned char Data = 100;
  while(!(UCSR0A & (1<<UDRE0)))  //wait for empty transmit buffer
    {
    }
  UDR0 = Data;                   //put data into buffer, sends the data
}

unsigned char Init_Receive(void)
{
  unsigned char Data = 0;
  while(!(UCSR0A & (1<<UDRE0)))  //wait for data to be received
   {
   }
  data = UDR0;                   // <===
  return data;                   // bzw. gleich return UDR0;
}

void main(void)
{
  DDRD |= (1<<DDD1);                      //TX output
  DDRD &= ~(1<<DDD0);                     //RX input
  unsigned char Data = 0;

  init_uart();                   // <==

  while(1)
  {
  Init_Transmit();
  Data = Init_Receive();
  }
}

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guten morgen,

vielen dank für deine hilfe. jetzt funktionierts endlich!
werd mir das merken mit der schönheitskorrektur ;)

danke nochmals,
daniel

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.