www.mikrocontroller.net

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


Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.