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
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.
@ 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.
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 ?????
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
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.
Puffern würde gehen, weil die Pakete alle 4 Sekunden versendet werden, also würde Zeit zum umrechnen bleiben.
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.
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 :-/
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.
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.
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.
Ok, ich werde es dann heute abend noch einmal Versuchen. Besten Dank
@ 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;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.