Forum: Mikrocontroller und Digitale Elektronik ATtiny45 läuft zu schnell


von Bernie P. (logimaus)


Lesenswert?

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
von Kai S. (kai1986)


Lesenswert?

Hallo,

wie sieht es denn aus, wenn du ein anderes Exemplar nimmst?

Gruß Kai

von Bernie P. (logimaus)


Lesenswert?

Hatte noch keine Lust, den SO8 in meinem Frickel-Aufbau umzulöten.

Wie ist denn Eure Erfahrung mit der initialen Genauigkeit vom 
RC-Oszillator?

von Carl D. (jcw2)


Lesenswert?

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
von S. Landolt (Gast)


Lesenswert?

Könnte man das reduzierte Programm und sein Assemblerlisting sehen?

von Bernie P. (logimaus)


Lesenswert?

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>
}

von Stefan F. (Gast)


Lesenswert?

Ist ein Abblock-Kondensator nahe am Chip an VCC/GND vorhanden?

von Bernie P. (logimaus)


Lesenswert?

Stefan U. schrieb:
> Ist ein Abblock-Kondensator nahe am Chip an VCC/GND vorhanden?

Klar doch, 100nF, dichter geht nicht.

von S. Landolt (Gast)


Lesenswert?

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.

von Bernie P. (logimaus)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.