Atmega128L + SIG_UART0_RECV

OP #907829
Lesenswert?
• ▲
▼
HAllo zusammen,

Zwar habe ich eine Frage Betreff der RS232. Habe ein problem mit dem 
Empfangen von Daten. Senden an den PC kann ich zeichen via rs232, jedoch 
empfangen über rs232 geht irgenwie nicht. Zwar funtioniert nicht mal der 
Interrupt richtig, dehalb vermute ich da das problem. Hat jemand eine 
idee was ich in der Initalisierung oder sonst vergessen habe?

Mein Code:

#include <avr/interrupt.h>
void  init_RS232(void);


//Interrupt für RX von USART
SIGNAL (SIG_UART0_RECV)
{
    //Daten empfangen, aufruf für LED um zu togglen.

    Leds.led2Toggle();
}



//Main Programm
int main(void)
{
     /* Set baud rate */
   UBRR0H = (unsigned char)(ubrr>>8);
   UBRR0L = (unsigned char)ubrr;
   /* Enable receiver and transmitter */
   UCSR0B = (1<<RXEN)|(1<<TXEN);
   /* Set frame format: 8data, 2stop bit */
   UCSR0C = (1<<USBS)|(3<<UCSZ0);

   sei();
   // test
   WriteChar('s')

  return 0;
}


//Write Data over RS232
void WriteChar(unsigned char c)
{
    while(!(UCSR0A & (1 << UDRE0)))
    ;   /* warte, bis UDR bereit */

    UDR0 = c;    /* sende Zeichen */
}


/*void ReceiveData( void )
{

  while(! (UCSR0A & (1<<RXC)));
  rx_ = UDR0;


}
*/




Besten dank für eure Hilfe.

lg
Gast #907857
Lesenswert?
• ▲
▼
Und in der main Funktion fehlt noch eine Endlosschleife.

//Main Programm
int main(void)
{
     /* Set baud rate */
   UBRR0H = (unsigned char)(ubrr>>8);
   UBRR0L = (unsigned char)ubrr;
   /* Enable receiver and transmitter */
   UCSR0B = (1<<RXEN)|(1<<TXEN);
   /* Set frame format: 8data, 2stop bit */
   UCSR0C = (1<<USBS)|(3<<UCSZ0);

   sei();
   // test
   WriteChar('s')

  while(1);
  return 0;
}
Gast #907931
Lesenswert?
• ▲
▼
Dabei besteht allerdings die Gefahr, dass du beim Empfang mehrerer 
Zeichen die Daten in rx_ überschreibst bevor du sie im Hauptprogramm 
verarbeitet hast. Je nach dem was du eigentlich vorhast, kann es 
sinnvoller sein, das lesen direkt im Hauptprogramm ohne Interrupt zu 
machen. Dann hast du nämlich die Möglichkeit anhand des Flags DOR (data 
over run) zu überprüfen, ob ein Zeichen verloren gegangen ist.

Wenn du es optimal lösen willst, dann solltest du in der Interrupt 
Routine fürs Empfangen die Daten in einen FIFO Puffer schreiben. Dabei 
solltest du dann Prüfen, ob der Puffer voll ist, und wenn ja selber eine 
globale Variable  als Buffer Overrun Flag setzen.

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