Das hast Du jetzt vielleicht falsch verstanden gehabt: die erste der AppNotes verwendet SPI-ISP und JTAG (beides kann der Drachen, der kann doch nur TPI nicht), aber dort sind eben nur'ne Hand voll Controller angegeben, und eben auch nur STK500 (ist ja strenggenommen AVRISP I), AVRISP I und II, JTAGICE I und II.
Letztendlich ist das mit jedem Programmer umsetzbar (wobei der natürlich selbst 'ne Akurate Clock haben muß). Aber ich will eben in meinen Programmer keine inoffizielle Firmware schreiben. Folglich muß ich also auf ATMEL warten (oder darauf verzichten).
Man kann natürlich sowas ähnliches auch selbst erreichen, ohne daß der Programmer die Impulse erzeugt, abr der Vorteil ist hier, daß wir den Programming-Mode zur Kommunikation nutzen (zur Erinnerung: Der Programmer programmiert das Kalibrationsprogramm ins Target, gibt den Reset frei, und generiert die Zeitimpulse (Clock-Leitung der Programmierschnittstelle). Das Target (Programm) versucht einen geeignetten OSCCAL (passend zu den Impulsen) zu finden, und signalisiert das an den Programmer (Datenleitung). Außerdem wird das Ergebnis im Eeprom/Flash (SPM) des Targets abgelegt (vorher natürlich).
Der Programmer erzwingt wieder den Programming Mode (Reset), und kann jetzt (über die Programmierschnittstelle) den ermittelten OSCCAL aus Eeprom/Flash auslesen.)
Das heißt, das Verfahren funktioniert auch mit Targets, die keinerlei Kommunikationsschnittstelle (eben bis auf das Programmierinterface) besitzen. Man braucht lediglich 'ne Möglichkeit das irgendwo nichtflüchtig zu speichern.
Aus dem Studio heraus ließe sich das (wenn ATMEL das so umsetzen würde) quasi als Ein-Klick-Möglichkeit machen:
- vorhandenes Programm/ggf Eeprom auslesen abspeichern
- anhand des Targets und Programmers entsprechendes Kalibrationsprogramm ins Target
- Impulse senden, und kalibrieren lassen
- ermitteltes OSCCAL aus Flash/Eeprom zurücklesen
- gesichertes Programm/Eeprom wiederherstellen
möglicherweise macht eine (Compiler)Variable Sinn, die die Eeprom-Adresse vorgibt, an die der Kalibrationswert am Ende geschrieben werden soll. Wurde diese Variable also im Originalprogramm gesetzt, wird der Wert (also die Adresse) auch vom Kalibrationsprogramm verwendet.
Natürlich kann man so eine Kalibrationsroutine bei großen Controllern auch irgendwo neben dem Code platzieren, und im Bedarfsfall zur Laufzeit ausführen lassen - andererseits kann man bei großen Controllern meist auch problemlos 'ne genauere Taktquelle nutzen.
Wenn Du das trotzdem selbst irgendwann mehr oder weniger universell angehen willst, sehe ich folgendes Problem:
Du kannst aus der definitionsdatei heraus nicht ableiten, welche RC-Oscillator-Version Dein Target hat. Device, Signatur usw steht drinn - selbst die Core_Version (quasi die möglichen Instruktionen - oder folgt daraus auch der verbaute interne Oscillator?).
Du mußt also blind den Timer (wenn vorhanden 16bit) einstellen (Prescaler=1), und die Schritte zwischen den Impulsen zählen, und durch stupides ausprobieren OSCCAL annähern lassen (weil Du die Wirkung des MSB ja nicht kennst).