Atmega128L + SIG_UART0_RECV

OP #907829
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
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
Wenn du uns jetzt auch noch verraten würdest, wo du eine Schleife siehst 
in der was empfangen wird? Ansonsten war nämlich leider dein Post 
Blödsinn.
Gast
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.