ATMEGA328PB UART Problem

OP #7195683
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?
#7195704
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.
Gast #7195736
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.
OP #7195742
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.
Gast #7195751
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,
(Firma: L-E-A) #7195777
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
Gast #7195778
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?
Gast #7196001
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren