Forum: Mikrocontroller und Digitale Elektronik Oscillator Calibration Byte


von Jenz (Gast)


Lesenswert?

Hallo.

Weiss jemand wozu die Option "Oscillator Calibration Byte" im AVR
Studio da ist ? Wiso kann man da Nochmal zwischen verschidenen
Frequenzen wählen ? (kann man doch bei den fuses auch)
Und was ist die Write Adress (und flash / eeprom) die man da einstellen
kann ?

MfG

von Rolf Magnus (Gast)


Lesenswert?

> Weiss jemand wozu die Option "Oscillator Calibration Byte" im AVR
Studio da ist ?

Steht im Controller-Datenblatt:

"During reset, hardware loads the calibration byte into the OSCCAL
Register and thereby automatically calibrates the RC Oscillator. At 3V
and 25°C, this calibration gives a frequency within ± 10% of the
nominal frequency. Using calibration methods as described in
application notes available at www.atmel.com/avr it is possible
to achieve ± 3% accuracy at any given VCC and Temperature.

von Jenz (Gast)


Lesenswert?

Aha also um den internen RC Oscillator genauer zu bekommen sind die
Werksseitig gesetzt oder wie ? Und warum kann mann da noch flash und
eeprom auswählen ?

von Rolf Magnus (Gast)


Lesenswert?

Sie sind nicht nur werksseitig gesetzt, sondern können nachher auch noch
verstellt werden, da es eben auch auf die Spannung und Temperatur am
Einsatzort ankommt.
Was es mit der Adresse auf sich hat, weiß ich auch nicht. Vielleicht
ist die Adresse gemeint, an der dieses Byte steht.

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Die Adresse ist dazu da den Wert für das Calibrationbyte dem Programm
zugänglich zu machen. Das Byte muss nach RESET von dort gelesen werden
und das Calibrationbyteregister damit geladen werden.

Mfg HG

von gerd (Gast)


Lesenswert?

Hallo,

beim ATtiny12 muss man in der Tat das OSCCAL Byte lesen, an eine
beliebige Adresse im Flash schreiben, das mittels LPM auslesen und in
das OSCCAL-Register schreiben. Bei den ATmega-Typen entfällt das, weil
die das selbst schon tun. Also erst Handbuch lesen, dann
Programmieren!

mfg
gerd

von ...HanneS... (Gast)


Lesenswert?

Die meisten ATMegas kalibrieren beim Reset nur dann selbst, wenn sie per
Fuse auf 1MHz eingestellt sind. Bei 2, 4 oder 8 MHz muss von Hand
kalibriert werden, so wie auch bei ATTiny12/15.

Da ATMEL das Calibrationsbyte jedes (calibrierbaren) AVRs zusätzlich in
das Low-Byte und H-Byte des letzen Wortes des Flash schreibt (geht aber
beim ersten Löschen verloren), nutze ich diesen Bereich (2*FLASHEND)
auch für das Calibrationsbyte. Per Programmersoftware wird das
Calibrationsbyte aus dem Signaturespace ausgelesen und ins Low-Byte des
letzten Wortes ins Flash geschrieben, in der Reset-Routine des
AVR-Programms wird dann dieses Byte per LPM gelesen und nach OSCCAL
ausgegeben. Damit kalibriert das AVR-Programm bei jedem Start den AVR
neu, ohne dass das (individuelle) Calibrationsbyte jedes AVRs in das
AVR-Programm assembliert bzw. compiliert werden muss.

Die Calibrationsroutine ist in eine Include-Datei ausgelagert, damit
ich sie nicht jedesmal neu eintippen oder einkopieren muss. Sie sieht
bei mir so aus:

;--- Calibration des internen RC-Oszillators.
;    Kann bei Betrieb mit Quarz entfallen...
;
;Das Calibrationsbyte muss von der Programmer-Software aus dem
;Signature-
;Bereich des AVR gelesen werden und in das Low-Byte der letzten
;Flash-Zelle geschrieben werden.

;Beim Tiny26 muss der Bezeichner "flashend" definiert werden,
;da dies in der "tn26def.inc" vergessen wurde.

 ldi zl,low(2*flashend)     ;Adresse auf Kalibrationsbyte L
 ldi zh,high(2*flashend)    ;und H
 lpm                        ;Kalibrationsbyte lesen
 ser zl                     ;Referenz für Vergleich auf Gültigkeit
 cpse r0,zl                 ;Kalibrationsbyte gültig? (nein wenn $ff)
 out osccal,r0              ;ja, Chip kalibrieren...
;--- Ende Calibration...

Diese Include benutze ich bei Tinys und Megas.

...

von Nour (Gast)


Lesenswert?

Hier steht, wie man den internen RC-Ocillator mitHilfe einen externen 
Krystal kalibrieren kann.

http://www.atmel.com/dyn/resources/prod_documents/doc8002.pdf

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

ich habe mich versucht in diesen alten Thread ein zu lesen, aber ich 
verstehs nicht. ich will meinen RC Oscillator kalibrieren. per Software 
gehts, aber im AVR Studio nicht.
wie im Screenshot zu sehen klicke ich auf "Read", dann liest er mir den 
Value 0x57 aus. bei Address gebe ich 0x31 ein (OSCCAL-Registeradresse). 
wenn ich auf "Write" klicke kommt wie unten zu sehen "Reading 
calibration byte .. 0x57 .. OK!".
ich kann den "Value" aber nicht verändern - das Textfeld ist irgendwie 
gesperrt... weiß jemand warum?

von Daniel (Gast)


Lesenswert?

sorry, falsche Zeile kopiert. ich meinte es kommt "Writing calibration 
byte 0x57 to byte address 0x31 in FLASH.. OK"

von Hannes L. (hannes)


Lesenswert?

Daniel schrieb:
> ich habe mich versucht in diesen alten Thread ein zu lesen, aber ich
> verstehs nicht. ich will meinen RC Oscillator kalibrieren. per Software
> gehts, aber im AVR Studio nicht.
> wie im Screenshot zu sehen klicke ich auf "Read", dann liest er mir den
> Value 0x57 aus. bei Address gebe ich 0x31 ein (OSCCAL-Registeradresse).

Du kannst das Byte vom PC aus nicht in den I/O-Bereich kopieren, nur in 
den Flash oder in den EEPROM. Um es in den I/O-Bereich (nach OSCCAL) zu 
bringen, brauchst Du ein Stück (selbstgeschriebene) AVR-Software (die im 
AVR läuft), die das Byte vom vereinbarten Ort (Adresse im EEPROM oder 
Flash) ausliest, ggf. auf Plausiblität prüft und nach osccal schreibt.

In meinem obigen Beitrag:
Beitrag "Re: Oscillator Calibration Byte"
ist ein solches Programmstück zu finden. Es holt das Kalibrationsbyte 
aus dem L-Byte der letzten adressierbaren Speicherzelle im Flash (also 
dem Ort, den ich für AVR-Studio und AVR-Programm vereinbart habe) und 
schreibt es nach OSCCAL, falls es einen anderen Wert als $FF (leere 
Flash-Zelle) hat. Damit das funktioniert, muss man es natürlich mit dem 
PC-Programm (AVR-Studio) an das L-Byte der letzten Adresse schreiben. 
Ich wählte diese Adresse, weil Atmel bei werksneuen AVRs (natürlich nur 
bei den Typen, die man noch selbst kalibrieren muss) das 
Calibrationsbyte auch an diese Adresse(n) schreibt. Bei den meisten 
Programmern wird dies allerdings beim ersten Flashen gelöscht... ;-(

> wenn ich auf "Write" klicke kommt wie unten zu sehen "Reading
> calibration byte .. 0x57 .. OK!".
> ich kann den "Value" aber nicht verändern - das Textfeld ist irgendwie
> gesperrt... weiß jemand warum?

...

von avr (Gast)


Lesenswert?

In einigen AVRs gibt es mehrere Werte (vom Werk eingemessen), nur
einer wird beim Reset verwendet. Hier der Mega8:
1
The ATmega8 stores four different calibration values for the internal RC Oscillator. These bytes
2
resides in the signature row High byte of the addresses 0x0000, 0x0001, 0x0002, and 0x0003
3
for 1, 2, 4, and 8 Mhz respectively. During Reset, the 1 MHz value is automatically loaded into
4
the OSCCAL Register. If other frequencies are used, the calibration value has to be loaded
5
manually, see Oscillator Calibration Register  OSCCAL on page 31 for details.

Will man einen anderen Wert verwenden muß man diesen im Programm
kennen.
Man kann ihn natürlich in das Programm schreiben (ist aber
bei jedem IC ein anderer Wert möglich/nötig) oder läst ihn
vom Studio automatisch im EEProm oder Flash ablegen wo er vom
Programm gelesen werden kann.
Dann im Programm das OSCCAL mit diesem Wert laden.

avr

von Daniel (Gast)


Lesenswert?

ich habe doch geschrieben, dass ich es per Software hinbekomme...
ich würde es nur zum "probieren" auch gern im AVR Studio machen und ich 
verstehe nicht warum man das Byte vom PC aus nicht in den I/O-Bereich 
kopieren kann wenn doch es doch ein "Write"-Button gibt.

von spess53 (Gast)


Lesenswert?

Hi

>ich verstehe nicht warum man das Byte vom PC aus nicht in den I/O-Bereich...

Mit dem AVR-Studio kannst du das Calbrationm-Byte entweder in den Flash 
oder ins EEPROM kopieren. Der I/O-Bereich liegt aber weder im Flash noch 
im EEPROM.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

> verstehe nicht warum man das Byte vom PC aus nicht in den I/O-Bereich
> kopieren kann wenn doch es doch ein "Write"-Button gibt.

Muss ich das JETZT verstehen???

...

von Simon K. (simon) Benutzerseite


Lesenswert?

Der IO Bereich liegt nicht im gleichen Adressraum wie der Rest. Deswegen 
kann man da nicht von außen drauf zugreifen.

von Kahn P. (Gast)


Lesenswert?

Ja die Funktion sollte auch immer wieder aufgerufen werden,
denn je nach Temperatur verstellt sich das Teil (intern Christal)

Der Code gekapert aus V-USB lässt meinen Atiny85 am USB mit 20 Mhz
laufen F_CPU = 200000000
1
; extern unsigned usbMeasurePacketLength(void);
2
; returns time between two idle strobes in multiples of 7 CPU clocks
3
.global usbMeasureFrameLength
4
usbMeasureFrameLength:
5
    ldi     cntH, 6         ; wait ~ 10 ms for D- == 0
6
    clr     cnt16L
7
    clr     cnt16H
8
usbMFTime16:
9
    dec     cntH
10
    breq    usbMFTimeout
11
usbMFWaitStrobe:            ; first wait for D- == 0 (idle strobe)
12
    sbiw    cnt16, 1        ;[0] [6]
13
    breq    usbMFTime16     ;[2]
14
    sbic    USBIN, USBMINUS ;[3]
15
    rjmp    usbMFWaitStrobe ;[4]
16
usbMFWaitIdle:              ; then wait until idle again
17
    sbis    USBIN, USBMINUS ;1 wait for D- == 1
18
    rjmp    usbMFWaitIdle   ;2
19
    ldi     cnt16L, 1       ;1 represents cycles so far
20
    clr     cnt16H          ;1
21
usbMFWaitLoop:
22
    in      cntH, USBIN     ;[0] [7]
23
    adiw    cnt16, 1        ;[1]
24
    breq    usbMFTimeout    ;[3]
25
    andi    cntH, USBMASK   ;[4]
26
    brne    usbMFWaitLoop   ;[5]
27
usbMFTimeout:
28
#if resL != cnt16L
29
    mov     resL, cnt16L
30
    mov     resH, cnt16H
31
#endif
32
    ret


1
void  calibrateOscillator(void)
2
{
3
  uchar       step = 128,trialValue = 0, optimumValue;
4
  int         x, optimumDev, targetValue = (unsigned)(1499 * (double)F_CPU / 10.5e6 + 0.5);
5
6
  cli();
7
8
    do{ OSCCAL = trialValue + step;
9
        x = usbMeasureFrameLength(); //proportional to current real frequency
10
        if(x < targetValue) trialValue += step; //frequency still too low   
11
        step >>= 1;
12
    }while(step > 0);
13
14
    optimumValue = trialValue;
15
    optimumDev   = x; //this is certainly far away from optimum
16
    for(OSCCAL   = trialValue - 1; OSCCAL <= trialValue + 1; OSCCAL++)
17
  {
18
       x = usbMeasureFrameLength() - targetValue;
19
       if(x < 0) x = -x;
20
       if(x < optimumDev) optimumDev = x,optimumValue = OSCCAL;
21
    }
22
23
    OSCCAL = optimumValue;
24
25
  sei();
26
}

used here too: http://www.visiongrid.de/keymandongle.html

Recht fusselig das alles zu analysieren, es wirkt vertrau vorraus.
 Gruß
  K aus B

von guest (Gast)


Lesenswert?

Oha, einen 11 Jahre alten Thread auszubuddeln ist schon fast 
Rekordverdächtig.

von Maik Jakob (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade in dieses Thema einzulesen,
habe dabei aber einige Fragen, die sich mir noch nicht ganz erschließen:

Es geht dabei um ATTiny2313A und oder ATTiny85

ich habe vor einen seriellen Datenstrom auszuwerten und in Ermangelung 
weiterer Zeitreferenzen gleich das Timing dieser seriellen Daten zur 
Calibrierung zu nutzen.

Da es in der gesamten Anwendung nicht nur um korrekten Empfang der 
seriellen Daten geht, bevorzuge ich im Moment noch die Lösung meine 
Messergebnisse zur Calibrierung des Oszilators zu nutzen.

Wenn ich alles gelesene bisher richtig verstanden habe, dann:

- merkt sich der ATTiny den letzten geschriebenen Kalibrierwert nicht 
von allein über Aus-Einschalten, wenn ich das wollte, müsste ich das 
selbst mit einem EEPROM oder Flash-Byte machen?

- kann ich problemlos so oft wie ich will ständig neue kleine 
Korrekturen in OSCCAL schreiben, weil das nur flüchtige Werte sind?

Die Alternative die ich im Moment noch sehe wäre, meine Messergebnisse 
für die Korrektur von Baudrate und Timerwerten zu verwenden, da ich aber 
115200Bd brauche geht das vermutlich nicht wirklich.

mfg. Maik

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.