ATtiny45 läuft zu schnell

OP #4391502
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.
#4391543
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 ;-)
OP #4391593
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>
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren