Forum: Mikrocontroller und Digitale Elektronik ATmega Calibration bytes in Software auslesen


von klausi (Gast)


Lesenswert?

Hallo,
weiß jemand ob es eine möglichkeit gibt, die Calibration bytes in der 
signature row aus der Software heraus auszulesen?
Mit dem Programmer funktioniert das natürlich problemlos, aber das ist 
nicht besonders praxistauglich.

von Thomas E. (thomase)


Lesenswert?

Das Calibration Byte ist die Voreinstellung für das OSCCAL-Register. 
Darin lässt sich dieser Wert zum Kalibrieren zur Laufzeit bearbeiten. 
Das Calibration Byte selbst wird dabei nicht verändert.

von klausi (Gast)


Lesenswert?

Ja, ich möchte Calibration Byte für 8MHz auslesen um es dann ins
OSCCAL-Register zu schreiben.

von wendelsberg (Gast)


Lesenswert?

So wie ich das lese, gibt es nur einen Wert fuer 1MHz, der beim Reset 
automatisch in das OSCCAL geladen wird.
Fuer andere Frequenzen musst Du einen im Flash oder EEPROM gespeicherten 
Wert selbst nach OSCCAL laden.
Und ja, OSCCAL kann auch gelesen werden. (Allerdings nach dem Reset dann 
nur den Wert fuer 1MHz).

wendelsberg

von Peter D. (peda)


Lesenswert?

Wäre nicht unblöd, mal den Typ zu nennen.
Z.B. beim ATmega1284P geht das:
Table 24-5. Signature Row Addressing
RC Oscillator Calibration Byte: Z-Pointer Address 0x0001

von wendelsberg (Gast)


Lesenswert?

ATMega128: Da gibt es sogar 4 Werte fuer 1,2,4 und 8 MHz.

Calibration Byte: The ATmega128 stores four different calibration values 
for the internal RC Oscillator. These bytes resides in the signature row 
high byte of the addresses 0x000, 0x0001, 0x0002, and 0x0003 for 1MHz, 
2MHz, 4MHz, and 8MHz respectively. During Reset, the 1MHz 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 41 for details.

wendelsberg

von klausi (Gast)


Lesenswert?

ATMega 8  und den Wert für 8MHz kann ich wie gesagt mit dem ISP 
Auslesen.
Ich möchte diese aber in Software auf dem chip selbst machen.

von wendelsberg (Gast)


Lesenswert?

klausi schrieb:
> Ich möchte diese aber in Software auf dem chip selbst machen.

Den Wert fuer 8MHz musst Du selbst setzen.
Allerdings steht da im DB (hast Du das gelesen?): This can be done by 
first reading the signature row by a programmer, and then store the 
calibration values in the Flash or EEPROM.

wendelsberg

von Hugo (Gast)


Lesenswert?

klausi schrieb:
> ATMega 8  und den Wert für 8MHz kann ich wie gesagt mit dem ISP
> Auslesen.
> Ich möchte diese aber in Software auf dem chip selbst machen.

Ich hab mal für dich das Datenblatt gelesen:
> During Reset, the 1MHz calibration value which is located
> in the signature row High byte (address 0x00) is automatically
> loaded into the OSCCAL Register. If the internal RC is used at
> other frequencies, the calibration values must be loaded
> manually. This can be done by first reading the signature row
> by a programmer, and then store the calibration values in the Flash
> or EEPROM. Then the value can be read by software and loaded into
> the OSCCAL Register.

von Hugo (Gast)


Lesenswert?

Hier steht es auch nochmal:
> Calibration Byte
> 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 1MHz, 2MHz, 4MHz, and 8Mhz respectively.
> During Reset, the 1MHz 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.

von P. M. (mikro23)


Lesenswert?

Beim xmega geht das so:
1
uint8_t read_calibration_byte(uint8_t index)
2
{
3
  uint8_t result;
4
  
5
  NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
6
  result = pgm_read_byte(index);
7
  NVM.CMD = NVM_CMD_NO_OPERATION_gc;
8
  return (result);
9
}

auslesen z.B. für den 32 MHz Oszillator mit:
1
  val = read_calibration_byte(PROD_SIGNATURES_START + (uint16_t)&PRODSIGNATURES_RCOSC32M);

Vielleicht kannst Du das ja irgendwie auf den mega übertragen.

von c-hater (Gast)


Lesenswert?

P. M. schrieb:

> Vielleicht kannst Du das ja irgendwie auf den mega übertragen.

Bestimmt kann er das nicht. Alles Wichtige wird ja durch die C-Seuche 
versteckt, ähem... portabel gemacht. (kicher...)

Aber ja, es geht auch bei vielen (vielleicht sogar allen?) ATmegas. Und 
wie es geht, steht, wer hätte das gedacht, im jeweiligen Datenblatt...

Üblicherweise in dem Hauptabschnitt mit dem Titel "Self-programming the 
Flash", Unterabschnitt "Reading Lock, Fuse and Signature Data from 
Software".

Und ja: Das geht (wie so vieles) NICHT in C. Jedenfalls nicht ohne 
Assemblerhilfe, sei es als Inline-Code oder als hinzugelinkte Lib (die 
dann ihrereseits auch wieder nur auf Assembler zurückgreifen muss).

Asm rules!

von Erwin D. (Gast)


Lesenswert?

c-hater schrieb:
> Und ja: Das geht (wie so vieles) NICHT in C. Jedenfalls nicht ohne
> Assemblerhilfe, sei es als Inline-Code oder als hinzugelinkte Lib (die
> dann ihrereseits auch wieder nur auf Assembler zurückgreifen muss).

Eine vorsichtige Frage: Warum steht dann im Datenblatt, daß man das Byte 
für 1MHz sehr wohl auslesen kann, die Bytes für die anderen Frequenzen 
aber nicht, sondern das man die manuell lesen muß? Es wurde oben das 
Datenblatt zitiert, und ich habe es auch gefunden:

> If other frequencies are used, the calibration value has to be loaded
> manually, see “Oscillator Calibration Register – OSCCAL”
> on page 31 for details.

Ist das ein undokumentiertes Feature, was du da beschreibst?

von c-hater (Gast)


Lesenswert?

Erwin D. schrieb:

> Eine vorsichtige Frage: Warum steht dann im Datenblatt, daß man das Byte
> für 1MHz sehr wohl auslesen kann, die Bytes für die anderen Frequenzen
> aber nicht, sondern das man die manuell lesen muß? Es wurde oben das
> Datenblatt zitiert, und ich habe es auch gefunden:
[...]

Nein. Dein Problem ist nur, das du kein Englisch beherrschst. Was du da 
behauptest, was da stehen würde, steht da einfach nicht.

Es geht im dem Text allein um den Sachverhalt, welcher dieser 
Kalibrierungswerte automatisch durch die HARDWARE geladen werden kann. 
Kein bissel geht es darum, welche Werte die Software auslesen kann.

Für jemanden mit gesundem Menschverstand wird im Gegenteil sogar ganz 
unmittelbar klar, dass wohl die Software leisten muss, was der Hardware 
nicht gegeben ist...

>> If other frequencies are used, the calibration value has to be loaded
>> manually

Und genau das steht hier auch... Wobei natürlich das "manually" 
interpretierbar ist. Gemeint ist das, was deutschsprachige Programmierer 
wohl als "zu Fuß" bezeichnen würden. Du musst es halt einfach selber 
machen, durch ein entsprechendes Stück Programmcode...

von Erwin D. (Gast)


Lesenswert?

c-hater schrieb:
> Du musst es halt einfach selber
> machen, durch ein entsprechendes Stück Programmcode...

Da wurde oben noch mehr aus dem Datenblatt zitiert, was ich so 
interpretiere, daß man die Bytes mittels Programmer auslesen soll und 
dann in den Flash oder EEPROM speichern soll. Erst von dort können sie 
mit Software gelesen werden und ins Calibration Byte geschrieben werden. 
Habe ich das auch falsch verstanden?

This can be done by first reading the signature row
> by a programmer, and then store the calibration values in the Flash
> or EEPROM.
> Then the value can be read by software and loaded into
> the OSCCAL Register.

von c-hater (Gast)


Lesenswert?

Erwin D. schrieb:

> Da wurde oben noch mehr aus dem Datenblatt zitiert, was ich so
> interpretiere, daß man die Bytes mittels Programmer auslesen soll und
> dann in den Flash oder EEPROM speichern soll. Erst von dort können sie
> mit Software gelesen werden und ins Calibration Byte geschrieben werden.
> Habe ich das auch falsch verstanden?

Du hast nicht falsch verstanden, was diese Leute geschrieben haben.

Du hast allerdings nicht verstanden, dass diese Leute eigentlich keine 
Ahnung haben.

Du hast einfach zu wenig eigene Kenntnisse, um den Wert der Postings 
einzuschätzen. Mein Rat: lerne Englisch, dann dann kannst du selber 
Datenblätter lesen. Lerne Assembler, um notfalls JEDE Sache selber 
umsetzen zu können und nicht auf andere angewiesen zu sein, über deren 
Kenntnisse und Motivation du nix weisst.

von Erwin D. (Gast)


Lesenswert?

c-hater schrieb:
> Du hast allerdings nicht verstanden, dass diese Leute eigentlich keine
> Ahnung haben.

Die Leute von Atmel meinst du?
Das ist original aus dem Datenblatt zitiert!

von c-hater (Gast)


Lesenswert?

Erwin D. schrieb:

> Die Leute von Atmel meinst du?

Nein.

> Das ist original aus dem Datenblatt zitiert!

Nein. Die Meinung all der unwissenden Flitzpiepen in diesem Thread war 
nicht sicher nicht aus dem Datenblatt zitiert. Zum Glück darf da nicht 
jeder unwissende Flachwichser seinen Senf ablassen.

Was im Datenblatt zu diesem Thema wirklich steht, habe ich gezeigt. 
Sogar, wo genau es steht. Ich finde, damit habe ich den Faulen und 
Dummen schon wesentlich mehr an kostenloser Dienstleistung erbracht, als 
mir eigentlich zuzumuten ist.

EOT

von Erwin D. (Gast)


Lesenswert?

c-hater schrieb:
> Erwin D. schrieb:
>> Das ist original aus dem Datenblatt zitiert!
>
> Nein. Die Meinung all der unwissenden Flitzpiepen in diesem Thread war
> nicht sicher nicht aus dem Datenblatt zitiert. Zum Glück darf da nicht
> jeder unwissende Flachwichser seinen Senf ablassen.

Ich habe gerade nochmal das Datenblatt geöffnet. Und hier ein direktes 
copy&paste:
1
This can be done by first reading the signature row by a programmer,
2
and then store the calibration values in the Flash or EEPROM. Then the
3
value can be read by software and loaded into the OSCCAL Register.

Seite 31, Abschnitt "Bits 7..0 - CAL7..0: Oscillator Calibration Value"
(Über der Tabelle 11)

> Was im Datenblatt zu diesem Thema wirklich steht, habe ich gezeigt.
> Sogar, wo genau es steht. Ich finde, damit habe ich den Faulen und
> Dummen schon wesentlich mehr an kostenloser Dienstleistung erbracht, als
> mir eigentlich zuzumuten ist.

Dann hätte dir das doch eigentlich auffallen müssen. Warum bezeichnest 
du die Leute von Atmel als "Flachwichser"? Findest du das nicht etwas 
unfair? Wenn du mehr weißt als Atmel, dann melde das doch dort!

von Axel S. (a-za-z0-9)


Lesenswert?

c-hater schrieb:
> es geht auch bei vielen (vielleicht sogar allen?) ATmegas.

Beim ATmega8, nach dem der TE explizit gefragt hat, geht es nicht.

> wie es geht, steht, wer hätte das gedacht, im jeweiligen Datenblatt...
> Üblicherweise in dem Hauptabschnitt mit dem Titel "Self-programming the
> Flash", Unterabschnitt "Reading Lock, Fuse and Signature Data from
> Software".

Beim ATmega8 kann man zwar Lock- und Fuse-Bytes auslesen, aber eben 
nicht die Signatur und auch nicht die Kalibrierung.

Datenblätter zitieren ist ja gut und schön. Es sollte dann aber auch 
das Datenblatt sein, das für die Frage relevant ist.

Erwin D. schrieb:
> Da wurde oben noch mehr aus dem Datenblatt zitiert, was ich so
> interpretiere, daß man die Bytes mittels Programmer auslesen soll und
> dann in den Flash oder EEPROM speichern soll. Erst von dort können sie
> mit Software gelesen werden und ins Calibration Byte geschrieben werden.
> Habe ich das auch falsch verstanden?

Das hast du ganz richtig verstanden. Aber du mußt natürlich nicht alle 
Calibration Bytes deines Exemplars auslesen. Es reicht, wenn du das eine 
Byte, das für die von dir gewünschte Taktfrequenz gilt, mit einem 
ISP-Programmer ausliest. Dann kannst du es entweder direkt in dein 
Programm einbauen oder du schreibst es ins EEPROM, damit es dein 
Programm da findet. In jedem Fall muß dein Programm das für dein 
Exemplar des ATmega8 passende Calibration Byte ins OSCCAL Register 
schreiben.

Der ATmega8 lädt beim Power-On Reset automatisch das Calibration Byte 
für 1MHz ins OSCCAL Register. Wenn du den ATmega8 mit 1MHz rennen läßt, 
dann mußt du also nichts tun. Für 2, 4 und 8MHz mußt du OSCCAL selber 
setzen. Und weil du das jeweilige Calibration Byte nicht zur Laufzeit 
lesen kannst, mußt du es zur Compilezeit tun.

Erwin D. schrieb:
> Warum bezeichnest du die Leute von Atmel als "Flachwichser"?

Weil er glaubt, er würde cool(er) rüberkommen, wenn er Gossensprache 
verwendet. Ich würde sagen, das Gegenteil ist der Fall.

: Bearbeitet durch User
von Erwin D. (Gast)


Lesenswert?

Axel S. schrieb:
> Weil er glaubt, er würde cool(er) rüberkommen, wenn er Gossensprache
> verwendet. Ich würde sagen, das Gegenteil ist der Fall.

Na immerhin hat er
> den Faulen und
> Dummen schon wesentlich mehr an kostenloser Dienstleistung erbracht, als
> mir eigentlich zuzumuten ist.

Und er hat mir empfohlen, englisch zu lernen, damit ich selber 
Datenblätter lesen kann. Da frage ich mich, ob sich er manchmal auch an 
seine eigenen Empfehlungen hält, statt immer nur das Maul aufzureißen 
und auf unterirdischem Niveau Gift und Galle zu verspritzen.

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.