UART senden mit Parity

OP (Firma: µGFX) #2653117
Lesenswert?

Nabend,

Ich brauche mal eure hilfe:
Ein ATmega32 muss einen String ("#0201r123EE\r") über RS-232 senden. Das 
Endgerät welches diesen String emfpängt gibt folgende RS-232 Vorgaben 
vor:

Baud: 2400
DataBits: 8
Parity: even
Stopbits: 1

Bisher habe ich bei simplen AVR Geschichten immer die Fleury Lib für den 
UART verwendet und ich habe mich auch sonst noch nie mit der 
Paritätsgeschichte in der Praxis beschäftigt.
Ich habe zwar eine funktionierende Routine um die Parität eines 
einzelnen chars zu berechnen, und ich denke auch dass sich dies leicht 
auf einen ganzen String ausbauen lässt, doch ich weiss nun nicht, was 
ich am ende mit dem bit machen soll.
1
uint8_t parity(unsigned char x) {
2
   register unsigned short i;
3
   uint8_t p = 0;
4

5
   for(i=0; i<8; i++) {
6
      p ^= (x&(1<<i))?1:0;
7
   }
8

9
   return p;
10
}

Also, was mache ich nun damit? Ist es möglich, die Fleury lib so leich 
ab zu ändern, dass ich weiterhin uart_puts() und diese Geschichten 
verwenden kann?

Nach dem Datenblatt gibt es vom ATmega32 her nur zum Empfangen eine 
Paritätseinstellung ( UPM[0:1] in UCSRC).

Also, könnt ihr mir hier weiterhelfen?


~ Tectu
Gast #2653125
Lesenswert?

Hi

>Nach dem Datenblatt gibt es vom ATmega32 her nur zum Empfangen eine
>Paritätseinstellung ( UPM[0:1] in UCSRC).

Nein. Das gilt für Senden und Empfangen:

Datenblatt:

These bits enable and set type of parity generation and check . If 
enabled, the transmitter will
automatically generate and send the parity of the transmitted data bits 
within each frame. The
Receiver will generate a parity value for the incoming data and compare 
it to the UPM0 setting.
If a mismatch is detected, the PE Flag in UCSRA will be set.

MfG Spess
OP (Firma: µGFX) #2653173
Lesenswert?

Hallo Spess,

Ich habe mal folgendes gemacht:
1
UCSRC |= (1<<UPM1);

wenn ich das Terminal auf  8E1 einstelle, kommt nur Müll raus. Bei 7E1 
erscheinen jedoch die richtigen Strings auf dem Terminal.
Da die Dokumentation des Endgeräts ganz klar 8E1 sagt, frage ich: Was 
muss ich noch unternehmen, damit dies Funktioniert, mit der Fleury lib?

Ich habe mal testweise einfach nur nach der Initialisierung durch die 
Fleury Lib die entsprechenden Bits UCSZ[0:2] auf 8-Bits gestellt, noch 
immer wird mein Bildschirm von Müll heimgesucht.


~ Tectu
#2653187
Lesenswert?

Mr. Anderson schrieb:
> Hallo Spess,
>
> Ich habe mal folgendes gemacht:
>
>
1
> UCSRC |= (1<<UPM1);
2
>
>
> wenn ich das Terminal auf  8E1 einstelle, kommt nur Müll raus. Bei 7E1
> erscheinen jedoch die richtigen Strings auf dem Terminal.

Ra Ruck Rick, Zaubertrick

Du hast 8 Bit und eine Parity eingestellt. Der Empfänger brauchte dazu 
die Einstellung 7 Datenbits + Parity, um das korrekt zu empfangen. Das 
Parity-Bit ist für den Empfänger offenbar nicht bei den 7 mitgerechnet. 
Achtung: Jetzt kommt der Trick: 7 + 1 (eben das Parity Bit) macht wieder 
die 8 Bit, die dein Mega aufgrund der UCSZ Bits auf den Weg geschickt 
hat. Offenbar wird beim Mega bei eingeschalteter Parity das Paritybit 
nicht zusätzlich erzeugt, sondern ist in den 8 eingestellten Bits 
enthalten.

Jetzt heißt es mitdenken:
Wenn also der Empfänger 8 Datenbits PLUS ein Paritybit haben will, 
worauf wirst du dann deinen Mega einstellen müssen?
OP (Firma: µGFX) #2653200
Lesenswert?

Achso, das Paritätsbit gehört zum Frame beim Senden, klar.

In diesem Falle währe das: 9-Bits!
1
UCSRB |= (1<<UCSZ2);
2
UCSRC |= (1<<UCSZ1);
3
UCSRC |= (1<<UCSZ0);


Also entweder mache ich da noch etwas anderes falsch, oder jetzt passt's 
mit der Fleury Lib nicht mehr, den noch immer breitet sich er Müll bei 
mir aus.



~ Tectu
Gast #2653213
Lesenswert?

Hi

Bitte beachten:

The UCSRC Register shares the same I/O location as the UBRRH Register. 
See the “Accessing
UBRRH/ UCSRC Registers” on page 158 section which describes how to 
access this register.

MfG Spess
#2653218
Lesenswert?

Rufus Τ. Firefly schrieb:
> Karl Heinz Buchegger schrieb:
>> Offenbar wird beim Mega bei eingeschalteter Parity das Paritybit
>> nicht zusätzlich erzeugt, sondern ist in den 8 eingestellten Bits
>> enthalten.
>
> Ist dessen UART tatsächlich so ... grottig?

Ist doch nur eine Frage der Zählweise.

Die eine Einstellung ist die Anzahl der Bits im Frame (Achtung: Frame, 
nicht Zeichen), das andere ist, ob eines davon das Parity Bit sein soll 
oder nicht.

Ist für mich genauso logisch, wie die Ansicht: 1 Zeichen ist 7 Bits lang 
und dann kommt noch 1 Parity dazu, macht also 8 Bits in 1 Frame.
Gast #2653257
Lesenswert?

Hi

>Üblich ist die Angabe der
>Wortlänge, so jedenfalls machen es alle UARTs, die mir in den
>vergangegen 25 Jahren über den Weg gelaufen sind. Ja, damit oute ich
>mich als AVR-nichtnutzer.

Ist auch bei AVRs so. Das Parity-Bit gehört nicht zur Wortlänge.

MfG Spess

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