Forum: Mikrocontroller und Digitale Elektronik AVR Studio, Atmel ICE und die unsägliche Oszillatorkalibrierung


von E. S. (ede_wolf)


Lesenswert?

Hallo zusammen,

Ich bräuchte mal einen Tip oder ein Statement ob es möglich ist...
Im Programmerdialog des AVR Studio kann man über den Atmel ICE  aus dem 
Signaturbereich die Kalibrierungsbytes für die möglichen Frequenzen des 
internen RC-Oszillators auslesen und an eine beliebige Speicherzelle des 
Flash oder EEPROMs schreiben um es dann von dort im Programmcode in das 
OSCCAL-Register zu transferieren und damit den RC-Oszillator auf eine 
relativ genaue Arbeitsfrequenz zu trimmen.
So weit so gut. Wenn ich nun einige Dutzend von den AVR zu brennen habe, 
ist diese manuelle Vorgehensweise doch recht lästig, aufwendig und 
zeitraubend. Das muss sich doch automatisieren lassen. Fuses lassen sich 
doch auch aus dem Quellcode schreiben ... .elf-File?, ... Makefile?... 
Was Studio und der ICE manuell kann, muss sich doch automatisieren 
lassen. Insbesondere etwas von dem man liest, dass es einige Programmer 
beherrschen sollen. Leider liest man nie welche!
Google hat mich nicht weitergebracht. Vielleicht könnt ihr mir helfen 
wie's automatisch geht ???

Danke schon mal
Ede_Wolf

PS:ATMega16A

von spess53 (Gast)


Lesenswert?

Hi

Dann papp einfach einen Quarz oder REsunator dran.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

REsunator -> Resonator

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die im Atmel gespeicherten Kalibrierbytes werden doch automatisch beim 
Reset in das OSCCAL eingetragen. Nur wenn Du es besser als die Fabrik 
mache willst, kannst Du die Teile ausmessen und manuell kalibrieren. 
Oder Du machst es zur Laufzeit mit einem externen Referenztakt von einem 
UART oder einem anderen zeitstabilen Signal, dessen Periode Du mit der 
internen Zeit vergleichst und entsprechend gegensteuerst.

von E. S. (ede_wolf)


Lesenswert?

Aähmmm, ... ich hatte vergessen hinzuzufügen dass die Frage sich auf die 
Automatisierung zum Einfügen des Osccal- Bytes beim Programmieren 
bezieht und nicht auf das mögliche nachträgliche Einfügen von Quarzen 
oder Resonatoren in fertige Hardware !?!?
Ja, es wird ein Kalibrierungwert beim Reset in das OSCCAL eingetragen. 
Aber eben nur der für die Taktfrequenz von 1MHz. Wenn ich 8 MHz benutze, 
muss ich den Kalibrierungswert selbst manuell einfügen. -> So sagt 
zumindest das Datenblatt.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Schau mal in einen fabrikneuen AVR, da stehen schon die Kalibrierbytes 
am Ende des Flash und des EEPROM.
Du darfst nur vor dem Programmieren nicht löschen, dann bleiben sie 
erhalten.

von Bernd K. (prof7bit)


Lesenswert?

Also ich meine mich dunkel erinnern zu können daß der avrdude einen 
Kommandozeilenswitch hat der sich darauf bezieht, hab das aber nie 
selbst angewendet.

Ich war einmal in der Verlegenheit das OSCCAL verwenden zu müssen, da 
hab ichs dann am Ende ganz pragmatisch so gelöst daß das Gerät sich beim 
Einschalten selbst kalibrieren konnte anhand eines von außen angelegten 
Signals bekannter Pulslänge, das hat es gemessen und seinen OSCCAL 
entsprechend korrigiert. Das wurde ganz am Schluss mit dem fertig 
aufgebauten Gerät im Rahmen des Endtests durchgeführt, das 
Kalibriersignal wurde bequemerweise mit dem ohnehin in dem Moment 
angeschlossenen PC-USB-UART generiert, also keine zusätzliche Hardware 
nötig.

: Bearbeitet durch User
von E. S. (ede_wolf)


Lesenswert?

Thomas E. schrieb im Beitrag #4912290:
> E. S. schrieb:
>> Aähmmm, ... ich hatte vergessen hinzuzufügen
>
> Du hast vor allen Dingen vergessen, hinzuzufügen, welchen Sinn das haben
> soll. Das erschließt sich nämlich niemandem.

Hm, ...ich möchte die von Atmel bei der Herstellung ermittelten und 
mitgegebenen  Korrekturwerte für Kalibrierung des RC-Oszillators 
benutzen um einen einigermaßen genauen Takt zu haben, der ansonsten ohne 
Benutzen dieser Korrektur erheblich abweichen kann. Für Timingaufgaben 
in meiner Anwendung ist DIESE Korrektur ausreichend. Ohne diese Maßname 
NICHT. Ich will es nur nicht JEDES MAL MANUELL machen müssen.
Warum erschließt sich das niemand ?? Bin ich zu blöd das zu erklären?

Also nochmal: Nur DAS und nichts anderes möchte ich wissen: Gibt es im 
AVR-Studio mit Atmel ICE beim Programmieren des ATMega16A eine 
Möglichkeit das OSCCAL Korrekturbyte für 8MHz AUTOMATISCH auszulesen und 
an eine Speicheradresse im Flash oder EEPROM zu schreiben? Wie das 
angeblich einige andere Programmer können.

von Bernd K. (prof7bit)


Lesenswert?

E. S. schrieb:
> eine
> Möglichkeit das OSCCAL Korrekturbyte für 8MHz AUTOMATISCH auszulesen und
> an eine Speicheradresse im Flash oder EEPROM zu schreiben?

Wozu? Das steht doch zur Laufzeit schon im OSCCAL-Register?

von Peter D. (peda)


Lesenswert?

Bernd K. schrieb:
> Wozu? Das steht doch zur Laufzeit schon im OSCCAL-Register?

Die alten AVRs haben noch 4 Cal-Bytes. Aber wie gesagt, die stehen ab 
Werk schon im Flash/EEPROM. Einfach nur das Häckchen beim Löschen 
rausmachen vor dem Programmieren.

von E. S. (ede_wolf)


Lesenswert?

Peter D. schrieb:
> Schau mal in einen fabrikneuen AVR, da stehen schon die Kalibrierbytes
> am Ende des Flash und des EEPROM.
> Du darfst nur vor dem Programmieren nicht löschen, dann bleiben sie
> erhalten.

Danke Peter,
Ja, bei Fabrikneuen soll das so sein, wobei es scheinbar aber bei den 
ATMEGA16A mit denen ich's hier zu tun habe scheinbar nicht so zu sein 
scheint. ...Vorsichtig ausgedrückt weil ich es nicht selbst verifiziert 
habe.
Das ist aber noch nicht mal das Hauptproblem, sondern dass ich viel 
Updates machen muss, und da geht's nicht ohne vorheriges Löschen.

von spess53 (Gast)


Lesenswert?

Hi

>Gibt es im
>AVR-Studio mit Atmel ICE beim Programmieren des ATMega16A eine
>Möglichkeit das OSCCAL Korrekturbyte für 8MHz AUTOMATISCH auszulesen und
>an eine Speicheradresse im Flash oder EEPROM zu schreiben? Wie das
>angeblich einige andere Programmer können.

Im 4er-Studio gibt es unter unter 'Auto' im Programmer-Dialog einen 
Punkt
'Write osc. cal. byte'. Das sollte es eigentlich sein. Habe ich aber 
noch nie benutzt.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

E. S. schrieb:
> und da geht's nicht ohne vorheriges Löschen.

Irgendwer versteht hier etwas nicht. Vielleicht bin ich das ja.

Aber bei den mir bekannten AVRs, der Atmega16 gehört nicht dazu, wird 
das OSCAL nicht gelöscht. Weder mit Eeprom- noch mit Flash-Erase.

Das wäre nach meinem Dafürhalten auch ziemlich bescheuert, das da als 
Werkskalibrierung reinzuschreiben und es dann bei der Standardprozedur 
Erase before Programming zu löschen.

: Bearbeitet durch User
von E. S. (ede_wolf)


Lesenswert?

Thomas E. schrieb im Beitrag #4912332:
> Bernd K. schrieb:
>> Wozu? Das steht doch zur Laufzeit schon im OSCCAL-Register?
>
> Irgendwie scheint da jemand ganz gewaltig auf dem Holzweg zu sein.

ATMEGA16A Datasheet Kapitel 26.4

The ATmega16A stores four different calibration values for the internal 
RC Oscillator. Thesebytes resides in the signature row High Byte of the 
addresses 0x0000, 0x0001, 0x0002, and0x0003 for 1, 2, 4, and 8 Mhz 
respectively. During Reset, the 1 MHz value is automaticallyloaded into 
the OSCCAL Register. If other frequencies are used, the calibration 
value has to beloaded manually, ....

von Thomas E. (thomase)


Lesenswert?

E. S. schrieb:
> If other frequencies are used, the calibration
> value has to beloaded manually, ....

OK. Das erklärt einiges.

von E. S. (ede_wolf)


Lesenswert?

Thomas E. schrieb:
> E. S. schrieb:
>> und da geht's nicht ohne vorheriges Löschen.
>
> Irgendwer versteht hier etwas nicht. Vielleicht bin ich das ja.
>
> Aber bei den mir bekannten AVRs, der Atmega16 gehört nicht dazu, wird
> das OSCAL nicht gelöscht. Weder mit Eeprom- noch mit Flash-Erase.
>
> Das wäre nach meinem Dafürhalten auch ziemlich bescheuert, das da als
> Werkskalibrierung reinzuschreiben und es dann bei der Standardprozedur
> Erase before Programming zu löschen.

Doch, das ist so. Ich hab's nicht erfunden.

von E. S. (ede_wolf)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Gibt es im
>>AVR-Studio mit Atmel ICE beim Programmieren des ATMega16A eine
>>Möglichkeit das OSCCAL Korrekturbyte für 8MHz AUTOMATISCH auszulesen und
>>an eine Speicheradresse im Flash oder EEPROM zu schreiben? Wie das
>>angeblich einige andere Programmer können.
>
> Im 4er-Studio gibt es unter unter 'Auto' im Programmer-Dialog einen
> Punkt
> 'Write osc. cal. byte'. Das sollte es eigentlich sein. Habe ich aber
> noch nie benutzt.
>
> MfG Spess

Jepp, das hab ich auch schon mal gesehen. Leider liegt das Generationen 
zurück und in 7 finde ich nichts dergleichen.

von Alexander S. (alex998)


Lesenswert?


von E. S. (ede_wolf)


Lesenswert?

Alexander S. schrieb:
> Die AN von Atmel dazu hattest du schon gesehen?
>
> 
http://www.atmel.com/images/atmel-2555-internal-rc-oscillator-calibration-for-tinyavr-and-megaavr-devices_applicationnote_avr053.pdf

Ja, hab ich gesehen. Leider ist auch diese Methode mit recht viel 
Aufwand verbunden und macht eigentlich das Gegenteil von Einsparung von 
Aufwand.
 Wenn ich einen zuverlässigen reproduzierbaren Input am UART hätte würde 
ich sogar diese "AUTOBAUD"- Methode implementieren, aber das hab ich 
leider nicht wirklich.

von E. S. (ede_wolf)


Lesenswert?

Bernd K. schrieb:
> Also ich meine mich dunkel erinnern zu können daß der avrdude einen
> Kommandozeilenswitch hat der sich darauf bezieht, hab das aber nie
> selbst angewendet.

Ja Bernd, genau sowas findet man bei der Suche, aber anstatt 
OpenSource/Freeware/Shareware hat man teures Markenequipment und doch 
keine Lösung.

> Ich war einmal in der Verlegenheit das OSCCAL verwenden zu müssen, da
> hab ichs dann am Ende ganz pragmatisch so gelöst daß das Gerät sich beim
> Einschalten selbst kalibrieren konnte anhand eines von außen angelegten
> Signals...

Möglicherweise wird es auf so etwas hinauslaufen...

von Bernd K. (prof7bit)


Lesenswert?

Vielleicht hilft folgender Link weiter wenn Du das Problem mit 
Markensoftware lösen musst:
http://atmel.force.com/support/articles/en_US/FAQ/Command-Line-Programming

Bei uns wird Produktionsflashen an nem separaten Arbeitsplatz gemacht 
auf dem genau die Tools installiert sind die minimal nötig sind um den 
Programmieradapter zu bedienen plus zugehörige Scripte bzw. 
selbstgebaute zweckdienliche GUI die das steuern so daß der Benutzer 
letztendlich nur noch Gerät auswählen, anstöpseln und Taste drücken 
muss. Für AVR werkelt dort als Backend avrdude (und ein unzerstörbarer 
Diamex-ALL). Für ARM ist sind es die J-Link Kommandozeilentools (und ein 
ausrangierter J-Link).

Und die ganze Kiste läuft übrigens unter Debian 8, das macht das ganze 
viel einfacher aufzusetzen, entspannter zu warten und befreit einen auch 
von dem unsäglichen USB-Treibergewürge (beonders bei Atmel) und 
sonstigen Windows-Krankheiten.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

spess53 schrieb:
> REsunator -> Resonator

 Abgeleitete Klasse oder selbständiges Objekt ?

von Huh (Gast)


Lesenswert?

E. S. schrieb:
> Ja, es wird ein Kalibrierungwert beim Reset in das OSCCAL eingetragen.
> Aber eben nur der für die Taktfrequenz von 1MHz. Wenn ich 8 MHz benutze,
> muss ich den Kalibrierungswert selbst manuell einfügen.

E. S. schrieb:
> The ATmega16A stores four different calibration values for the internal
> RC Oscillator. Thesebytes resides in the signature row High Byte of the
> addresses 0x0000, 0x0001, 0x0002, and0x0003 for 1, 2, 4, and 8 Mhz
> respectively.

Was versteh ich hier nicht? Oben schreibst du, daß du 8MHz benutzt. Und 
unten zitierst du selbst aus dem Datenblatt, daß der Wert für 1, 2, 4 
und 8MHz gespeichert ist.

von c-hater (Gast)


Lesenswert?

E. S. schrieb:

> Leider ist auch diese Methode mit recht viel
> Aufwand verbunden und macht eigentlich das Gegenteil von Einsparung von
> Aufwand.
> Wenn ich einen zuverlässigen reproduzierbaren Input am UART hätte würde
> ich sogar diese "AUTOBAUD"- Methode implementieren, aber das hab ich
> leider nicht wirklich.

Was du auf jeden Fall hast: Maximale Umständlichkeit bei der Erlangung 
der der "calibration bytes". Die kann man doch zur Laufzeit der 
Anwendung einfach direkt an der Quelle auslesen, nämlich aus der 
"signature row" (also von dort, wo auch der Programmer sie herholen 
würde).

Es gibt also keinerlei Notwendigkeit dafür, sie der Anwendung über 
irgendwelche idiotischen Umwege mittels Programmer per Flash oder EEPROM 
bereitzustellen...

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> Die kann man doch zur Laufzeit der
> Anwendung einfach direkt an der Quelle auslesen, nämlich aus der
> "signature row" (also von dort, wo auch der Programmer sie herholen
> würde).
Ich bin erstaunt!

Einige wenige AVR, ja...
Aber so absolut?

Verblüffung pur...

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Die kann man doch zur Laufzeit der
> Anwendung einfach direkt an der Quelle auslesen, nämlich aus der
> "signature row" (also von dort, wo auch der Programmer sie herholen
> würde).

Geht aber nur beim Nachfolger ATmega164. Der alte ATmega16 kanns nicht.

Man kann sich aber eine kleine Batch schreiben, die STK500.exe aufruft.
Damit kann man dann das Cal-Byte in eine Flash/EEPROM-Adresse schreiben.
1
O   Read oscillator callibration byte. 'address' is the address of
2
 the calibration byte as decribed in the data sheet of the device.
3
Se  Write oscillator call. byte to EEPROM memory. 'addr' is byte address
4
Sf  Write oscillator call. byte to FLASH memory. 'addr' is byte address

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Geht aber nur beim Nachfolger ATmega164. Der alte ATmega16 kanns nicht.

Bist du da sicher?

Ich werde jetzt gerade etwas unsicher und werde es einfach noch mal 
ausprobieren, bevor ich Unsinn poste. Aber wenn ich mich richtig 
erinnere, war das auch bei den alten Gammelteilen möglich. Es war nur 
nicht im Detail (also mit Beispielcode) dokumentiert, wie es zu machen 
ist. Die Adressen der calibration bytes sind aber immerhin dokumentiert, 
das konnte ich auf die Schnelle dem DB entnehmen...

Hab' im Moment keinen entsprechenden ATMega greifbar, um es ausprobieren 
zu können, aber alten Code gefunden, der es tut oder zumindest tun will. 
Leider habe ich damals nicht drangeschrieben, ob es funktioniert hat...

Schönes Beispiel dafür, wie wichtig hinreichende Dokumentation auch für 
einen selber ist bzw. irgendwann mal sein kann...

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> Bist du da sicher?

Ich bin mir so sicher, wie ich nur sein kann, dass meine Lieblinge, die 
ATMega328P, es nicht können.

Wäre allerdings sehr erfreut, wenn ich mich irren würde.
Denn das Gehampel hat mich auch schon einige male gestört.

von Peter D. (peda)


Lesenswert?

Arduino F. schrieb:
> Ich bin mir so sicher, wie ich nur sein kann, dass meine Lieblinge, die
> ATMega328P, es nicht können.

Da muß ich Dich enttäuschen, die können es:
1
27.8.10 Reading the Signature Row from Software
2
Table 27-5. Signature Row Addressing
3
RC Oscillator Calibration Byte 0x0001


Nur die alten ATmega8,16,32 und ATmega48 können es nicht.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Peter D. schrieb:
> Da muß ich Dich enttäuschen,
Danke, für diese Enttäuschung!

Ein klein bisschen, frage ich mich, wieso ich das vorher nicht hin 
bekommen habe.....
Aber egal, das gehört bei einer ordentlichen Enttäuschung auch mal dazu.


In meinem Datenblatt ist das übrigens:
> 30.8.10. Reading the Signature Row from Software
Aber auch nicht weniger gut versteckt.

1
#include <avr/boot.h>
2
3
4
void setup() 
5
{
6
  Serial.begin(9600);
7
8
  byte osccal = OSCCAL ;
9
10
11
  Serial.print("OSCCAL Register: ");
12
  Serial.println(osccal,HEX);
13
14
15
16
  osccal = boot_signature_byte_get(1);
17
18
  Serial.print("OSCCAL Signatur: ");
19
  Serial.println(osccal, HEX);
20
}
21
22
void loop() {}

von E. S. (ede_wolf)


Lesenswert?

Vielen Dank an alle die sich die Zeit genommen haben mir mit diversen 
Tips weiterzuhelfen.
Die Summe aus einigen davon, noch intesiveres Studieren vieler Webseiten 
und schließlich stundenlanges unermüdliches herumprobieren haben endlich 
zu einer praktikablen Lösung geführt mit der ich leben kann.

Alexander S. schrieb:
Die AN von Atmel dazu hattest du schon gesehen?
http://www.atmel.com/images/atmel-2555-internal-rc...

das war der erste Ansatz der nicht funktioniert hat. Avrdude war der 
zweite an dem ich verzweifelt bin, weil der ewig den ICE nicht kennen 
wollte. U.A.


Vielleicht hilft folgender Link weiter wenn Du das Problem mit 
Markensoftware lösen musst:
http://atmel.force.com/support/articles/en_US/FAQ/...
Bei uns wird Produktionsflashen an nem separaten Arbeitsplatz gemacht 
auf dem genau die Tools installiert sind die minimal nötig sind um den 
Programmieradapter zu bedienen plus zugehörige Scripte.....


Dann also wieder zurück zur AVR053 die wir endlich zum Schnurren 
gebracht haben, aber letztlich nur durch einen DOWNgrade auf 6.2.!!!! 
@#&*!@?#&%**!!!!

So ist es nun letztlich eine Batch mit den Kommandozeilenparametern für 
ATProgram geworden, nun wahlweise mit Kalibrierung auf eine externe 
Frequenz (viel langsamer weil aufwendiger) oder eben nur die schnelle 
Übername der Kalibrierungbytes ins EEPROM.

Also vielen Dank nochmal an alle Helfer!

von spess53 (Gast)


Lesenswert?

Hi

>Also vielen Dank nochmal an alle Helfer!

Was nutzt das ganze nun eigentlich? Das gilt für eine Temperatur und 
für eine Betriebsspannung. Außerhalb läuft es aus dem Ruder.

MfG Spess

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

1-Punkt-Kalibrierung?
Immerhin genauer, als ganz ohne.

MfG

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.