Forum: Mikrocontroller und Digitale Elektronik UART senden mit Parity


von Joel B. (Firma: µGFX) (tectu)


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

von spess53 (Gast)


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

von Joel B. (Firma: µGFX) (tectu)


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

von Karl H. (kbuchegg)


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?

von Joel B. (Firma: µGFX) (tectu)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Cyblord -. (cyblord)


Lesenswert?

Wozu braucht man eigentlich eine extra lib, wenn man doch sowieso den 
eingebauten HW USART verwendet? Da muss man doch sowieso schon fast 
nichts mehr selber tun?

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

cyblord ---- schrieb:
> Wozu braucht man eigentlich eine extra lib, wenn man doch sowieso den
> eingebauten HW USART verwendet? Da muss man doch sowieso schon fast
> nichts mehr selber tun?

Die Fleury Lib hat eine Interrupt getriebene FIFO dazwischen geschaltet.

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Okay, das funktioniert nun :)

Ich bedanke mich für euere Hilfe!


~ Tectu



P.S. happy flamewar

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ist doch nur eine Frage der Zählweise.

Sicher, aber ungewöhnlich ist's schon. Ü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.

von spess53 (Gast)


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

von asd (Gast)


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?

Der UART im STM32 macht das auch so, wenn ich mich richtig erinnere.

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.