mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler beim Senden mit USART0 auf Mega64


Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe hier ein STK600 mit Mega64 in passendem Adapter samt 
aktiviertem Baudraten-Quarz. Baudrate ist 9600.
Empfang vom USART ist Interrupt-gesteuert und funktioniert. Gesendet 
wird wartend mit dem üblichen Code à la:
void UartPutc(unsigned char c)
{
   while(!(UCSRxA & (1 << UDREx)))     // warte, bis UDR bereit 
  {
    asm volatile("nop"::);
    ;
  }
    UDRx = c;                // sende 
}
Wenn ich beim Senden jedes einzelnen Zeichens einen Breakpoint auf dem 
AVR habe kommen die Daten auch sauber auf der Windows-Gegenseite an.
Wenn ich mein 17-Byte-Telegramm allerdings frei laufend sende kommen auf 
der Gegenseite idR nur 16 Bytes an und außer dem ersten ist es Rubbish.

Ich hatte jetzt zuerst meine Windows-Empfangsroutine in Verdacht, in 
meiner Verzweiflung habe ich mal alle UART-Relevanten Register in 
Defines gepackt, so daß ich leicht von UART0 auf UART1 umstellen konnte 
und:
Siehe da, mit UART1 geht's.

Hat jemand eine Idee, was da schief gelaufen ist?

Dirk

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich hatte jetzt zuerst meine Windows-Empfangsroutine in Verdacht,
Nimm doch zum Test einfach ein Terminalprogramm...

> Wenn ich mein 17-Byte-Telegramm allerdings frei laufend sende kommen auf
> der Gegenseite idR nur 16 Bytes an und außer dem ersten ist es Rubbish.
Hört sich irgendwie nach Anzahl der Stoppbits an...

> Hat jemand eine Idee, was da schief gelaufen ist?
Irgendein Register wird da noch falsch initialisiert.
Zeig doch mal den ganzen Code...

Autor: Dirk Schlage (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
Im Anhang die komplette uart.c.
Die Initialisierung wird im Hauptprogramm mit
UartIni();
aufgerufen und das Telegramm wird mit
int send(const char* buffer, uint8_t len)
{

  {
    //tbd: gepuffertes Senden implementieren.
    int sent = 0;
    while(sent < len)
    {
      UartPutc(*buffer++);
      sent++;
    }
    return (sent == len ? 0 : -1);
  }
gesendet.

Gruß
    Dirk

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.