Forum: Mikrocontroller und Digitale Elektronik Software UART for Tiny13 oder größer zur Umsetzung von Parität und Zeichenlänge


von Lars (Gast)


Lesenswert?

Moin zusammen,

vorweg erstmal danke für die ganzen Infos, die man sich hier zum Thema 
Uart erlesen kann. Ich habe schon mit einer ganzen Reihe 
Beispielprogrammen gebastelt und auch schon den ein oder anderen 
Zwischenerfolg erreicht, denoch habe ich noch Fragen, wie man meine 
Problemstellung professionel angeht.

Aufgabe:
Ich habe einen Stromzähler, der sich über die D0 Schnittstelle prima 
auslesen lässt. Die erforderlichen Schnittstellenparameter sind 9600 
7E1. Mit einem USB-Adapeter funktioniert alles super, auch das auslesen 
mit dem Atmega8 und dem Anzeigen auf einem LCD funktioniert. Jedoch 
möchte ich mit einem Tiny eine Umwandlung vor dem PC, von 7E1 auf 8N1 
schaffen. Die Baudrate bleibt bei 9600.

Erfahrund bzw. Erkenntnisse:
Die Beispiele, die ich gefunden habe, sehen fast alle vor, das man die 
Parameter vor der Initalisierung bzw wärend der Initalisierung übergibt.

Meine Fragen:
- Ist es Sinnvoll für das Senden und Empfangen komplett getrennte 
Konfigurationen vorzusehen oder kann man die Konfiguration mitten im 
Programmablauf "umzuschalten"?

- Gibt es ähnliche Projekte, die evtl. einen anpassbaren Code 
bereitstellen?

Bisherige Favoriten, über die ich gestolpert bin und vielleicht 
Grundlage sein könnten:
Beitrag "I2C (TWI) Sniffer"
Beitrag "LCD über nur einen IO-Pin ansteuern"

Ich würde mich sehr über anreize und Hilfe freuen

von Route_66 (Gast)


Lesenswert?

Lars schrieb:
> Meine Fragen:
> - Ist es Sinnvoll für das Senden und Empfangen komplett getrennte
> Konfigurationen vorzusehen oder kann man die Konfiguration mitten im
> Programmablauf "umzuschalten"?

Hallo!
Ich würde den Zähler auch mit 8N1 auslesen und die Paritätsprüfung in 
Software machen. Dann das Paritätsbit löschen und ab zum PC.

von Falk B. (falk)


Lesenswert?

@ Lars (Gast)

>auslesen lässt. Die erforderlichen Schnittstellenparameter sind 9600
>7E1. Mit einem USB-Adapeter funktioniert alles super, auch das auslesen
>mit dem Atmega8 und dem Anzeigen auf einem LCD funktioniert. Jedoch
>möchte ich mit einem Tiny eine Umwandlung vor dem PC, von 7E1 auf 8N1
>schaffen. Die Baudrate bleibt bei 9600.

Wozu? 7E1 ist mit dem PC, welcher auf 8N1 als Empfänger eingetellt ist 
problemlos empfangbar, den Paritycheck macht man dann halt auf dem PC in 
der USersoftware. Problem gelöst.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Lars schrieb:
> Meine Fragen:
> - Ist es Sinnvoll für das Senden und Empfangen komplett getrennte
> Konfigurationen vorzusehen

Meinst du jetzt auf EINER Schnittselle (also z.B. den Datenweg von/zu 
deinem Zähler) ?

Ich kenne kein (End-)Gerät, welches für Senden bzw. Empfangen 
unterschiedliche Parameter (Baudrate, Startbit/Datenbit/Stopbit/Parität) 
verlangt.

Können denn  eine herkömmliche Hardware-USART sowas überhaupt? (diese 
Parameter getrennt einzustellen)

Für mich sehe ich keinen Nutzen darin, da unterschiedliche Parameter 
vorzusehen.

> oder kann man die Konfiguration mitten im Programmablauf "umzuschalten"?

Wie den? Mittendrin entschließt du dich, anstelle von 7 Bit prlötzlich 8 
Bit zu empfangen? Oder die ersten 4 Bit auf Baudrate x, und dann auf 
Baudrate y  ?????

von Lars (Gast)


Lesenswert?

Danke schon einmal für die schnellen Antworten.

Der Zähler sendet nur Daten (kann garnicht empfangen) und das Gerät 
(PC), welches die Daten emfangen soll, kann nur 8N1 empfangen. Ich 
möchte alsi über den Tiny die Umwandlung der seriellen Daten von 7E1 auf 
8N1 vornehmen. Weil ohne Umwandlung bekomme ich nur Datenbrei.

Danke

von Peter D. (peda)


Lesenswert?

Lars schrieb:
> Jedoch
> möchte ich mit einem Tiny eine Umwandlung vor dem PC, von 7E1 auf 8N1
> schaffen. Die Baudrate bleibt bei 9600.

Das geht nicht.
Empfang 7E1 dauert 10 Bit.
Senden 8N1 dauert 11 Bit.
Woher willst Du die zusätzliche Bitzeit nehmen?

Du mußt entweder schneller senden.
Oder das ganze Paket puffern, in der Hoffnung, daß zwischen den Paketen 
eine genug lange Pause ist für die zusätzlichen Bitzeiten.

von Lars (Gast)


Lesenswert?

Puffern würde gehen, weil die Pakete alle 4 Sekunden versendet werden, 
also würde Zeit zum umrechnen bleiben.

von Route_66 (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Senden 8N1 dauert 11 Bit.

Aber nur im Multiprozessor-Mode

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:

> Senden 8N1 dauert 11 Bit.

Ich steh heut zwar des öfteren schon mal auf dem Schlauch, aber warum 
sollen da 11 Bit raus kommen? Bei 'No Parity' wird doch gar kein 
Paritätsbit übertragen.

von Lars (Gast)


Lesenswert?

Mein laienhaftes Verständnis sagt folgendes:

7E1: Startbit, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Paritätsbit, 
Stopbit
8N1: Startbit, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8, Stopbit

Oder? Also ist die Umsetzung garnicht so schwer? Denoch verstehe ich 
nicht, wie ich es machen muss :-/

von Karl H. (kbuchegg)


Lesenswert?

Lars schrieb:
> Mein laienhaftes Verständnis sagt folgendes:
>
> 7E1: Startbit, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Paritätsbit,
> Stopbit
> 8N1: Startbit, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8, Stopbit
>
> Oder? Also ist die Umsetzung garnicht so schwer? Denoch verstehe ich
> nicht, wie ich es machen muss :-/

Na ja.
In dem einen Fall hast du eben kein Bit 8 (wir fangen übrigens immer bei 
0 zu zählen an) sondern ein Paritätsbit, welches dich aber eigentlich 
nicht interessiert.

Stellst du den Empfänger auf 7E1 ein, dann kriegst du das Paritätsbit 
überhaupt nicht zu Gesicht, weil der Empfänger nur 7 Datenbits aus dem 
Datenstrom rausholt. Nichts desto trotz kriegst du vom Empfänger ein 
vollständiges Byte (mit 8 Bit), weil das technisch anders nun mal nicht 
möglich ist. Das Empfangsregister ist nun mal 8 Bit breit. Entweder der 
Empfänger setzt dann das Bit 8 auf 0, oder du machst das selber.
Ob du in weiterer Folge dir das Paritätsbit auch noch 'aboholst', bzw 
den Empfänger befragst, ob es einen Paritätsfehler gab oder nicht ist 
dir überlassen.

So wie ich das sehe, könntest du den Empfänger aber genausogut auch auf 
8N1 stellen. Letzten Endes ist das nur eine Interpretationsfrage, ob man 
eine Sequenz von 8 aufeinanderfolgenden Bits nun in 7 Datenbits und 1 
Paritätsbit aufteilt, oder ob man die 8 Bits so nimmt wie sie kommen und 
dann einfach das 8.te Bit selbst auf Parität auswertet bzw. auf 0 setzt 
um wieder die 7 Datenbits zu kriegen, die man dann als Sender weiter auf 
den Weg schickt.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Lars schrieb:

> 8N1 vornehmen. Weil ohne Umwandlung bekomme ich nur Datenbrei.

Das wundert mich nicht.
Denn wenn du einem 8N1 Empfänger 7E1 Daten vorwirfst, dann kriegt der 
zwar auch jeweils 8 Bit, aber das 8-te Bit ist dann insofern speziell, 
dass es nicht zu den Daten gehört, sondern die Parität angibt. Einfach 
dieses Bit auf 0 setzen und dann müsste es passen.

von Peter D. (peda)


Lesenswert?

Karl Heinz schrieb:
> Bei 'No Parity' wird doch gar kein
> Paritätsbit übertragen.

Ups, nehme alles zurück.

Dann braucht man aber auch keinen Konverter.
Das 7E1 läßt sich prima als 8N1 empfangen.
Nur noch das Parity ausmaskieren (byte &= 0x7F;) und fertig.

von Lars (Gast)


Lesenswert?

Ok, ich werde es dann heute abend noch einmal Versuchen. Besten Dank

von Falk B. (falk)


Lesenswert?

@ Peter Dannegger (peda)

>Dann braucht man aber auch keinen Konverter.
>Das 7E1 läßt sich prima als 8N1 empfangen.

Beitrag "Re: Software UART for Tiny13 oder größer zur Umsetzung von Parität und Zeichenlänge"

>Nur noch das Parity ausmaskieren (byte &= 0x7F;) und fertig.

Ich würde es eher so machen

data >>= 1;

von Stefan E. (sternst)


Lesenswert?

Falk Brunner schrieb:
> Ich würde es eher so machen
>
> data >>= 1;

Nö. UART überträgt LSB-First, also landet das Paritäts-Bit im MSB.

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.