UART Übertragungsproblem

OP #1356455
Lesenswert?

Hi Zusammen, bin jetzt seit ca. 2 Wochen fleißig dabei mich in die Welt 
der Microcontroller einzuarbeiten. Habe bis jetzt auch alles soweit 
geschafft ohne doofe Fragen in das Forum zu schreiben.

Aber jetzt ist es doch so weit.

Also ich habe ein kleine Programm geschrieben welches mir nur Testweise 
ein 8-Bit Wert senden soll.
Benutze auch einen Externen Quarz (Fuses gesetzt), da es ja mit dem 
Internen immer wieder Probleme wegen Kalibrierung gibt.

So weit so gut, ich bekomme auch immer einen Empfang in HTERM (oder auch 
Hyperterminal) aber das Zeichen ist nicht das was ich gesendet habe.
Ich weiß das meistens der Fehler in fehlerhafter Baudrate liegt, aber 
ich finde ihn einfach nicht. Habe auch schon mit dem Oszi nachgemessen 
ob die Eingestellte Baudrate auch wirklich rauskommt, und das scheint zu 
stimmen.


C-Code:
1
#include <avr/io.h>
2
 
3
#define F_CPU 3686400UL      // 3686400 Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
4
#define BAUD 4800UL         // Baudrate
5
#define UBRR_VAL 47      // Wert für Baudrate bei der Frequenz aus Datasheet
6

7
 
8
int main(void)
9
{
10
  UCSRB |= (1<<TXEN);    // Senden eingeschaltet
11
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0)|(1<<USBS);  // Zugriff auf UBRRH / Assynchron / Character Size = 8-Bit
12

13
  while(1)
14
  {
15
  
16
    
17
  
18
      UBRRH = UBRR_VAL >> 8;      //High Nibble schreiben
19
      UBRRL = UBRR_VAL;        //Low Nibbel schreiben
20

21
      while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
22
        {
23
        }
24
 
25
        UDR = 0xAA;                    // schreibt den Hex-Wert auf die Schnittstelle
26

27
  }
28

29

30
}


Also der Hex Wert 0xAA sollte ja eigentlich dem Binärwert von 10101010 
entsprechen. Aber ich bekomme über HTERM immer den Wert 11010011.

Kann es irgendwie sein das HTERM bei mir da die Start- und Stoppbits 
durcheinander bringt? Eine andere Idee habe ich leider nicht mehr.

Im Anhang nochmal der Screenshot von HTERM.

Hoffe das ist nicht wieder so eine Anfängerfrage, aber ich währe 
wirklich sehr dankbar, wenn mir hier jemand weiterhelfen kann.

Gruß
Daniel
Angehängte Dateien:
#1356477
Lesenswert?

Hallo,

Jean Player schrieb:
> Hi,
>
> UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0)|(1<<USBS);
> Du setzt in dieser Zeile auf 2 StopBits , hast in HTERM aber nur 1
> StopBit eingestellt-

Das stört aber hier nicht. Umgekehrt würde es stören, also Sender 1 
Stoppbit, Empfänger erwartet aber 2.

Das Stoppbit ist Ruhepegel, der kann dauern wie er will bis das nächste 
Startbit kommt.

Gruß aus Berlin
Michael
OP #1356480
Lesenswert?

Hmm, das war nur mal ein Test von mir, hatte leider vergessen das wieder 
rauszulöschen.

Aber auch ohne diesen Wert funktioniert es nicht. Jetzt ändern sich 
allerdings die Werte von der HTERM ausgabe auch noch.

HTERM ausgabe nochmal im Anhang.

Achsoo vielleicht sollte ich noch dazu sagen, dass die Übertragung nicht 
über RS232 funktioniert sonder per USB mit dem "mySmartUSB MK2
Version 2.11"
OP #1356501
Lesenswert?

Ja, die Baudrate ist auch im Treiber eingestellt.

Jetzt muss ich mich korrigieren, habe nochmal alles neu angeschlossen 
und jetzt funktioniert die Brücke von TxD zu RxD auch einwandfrei. 
Kriege das gesendete wieder zurück.

Also muss das Problem wohl doch irgendwie in meinem C-Code liegen oder?
#1356507
Lesenswert?

Hallo,

wohl zu warm hier heute, jetzt erst gesehen...

  while(1)
  {



      UBRRH = UBRR_VAL >> 8;      //High Nibble schreiben
      UBRRL = UBRR_VAL;        //Low Nibbel schreiben

      while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
        {
        }

        UDR = 0xAA;                    // schreibt den Hex-Wert auf die 
Schnittstelle

  }



Du setzt jedesmal gleich nach dem Schreiben der Daten die Baudrate in 
Deiner Main-Loop und damit macht der UART natürlich Mist.

      UBRRH = UBRR_VAL >> 8;      //High Nibble schreiben
      UBRRL = UBRR_VAL;        //Low Nibbel schreiben

gehört natürlich zur Initialisierung VOR die While-Schleife...

Gruß aus Berlin
Michael
OP #1356532
Lesenswert?

Hmm, schade die freude war wohl zu früh.

Habe jetzt herausgefunden, das es zwar teilweise funktioniert. Dies aber 
anscheinend stark davon abhängt wann ich HTERM starte. Wenn ich öfter 
Connecte und Disconnecte, dann kommen verschiedene Werte raus. naja, 
dafür ist wohl der Wert 0xAA nicht geeignet, da er nicht genau 
unterscheiden kann welches das Start und Welches das Stoppbit ist 
oder????

Was macht man denn um solchen Datenwust zu vermeiden?
Gast #1356547
Lesenswert?

>Wollte Daten
>so einfach wie möglich nur in eine Richtung übertragen.


Und warum machst Du es nicht einfach?

Pack die Daten in einen Protokollrahmen, sende das Telegramm an den 
Empfänger. Sende das telegram einfach periodisch.
Der Empfänger nimmt die Daten nur an, wenn er das Telegramm korrekt 
erfaßt hat.

Und gut.
#1356553
Lesenswert?

Hallo,

wenn der Empfänger immer aktiv ist, geht es.

Wenn die Pause zwischen 2 Datenpaketen länger ist als eine Bytedauer + 
Start + Stop und etwas Reserve, ist nur das erste Paket kaputt, beim 2. 
wird das erste Startbit dann wieder richtig erkannt.

Gruß aus Berlin
Michael

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