Forum: Mikrocontroller und Digitale Elektronik RS232 0x00 Senden mit seltsamen verhalten.


von Thomas K. (tkrieger)


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

von STK500-Besitzer (Gast)


Lesenswert?

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

Der Ursprung dürfte vor dem Aufruf der Funktion liegen...

von Thomas K. (tkrieger)


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.

von Matthias L. (Gast)


Lesenswert?

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

Poste mal das Programm komplett. Am besten als Anhang.

von yalu (Gast)


Lesenswert?

> Wenn ich jetzt doch ein Byte 0x00 übertrage werden die folgend
> übertragenden Bytes unabhängig vom übergebenen Wert auch mit 0x00
> übertragen.

Wie stellst du das fest?

von Thomas K. (tkrieger)


Angehängte Dateien:

Lesenswert?

Hi,

hab das Programm mal angehängt. Die Daten werden über ein Terminal 
Programm am PC im HEX Format angezeigt.

Als Beispielausgabe (ohne Delay):

00 A6 A0 00 00 00 00 00 00 F8 A0 00 00 00 ...

PS: Habe als MAX232 die EPE Version. Als Kondensatoren sind 4,7uF 
angeschlossen anstatt 1uF wie im Datenblatt.

von Matthias L. (Gast)


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?

von Stefan E. (sternst)


Lesenswert?

Matthias Lipinsky wrote:

> stellst du zwei Stoppbits ein.
> Da das eher selten ist:
> Hast du das im Terminalprogramm berücksichtigt?

Wenn man 2 Stoppbits sendet, ist es egal, ob am Empfänger 1 oder 2 
Stoppbits eingestellt sind.

von Thomas K. (tkrieger)


Lesenswert?

Danke, ist aber berücksichtigt worden im Terminal Programm.

Gruß

Thomas

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.