mikrocontroller.net

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


Autor: Thomas Krieger (tkrieger)
Datum:

Bewertung
0 lesenswert
nicht 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:
/**
 * Sendet ein einzelnes Zeichen
 * an die RS232 Schnittstelle 
 */
void serial_putc(unsigned char data) 
{

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

  if (data == (unsigned char)0x00)
    _delay_ms(10);
  
} // 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas Krieger (tkrieger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

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

und die main jetzt:
int main(void) 
{

    // Serielle Schnittstelle vorbereiten
    initSerial();

    int x;

    for (x=0;x<16;x++)
      serial_putc(0x00);
    for (x=0;x<24;x++)
      serial_putc(0xFE);
}

Leider aber immer noch mit dem gleichen Ergebnis.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>habe das Programm mal kurz gestuzt, auf den wesentlichen Teil.

Poste mal das Programm komplett. Am besten als Anhang.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Krieger (tkrieger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ne Frage:

In der Zeile:
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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Krieger (tkrieger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ist aber berücksichtigt worden im Terminal Programm.

Gruß

Thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.