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?
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
@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
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
@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
@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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.