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


von Dirk Schlage (Gast)


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:
1
void UartPutc(unsigned char c)
2
{
3
   while(!(UCSRxA & (1 << UDREx)))     // warte, bis UDR bereit 
4
  {
5
    asm volatile("nop"::);
6
    ;
7
  }
8
    UDRx = c;                // sende 
9
}
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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Dirk Schlage (Gast)


Angehängte Dateien:

Lesenswert?

Ok,
Im Anhang die komplette uart.c.
Die Initialisierung wird im Hauptprogramm mit
1
UartIni();
aufgerufen und das Telegramm wird mit
1
int send(const char* buffer, uint8_t len)
2
{
3
4
  {
5
    //tbd: gepuffertes Senden implementieren.
6
    int sent = 0;
7
    while(sent < len)
8
    {
9
      UartPutc(*buffer++);
10
      sent++;
11
    }
12
    return (sent == len ? 0 : -1);
13
  }
gesendet.

Gruß
    Dirk

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.