ATtiny45 läuft zu schnell

OP #4391502
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
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
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>
}
Gast #4391617
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.
OP #4391641
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.