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
> 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.
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 ?
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.
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
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
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.
...
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?
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?
...
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
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.
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
> 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???
...
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)
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