Forum: Mikrocontroller und Digitale Elektronik AVR128DA28 9600Baud mit 24MHz


von NARX (Gast)


Lesenswert?

Hallo,

ich möchte mit 24Mhz 9600Baud für die UART Übertragung nutzen. Mit 
meiner aktuellen Berechnung funktionieren die 9600Baud nur mit weniger 
Mhz (4MHz funktionieren). Ab 24Mhz empfange ich nur noch fehlerhafte 
Zeichen.
Muss ich die Formel anpassen oder geht das einfach nicht?
1
#define F_CPU 24000000UL
2
#define BAUDRATE0 9600    //Baudrate
3
#define USART0_BAUD_RATE ((float)(F_CPU * 64 / (16 * (float)BAUDRATE0)) + 0.5)
4
5
void init_uart(void)
6
{
7
  //UART0
8
  PORTA.DIR &= ~PIN1_bm;//RXD
9
  PORTA.DIR |= PIN0_bm; //TXD
10
  USART0.BAUD = (uint16_t)USART0_BAUD_RATE;
11
  USART0.CTRLB |= USART_TXEN_bm | USART_RXEN_bm;
12
}

BG

von Peter K. (Gast)


Lesenswert?

nutzt du ein Quarz oder den internen Oscilator?
Baudatenquarze sagen dir was?
https://www.mikrocontroller.net/articles/Baudratenquarz

von NARX (Gast)


Lesenswert?

Nutze den internen Oszillator. Auf externe möchte ich verzichten.

Beitrag #7121989 wurde vom Autor gelöscht.
von Ron T. (rontem)


Angehängte Dateien:

Lesenswert?

NARX schrieb:
> Ab 24Mhz empfange ich nur noch fehlerhafte Zeichen.
> Muss ich die Formel anpassen oder geht das einfach nicht?

Ich empfehle Dir dringend die genaue Frequenz nachzuprüfen und ggf.
nachzujustieren. Wo kommen die +0,5 im Quotienten der Formel her?

von Falk B. (falk)


Lesenswert?

NARX schrieb:
> Muss ich die Formel anpassen oder geht das einfach nicht?

Wo hast du die Formel her? Was soll der cast auf (float)?
1
#define F_CPU 24000000UL
2
#define BAUDRATE0 9600L    //Baudrate
3
#define USART0_BAUD_RATE ((F_CPU * 64 + 8) / (16 * BAUDRATE0))

Wenn man es manuell rechnet, kommt exakt 10.000 raus. Was für ein 
Wunder, bei der riesigen CPU-Frequenz. Aber das löst nicht das Problem 
des ungenauen RC-Oszillators im IC. Damit der genau genug ist, muss er 
kalibriert werden. Dazu gibt es diverse Register. Das muss man im 
Programm selber machen.

von beo bachta (Gast)


Lesenswert?

NARX schrieb:
> Nutze den internen Oszillator. Auf externe möchte ich verzichten.

Interner Oszillator und genaue Frequenzen passen einfach nicht
zusammen. Das ist schlichtweg Mist bzw. Pfusch am Bau. Selbst
wenn man die Frequenz kalibriert kann sie einem durch Spannungs-
schwankungen und Temperatureinflüsse davonlaufen. Da ist auf
nix Verlass.

von S. Landolt (Gast)


Lesenswert?

> 4MHz funktionieren

Nun ja, 4 MHz ist die Standardfrequenz nach einem Reset. Vielleicht 
funktioniert ja die Umschaltung auf 24 MHz nicht, wie sieht diese denn 
aus?

von _Gast (Gast)


Lesenswert?

Hm,

einfach mal zyklisch ein Byte auf dem entsprechenden UART senden, dann 
sieht du ja gleich was Sache ist.


Gruß

von Ron T. (rontem)


Lesenswert?

beo bachta schrieb:
> Selbst
> wenn man die Frequenz kalibriert kann sie einem durch Spannungs-
> schwankungen und Temperatureinflüsse davonlaufen. Da ist auf
> nix Verlass.

Naja ganz so wie im Wilden Westen ist es zum Glück nicht. Der interne 
OSC dieser neuen AVRs ist 1. präziser als der älterer Typen und 2. kaum 
spannungsabhängig (interne Spannungsregelung). Der Temperatur-Einfluß 
ist natürlich gegeben doch könnte man die intern messen und bei großen 
Schwankungen wie im Außenbereich ggf. nachjustieren. So eingestellt sind 
auch 24MHz definitiv machbar, zumal bei nur 9600 Baud. Schließlich gibt 
es dann noch das Autotune-Feature mit 32kHz Quarz.

S. Landolt schrieb:
> Vielleicht funktioniert ja die Umschaltung auf 24 MHz nicht, wie sieht
> diese denn aus?

Warum sollte die Umschaltung Probleme machen? Einfach in OSCHFCTRLA 
einstellen und gut ist. Das ist ja nicht mit einer 
Taktquellenumschaltung verbunden deren Erfolg man im Clock Status 
nachprüfen müsste.

Ein Tipp noch zum Controller: Wenn Auswahl besteht lieber die 
fehlerbereinigteren DB/DD Typen nehmen.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Ron T. schrieb:

> Naja ganz so wie im Wilden Westen ist es zum Glück nicht. Der interne
> OSC dieser neuen AVRs ist 1. präziser als der älterer Typen und 2. kaum
> spannungsabhängig (interne Spannungsregelung).

Das ist so, ja.

> Der Temperatur-Einfluß
> ist natürlich gegeben doch könnte man die intern messen und bei großen
> Schwankungen wie im Außenbereich ggf. nachjustieren.

Auch das ist so. Man muß es dann halt aber auch tatsächlich tun. Von 
allein passiert da garnix. Und im gezeigten Code war auch nix davon 
enthalten.

> Schließlich gibt es dann noch das Autotune-Feature mit 32kHz Quarz.

Auch das ist so. Aber auch hier gilt: Man muß es dann halt aber auch 
tatsächlich tun. Von allein passiert da garnix. Und im gezeigten Code 
war auch nix davon enthalten.

> So eingestellt sind
> auch 24MHz definitiv machbar, zumal bei nur 9600 Baud.

"Zumal" ist Bullshit. Der relative Fehler wirkt völlig unabhängig von 
der Ziel-Baudrate. Nur auf den systematischen Fehler hat die 
Zielbaudrate Einfluss. Dieser (und leider nur dieser) Einfluss ist bei 
den neuen AVRs halt um den Faktor 64 geringer, dank fraktionalem 6 
Bit-Teileranteil.

> Warum sollte die Umschaltung Probleme machen? Einfach in OSCHFCTRLA
> einstellen und gut ist.

Diese Einstellung unterliegt der "configuration change protection". Und 
muss halt unter Berücksichtigung eben dieses Sachverhalts vorgenommen 
werden, um wie gewünscht wirksam werden zu können. Und schon wieder: Im 
gezeigten Code war auch nix davon enthalten...

Sprich: TO hat ohne jegliche Ahnung und ohne hinreichende DB-Lektüre 
versucht, alten Code per C&P zu übernehmen und ist damit gnadenlos auf 
die Fresse gefallen. Also ist alles genau so gekommen, wie es kommen 
musste...

von S. Landolt (Gast)


Lesenswert?

> Warum sollte die Umschaltung Probleme machen? Einfach
> in OSCHFCTRLA einstellen und gut ist.

So, tatsächlich so einfach, Ron T.? Siehe die Anmerkung von c-hater.

von Georg M. (g_m)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Georg M. schrieb:

> _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_24M_gc);

Da fehlt noch was, was nicht unbedingt naheliegend ist: Das richtige 
Include...

Wie ich immer sage: C ist Dreck...

In Asm genügt mir ein einziges Include. Das passt immer und bringt 
alles, was ich brauche...

von S. Landolt (Gast)


Lesenswert?

> _PROTECTED_WRITE (CLKCTRL.OSCHFCTRLA, CLKCTRL_FREQSEL_24M_gc);

Eben.
Und allgemein, wie immer, so gilt auch hier: man reduziert seinen 
Problemfall auf ein Minimalprogramm - meistens klärt sich dann bereits 
alles, und erst falls nicht, stellt man dieses Programm (vollständig) 
hier im Forum vor. Ausschnitte, von denen man glaubt, der Fehler sei 
dort zu finden, führen im Regelfall nur in die Irre.

von Ron T. (rontem)


Lesenswert?

S. Landolt schrieb:
> So, tatsächlich so einfach, Ron T.? Siehe die Anmerkung von c-hater.

Nun ja, das setzt man voraus ;-)

Daß der Code des TO nicht vollständig ist das ist ja offensichtlich. Den 
Protected Write hat er aber offensichtlich überwunden.

c-hater schrieb:
> Wie ich immer sage: C ist Dreck...

Naja soweit würde ich mich nicht versteigen obwohl ich selber Asm 
bevorzuge.

S. Landolt schrieb:
> Und allgemein, wie immer, so gilt auch hier: man reduziert seinen
> Problemfall auf ein Minimalprogramm - meistens klärt sich dann bereits
> alles, und erst falls nicht, stellt man dieses Programm (vollständig)
> hier im Forum vor.

Genau.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Also ich setze gar nichts voraus - es gibt hier Anfänger, die glauben, 
es sei ausreichend, den Systemtakt im Programm per 'define F_CPU' 
anzugeben.

Und "offensichtlich" - Ihre hellseherischen Fähigkeiten möchte ich 
haben.

von Ron T. (rontem)


Lesenswert?

S. Landolt schrieb:
> Und "offensichtlich" - Ihre hellseherischen Fähigkeiten möchte ich
> haben.

Am Takt muß er doch erfolgreich gedreht haben wenn

NARX schrieb:
> Ab 24Mhz empfange ich nur noch fehlerhafte Zeichen

Oder etwa nicht?

von S. Landolt (Gast)


Lesenswert?

Zugegeben, es hat den Anschein. Es könnte aber auch sein, dass ihm bei 
dieser Programmänderung versehentlich ein anderer/weiterer Fehler 
unterlaufen ist. Ohne das Programm zu sehen, möchte ich da nicht weiter 
spekulieren.

von Ron T. (rontem)


Lesenswert?

S. Landolt schrieb:
> Zugegeben, es hat den Anschein.

Nein das muß so sein. Ein Problem mit der "configuration change 
protection" können wir glaube ich ausschließen. Was desweiteren zu tun 
wäre wurde schon gesagt. Ob es den TO noch interessiert?

von NARX (Gast)


Lesenswert?

@Ron T.
Danke, du beschreibst es genau so wie es ist. Interesse ist noch da aber 
bin noch nicht dazu gekommen mal die Kalibrierung auszuprobieren. Ich 
poste später mal meinen Code das weitere Diskussion vermieden werden 
kann.

Auf meinem ATmega4809 funktionieren 20MHz mit 9600b, möchte das später 
auch mal probieren.

Zur Diskussion externen Quarz, ich hatte noch nie Probleme bei der UART 
Übertragung mit dem internen Quarz.

von Michael D. (nospam2000)


Lesenswert?

NARX schrieb:
> Auf meinem ATmega4809 funktionieren 20MHz mit 9600b, möchte das später
> auch mal probieren.

Ob die Kommunikation funktioniert hängt von der Gegenstelle ab, die ja 
auch einen rechnerischen Fehler bei der Baudrate hat. Bei gleichem 
Mikrocontroller und F_CPU kommt da diesselbe tatsächliche Baudrate raus.

Siehe z.B. hier: 
https://github.com/nospam2000/ch341-baudrate-calculation#with-the-new-driver-my-application-no-longer-works

Es gibt eine praktische Möglichkeit, die Baudrate so exakt wie möglich 
an die Gegenstelle anzupassen, wenn man den internen Oszillator 
verwenden:
Man tuned den internen Oszillator so, dass die Abweichung vom der 
empfangenen Baudrate minimal wird.

siehe hier: 
https://github.com/nospam2000/Arduino-BlueController/tree/master/bluecontroller/examples/Calibrate_BlueController_OSCCAL_by_UART

Wenn man den passenden OSCCAL Wert ermittelt hat, muss man den in seinem 
Program hinterlegen, da er bei jedem Neustart gesetzt werden muss. Ich 
habe das damals im Bootloader gesetzt, damit nicht jedes Programm sich 
mit unterschiedlichen Werten für verschiedene MCUs rumschlagen muss.

Theoretisch kann man das auch im Hintergrund nachführen, dann muss man 
den Wert nicht speichern.

Einfachere Möglichkeit: keine "Standard" Baudraten verwenden sondern 
z.B. 10000 Baud anstatt 9600 Baud. Es ist totaler Blödsinn heute solche 
krummen Werte zu verwenden die zu keinem Quarz passen und macht nur 
Ärger.
Leider kommt damit nicht jede Software zurecht.

  Michael

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Der interne RC-Oszillator ist hinreichend genau für den UART. Selbst mit 
32MHz geht das prima bei der DA / DB Serie wie auch bei den neuen Tinys. 
Da braucht man wirklich nicht nach einem Fehler zu suchen.

Zwei beliebte Möglichkeiten: F_CPU ist falsch, oder der RC-Oszillator 
läuft einfach nicht auch 24MHz (die Gründe wurden schon genannt).

Einfach mal einen Pin togglen und schauen ob das zur vermeintlichen 
Taktrate passt.

von S. Landolt (Gast)


Lesenswert?

Ron T. schrieb:
> S. Landolt schrieb:
>> Zugegeben, es hat den Anschein.
>
> Nein das muß so sein. Ein Problem mit der "configuration change
> protection" können wir glaube ich ausschließen.

Nachdem nun so gar nichts mehr von NARX kommt, möchte ich doch noch 
einen Einwand nachreichen: es würde perfekt passen, nicht wahr - der 
Controller läuft nach wie vor mit der Standardfrequenz von 4 MHz, 
USART0.BAUD wird aber auf Grund von '#define F_CPU 24000000UL' 
berechnet.

von Ron T. (rontem)


Lesenswert?

S. Landolt schrieb:
> der Controller läuft nach wie vor mit der Standardfrequenz von 4 MHz

Du hast Recht. Strenggenommen können wir mangels vollständigem Programm 
und Kenntnis der Fähigkeiten des TO rein gar nichts ausschließen. Ich 
vertrau einfach mal

NARX schrieb:
> du beschreibst es genau so wie es ist

und daß er den Takt wirklich umschalten konnte denn

NARX schrieb:
> Auf meinem ATmega4809 funktionieren 20MHz mit 9600b, möchte das später
> auch mal probieren.

da hat er es ja auch geschafft und zum Thema Change Protection kam kein 
Geständnis ;-)

: Bearbeitet durch User
von Ron T. (rontem)


Lesenswert?

Michael D. schrieb:
> Einfachere Möglichkeit: keine "Standard" Baudraten verwenden sondern
> z.B. 10000 Baud anstatt 9600 Baud. Es ist totaler Blödsinn heute solche
> krummen Werte zu verwenden die zu keinem Quarz passen und macht nur
> Ärger.
> Leider kommt damit nicht jede Software zurecht.

Da könnte es aber großen Ärger mit vielerlei Gerätschaften geben die 
ihre Daten nunmal in einer solchen fixen Datenrate ausgeben.

Quarze brauchts keine mehr:

Wilhelm M. schrieb:
> Der interne RC-Oszillator ist hinreichend genau für den UART.

von NARX (Gast)


Lesenswert?

Ich konnte nun das Problem lösen.
Gestern hat die Kommunikation mit 4MHz auch nicht mehr funktioniert. 
Habe dann mal den UART USB Konverter gewechselt.
Nun kann ich Problemlos kommunizieren. 20MHz und 24MHz funktionieren 
ebenfalls. Gute Frage warum der Adapter nicht mehr läuft. Nutze nun 
einen Baugleichen. Ich glaube die Adapter haben den PL2303 Chip.

von Ron T. (rontem)


Lesenswert?

NARX schrieb:
> Habe dann mal den UART USB Konverter gewechselt.

Schön, daß wir wieder mal alle Aspekte des Themas beleuchtet haben 
(fernab der eigentlichen Lösung ;-)

von S. Landolt (Gast)


Lesenswert?

Und was für ein Zufall auch (wieder einmal hier im Forum): just in dem 
Moment, da die Frequenz umgestellt wird, fällt der davon völlig 
unabhängige Adapter aus.
  Aber interessant war die Diskussion schon.

von c-hater (Gast)


Lesenswert?

NARX schrieb:

> Zur Diskussion externen Quarz, ich hatte noch nie Probleme bei der UART
> Übertragung mit dem internen Quarz.

Das verwundert den Fachmann dann doch sehr. Da ist nämlich die genauso 
unschöne wie unbestreitbare Tatsache, dass es keinerlei "interne Quarze" 
gibt...

von Michael D. (nospam2000)


Lesenswert?

c-hater schrieb:
> Das verwundert den Fachmann dann doch sehr. Da ist nämlich die genauso
> unschöne wie unbestreitbare Tatsache, dass es keinerlei "interne Quarze"
> gibt...

Um auch etwas klugzuscheißen: das mag zwar für eine AVR mcu gelten, eine 
DS3231 hat aber einen internen Quarz, sogar einen TXCO.

Wenn schon kleinlich, dann richtig :-)

 Michael

von Jobst M. (jobstens-de)


Lesenswert?

beo bachta schrieb:
> Selbst wenn man die Frequenz kalibriert

Justiert oder abgeglichen. Nicht kalibriert. Davon ändert sie sich 
nicht. Auch im englischen wird dies häufig falsch eingesetzt, dort heißt 
es adjustment. Woher kommt der Glaube, dass eine Kalibrierung eine 
Justage sei?


Ron T. schrieb:
> zumal bei nur 9600 Baud.

Wurde schon drauf hingewiesen: Es ist unabhängig von der Baudrate, da es 
sich um einen prozentualen Fehler handelt.
10% Geschwindigkeitsunterschied zwischen Sender und Empfänger sind die 
Grenze zum Ausfall der Kommunikation bei 8n1. Wenn man beiden Seiten 
jeweils 5% erlaubt geht es wahrscheinlich gut.


S. Landolt schrieb:
> Nachdem nun so gar nichts mehr von NARX kommt

Neee, schau mal 3 Beträge vor Deinem.


NARX schrieb:
> mit dem internen Quarz.

Michael D. schrieb:
> das mag zwar für eine AVR mcu gelten, eine
> DS3231 hat aber einen internen Quarz, sogar einen TXCO.

Geht aber um den AVR. Und nicht um den DS3231, welcher als Uhr/Zeitbasis 
mit 1-10% Genauigkeit absurd wäre.

Michael D. schrieb:
> Wenn schon kleinlich, dann richtig :-)

Eben.


Gruß
Jobst

von Tom (Gast)


Lesenswert?

Jobst M. schrieb:
> Es ist unabhängig von der Baudrate, da es sich um einen prozentualen
> Fehler handelt.
> 10% Geschwindigkeitsunterschied zwischen Sender und Empfänger sind die
> Grenze zum Ausfall der Kommunikation bei 8n1. Wenn man beiden Seiten
> jeweils 5% erlaubt geht es wahrscheinlich gut.

Physikalische Realitäten schaun zuweilen aber anders aus als die schnöde 
Mathematik. Mit steigendem Speed werden Flanken unsauberer und das 
Verhältnis zwischen Anstiegs/Abfall- Zeiten und konstantem Datenpegel 
ungünstiger.

von Tom (Gast)


Lesenswert?

Und das was beidseits an Toleranz "erlaubt" ist wird mit steigender 
Geschwindigkeit sicher nicht mehr.

von Jobst M. (jobstens-de)


Lesenswert?

Tom schrieb:
> Und das was beidseits an Toleranz "erlaubt" ist wird mit steigender
> Geschwindigkeit sicher nicht mehr.

Natürlich nicht. Wenn man aber weiß, dass ab spätestens 10% Unterschied 
zwischen beiden Seiten Schluss ist, sollte man es nicht mit mehr 
versuchen und sich dann wundern. Deshalb ist die graue Theorie auch hin 
und wieder ganz hilfreich.
Selbstverständlich nimmt man dann einen Takt mit weit weniger Toleranz. 
Es soll ja nicht auf Kante sein. Ob einen Quarz oder einen justierten 
RC-Oszillator ist dabei ja egal.


Gruß
Jobst

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.