Forum: Mikrocontroller und Digitale Elektronik OSCAL - PONYPROG - ATmega8 - ATmega32


von Bernhard S. (bernhard)


Lesenswert?

In den Datenblatt steht, dass man den internen RC-Oszillator
kalibrieren kann.

Mit Ponnyprog (Version  2.06f Beta 5/2005) kann man dieses
OSCAL-BYTE auslesen (Menue "Command" - ganz unten) .

Aber wie kann man einen anderen Wert im µC setzen?

Kann mir das mal bitte jemand erklären?

von Gunter (Gast)


Lesenswert?

Hi,

prinzipiell:
in den Controllern sind 4 Calibration Bytes fest hinterlegt.
Für 1, 2, 4 und 8 MHz. Die werden bei der Produktion für jeden
Controller individuell ermittelt und in einem spez. Speicherbereich
eingebrannt (ähnlich wie die Singnature Bytes).
Dann gibt es das (R/W) Register OSCCAL, das den internen RC-Oszillator
beeinflusst.
Bei einem Reset wird automatisch das 1MHz Cal.Byte nach OSCCAL
geladen.

Benutzt man jedoch intern 2/4/8 MHz, muß man den Wert des
entprechenden
Cal.Bytes selber nach OSCCAL schreiben (macht man typischerweise ganz
am Anfang des Programms).

So, jetzt kommt der Knackpunkt:
die Cal.Bytes können nicht zur Laufzeit gelesen werden. Das kann nur
ein Programmer.
Meine Programmiersoftware (*) zeigt mir die 4 (!) Cal.Bytes an und
erlaubt,
eines davon automatisch ganz ans Ende des Flash zu schreiben
(macht man typischerweise ganz am Anfang des Programms)
Obwohl sich die Cal.Bytes von Controller zu Controller unterscheiden,
kann man damit eine Serienproduktion aufbauen (Ende des Flash lesen
und
diesen Wert nach OSCCAL schreiben).

So, und jetzt der zweite Knackpunkt:
bei meinem (alten) Ponyprog 2000 wird nur ein Calibration Wert
angezeigt.
Es ist auch nicht klar, ob dieser Wert aus einem der Cal.Bytes oder
aus
OSCCAL stammt.

Da sich die Werte in der Cal.Bytes immer nur um 3,4,5,.. max. 10,12
unter-
scheiden kann man den optimalen Wert aber auch experimentell selber
emitteln.
Das schlägt ATMEL sogar vor, wenn es möglichst genau sein soll.

hth
Gunter

(*) ist keine Shareware und an einen kommerziellen Programmer
gebunden

von Bernhard S. (bernhard)


Lesenswert?

@Gunter

Danke für Deine sehr gute Erklärung.

>Benutzt man jedoch intern 2/4/8 MHz, muß man den Wert des
>entprechenden Cal.Bytes selber nach OSCCAL schreiben (macht man
>typischerweise ganz am Anfang des Programms).

Könnte das in der Praxis dann so aussehen?

  ldi temp, 5
  out OSCAL, temp

von Gunter (Gast)


Lesenswert?

Hi,

prinzipiell ja.
Nur 1. heißt das Register OSCCAL /mit 2 "C")
und
"5" dürfte absolut unrealistisch sein.
Nimm als Ausgangspunkt den Wert, den Ponyprog anzeigt
und ändere den leicht (1,2,.. 5,6) nach oben und unten.

Gunter

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

@Gunter

>Nur 1. heißt das Register OSCCAL /mit 2 "C")

...korrekt, denn es heißt ja "Oscillator Calibration",
ich hatte es immer falsch geschrieben und aus diesem Grunde nie
gefunden...

Hab mal etwas damit OSCCAL experimentiert und die interne
Oszillatorfrequenz grafisch dargestellt.

Bernhard

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

@Gunter:
Sehr treffend formuliert. Solltest du ins WIKI setzen, diese Frage
taucht ja immer wieder auf.

@Bernhard:
Die Experimente mit OSCCAL sind ja ganz nett, trotzdem sollte man den
Spielraum keinesfalls ausnutzen. Denn bei (per OSCCAL) übertaktetem
Controller funktioniert EEPROM und FLASH-Schreiben nicht mehr. Ein
diesbezüglicher Hinweis ist irgendwo im Datenblatt versteckt.

Übrigens liest meine (Eigenbau-) ISP-Software bei jedem Löschen des
Flash automatisch das betreffende Calibrationsbyte (gemäß
Taktfuseeinstellung) aus dem Signature-Space und schreibt es in das
L-Byte und H-Byte der letzten Flashzelle, falls diese nicht bereits vom
Programmcode belegt ist. In der Reset-Routine des AVR-Programms wird
dann mittels .include die Datei calibra.inc (Anhang) eingebunden und
ausgeführt, die ein gültiges Calibrationsbyte (also nicht $ff) nach
OSCCAL ausgibt. Somit brauche ich mir beim Erstellen des AVR-Programms
keine Gedanken um die Calibration machen.

...

von Gunter (Gast)


Lesenswert?

Hi,

@HanneS
Danke für die Blumen! :-)
Mit dem WIKI und dessen Bedienung müßte ich mich mal
auseinandersetzen.

@Bernhard
genau diesen Graph, sowie die analogen für 2,4,8 MHz
findest Du auch in den Datenblättern bei
"typical characteristics / internal oscillator speed".

Nochwas:
ich habe jetzt auch rausgefunden, was PonyProg da wohl
anzeigt: nämlich den Wert des Cal.Byte für 1 MHz.
"Lancos" (der Programmierer von PonyProg) hat da offensichtlich
einen Fehler in den (älteren) Datenblättern einfach übernommen.
Zumindest in meinen Versionen des M8 und M32 Datenblatts steht
bei "memory programming - serial downloading" als Befehl zum
Lesen des Calibration Bytes:
0011 1000  -  00xx xxxx  -  0000 0000  -  oooo oooo
Also OHNE Adress Bits !!!
Korrekt ist aber
0011 1000  -  00xx xxxx  -  0000 00bb  -  oooo oooo
wobei die beiden "b" das gewünschte Cal.Byte angeben.

Schöne Grüße
Gunter

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.