USART senden und empfangen

Gast #649395
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
Persönliche Seite #649451
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren