www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Oscillator Calibration Byte


Autor: Jenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Nour (Gast)
Datum:

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

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

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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?

...

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einigen AVRs gibt es mehrere Werte (vom Werk eingemessen), nur
einer wird beim Reset verwendet. Hier der Mega8:
The ATmega8 stores four different calibration values for the internal RC Oscillator. These bytes
resides in the signature row High byte of the addresses 0x0000, 0x0001, 0x0002, and 0x0003
for 1, 2, 4, and 8 Mhz respectively. During Reset, the 1 MHz value is automatically loaded into
the OSCCAL Register. If other frequencies are used, the calibration value has to be loaded
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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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???

...

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Karsten Schulz (kahnsoft)
Datum:

Bewertung
0 lesenswert
nicht 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
; extern unsigned usbMeasurePacketLength(void);
; returns time between two idle strobes in multiples of 7 CPU clocks
.global usbMeasureFrameLength
usbMeasureFrameLength:
    ldi     cntH, 6         ; wait ~ 10 ms for D- == 0
    clr     cnt16L
    clr     cnt16H
usbMFTime16:
    dec     cntH
    breq    usbMFTimeout
usbMFWaitStrobe:            ; first wait for D- == 0 (idle strobe)
    sbiw    cnt16, 1        ;[0] [6]
    breq    usbMFTime16     ;[2]
    sbic    USBIN, USBMINUS ;[3]
    rjmp    usbMFWaitStrobe ;[4]
usbMFWaitIdle:              ; then wait until idle again
    sbis    USBIN, USBMINUS ;1 wait for D- == 1
    rjmp    usbMFWaitIdle   ;2
    ldi     cnt16L, 1       ;1 represents cycles so far
    clr     cnt16H          ;1
usbMFWaitLoop:
    in      cntH, USBIN     ;[0] [7]
    adiw    cnt16, 1        ;[1]
    breq    usbMFTimeout    ;[3]
    andi    cntH, USBMASK   ;[4]
    brne    usbMFWaitLoop   ;[5]
usbMFTimeout:
#if resL != cnt16L
    mov     resL, cnt16L
    mov     resH, cnt16H
#endif
    ret


void  calibrateOscillator(void)
{
  uchar       step = 128,trialValue = 0, optimumValue;
  int         x, optimumDev, targetValue = (unsigned)(1499 * (double)F_CPU / 10.5e6 + 0.5);

  cli();

    do{ OSCCAL = trialValue + step;
        x = usbMeasureFrameLength(); //proportional to current real frequency
        if(x < targetValue) trialValue += step; //frequency still too low   
        step >>= 1;
    }while(step > 0);

    optimumValue = trialValue;
    optimumDev   = x; //this is certainly far away from optimum
    for(OSCCAL   = trialValue - 1; OSCCAL <= trialValue + 1; OSCCAL++)
  {
       x = usbMeasureFrameLength() - targetValue;
       if(x < 0) x = -x;
       if(x < optimumDev) optimumDev = x,optimumValue = OSCCAL;
    }

    OSCCAL = optimumValue;

  sei();
}

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

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

: Bearbeitet durch User
Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, einen 11 Jahre alten Thread auszubuddeln ist schon fast 
Rekordverdächtig.

Autor: Maik Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.