RS232 0x00 Senden mit seltsamen verhalten.

OP #977478
Lesenswert?

Moin,

habe gerade ein sehr seltsames Verhalten bei meiner Programmierung 
festgestellt. Hab an meinem Atmega32 einen MAX232 mit 38400 Bauds und 
einem externen Quartz mit 16 MHz.

Die Übertragung klappt schon seit längeren ordentlich und es gab bis auf 
jetzt nie Probleme. Wenn ich jetzt doch ein Byte 0x00 übertrage werden 
die folgend übertragenden Bytes unabhängig vom übergebenen Wert auch mit 
0x00 übertragen. Kurze Zeit später läuft die Kommunikation wieder 
ordentlich.

Hab jetzt erstmal folgende Anpassung an das Programm gemacht:
1
/**
2
 * Sendet ein einzelnes Zeichen
3
 * an die RS232 Schnittstelle 
4
 */
5
void serial_putc(unsigned char data) 
6
{
7

8
  /* Wait for empty transmit buffer */
9
  while ( !( UCSRA & (1<<UDRE)) )
10
       ;
11
  /* Put data into buffer, sends the data */
12
  UDR = data;
13

14
  if (data == (unsigned char)0x00)
15
    _delay_ms(10);
16
  
17
} // serial_putc

Allerdings sollte so eine Bremse doch normalerweise nicht nötig sein, 
wenn ich auf die Hardware-Flags für die Übertragungsbereitschaft warte?

Falls jemand das auch schon mal gesehen hat, oder einen Tip für den 
Ursprung kennt...gerne!

Grüße

Thomas
OP #977489
Lesenswert?

Moin,

habe das Programm mal kurz gestuzt, auf den wesentlichen Teil.

Die RS232 Init Routine sieht folgendermassen aus:
1
void initSerial(void) 
2
{
3
  /* Set baud rate (38400) */
4
  UBRRH = (unsigned char)(25>>8);
5
  UBRRL = (unsigned char)25;
6
  /* Enable receiver and transmitter */
7
  UCSRB = (1<<RXEN)|(1<<TXEN);
8
  /* Set frame format: 8data, 2stop bit */
9
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
10
  
11
} // initSerial

und die main jetzt:
1
int main(void) 
2
{
3

4
    // Serielle Schnittstelle vorbereiten
5
    initSerial();
6

7
    int x;
8

9
    for (x=0;x<16;x++)
10
      serial_putc(0x00);
11
    for (x=0;x<24;x++)
12
      serial_putc(0xFE);
13
}

Leider aber immer noch mit dem gleichen Ergebnis.
Gast #977560
Lesenswert?

Mal ne Frage:

In der Zeile:
1
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
stellst du zwei Stoppbits ein.
Da das eher selten ist:
Hast du das im Terminalprogramm berücksichtigt?

bzw.  hast du dir den Tx-Pin mal mit dem Oszi angesehen?

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