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. ...
Hier steht, wie man den internen RC-Ocillator mitHilfe einen externen Krystal kalibrieren kann. http://www.atmel.com/dyn/resources/prod_documents/doc8002.pdf
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?
sorry, falsche Zeile kopiert. ich meinte es kommt "Writing calibration byte 0x57 to byte address 0x31 in FLASH.. OK"
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? ...
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
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??? ...
Der IO Bereich liegt nicht im gleichen Adressraum wie der Rest. Deswegen kann man da nicht von außen drauf zugreifen.
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
Oha, einen 11 Jahre alten Thread auszubuddeln ist schon fast Rekordverdächtig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.