F_CPU wird nicht dort festgelegt sondern als precompiler konstante oder per define im code
im 2ten Bild LOW.CKDIV8 ist AN, das heißt deine CPU taktet mit OSC/8 = 1 Mhz, da OSC 8Mhz ist
Um mal ins Detail zu gehen, im Code für die Atmel Treiber und internen Funktion (von delay.h) zum Beispiel werden Formel benutzt um die Anzahl an Takte Vs Frequenz zu errechnen um korrekt und deterministisch arbeiten zu können, damit delay_ms(1000) auch genau eine Sekunde dauert.
Die Formel verwendet dann den "Platzhalter" F_CPU wo eigentlich eine Frequenz stehen müsste, also quasi so etwas wie eine Variable!
Es ist aber keine Variable sondern eneben nur ein Platzhalter.
Beim compilen geht der Preprozessor/Precompiler einmal über den Code, sammelt alle #defines und andere precompiler Schlüsselwörter ein und bildet sich so eine Art Notizzettel welcher Code eingeblendet und ausgeblendet wird und welche Platzhalter mit welchem Inhalt überschrieben werden ("Suchen und ersetzen" wenn man es so nennen will)
Nach diesem Schritt sollte sich dein Code so lesen als hättest du überall die F_CPU Frequenz von Hand eingetragen und dieser wird dann am Ende fertig compiliert.
Geändert von Ceos (11.06.2019 um 15:16 Uhr)
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Bei LOW.CKDIV8 war ich mir unsicher - daher hier Dank für die Bestätigung!im 2ten Bild LOW.CKDIV8 ist AN, das heißt deine CPU taktet mit OSC/8 = 1 Mhz, da OSC 8Mhz ist
Aber auch der 2ten Teil deiner Ausführung war in mir ein Wissens-Wackelkandidat, da in div. Fachliteraturen bei einigen Prog F_CPU eingetragen wurde und bei anderen nicht.Die Formel verwendet dann den "Platzhalter" F_CPU wo eigentlich eine Frequenz stehen müsste
Nun hat sich FÄLSCHLICHER WEISE in meinem Kopf Gedanke fest gesetzt, dass die Fuse-Prozessor-Geschweindgkeit nur dann greift, wenn KEIN F_CPU im Prog.code steht.
Dank dir auch hier für deine tolle und einfache Ausführung!!!
Abschließend zu meinem Verständnis: Sollte in Fuse und F_CPU unterschiedliche Frequenzen eingetragen sein, meckert der Compiler nicht, funktioniert auch das Programm im Ablauf, aber berechnete Zeiten werden falsch interpretiert/umbesetzt.
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Der Compiler kennt nur die Infos die du ihm gibst und das ist bestenfalls das F_CPU Makro, die fuses kann dein compiler nicht wissen, das ist eine andere Baustelle
und wenn du falsche Zeiten gibst rennt deine sleep_ms(1000) eben in 1/8tel Sekunden durch statt einer ganzen Sekunde wenn das CKDIV8 nicht an ist
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Lesezeichen