Forum: Mikrocontroller und Digitale Elektronik Welche Baudrate mit internem Oszillator?


von mr.chip (Gast)


Lesenswert?

Hallo

Seit knapp 2 Stunden tüftel ich hier an einer kleinen Schaltung herum, 
aber krieg das UART beim besten Willen nicht über 4800 Baud. Ich 
verwende den internen Oszillator des Mega8. Könnte es daran liegen? Ok, 
meine Platine sieht zwar auch nicht genial aus, allerdings funktioniert 
beispielsweise der ISP problemlos - während ich die UART-Anschlüsse 
sogar direkt am Pin festmachen kann und selbst dann keine höhere 
Datenraten kriege.

Was sind so eure Erfahrungen? Wie viel kriegt man mit dem internen 
Oszillator hin? Und vorallem: Wie kann man mehr hinkriegen? (Ein Quarz 
ist nicht vorgesehen, aber ich brauch das UART, und zwar mit etwas 
Speed...)

Gruss

Michael

von Otto (Gast)


Lesenswert?

Hallo Mr.Chip,

die Stabilität des internen Oszillators reicht für einen sicheren 
Betrieb der UART nicht - siehe Tutorium.

Gruß Otto

von Andreas K. (a-k)


Lesenswert?

Ohne Kalibrierwert (=>OSCCAL) geht's garnnicht, dafür ist der interne 
Oszillator zu ungenau.

Und mit Kalibrierung sollte man sich dabei auf Debug-Ausgaben oder 
ähnlich Unwichtiges beschränken. Über Spannungs/Temperaturbereiche 
hinweg ist er auch dann nicht genau genug.

von nullpointer (Gast)


Lesenswert?

Man kann den internen Oszillator abgleichen. Man kann auch eine 
Temperaturkompensationstabelle nehmen, oder mit einem 32k Quarz 
automatisch abgleichen.

von mr.chip (Gast)


Lesenswert?

Also kurz gesagt: Man kann 9600 Baud vergessen?

Was denkt ihr, kriege ich via I2C mehr hin? (da synchron)

von Andreas K. (a-k)


Lesenswert?

Ja.

von mr.chip (Gast)


Lesenswert?

> Ja.

Ok, danke. Dann weiss ich jetzt immerhin, dass es nicht an der Schaltung 
liegt.

von nullpointer (Gast)


Lesenswert?

Man sollte I2C nicht gegen ein UART ausspielen. Die sind zu verschieden. 
Es gibt eine Appnote bei Atmel, wie man den internen RC gegen einen 32k 
Quarz abgleicht. Braucht um die 240 bytes. Ich denke es mit weniger zu 
schaffen. Duch manuellen Abgleich, am Scope habe ich fuer eine 
Temperatur 9600 ohne problem laufen. Dazu muss man das UART dazu 
bringen, einen Satz 0x55 rauszulassen. 10bits sollen nun 1041us lang 
sein. Nach ein paar Iterationen am OSCCAL ist man dort.

von Hannes L. (hannes)


Lesenswert?

nullpointer wrote:
> Es gibt eine Appnote bei Atmel, wie man den internen RC gegen einen 32k
> Quarz abgleicht. Braucht um die 240 bytes. Ich denke es mit weniger zu
> schaffen.

Wenn man aber schon auf PB6 und PB7 verzichtet, um einen Uhrenquarz 
anzuschließen, um dann per Software am internen Oszillator zu schrauben, 
dann kann man auch gleich über den Einsatz eines Baudratenquarzes 
(Suchbegriff) nachdenken.

Der Einsatz eines Uhrenquarzes (asynchron über Timer2) ist eigentlich 
nur bei Batteriegeräten interessant, bei denen der AVR die meiste Zeit 
im Power-Down-Sleep verbringt, aber trotzdem die Uhrzeit weiter zählt.

> Duch manuellen Abgleich, am Scope habe ich fuer eine
> Temperatur 9600 ohne problem laufen. Dazu muss man das UART dazu
> bringen, einen Satz 0x55 rauszulassen. 10bits sollen nun 1041us lang
> sein. Nach ein paar Iterationen am OSCCAL ist man dort.

Als Notlösung nicht übel, erfordert aber auch die entsprechende 
("55"-sendende) Software am PC. Eine praktikable Allround-Lösung ist es 
auch nicht. Baudratenquarz bleibt nunmal Baudratenquarz...

...

von Holger K. (krulli) Benutzerseite


Lesenswert?

mit den internen 8MHz sollte 9600Baud drin sein... - selbst schon 
probiert.

von Hannes L. (hannes)


Lesenswert?

Holger Krull wrote:
> mit den internen 8MHz sollte 9600Baud drin sein... - selbst schon
> probiert.

Ging bei mir nicht, jedenfalls nicht zuverlässig. Daher hatte ich GLCD 
(8-Bit-Datenbus) und UART am Mega8 damals aufgegeben.

...

von Holger K. (krulli) Benutzerseite


Lesenswert?

Hallo Hannes,
wie zuverlässig das war, kann ich nicht sagen, ich hatte es probiert und 
es schien vernüftig zu laufen. Aber danach hatte ich auf einen externen 
Baudratenquarz umgefust und das nicht weiter ergründet.
Diese Ozillatorkalbrierung ist für mich noch ein Buch mit 7 Siegeln ;-)
Viele Grüße nach KB
Holger

von nullpointer (Gast)


Lesenswert?

die bessere Frequenz als 8MHz ist 7.328MHz...

von Holger K. (krulli) Benutzerseite


Lesenswert?

nullpointer wrote:
> die bessere Frequenz als 8MHz ist 7.328MHz...

Wie kann man die als internen Takt einstellen??? (siehe ersten Post)

von Hannes L. (hannes)


Lesenswert?

nullpointer wrote:
> die bessere Frequenz als 8MHz ist 7.328MHz...

Oder noch besser 7,3728MHz, aber das sollte der Frager mittels 
Suchbegriff "Baudratenquarz" eigentlich selbst herausfinden...

;-)

...

von nullpointer (Gast)


Lesenswert?

7,3728MHz einstellen ? Genau gleich wie man 8MHz einstellt. Baurate auf 
9600 einstellen und am OSCCAL schauben bis es passt.

von Hannes L. (hannes)


Lesenswert?

Holger Krull wrote:
> nullpointer wrote:
>> die bessere Frequenz als 8MHz ist 7.328MHz...
>
> Wie kann man die als internen Takt einstellen??? (siehe ersten Post)

Durch Manipulation von OSCCAL. Das hält dann aber nur von Zwölf bis 
Mittag...

OSCCAL muss beim Mega8 (und allen anderen AVRs nach Calibrationsmode 
3.0, siehe AN053) sowiso händisch calibriert werden, wenn der Oszillator 
mit 2, 4 oder 8 MHz läuft. Die automatische Calibration beim Kaltstart 
erfolgt nur für 1MHz.

Gruß übern Bach...

...

von nullpointer (Gast)


Lesenswert?

Am OSCCAL zu drehen ist stabil, sofern die Temperatur sich nicht 
aendert. Die Spannungsabhaengigkeit ist fast vernachlaessigbar.

von Axel R. (Gast)


Lesenswert?

Guten Morgen,

Den Wert, der in OSSCAL drinnsteht (+/r/n), über die UART ausgeben. Dann 
um einen erhöhen lassen. Wenn du was siehst, weisst Du, was in OSCCAL 
rein muss. So fünf bis sieben Prints wirst Du lesbar untereinander 
stehen haben. Der Rest sind "Hieroglyphen". Von den lesbaren nimmst Du 
den "mittleren". Bei Zimmertemperatur passt das ganz gut. Auch bei 9600.

Gruß
AxelR.

von Frank (Gast)


Lesenswert?

Die Ergebnisse können aber ziemlich abweichen, auch bei gleichen 
Umgebungsverhältnissen. Ich hab mal eine Displayansteuerung mit nem M8 
gebaut die bei mir prima mit internem Takt funktioniert hat. Dann hab 
ich diese Schaltung nochmal gebraucht und hab 1:1 alles nochmal 
aufgebaut und es ging garnix. Den alten M8 in die neue Schaltung 
gedrückt und es funktioniert sofort. Daraufhin hab ich mir 8 rumliegende 
M8 geschnappt und dasselbe Programm draufgebrannt. Mit 2 Stück 
funktionierte die Schaltung wie schon mit dem ursprünglichen M8, ein 
Weiterer tats wenns nicht zu warm war. Dann kamen Experimente mit OSCCAL 
dran, was immerhin 6 Controller zum laufen brachte. Besonders stabil war 
das aber nicht. Schaltung ne Stunde ins Eisfach und nix geht mehr. Quarz 
ist in jedem Fall besser, weil stabiler und reproduzierbar.

bye

Frank

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.