Forum: Mikrocontroller und Digitale Elektronik Attiny2313 UART: Lese-Störungen


von Niklas B. (niklas90)


Angehängte Dateien:

Lesenswert?

Hi,

ich baue mir gerade eine Bluetoothfernsteuerung für ein Modellboot, 
wobei im Moment ein RN-42 als Empfänger dient und die Steuerbefehle von 
einer selbstgeschriebenen Android-App empfängt und an den Attiny2313 
weiterleitet. Dieser soll die Daten auswerten und dann später 
entsprechend die Elektronik für das Boot ansteuern. Soweit der Plan.

Leider kommt es ab und zu (naja eher alle 2-5 Sekunden) vor, dass das 
letzte Bit nicht richtig vom µC erkannt wird.


Zur Konfiguration: Im Datenblatt vom RN-42 habe ich leider nix zum 
Frame-Format der UART-Übertragung gefunden, aber hier: 
http://jonasjuffinger.com/bluetooth-modul-rn-42-kommunikation-mit-atmega16/ 
meint der Author, dass ein Stopbit und 8 Bits verwendet werden. Die 
Baudrate habe ich wie im Datenblatt angegeben per Pullupwiderstand auf 
9600 runtergeschraubt, da mir das locker reicht und ich doch theoretisch 
mit dem internen Quarz vom Attiny auskommen müsste, oder?

In meiner App sende ich alle 100 ms einen Wert zwischen 0 und 255 (per 
Slider einstellbar zum Testen).

Die Fuses vom µC habe ich je nach Konfiguration (siehe Bilder) auf 
intern 8MHz oder extern 8MHz-Quarz sowie CLK8 eingestellt, ich habe also 
in jedem Fall einen Systemtakt von 1MHz.

3V Betriebsspannung für beide IC's von 2 AA Zellen. Abblockkondensatoren 
haben nix gebracht.


Was seltsam ist: Wenn ich mit dem internen Takt arbeite, flackert das 
letzte Bit/oberste LED wenn ich Werte kleiner als 128 sende. Darüber ist 
alle i.O. (ist ja dann eh immer an). Aber wenn ich den externen Quarz 
nehme, dann ist die letzte LED immer aktiv (wtf, warum?), wechselt aber 
im Fehlerfall (der dann deutlich seltener auftritt) mit der vorletzten 
>.<

Der Fehler tritt erwartungsgemäß häufiger auf, wenn ich in kürzeren 
Abständen als 100 ms sende, aber das wäre mein Worstcase-wert, weil ich 
möchte ja, dass mein Boot in Echtzeit reagiert und nicht die nächste 
Ente plattfährt.


In den Bildern sieht man, wie ich das blaue Signal direkt vom RN-42 
abgreife, das ist immer fehlerlos. Um zu Testen, ob meine Baudrate vll 
falsch eingestellt war, lasse ich einfach vom Attiny den gelesenen Wert 
direkt wieder ausgeben. Das ist das gelbe, fehlerbehaftete Signal. Wie 
man auf den Oszi-Bildenr sieht, haben beide Signale gleiche "Ausdehnung" 
also nehme ich mal an, dass die Baudrate stimmt. Was extrem komisch ist: 
Bevor ich TX konfiguriert hatte, also nur empfangen habe, traten die 
Fehler häufiger auf.


tl;dr

Meint ihr, dass es normal ist, dass der Attiny Bytes alle paar Sekunden 
falsch empfängt wenn ich alle 100 ms eines sende?


Nachtrag: Ich habe jetzt auch mal versucht 2 chars direkt hintereinander 
zu senden, damit kommt der Attiny gar nicht klar. Irgendwas stimmt da 
nicht. Ich muss später auf jedenfall mindestens 4 Zeichen hintereinander 
senden (2 Kanäle mit je Steuerwert) :-(

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Die
>Baudrate habe ich wie im Datenblatt angegeben per Pullupwiderstand auf
>9600 runtergeschraubt,

Wie ändert man mit einem Pull-Up-Widerstand die Baudrate?

> da mir das locker reicht und ich doch theoretisch
>mit dem internen Quarz vom Attiny auskommen müsste, oder?

Falsch. Der Fehler durch den internen RC-Oszillator wird durch die 
Baudrate nicht beeinflusst. 9600Bd bei 1MHz gibt einen Fehler von 7%. Da 
kannst du eigentlich froh sein, das es bei dir so 'gut' funktioniert.

MfG Spess

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Niklas Beuster schrieb:
> Ich habe jetzt auch mal versucht 2 chars direkt hintereinander
> zu senden, damit kommt der Attiny gar nicht klar.

Geh doch schrittweise ran, d.h., teste den Tiny erstmal mit einem 
direkten seriellen Signal aus z.B. einem PC. Der PC kann dir auch mal 
einen längeren String senden, um die UART Empfangsroutine wasserdicht zu 
machen. Je nach verwendetem seriellen Signal musst du evtl. RS232 Pegel 
wandeln.

Der interne RC Oszillator ist für deinen Fall nicht geeignet. Abgesehen 
vom intrisischen Fehler ist er auch recht temperaturabhängig. Man kann 
ihn kalibrieren, aber nur für eine gewisse Aussentemperatur. Bei dir 
gehts um missionskritische Sachen, nimm also einen Quarz.

Wenn das alles gut läuft, gehst wieder über das BT-Modul. Bei jeder 
Funkübertragung, vor allem wenn es um Sachwerte geht, solltest du dir 
unabhängig von der in BT festgelegten Fehlerkorrektur ein Protokoll mit 
Fehlererkennung ausdenken. Das kann von einer simplen XOR Mimik bis zur 
CRC Prüfsumme gehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Niklas Beuster schrieb:
> theoretisch mit dem internen Quarz vom Attiny
Der Attiny hat keinen internen Quarz. Er hat einen internen 
RC-Oszillator. Mit diesem kannst du die serielle Schnitte bedienen, wenn 
du ihn im laufenden Betrieb nachkalibrierst(!). Du misst also immer 
wieder mal mit einem Timer eine Bitdauer aus und erwartest dann ja einen 
bestimmten Wert. Wenn dieser Wert nicht stimmt, dann muss der Oszillator 
nachgestellt werden. Kompliziert? Ja, das ist es. Aber du willst ja 
unbedingt den Quarz sparen. Und Sparen kostet: Hirnschmalz...

von Niklas B. (niklas90)


Lesenswert?

Lothar Miller schrieb:
> Kompliziert? Ja, das ist es. Aber du willst ja
> unbedingt den Quarz sparen. Und Sparen kostet: Hirnschmalz...

Wie gesagt, im zweiten Bild verwende ich ja einen externen Quarz. Das 
hat nix mit Hirnschmalz zu tun, sondern dass der einfach Platz wegnimmt, 
der im Modellbau eben kritisch ist.

Das Problem ist, dass gerade mit Quarz das MSB als "aktiv" ausgewertet 
wird, obwohl ich Werte < 128 sende. Daraus könnte man schließen, dass 
das Frameformat 7 Bit wäre. Das es ein Vorzeichen ist, kann ich 
eigentlich ausschließen, da ich nur Werte von 0 bis 255 benutze und vor 
dem Senden sowieso in (byte) casten muss.

spess53 schrieb:
> Wie ändert man mit einem Pull-Up-Widerstand die Baudrate?

Steht im Datenblatt: Man kann zwischen 2 vordefinierten Werten 
umschalten, der höhere ist im 5 stelligen Bereich.

Matthias Sch. schrieb:
> Geh doch schrittweise ran, d.h., teste den Tiny erstmal mit einem
> direkten seriellen Signal aus z.B. einem PC. Der PC kann dir auch mal
> einen längeren String senden, um die UART Empfangsroutine wasserdicht zu
> machen.

Leider habe ich keinen seriellen Port am Rechner :(, aber ich habe Rx 
und Tx zum Testen des Moduls auch mal direkt miteinander verbunden und 
dann mit einer Bluetooth-Terminal-App direkt Zeichen übertragen und 
empfangen und da kam nie ein Fehler, auf den Oszi-Bildern sieht man ja 
auch, dass das blaue Signal (abgegriffen vom Empfangspin des Moduls) 
immer korrekt ist.

Achja, das Stopbit ist aber immer high, oder? Also das sieht man nie in 
den Graphen, darum bin ich davon ausgegangen. Das Startbit ist immer 
low.

Die Idee mit dem Protokoll ist gut, damit habe ich auch schon Erfahrung 
bei Projekten mit STM32L1 und F4, aber dazu müssten ja erst mal mehr als 
ein Zeichen hintereinander erkannt werden ;-)

von STK500-Besitzer (Gast)


Lesenswert?

Niklas Beuster schrieb:
> ie gesagt, im zweiten Bild verwende ich ja einen externen Quarz.

und auch die Fuses richtig eingestellt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Niklas Beuster schrieb:
> Abblockkondensatoren haben nix gebracht.
Trotzdem müssen da welche ran. Ganz OHNE ist ganz schlecht.

Niklas Beuster schrieb:
> Das hat nix mit Hirnschmalz zu tun, sondern dass der einfach Platz
> wegnimmt, der im Modellbau eben kritisch ist.
Doch, eben: du kannst Platz gegen Hirnschmalz tauschen. Nur muss man 
dann irgendwo irgendwie nachkalibrieren. Mit dem RC-Oszillator allein 
geht es nicht...

> Wie gesagt, im zweiten Bild verwende ich ja einen externen Quarz
Sicher? Zieh den im Betrieb mal ab. Wenns weiterläuft wird er nicht 
verwendet...

> Achja, das Stopbit ist aber immer high, oder? Das Startbit ist immer
> low.
Ja, so ist es.

Du hast doch ein Oszi, dann miss doch mal die genaue Bitdauer aus. Das 
müssen beim 9600 Baud genau 104us sein.

: Bearbeitet durch Moderator
von Mark R. (stevestrong)


Lesenswert?

Laut Tabelle 58 aus dem ATTiny User Manual hat der uC mit fosc=8MHz bei 
9600 bps einen Fehler von 0,2%. Auch mit internen OSC soll also keine Rx 
Probleme geben. Es sei denn der RN-41 generiert die Baud-rate nicht ganz 
genau, dann passt es mit dem ATTiny nicht zusammen.
Versuch mal die Baudrate auf 4800 oder auf 19200 ein zu stellen, der 
Fehler sollte auch bei 0,2% bleiben.
Machst du eventuell die Port-pins inzwischen unkonfigurieren?

von der alte Hanns (Gast)


Lesenswert?

> 9600Bd bei 1MHz gibt einen Fehler von 7%.

Wieso wird eigentlich diesem Hinweis von spess53 nicht nachgegangen?
Mit U2X=1 (und UBRR=12) käme man auf 0.2 % und damit wäre eine 
mögliche Fehlerquelle beseitigt.

von Mark R. (stevestrong)


Lesenswert?

eine Minute zu spät...

von der alte Hanns (Gast)


Lesenswert?

> eine Minute zu spät...
Ich würde eher sagen, dass wir uns ergänzen, Sie mit alternativer 
Baudrate, ich mit U2X.

von der alte Hanns (Gast)


Lesenswert?

> dass wir uns ergänzen

Doch nicht: wo lesen Sie, dass der Fragesteller mit 8 MHz arbeitet? Ich 
sehe 1 MHz.

von Mark R. (stevestrong)


Lesenswert?

Auch mit 1MHz sollte der Fehler mit U2X=1 immer noch 0.2% sein.

von der alte Hanns (Gast)


Lesenswert?

(Kennen Sie Orwells 1984? So fühle ich mich manchmal: man dreht sich 
kurz um, und plötzlich steht etwas ganz anderes da oder wie eben gar 
nichts mehr.)

Ja eben, nur derzeit beträgt der Fehler 7 %!

von Cyblord -. (cyblord)


Lesenswert?

Der neue Tiny841 hat übrigens 2 UARTs und verbesserte Genauigkeit des 
internen RC-Oszillators. Somit besteht meist kein Grund mehr für einen 
externen Quarz, trotz UART. Für Modellbauprojekte super geeignet.

Heute würde ich keine Projekte mehr mit dem Attiny2313 machen. Der ist 
schon relativ alt und hat wenig Speicher.

gruß cyblord

: Bearbeitet durch User
von der alte Hanns (Gast)


Lesenswert?

Auch auf die Gefahr hin, mich zu wiederholen: auch eine
> verbesserte Genauigkeit des internen RC-Oszillators
hilft bei einem fixen Fehler von 7 % nur begrenzt.

von Cyblord -. (cyblord)


Lesenswert?

der alte Hanns schrieb:
> Auch auf die Gefahr hin, mich zu wiederholen: auch eine
>> verbesserte Genauigkeit des internen RC-Oszillators
> hilft bei einem fixen Fehler von 7 % nur begrenzt.

War auch nicht darauf bezogen, sondern allgemein auf die ext. Quarz 
Problematik. Eine passende Baudrate für seinen Takt muss man natürlich 
so doer so wählen.

von der alte Hanns (Gast)


Lesenswert?

Okay - auch ich kann das Mantra 'RS232 nur mit Quarz' nicht mehr hören. 
Es kommt immer auf die Voraussetzungen an.

von Cyblord -. (cyblord)


Lesenswert?

der alte Hanns schrieb:
> Okay - auch ich kann das Mantra 'RS232 nur mit Quarz' nicht mehr hören.
> Es kommt immer auf die Voraussetzungen an.

Volle Zustimung. Auch mit den älteren AVRs ging der UART nämlich mit dem 
internen RC wunderbar, wenn die Baudrate korrekt gewählt war. Sicher, 
für ein echtes Produkt ist sowas nicht zu empfehlen und man merkt 
deutliche Abweichungen wenn man die Temperaturen ändert (Schaltung mal 
in Kühltruhe oder mit 100°C Heißluft draufballern). Aber auf dem Tisch 
bei Raumtemperatur geht es einfach und diverse Anfängerprobleme mit dem 
UART werden zu 99,999% nicht daraus resultieren sondern haben einen 
anderen Grund.

: Bearbeitet durch User
von Niklas B. (niklas90)


Angehängte Dateien:

Lesenswert?

Alsooo..

Jetzt geht es. Lösung war, U2X = 1 zu setzen und UBBR entsprechend neu 
einzustellen (nach der Formel im Datenblatt).


Interessant war aber, wieso der Fehler auftrat. Es hatte nix mit der 
Hardware zu tun (hatte zuvor auch den externen Quarz dran (ja, Fuses 
gesetzt), mehrere Siebkondensatoren und 3,3V Regler mit anderem 
Batteriepack).

Vielmehr stimmte die Baudrate einfach nicht genau, obwohl ich sie nach 2 
verschiedenen Formeln berechnen lies (die im Datenblatt und die von 
dieser Seite). Im Bild sieht man in blau die korrekte Periode für 
Startbit + 8 Datenbits = 9 Bits: 944µs. Durch 9 ist 104.89µs, entspricht 
also einer Baudrate von ca. 9534.

Das was ich erkannt hatte, wurde ja direkt mit meinen Einstellungen 
zurückgesenden – in gelb. Hier sieht man eine kürzere Periode. Also 
wurde das Stopbit des korrekten Signals wahrscheinlich als letztes 
Datenbit erkannt (obwohl diese Argumentation jetzt nicht wirklich Sinn 
macht, kann das sein? Weil er ja schneller abtastet und nicht 
langsamer).

: Bearbeitet durch User
von der alte Hanns (Gast)


Lesenswert?

Wie Sie auf 9534 kommen, ist mir unklar; nach meiner Berechnung war der 
2313 auf 8929 Bd eingestellt, und dann ist es kein Wunder, dass das 
letzte Bit nicht richtig gelesen wird, Quarz hin, RC-Oszillator her.

Darauf hatte spess53 in der ersten Antwort um 07:20 hingewiesen
> 9600Bd bei 1MHz gibt einen Fehler von 7%
und wenn er auch nicht gleich noch die Lösung mit U2X=1 gratis 
mitlieferte, so war doch alles Weitere seither genau betrachtet eine 
Vergeudung von Zeit und Energie.

von Uwe (de0508)


Lesenswert?

Hallo,

es geht ja noch weiter, ich habe auf einen atTiny4313 gewechselt und er 
RC Oszillator ist auf eine niedrigere Versorgungsspannung Vcc=~3V auf 
8MHZ über den OSCCAL Wert abgeglichen.

Diesen Umstand findet man natürlich im Datenblatt und mich hat 
interessiert, wie groß die Abweichung bei Vcc=5V ist.

Somit habe ich bisher bei drei atTiny4313 ein Abgleichverfahren in 
meiner Firmware implementiert, das die im Datenblatt angegeben 
Abweichung von +10% @25°C für 8MHz bei Vcc=5V bestätigte.

Dadurch musst ich bisher nur den OSCCAL Wert um 1 vermindern.

Ich weiß, dass diese Stichprobe nicht sehr groß war, aber weitere 10 
atTiny4313 warten auf eine Überprüfung.

Verwendet wird auch nur eine Baudrate von 9600 8,N,1 mit U2X = 0.

von Uwe (de0508)


Lesenswert?

Für alle Mitleser,

noch ein Hinweis, Atmel hat seine Abgeichverfahren hier beschrieben.

AVR053: Calibration of the internal RC oscillator
# http://www.atmel.com/Images/doc2555.pdf

AVR054: Run-time calibration of the internal RC oscillator
# http://www.atmel.com/Images/doc2563.pdf

AVR055: Using a 32kHz XTAL for run-time calibration of the internal RC
# http://www.atmel.com/Images/doc8002.pdf

Somit sollte man immer die gesamten AP zum gewählten AVR µC sichten und 
bei Bedarf auch lesen. Ob man dann das eine oder andere Umsetzen mag, 
liegt an einem selbst.

: Bearbeitet durch User
von der alte Hanns, mitten in der Nacht (Gast)


Lesenswert?

Wenn Sie Ihrer Irrlehre nicht sofort abschwören, werden Sie von der 
herrschenden Quarz-Fraktion als Ketzer verbrannt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

der alte Hanns, mitten in der Nacht schrieb:
> Wenn Sie Ihrer Irrlehre nicht sofort abschwören, werden Sie von der
> herrschenden Quarz-Fraktion als Ketzer verbrannt.

Aber nein. Wie Lothar bereits erklärt hat, könnte man ja aus der Länge 
bspw, des Startbits vom BT-Modul den internen Oszillator kalibrieren. 
Die Frage ist eben, ob man diese Baustelle eröffnen will oder mit ein 
wenig Hardware das erst mal beiseite schiebt, um eine mögliche 
Fehlerquelle auszuschließen. Und immerhin hängt hier möglicherweise ein 
Wertobjekt an diesem Faden.
Ich benutze für Debug Ausgaben und andere Spielchen oft den internen 
Oszillator mit UART, das geht auch in 95% der Fälle problemlos. Aber 
beim Modellbau sind die restlichen 5% nach Murphy Gesetz genau die, die 
das Modell in die Botanik schicken.

von der alte Hanns (Gast)


Lesenswert?

Mit einer solchen allgemein gehaltenen Aussage überzeugen Sie mich 
nicht.

Aber noch einmal zum Ursprungsthema, und das in aller Deutlichkeit: 
bereits nach der ersten Antwort war im Prinzip alles gesagt, und somit 
bekommt der Diskussionstitel eine neue und erhellende Bedeutung: 
Lese-Störungen

von Störungsdienst (Gast)


Lesenswert?

Der alte Hanns mäkelte:
>Mit einer solchen allgemein gehaltenen Aussage überzeugen Sie mich
>nicht.

Können Sie nicht einfach mal die Pfoten von der Tastatur lassen, wenn
bereits Alles gesagt ist -bloß noch nicht von Jedem?

SCNR

von der alte Hanns (Gast)


Lesenswert?

An Ihrem Einwand mag etwas dran sein (die Pfoten verrechnen wir mit dem 
Sie), ich werde versuchen, mich zu ändern.

Auf der anderen Seite:
Wenn Sie hier neu sind, dann haben Sie m.E. ein etwas unglückliches 
Pseudonym gewählt, auch wäre ein Fach- als erster Beitrag angebrachter 
gewesen.
Wenn Sie aber bereits unter anderem Namen Mitglied im Forum oder gar bei 
dieser Diskussion sind, so sind Sie schlicht und einfach nur feige. Wie 
werden Sie sich verhalten, wenn einmal wirklich Zivilcourage gefragt 
ist?
Tertium non datur.

von Bole aus Serbien (Gast)


Lesenswert?

Die ganze Diskussion wäre überflüssig wenn Niklas anstatt bytes vom 0 
bis
255 zu senden, einfach 0xAA gesendet hätte...
Ich habe Tiny2313/4313 in mehr als 20 verschiedenen Schaltungen benutzt,
hatte noch NIEMALS irgendwelche probleme mit BaudRaten von 4800-19200.
Und einfachste Kalibrierung ist: PC sendet 0xAA, Software im Tiny 
vergleicht bitzeiten mit Timer - genauer geht's nicht !
Temperaturbedingte Abweichungen sind eine andere Frage...

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.