Forum: Mikrocontroller und Digitale Elektronik ATTiny 2313 Baudrate


von Hans (Gast)


Lesenswert?

Hallo,

ich versuche bei dem ATtiny und dem internen Osscilator (8MHz) eine 
Baudrate von 4800 einzustellen.

Aus dem datenblatt habe ich den Wert 103 (dez.) genommen und in das 
UBRRL geschrieben. Mit dem Ossziloscope messe ich dann eine Frequenz von 
555Hz.

Ich würde mich freuen wenn ihr mir helfen könntet.

Dabke & Grüße

: Verschoben durch User
von g457 (Gast)


Lesenswert?

Der µC läuft mit 1MHz -> Fuses prüfen. Und der interne RC ist für UART 
nur bedingt zu gebrauchen.

von hans (Gast)


Lesenswert?

Hallo,

vielen Dank für deine Antwort. Fuses hatte ich auf 8MHz eingestellt. Das 
der Interne RC etwas ungenauer sein soll habe ich auch gehört aber kann 
man den nicht kallibrieren?

Weißt du wie das geht?

Viele Grüße

von Peter X. (peter_x)


Lesenswert?

Gib mal bei gockel

calibration of internal rc oscillator atmel

ein.

von g457 (Gast)


Lesenswert?

> Fuses hatte ich auf 8MHz eingestellt.

Wenn dem so ist (welchen Wert hat die 'low fuse'?) initialisierst Du die 
UART falsch -> vollständigen Code zeigen.

von (prx) A. K. (prx)


Lesenswert?

hans schrieb:
> Fuses hatte ich auf 8MHz eingestellt.

Und die CKDIV8 Fuse beachtet?

von hans (Gast)


Lesenswert?

Hallo,

C-Code der initialisierung der UART:
1
void iniUART()
2
{// USART initialization
3
// Communication Parameters: 8 Data, 1 Stop, No Parity
4
// USART Receiver: On
5
// USART Transmitter: On
6
// USART Mode: Asynchronous
7
// USART Baud rate: 9600
8
UCSRA=0x00;
9
UCSRB=0x18;//transmitter and receiver enable
10
UCSRC=0x06;//8 data bits and ...
11
UBRRH=0x00;//-|
12
UBRRL=0x10;//-- set baudrate 4800 bei internen 4MHz
13
}

Und die CKDIV8 Fuse beachtet? --> nein, habe ich leider nicht beachtet.

Das LOW Fuse hat lauf AVRStudio den wert 0x44;

Vielen Dank für eure Hilfe. Ich weiß das zu schätzen!!!!!!

Viele Grüße

von janos (Gast)


Lesenswert?

hans schrieb:
> Und die CKDIV8 Fuse beachtet? --> nein, habe ich leider nicht beachtet.
>
> Das LOW Fuse hat lauf AVRStudio den wert 0x44;
>
> Vielen Dank für eure Hilfe. Ich weiß das zu schätzen!!!!!!

Und jetzt? Brichtigt? Geht es jetzt?

von hans (Gast)


Lesenswert?

Hallo,

hast du recht das war echt blöd geantwortet. Nee, läuft noch nicht ich 
versuche gerade zu verstehen wie das mit dem Kalibrieren geht. Ich hoffe 
das das des Rätsels lösung ist.

In wie weit das CKDIV8-Register einzustellen ist habe ich noch nicht 
ganz verstanden.

Vielleicht hat noch jemand einen Tipp. Ich würde mich sehr freuen.

Derzeit sehe ich 2 Möglichkeiten.

- Umstieg auf externen Quarz
- kalibrierung

Vielen Dank noch mal für eure Hilfe!!!!!

von (prx) A. K. (prx)


Lesenswert?

hans schrieb:
> - Umstieg auf externen Quarz

Das löst dein Problem mit der /8 Fuse nicht.

> In wie weit das CKDIV8-Register einzustellen ist habe ich noch nicht
> ganz verstanden.

Die hat 2 Zustände, einer ist richtig, einer ist falsch. ;-)

In beiden funktioniert der AVR, nur eben mit um den Faktor 8 
unterschiedlicher Frequenz. Damit wirst du dich nicht aussperren.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

hans schrieb:
> aber kann
> man den nicht kallibrieren?
>
> Weißt du wie das geht?

Letztendlich musst Du nur den geeigneten Wert ins OSCCAL-Register 
schreiben. Nach dem Einschalten steht da schon ein Wert drin, das ist 
der werksseitig kalibrierte. Der wird jedes mal beim Einschalten wieder 
da reingeschrieben.

Du musst also gleich nach dem Reset Deinen eigenen (selbst ermittelten) 
Wert in dieses Register schreiben, das ist alles. Augenblicklich wird 
sich die Oszillatorfrequenz entsprechend ändern.

Natürlich ist das eigentliche Problem: Wie ermittelst Du diesen Wert, er 
wird bei jedem Exemplar unterschiedlich ausfallen. Wenn Deine Schaltung 
nur ein Einzelstück ist und keine Serienproduktion kannst Du den 
benötigten Wert einmal von Hand per Ausprobieren ermitteln, das wird 
dann perfekt funktionieren bis ans Ende der Zeit.

Wenn es eine Serienproduktion wird dann rate ich DRINGEND dazu 
stattdessen einen Quarz zu nehmen, und zwar einen von den 
Baudratenquarzen mit den "krummen" Frequenzen die sich perfekt auf die 
glatte Baudrate runterteilen lassen (und dann nimm gleich den mit der 
höchsten Frequenz die der Tiny noch kann (18.432MHz?) dann bekommst Du 
auch gleich einen ordentlichen Kick in der Rechenleistung). Du WILLST 
Dir das Problem nicht antun mit dem notwendigen Kalibrieren jedes 
einzelnen Geräts und der möglichen Fehlerquelle einer fehlerhaften 
Kalibrierung, der Kunde wird Dir das um die Ohren hauen wenn solche 
Probleme auftreten und die werden auftreten sobald mehr als nur ne Hand 
voll Geräte gebaut werden.

von John (Gast)


Lesenswert?

AVR054: Run-time calibration of the internal RC oscillator

http://www.atmel.com/Images/doc2563.pdf

von janos (Gast)


Lesenswert?

Bernd K. schrieb:
> Wenn es eine Serienproduktion wird dann rate ich DRINGEND dazu
> stattdessen einen Quarz zu nehmen, und zwar einen von den

Na klar. Klingt nach dem Projekt eines Entwicklers für Serienproduktion. 
Falls nicht, reicht vor allem bei den niedrigen Baudraten wie 4800 der 
interne Oszillator.

von g457 (Gast)


Lesenswert?

> Das LOW Fuse hat lauf AVRStudio den wert 0x44;

Freut mich, dass Du inzwischen erkannt hast, Dass die Fuses wirklich 
falsch sind.

> Falls nicht, reicht vor allem bei den niedrigen Baudraten wie 4800 der
> interne Oszillator.

Nicht ohne Kalibrieriung. Falls des TOs Messung richtig ist und er 555 
Bd statt der eingestellten 600 Bd bekommt, dann liegt er um immerhin 
fast 8% daneben - das schluckt ein normales(tm) Gegenüber 
normalerweise(tm) nicht mehr.

von Falk B. (falk)


Lesenswert?

@ janos (Gast)

>Falls nicht, reicht vor allem bei den niedrigen Baudraten wie 4800 der
>interne Oszillator.

Und noch Einer, der die Prozentrechnung nicht verstanden hat.

5% Fehler sind immer 5% Fehler, egal ob bei 4800 oder 115200 Baud.
Ich hab mit Kalibrierung auch schon 115200 Baud benutzt, alles kein 
Thema.

von janos (Gast)


Lesenswert?

Falk Brunner schrieb:
> @ janos (Gast)
> 5% Fehler sind immer 5% Fehler, egal ob bei 4800 oder 115200 Baud.

Wenn die Gegenstelle auch einer Toleranz unterliegt, wird der Grat, bei 
dem sich beide treffen, bei hohen Baudraten schmaler!?

von hans (Gast)


Lesenswert?

Hallo,

ich trau mich kaum zu fragen aber welches Register verbirgs sich hinter 
dem "Fuses LOW"? Ist das das CLKPR Register? Und wird dadurch die 
Frequent für den gesamten Kontroller herunter geteilt?

Welches wäre denn der richtige Wert für dieses Register?

Bitte steinigt mich nicht. (ist doch bald Weihnachten) ;-)

Grüße an alle.

von hans (Gast)


Lesenswert?

Hallo,

ahh ich habe glaube ich die Stelle über die Fuse Bytes im Datenblatt 
gefunden, sorry.

Melde mich gleich wieder, obs mir geholfen hat. ;-)

Grüße

von hans (Gast)


Lesenswert?

Hallo,

Ok ich denke ich habe das mit den Fuse Bytes verstanden. Die Fuse 
Byte/Bits configurieren unter anderem welche Quelle für den SystemClock 
verwendet wird oder den Divisor8.

Was mir aber derzeit noch nicht so ganz klar ist, ist das ich nun bei 
einem externen Quarz (7,3...MHz) in das UBRRL Register eine 5 eintragen 
musste um auf 9600 Baud zu kommen. Im datenblatt steht 47 oder 95. Also 
muss irgendwo noch ein teiler sein der die externe Frequenz runter 
teilt. Könnte das das  CLKPR Register sein?

Grüße Hans

von Bernd K. (prof7bit)


Lesenswert?

janos schrieb:
> allem bei den niedrigen Baudraten

Das hat nichts mit der Baudrate zu tun.

von g457 (Gast)


Lesenswert?

> Was mir aber derzeit noch nicht so ganz klar ist, ist das ich nun bei
> einem externen Quarz (7,3...MHz) in das UBRRL Register eine 5 eintragen
> musste um auf 9600 Baud zu kommen. Im datenblatt steht 47 oder 95.

Welchen Wert hat die low fuse jetzt? Hast Du die CKDIV8 auf 1(!) 
gesetzt?

von spess53 (Gast)


Lesenswert?

Hi

>Was mir aber derzeit noch nicht so ganz klar ist, ist das ich nun bei
>einem externen Quarz (7,3...MHz) in das UBRRL Register eine 5 eintragen
>musste um auf 9600 Baud zu kommen.

Wie kommst du auf 5?

MfG Spess

von g457 (Gast)


Lesenswert?

> Wie kommst du auf 5?

Er stellt (imaginär) 76800 Bd ein um auf 9600 Bd zu kommen -> Der 
Systemtakt läuft immernoch um Faktor 8 zu langsam. Ich vermute der TO 
ist gerade damit beschäftigt, die CKDIV8 zu löschen.

von hans (Gast)


Lesenswert?

Hallo,

laut AVRStudio steht im LOW Fuses Byte der Wert 0x7D; das bedeutet ja 
das der CKDIV8 Bit auf 0 gesetzt ist. Aber welcher Teiler ist dann 
gesetzt?

Danke für die Hilfe!!!!!

Viele Grüße

von g457 (Gast)


Lesenswert?

> das bedeutet ja das der CKDIV8 Bit auf 0 gesetzt ist.

Ja, und das ist falsch.

von hans (Gast)


Lesenswert?

Hallo,

"Ich vermute der TO ist gerade damit beschäftigt, die CKDIV8 zu 
löschen."

Was bedeutet der TO?

Grüße Hans

von g457 (Gast)


Lesenswert?

> Was bedeutet der TO?

"ThreadOpener" aka "Frederöffner", also Du. Hast Du CKDIV8 inzwischen 
gelöscht?

von Bernd K. (prof7bit)


Lesenswert?

hans schrieb:
> laut AVRStudio steht im LOW Fuses Byte der Wert 0x7D; das bedeutet ja
> das der CKDIV8 Bit auf 0 gesetzt ist.

0 bedeutet: gesetzt!

Hier zwei wichtige nützliche Webseiten für Dich:

http://www.engbedded.com/fusecalc/
http://wormfood.net/avrbaudcalc.php

von hans (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für eure Hilfe. Nun scheint alle so zu funktionieren wie es 
das Datenbaltt vorgibt. Top!!!!!

Ich allen schöne Feiertage. Noch mal vielen Dank such für eure Geduld. 
;-)

Viele Grüße

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.