AVR128DA28 9600Baud mit 24MHz

Gast #7121964
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
Beitrag #7121989 wurde von einem Moderator gelöscht.
#7122024
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.
Gast #7122219
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.
#7122353
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.
Gast #7122392
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...
Gast #7122451
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...
Gast #7122453
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.
#7122530
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.
Gast #7122550
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.
Gast #7122557
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.
Gast #7122598
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.
#7122620
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
#7122657
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.
Gast #7122964
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.
#7122969
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 ;-)
#7122970
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.
Gast #7123042
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.
Gast #7123557
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.
Gast #7123561
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...
#7123993
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
Gast #7124015
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.
#7124122
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

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