Ich habe einen ATtiny45, der nach meinem Empfinden zu schnell läuft. Ich nutze den internen 8MHz-RC-Oszillator und habe einen Timer-Interrupt, der alle 100us kommt. Wenn ich in der Interrupt-Routine einen Port toggle, kann ich mit dem Oszi eine Periodendauer von ca. 88µs messen. Daraufhin hab ich mal eine Hauptschleife mit gesperrten Interrupts gebaut, die einfach nur einen Port toggelt. Wenn ich im Assembler-Listing die Zyklen vom Maschinencode raussuche und addiere, komme ich ebenfalls drauf, dass der uC etwa 13% zu schnell läuft. Gemäß Datenblatt sollte die Genauigkeit im Auslieferungszustand 10% sein. Wenn ich an der Spannung drehe (2.5V...5V) oder an der Temperatur (Daumen drauf), ändert sich das Zeitverhalten nur minimal. 13% wären damit ausserhalb der Spec. Wenn ich OSCCAL auf 0x5F setze stimmt die Frequenz. Mit OSCCAL=0xa6 ist die Frequenz so, wie wenn ich OSCCAL gar nicht beschreibe. Demnach ist dies vermutlich der Wert nach Reset. Die internen Kalibrationswerte kann ich mit dem AVRDUDE zu 0x8B und 0x41 auslesen. Wenn ich diese Werte ins OSCCAL schreibe, komme ich auf noch andere Fehler. Das OSCCAL-Register kann ich natürlich so abgleichen, dass die Geschwindigkeit passt. Aber ist die CPU im 8MHz-Modus nicht von Haus auf 1% kalibriert? Mir stellt sich die Frage, ob mein uC nicht korrekt tickt, oder ob ich zu blöd bin, das Handbuch zu begreifen.
:
Bearbeitet durch User
Hallo, wie sieht es denn aus, wenn du ein anderes Exemplar nimmst? Gruß Kai
Hatte noch keine Lust, den SO8 in meinem Frickel-Aufbau umzulöten. Wie ist denn Eure Erfahrung mit der initialen Genauigkeit vom RC-Oszillator?
DB verspricht "Factorycalibration" von +-10% indem die Hardware beim Start einen Device-spezifischen OSCCAL-Wert setzt. Per FineTuning kann man per Software +-1% erreichen. Fast +14% ist zwar etwas mehr, aber nicht wirklich unerwartet. Wer weiß ob beim reinfrickeln alle "Lötanweisungen" des Herstellers eingehalten wurden ;-)
:
Bearbeitet durch User
Hier meine kleine Schleife und ihr Listing. Nach meinem Dafürhalten benötigen die vier Befehle 5 Zyklen, bei 8MHz sollte ein Durchlauf 625us benötigen, gemessen hab ich ca. 550us. while(1) { PORTB=~PORTB; 38: 88 b3 in r24, 0x18 ; 24 3a: 80 95 com r24 3c: 88 bb out 0x18, r24 ; 24 3e: 00 c0 rjmp .+0 ; 0x40 <__SREG__+0x1> }
Stefan U. schrieb: > Ist ein Abblock-Kondensator nahe am Chip an VCC/GND vorhanden? Klar doch, 100nF, dichter geht nicht.
Ich kann nur Assembler, das "3e: 00 c0" wundert mich, es entspricht in avrasm2 einem "rjmp pc+1", springt also auf den nächstfolgenden Befehl und mitnichten an den Anfang "38" zurück.
S. Landolt schrieb: > Ich kann nur Assembler, das "3e: 00 c0" wundert mich, es entspricht in > avrasm2 einem "rjmp pc+1", springt also auf den nächstfolgenden Befehl > und mitnichten an den Anfang "38" zurück. Ich schätze, dass da noch der Linker das korrekte Sprungziel berechnet und solange erstmal nur "00" als Platzhalter steht.
Haben Sie PB4 frei oder irgendwie zur Verfügung? Dann per Fuse CKOUT PB4 als CLKO schalten und die Frequenz direkt messen.
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.