... rein theoretische ... die (eigene) CPU Taktrate intern und selbständig zu ermitteln ...
Hei Mann. Was für eine schicke Frage! Erstens - rein theoretisch ist doch Käse, das mach doch erst Sinn, wenn es (*ggg*theoretisch*ggg*) auch wirklich ginge! Und ich bin schon sicher dass es geht, habs mal eben kurz überflogen (Datenblatt ATmega8A_8159D–AVR–02/11) - aber nicht in letzter Konsequenz ausgearbeitet.

Lösungsansatz: Es gibt verschiedene Taktquellen im Controller die Du anzapfst oder installierst bzw. nicht anzapfst oder nicht installiert hast.

Setzen wir mal voraus, dass Du einen externen Quarz angehängt und gefused hast (ohne fuses is nix los !). Nun wird ein Timer initialisiert, wohl ohne prescaler. Der WDT wird initialisiert. Der Timer sollte mit der WDT-Dimensionierung so abgestimmt werden, dass er innerhalb eines WDT-Zyklus nicht überläuft. Der Timer sieht in der - weiter unten genannten EEPROM-Zelle nach, ob die leer ist - und wird >>nur dann<< auf "Stand-ins-EEPROM-schreiben" gestellt, wenn die Zelle leer ist.

Timer und WDT so schnell es geht hintereinander starten. Der Timerstand wird möglichst schnell in einem Loop ausgelesen und ins EEPROM geschrieben, wohl immer ins gleiche Register (das vorletzte oder so - das man später eh kaum mehr braucht - besser keins von den vorderen Plätzen und KEINESFALLS das erste).

Irgendwann schlägt der WDT zu - und dann kann der Timer nix mehr wegschreiben. Aus dem letzten Wert in der genannten EEPROM-Zelle - und den Auslegungswerten für den WDT bzw. Timer lässt sich mit einer gewissen Toleranz die CPU-Frequenz errechnen. Die Timerinitialisierung in Abhängigkeit von leerer oder geschriebener EEPROM-Zelle sichert den Zelleninhalt nach dem Messlauf für eine spätere Auswertung *ggg*.

Es ist eine ziemlich unpraktische Lösungsidee, sicher eher nur für den von Dir angedachten "theoretischen" Fall.

Schreib mal wenn Du das durchgedacht hast, ob Du ähnlicher Meinung bist.