Forum: Mikrocontroller und Digitale Elektronik Problem bei UART-Kommunikation


von Lucas Pelchen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

die UART Kommunikation funktioniert grundsätzlich. D.h. das Senden und 
Empfangen der Daten klappt. Aber mich wundert es, dass ich am Terminal 
nur die ersten 6 Bit der übertragenen Daten lesen kann/ bzw. dass diese 
den zu erwartenden Daten entsprechen. Es ist auch egal welche Daten ich 
ab den 6ten Bit sende es wird immer "11111111" empfangen. Meine Frage 
warum?

von Verwirrter Leser (Gast)


Lesenswert?

Lucas Pelchen schrieb:
> welche Daten ich
> ab den 6ten Bit sende

Du sprichst wirres Zeug. Du kannst nicht einzelene Bits senden.

Formuliere erst mal klar was du machst, was du erwartest
und was du anstelle dessen bekommst.

von Stefan F. (Gast)


Lesenswert?

Benutzt du den internen R/C Oszillator oder hast du den µC korrekt 
konfiguriert, einen Quarz zu benutzen?

Der R/C Oszillator eignet sich nicht zuverlässig für serielle 
Kommunikation.

von Stefan K. (stefan64)


Lesenswert?

In Deiner Formel für die Baudrate stimmt die Klammerung nicht.

Deine Formel:
#define uartrate ((F_CPU+baudrate*8)/((baudrate*16)-1))

Die 1 muss nicht von (baudrate*16) abgezogen werden, sondern vom 
Gesamtergebnis.

Richtig ist:
#define uartrate ( ((F_CPU+baudrate*8) / (baudrate*16)) -1)

Durch Deine Formel schreibst Du in UBRR0 26 statt 25, was einen 
Baudratenfehler von 4% ergibt. Das sorgt für Deine Aussetzer nach 
mehreren Zeichen (nicht "Bits").

Viele Grüße, Stefan

von Stefan F. (Gast)


Lesenswert?


von Teddy (Gast)


Lesenswert?

Dein Code ist scheiße.

    /* Replace with your application code */
    while (1)
    {
    temp = USART_Empfangen();
    switch(temp)
    {
      case  'A':
      //UART_putChar(temp);
      strcpy(str,"Hallo_Lucas");
      UART_putStr(str);
      _delay_ms(1000);
      break;

      default:
      UART_putChar(temp);
      _delay_ms(1000);
      break;
    }
    }

Hier geht dein Switch Case immer ins default, wenn du nicht A eingibst.
Dann gibt er irgendwelche Mist aus, was dort im temp steht.

unsigned char USART_Empfangen(void)
{
  while(!(UCSR0A & (1<<RXC0)))
  {
  }
  return UDR0;
}

Wenn du nichts empfangen hast, was steht dann im UDR0?

von Stefan F. (Gast)


Lesenswert?

> Dann gibt er irgendwelche Mist aus, was dort im temp steht.

Dann gibt er ein Echo des zuvor empfangenen Zeichen aus. Mist würde ich 
das nicht nennen.

> Wenn du nichts empfangen hast, was steht dann im UDR0?

Spielt keine Rolle, denn das Programm wartet so lange, bis etwas 
empfangen wurde.

von Lucas Pelchen (Gast)


Angehängte Dateien:

Lesenswert?

Habe die Baudratenberechnung richtig gestellt, jedoch immer noch das 
selbe Bild.

Was mich wundert, ist wenn ich die im Anhang gezeigt Variante auf den 
atmega88 lade sendet er mir eine Zeichenfolge mit bis zu 100 Zeichen.

von Jim M. (turboj)


Lesenswert?

Lucas Pelchen schrieb:
> Habe die Baudratenberechnung richtig gestellt, jedoch immer noch das
> selbe Bild.

Dir ist schon klar das der UART keinen Fifo hat und durch die ganzen 
delays jede Menge Zeichen verloren gehen?

Übrigens benutzen die meisten modernen Terminals einen Zeilenpuffer. 
Weil die Zeile am Stück gesendet wird muss man auch jede Millisekunde 
(bei 9600 Baud) ein Zeichen abholen können - der OP Code kann es aber 
nur 1x pro Sekunde...

Schau Dir mal an wie man eine Zustandsmaschine oder einen endlichen 
Automaten programmiert.

von W.S. (Gast)


Lesenswert?

Jim M. schrieb:
> Schau Dir mal an wie man eine Zustandsmaschine oder einen endlichen
> Automaten programmiert.

Oder eben einen lowlevel-Treiber, der diesen Namen auch verdient.

Beispiele, wie man's richtig macht, gibt es ja genug.

W.S.

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.