Forum: Mikrocontroller und Digitale Elektronik ATMEGA328PB UART Problem


von Bernd (wowcool)


Lesenswert?

Hallo, ich habe folgendes Problem. Ich empfange über die interne UART 
Schnittstelle an einem atmega328PB vier Byte. Laut Datenblatt versorge 
ich den Controller mit 5V. Bei dieser Spannung werden die Daten falsch 
eingelesen, nur durch Zufall werden mal die Richtigen empfangen. Senke 
ich die Versorgungsspannung auf unter 5V (z.B. 4V) funktioniert alles 
einwandfrei.
Habe schon zig verschiedene PBs getestet, immer gleich.

Kann sich jemand so ein Verhalten erklären?

von Achim M. (minifloat)


Lesenswert?

Die Quelle arbeitet mit welcher Signalspannung?

Sind die GND von Quelle und 328 vernünftig verbunden?

mfg mf

von Bernd (wowcool)


Lesenswert?

Ja sind sie. Die Quelle versorgt den PB über ein dreiadriges Kabel mit 
den 5V.(GND/5V/SIG)

von Uwe (de0508)


Lesenswert?

Hallo,

passt denn die unbekannte Baudrate zum internen oder externen Takt, und 
ist das serielle Datenformat, z.B. 8-n-1, korrekt eingestellt.

Wenn die Veränderung der Versorgungsspannung den internen Taktoszillator 
verstellt und es dann passen sollte, dann stimmen vielleicht auch einige 
Fuse-Bits nicht.

von Bernd (wowcool)


Lesenswert?

Also er die Baudrate ist 9600 und beide laufen mit 8MHz interner 
Oszillator (atmega8A Sender, atmega328PB Empfänger)

von Bernd (wowcool)


Lesenswert?

Noch was, ein 8A als Empfänger funktioniert mit allen Spannungen 
fehlerfrei, nur der PB nicht

von Jester (Gast)


Lesenswert?

Teste mal mit 8N2 senden, mit 8N1 empfangen - was passiert dann? Was 
passiert, wenn Du die Bitrate deutlich runter setzt, z.B. auf 9600 bps?

von MaWin (Gast)


Lesenswert?

Bernd schrieb:
> Habe schon zig verschiedene PBs getestet, immer gleich.

Welcher Quartz ?

von STK500-Besitzer (Gast)


Lesenswert?

MaWin schrieb:
> Welcher Quartz ?

Bernd schrieb:
> beide laufen mit 8MHz interner
> Oszillator

von Bernd (wowcool)


Lesenswert?

Wie geschrieben intern 8 MHz. Eine Änderung der Baudrate etc. verändert 
leider nichts..

von Norbert (Gast)


Lesenswert?

Bernd schrieb:
> Also er die Baudrate ist 9600 und beide laufen mit 8MHz interner
> Oszillator (atmega8A Sender, atmega328PB Empfänger)

Na schön, da kannst du mit der Versorgungsspannung schön einstellen ob 
und wenn das eventuell mal für einen kurzen Zeitraum funktionieren soll.
Die Spannung »trimmt« den internen Oszillator so das per glücklichem 
Zufall gelegentlich die Baudraten stimmen.

Kurz zusammengefasst: Ganz schlechte Idee.

von Bernd (wowcool)


Lesenswert?

Also unter 5V geht es immer (hundertmal schon probiert). Auch egal ob 3V 
oder 4,5V, immer fehlerfrei.
Ab 5V geht es nicht mehr (ist die Ausgangsspannung des vorgeschalteten 
LDO). Das Signal (Oszi) am RXD Pin ist bis auf den Pegel auch identisch 
bei allen Eingangsspannungen so wie es sein soll.

von Bernd (wowcool)


Lesenswert?

Noch eine neue Erkenntnis. Ein PB als Sender und Empfänger geht auch 
immer mit allen Spannungen. Nur die Kombi 8A Sender und PB Empfänger 
läuft nur unter 5V.

von STK500-Besitzer (Gast)


Lesenswert?

Bernd schrieb:
> Noch eine neue Erkenntnis. Ein PB als Sender und Empfänger geht auch
> immer mit allen Spannungen. Nur die Kombi 8A Sender und PB Empfänger
> läuft nur unter 5V.
Nimm einen Föhn und erwärme mal einen der Controller in der 
"funktionierenden" Schaltung. Funktioniert sie dann immer noch?

Verwende einfach für beide (Baudraten-)Quarze, und du hast keine 
Spannungsabhängigkeit der Oszillatoren mehr,

von Bernd (wowcool)


Lesenswert?

Externe Quarze geht leider nicht mehr. Habe sehr viele bestückte 
Platinen in dieser Variante.... Bei der Erwärmung passiert nichts.

von Norbert (Gast)


Lesenswert?

Bernd schrieb:
> Habe sehr viele bestückte
> Platinen in dieser Variante.

Na dann ›Viel Glück‹

›Diese Wolke nehme ich noch mit‹ dachte der Fallschirmspringer als er in 
den Bodennebel eintauchte.

von STK500-Besitzer (Gast)


Lesenswert?

Norbert schrieb:
> Na dann ›Viel Glück‹

Etwas in der Art wollte ich auch gerade schreiben.

von Bernd (wowcool)


Lesenswert?

Danke Euch, kann ich brauchen....

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Wenn Sender und Empfänger beide mit 5V versorgt werden und TxD direkt 
mit RxD verbunden ist, also ohne Spannungsteiler oder ähnlichem, kann 
ich mir nur den RC-Oszillator des Empfängers als Ursache vorstellen.

Kannst Du nicht versuchsweise mal von beiden MCUs ein aus dem internen 
Takt abgeleitetes Signal ausgeben und mit einem Zähler sauber ausmessen?

Ansonsten gäbe es noch die Möglichkeit des Trial-&-Error-Vorgehens, 
indem Du das OSCCAL-Register des Empfängers schrittweise erhöhst oder 
verminderst, siehe Datenblat:


9.12.1 OSCCAL – Oscillator Calibration Register


 The Oscillator Calibration Register is used to trim the Calibrated 
Internal RC Oscillator to remove process
variations from the oscillator frequency. A pre-programmed calibration 
value is automatically written to this
register during chip reset, giving the Factory calibrated frequency as 
specified in Table 29-9 on page 304...

Grüßle,
Volker

: Bearbeitet durch User
von ... (Gast)


Lesenswert?

Wenn der interne Oszillator korrekt getrimmt ist, sind die 0.2% 
Bauratenfehler sicher kein Problem (Table 24-8. Examples of UBRRn 
Settings for Commonly Used Oscillator Frequencies)
Aber je nach Betriebsspannungsbereich und Temperatur muss der interen 
Oszillator selber getrimmt werden um auf kleiner 3% zu kommen
(Calibrated Internal RC Oscillator Accuracy
Table 33-4. Calibration Accuracy of Internal RC Oscillator)
https://ww1.microchip.com/downloads/en/DeviceDoc/40001906C.pdf

trotzdem sicherheitshalber die Frage - was sagt das Oszi?
sicher dass die Signalpegel und Flankensteilheit passen?
und bei der Gelegenheit einfach gleich die Bitdauer messen...

funktionieren zwei ATmega328PB miteinander?

von Bernd (wowcool)


Lesenswert?

Alles klar werde ich versuchen, danke!

Ja zwei ATMEGA328PB funktionieren bei allen Spannungen einwandfrei.

von Bernd (wowcool)


Lesenswert?

Ein ATMEGA328PB als Sender und ein ATMEGA8A als Empfänger geht auch 
immer, nur 8A Sender und PB Empfänger klappt nicht.

von S. Landolt (Gast)


Lesenswert?

Schauen Sie sich einmal in den beiden Datenblättern das Diagramm 
'Calibrated 8 MHz RC Oscillator Frequency vs. VCC' an.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

So ad hoc würde ich vorschlagen, erstmal den ATmega8A per OSCCAL auf 8.0 
MHz bei 5.0 V zu trimmen; bei diesem ist laut Datenblatt die Abweichung 
am größten.

von Bernd (wowcool)


Lesenswert?

Super Tipp, danke! Hätte ich nicht damit gerechnet, dass es da so eine 
Abweichung gibt. Das ist hier wohl mein Problem :)

von Achim M. (minifloat)


Lesenswert?

Bernd schrieb:
> Habe sehr viele bestückte Platinen in dieser Variante

Einer der beiden μC muss dann der Master werden und regelmäßig eine 
Uart-Takt-Rekalibrierungssequenz ausspucken. Wie beim LIN-Bus. Die 
Slaves vermessen diese Sequenz und stellen ihren UART-Vorteiler 
entsprechend ein.

mfg mf

: Bearbeitet durch User
von Euro (Gast)


Lesenswert?

Man bekommt so eine leichte Verschiebung recht gut diagnostiziert, wenn 
man das 9. Datenbit hinzunimmt und immer als 0 sendet.
Beim Empfänger kommt dann entweder
das offizielle FrameError-Flag, wenn der Sender zu langsam sendet (9. 
Datenbit landet im Stop-Bit)
oder
Das 9. Bit wird als 1 empfangen, wenn der Sender zu schnell sendet 
(Stopbit landet im 9. Datenbit)

Entsprechend kann man dann das Baudratenregister entweder tunen oder 
anhand von Synchronisationsbytes (typ. 0xAA) die Bits einzeln ausmessen 
und die korrigierte Baudrate neu berechnen.
Das geht dann auch über den gesamten Temperatur- und Spannungsbereich.

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.