Forum: Mikrocontroller und Digitale Elektronik Atmega8 OSCCAL


von Fire Eagle (Gast)


Lesenswert?

Hallo!

Ich möchte meinen Atmega mit 8Mhz internem RC-Oszillator betreiben.
Der hat aber nach dem Reset in OSCCAL den Wert für 1Mhz. Jetzt müsste 
ich dazu das "Signature High Byte" der Adresse 0x0003 auslesen.
Wie komme ich an diese Werte (mit AVRDude)?
Sind das die High8-bit der Device-Signatur (aber die Signatur ist ja nur 
0x00-0x02)?

Danke!

von Konrad S. (maybee)


Lesenswert?

OSCCAL ist die falsche Baustelle.
Sieh mal im Datenblatt vom ATmega8 nach bei "Calibrated Internal RC 
Oscillator" (Seite 30). Tabelle 9 listet die CKSEL3..0-Werte.

von Fire Eagle (Gast)


Lesenswert?

Hallo!

Ist mir schon klar, wie ich die 8Mhz einstelle. Ich wollte nur den zu 
den 8Mhz passenden Kalibrierungwert auslesen und in OSCCAL schreiben.
Ich wollte das einfach mal interessehalber ausprobieren. Sonst nehm ich 
eh einen Quarz, wenn der Takt genau sein soll.

von Dopplereffekt (Gast)


Lesenswert?

Den Wert musst du selbst bestimmen und setzen, siehe hier 
(http://www.atmel.com/Images/doc2555.pdf).

von Hannes L. (hannes)


Lesenswert?

Dopplereffekt schrieb:
> Den Wert musst du selbst bestimmen und setzen, siehe hier

Ja eben, deshalb will er ja wissen, wie man das Calibrationsbyte für 
8MHz per AVRDUDE aus dem High-Byte der Adresse 3 des Signature-Bereichs 
ausliest.

Mit AVR-Studio4 ist das kein Akt, mit meinem Eigenbau-Brenner war das 
auch kein Akt, denn die Befehlssequenz steht haargenau im Datenblatt des 
Mega8. Wie man das per Dude macht, kann ich Dir leider nicht sagen, ich 
benutze den Dude nicht. Vielleicht steht's ja in der Doku...

...

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hannes Lux schrieb:
> Ja eben, deshalb will er ja wissen, wie man das Calibrationsbyte für
> 8MHz per AVRDUDE aus dem High-Byte der Adresse 3 des Signature-Bereichs
> ausliest.

"man avrdude" fördert das hier zutage:
1
 -U memtype:op:filename[:format]
2
         Perform a memory operation as indicated.  The memtype field specifies the memory type to operate
3
         on.  The available memory types are device-dependent, the actual configuration can be viewed with
4
         the part command in terminal mode.  Typically, a device's memory configuration at least contains
5
         the memory types flash and eeprom.  All memory types currently known are:
6
         calibration  One or more bytes of RC oscillator calibration data.
7
         eeprom       The EEPROM of the device.
8
         efuse        The extended fuse byte.
9
         flash        The flash ROM of the device.
10
         fuse         The fuse byte in devices that have only a single fuse byte.
11
         hfuse        The high fuse byte.
12
         lfuse        The low fuse byte.
13
         lock         The lock byte.
14
         signature    The three device signature bytes (device ID).
15
         fuseN        The fuse bytes of ATxmega devices, N is an integer number for each fuse supported by
16
                      the device.
17
         application  The application flash area of ATxmega devices.
18
         apptable     The application table flash area of ATxmega devices.
19
         boot         The boot flash area of ATxmega devices.
20
         prodsig      The production signature (calibration) area of ATxmega devices.
21
         usersig      The user signature area of ATxmega devices.

Es muss also "prodsig" als "memtype" angegeben werden. Auf diese Weise 
liest man den Kalibrierungswert aus und schreibt ihn (ebenfalls mit 
AVRDUDE) ins EEPROM. Das Programm auf dem Mikrocontroller kann sich dann 
den Wert aus dem EEPROM holen und ihn ins Register OSCCAL schreiben. 
Sinnigerweise sollte man das Fusebit EESAVE auf 0 setzen, damit der 
EEPROM-Inhalt beim späteren Neuschreiben des Flashspeichers nicht 
verloren geht.

Alternativ kann man den Kalibrierungswert natürlich auch gleich als 
Konstante ins Programm schreiben. Das muss man aber für jeden Chip 
einzeln machen, wenn das Programm auf mehreren Mikrocontrollern mit 
kalibriertem 8-MHz-Oszillator laufen soll.

Ein dritter Weg wäre, den Mikrocontroller per Programm sich selbst 
kalibrieren zu lassen. Dazu muss man ihm einmal eine konstante 
Zeitquelle per I/O-Pin zur Verfügung stellen.

von R. M. (rmax)


Lesenswert?

Markus W. schrieb:
> Es muss also "prodsig" als "memtype" angegeben werden.

Es geht um einen ATmega8, da ist es "calibration", nicht "prodsig".

von Anton (Gast)


Lesenswert?

Bei den (neueren) ATMEGAS, die ich kenne, wird der von der Factory
vorkalibrierte Wert bei jedem Reset ins OSCAL geschrieben.
OSCAL läßt sich per in-Befehl auslesen.
Man kann jederzeit, eine stabile Refernz vorausgesetzt, den
internen Oscillator über OSCAL nachjustieren.

Hatte erst vor kurzem bei einem Tiny44 Versuche diesbezüglich
unternommen. Eine Stufe waren so 40kHz beim 8MHz Oszillator.
Und Vorsicht Oscal kennt 2 Bereiche: 0...127 und 128...255,
die sich etwas überlappen, ein Blick isn DB ist dringend nötig!

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

R. Max schrieb:
> Markus W. schrieb:
>> Es muss also "prodsig" als "memtype" angegeben werden.
>
> Es geht um einen ATmega8, da ist es "calibration", nicht "prodsig".

Du hast völlig Recht, "prodsig" ginge zwar auch (darin enthalten sind 
die Signatur und die Kalibrierungsbytes), aber "calibration" wäre in 
diesem Fall einiges einfacher.

Anton schrieb:
> Bei den (neueren) ATMEGAS, die ich kenne, wird der von der Factory
> vorkalibrierte Wert bei jedem Reset ins OSCAL geschrieben.

Ja, das ist auch bei den alten der Fall. Übernommen wird aber immer nur 
die Kalibrierung für den Default-Oszillator, das ist beim ATmega8 der 
1-MHz-Oszillator. Der TO will aber den 8-MHz-Oszillator verwenden.

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.