Forum: Mikrocontroller und Digitale Elektronik USART senden und empfangen


von Daniel (Gast)


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

von Stefan B. (stefan) Benutzerseite


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.
1
void init_uart(void)
2
{
3
  //USART initialisieren
4
  UBRR0 = 49;                             //Baudrate 10000
5
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);      //enable transmitter+receiver
6
  UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);    //8 Bit character size
7
}
8
9
void Init_Transmit(void)
10
{
11
  unsigned char Data = 100;
12
  while(!(UCSR0A & (1<<UDRE0)))  //wait for empty transmit buffer
13
    {
14
    }
15
  UDR0 = Data;                   //put data into buffer, sends the data
16
}
17
18
unsigned char Init_Receive(void)
19
{
20
  unsigned char Data = 0;
21
  while(!(UCSR0A & (1<<UDRE0)))  //wait for data to be received
22
   {
23
   }
24
  data = UDR0;                   // <===
25
  return data;                   // bzw. gleich return UDR0;
26
}
27
28
void main(void)
29
{
30
  DDRD |= (1<<DDD1);                      //TX output
31
  DDRD &= ~(1<<DDD0);                     //RX input
32
  unsigned char Data = 0;
33
34
  init_uart();                   // <==
35
36
  while(1)
37
  {
38
  Init_Transmit();
39
  Data = Init_Receive();
40
  }
41
}

von Daniel (Gast)


Lesenswert?

guten morgen,

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

danke nochmals,
daniel

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.