Problem bei UART-Kommunikation

Gast #5254775
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?
Angehängte Dateien:
#5254814
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
Gast #5254835
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?
#5254884
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren