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_tparity(unsignedcharx){
2
registerunsignedshorti;
3
uint8_tp=0;
4
5
for(i=0;i<8;i++){
6
p^=(x&(1<<i))?1:0;
7
}
8
9
returnp;
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
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
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
>> 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?
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
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?
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?
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
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.
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.
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.
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
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.