Arduino-ATtiny85: Startup Time verkürzen

Gast #6838578
Lesenswert?

Hallo,

habe den ATtiny85 jetzt mit dem AVRISP MK2 aus dem Atmel-Studio heraus 
programmiert, d.h. ohne Bootloader und die damit verbundene 
Startverzögerung.

Ganz am Anfang der Setup()-Routine setzte ich einen Pin auf Output HIGH, 
durchlaufe den Rest des Setups und ein paar Berechnungen und setze den 
Pin dann zurück auf LOW.
Das Setup und die Berechnungen dauern ca. 500 us, das ist OK.

Aber:
Von Power-On (Anlegen der Betriebsspannung) bis der Pin auf HIGH geht 
und den Beginn der Setup-Routine anzeigt, vergehen ca. 100 ms.
Das ist doch recht lange. Was passiert in dieser Zeit?

Die Betriebsspannung läuft nicht langsam hoch, sondern ist im Verhältnis 
zu den andern Zeiten sofort da.

Es wird ein Quarz mit 4 MHz verwendet, per Fuses ist eine Startup-Time 
von 1k Clock Cycles festgelegt, also ca. 0,25 ms. Dazu kommt das 
Reset-Delay, das mit 4 ms eingestellt ist. Insgesamt also unter 5 ms.

Wenn ich am Pin des Quarzes messe (Oszi), dauert es gut 150-200 ms bis 
eine Schwingung zu sehen ist, vermutlich beeinflusst aber der Tastkopf 
die Anschwingzeit.

Der Quarz wird mit zwei Kondensatoren mit je 10 pF betrieben, die gerade 
hier liegen hatte. Ist der Wert zu klein? Im Datenblatt werden 12-22 pF 
empfohlen.

Da habe ich jetzt zwei Fragen:
1. Was macht die Setup()-Routine sonst noch, außer dem von mir 
programmierten Code? Wahrscheinlich kommt aber kein nennenswerter 
Beitrag zur Startzeit dazu, oder?
2. Kann ich das Anschwingen des Quarzes beschleunigen? Wie?

Besten Dank!

Tim
Gast #6838581
Lesenswert?

Tim schrieb:
> 1. Was macht die Setup()-Routine sonst noch, außer dem von mir
> programmierten Code? Wahrscheinlich kommt aber kein nennenswerter
> Beitrag zur Startzeit dazu, oder?

Woher sollen wir das wissen, wenn dein Programm geheim ist?
Auf jeden Fall wird der Init Code wohl deine globalen Variablen 
initialisieren und den SP.


Für einen schnellen Start solltest du auf den internen Oszillator 
setzen.
Ein Quarz ist da die schlechteste Wahl
Selbst ein Resonator ist da deutlich fixer.
Den Kondensator am Reset weg lassen.
#6838739
Lesenswert?

Tim schrieb:
> Da habe ich jetzt zwei Fragen:
> 1. Was macht die Setup()-Routine sonst noch, außer dem von mir
> programmierten Code?

Nichts. Der einzige "unsichtbare" Code, der vor Setup läuft, ist der 
Startup Code vom C. Der braucht aber sicher keine 100ms.

> 2. Kann ich das Anschwingen des Quarzes beschleunigen? Wie?

Durch einen Resonator. Aber auch ein Quarz braucht keine 100ms. Mach mal 
einen Test mit einem Reset, nicht mit Power ON.
Beitrag #6838783 wurde von einem Moderator gelöscht.
Gast #6838796
Lesenswert?

Tim schrieb:

> Es wird ein Quarz mit 4 MHz verwendet, per Fuses ist eine Startup-Time
> von 1k Clock Cycles festgelegt, also ca. 0,25 ms. Dazu kommt das
> Reset-Delay, das mit 4 ms eingestellt ist. Insgesamt also unter 5 ms.

???

Zeig' mal deine Fuses. Konkret! Also drei Hexzahlen! Und nicht so doofe 
Prosa.
Gast #6838807
Lesenswert?

Falk B. schrieb:

> Aber auch ein Quarz braucht keine 100ms.

Wenn er schlecht angepasst ist, kann das schonmal passieren.

Es gibt da ein recht breites Feld, wo Fehlanpassung noch nicht dafür 
sorgt, dass das Teil garnicht mehr schwingt, sondern "nur" ein lausiges 
Anschwingverhalten hat. Die Schwingung wird dann durch mehr oder weniger 
zufällige Umwelteinflüsse förmlich "langsam hochgepumpt". Erst ab einer 
bestimmten Amplitude reicht dann das Oszillator-Feedback alleine, um die 
Sache einigermaßen stabil am Laufen zu halten.
Gast #6838846
Lesenswert?

Danke für die vielen Antworten!

Diesen entehme ich, dass die Arduino-IDE vor Setup() keinen für den 
Programmierer unsichtbaren Code einbaut, der nennenswerte Verzögerungen 
erzeugt.

Am Reset-Pin hängt gar nichts, kein externer Pull-Up, kein Kondensator.

Die beiden Keramik-Kondensatoren am Quarz habe ich nochmal geprüft, da 
steht tatsächlich 100 drauf, also 10 pF.

Der entscheidende Tipp war dann der mit dem Resonator, damit erreiche 
ich eine Startup-Zeit von ca. 12 ms statt den bisherigen 100 ms.

Den internen Oszillator will ich noch ausprobieren
Kann ich während des Betriebs, also per Programmcode, dann vom internen 
Oszillator auf den externen Quarz umschalten? Das wäre wichtig, weil die 
Taktfrequenz etwas genauer sein sollte, als sie mit dem internen ist.
Den kann man zwar irgendwie kalibrieren, aber eine Umschaltung auf den 
externen Takt wäre doch einfacher - falls das geht.
Gast #6838852
Lesenswert?

Tim schrieb:
> Diesen entehme ich, dass die Arduino-IDE vor Setup() keinen für den
> Programmierer unsichtbaren Code einbaut, der nennenswerte Verzögerungen
> erzeugt.

Schau lieber nach. Der Compiler kann ein Assembler-Listing erzeugen, 
dann siehst du alles im Detail.
Gast #6838855
Lesenswert?

Tim schrieb:
> Kann ich während des Betriebs, also per Programmcode, dann vom internen
> Oszillator auf den externen Quarz umschalten?

Wenn du das Register dazu findest, dann ja. Ich denke es geht nur über 
CKSEL, das ist eine Fuse. Also nicht zur Laufzeit.
Gast #6838857
Lesenswert?

Tim schrieb:
> Diesen entehme ich, dass die Arduino-IDE vor Setup() keinen für den
> Programmierer unsichtbaren Code einbaut, der nennenswerte Verzögerungen
> erzeugt

Setup() ist eine Funktion, die in der Main() aufgerufen wird. Guck dir 
einfach den Code an, dann siehst du, was vorher passiert.
Gast #6838858
Lesenswert?

Tim schrieb:
> Diesen entehme ich, dass die Arduino-IDE vor Setup()
Von der Arduino IDE war bisher noch nicht die Rede!
Warum?

Tim schrieb:
> der nennenswerte Verzögerungen erzeugt.
Es werden die Timer initialisiert.
Für millis() und PWM

Tim schrieb:
> Am Reset-Pin hängt gar nichts, kein externer Pull-Up, kein Kondensator.
Der interne Pullup des Reset ist sehr schwach.
Du könntest da mal einen kleinen, z.B. 10k, dran bauen.

Tim schrieb:
> Kann ich während des Betriebs, also per Programmcode, dann vom internen
> Oszillator auf den externen Quarz umschalten?
Nein...
Gast #6838932
Lesenswert?

EAF schrieb:
> Von der Arduino IDE war bisher noch nicht die Rede!
> Warum?
Für mich war das klar, für die Leser natürlich nicht. Sorry, das hätte 
ich natürlich erwähnen müssen.

Den 10k Widerstand an Reset kann ich gerne mal dran löten.
Ohne den Widerstand hat es bisher zwar funktioniert. Aber vermutlich 
muss ich dann damit rechnen, dass der Controller irgendwann ungeplant 
über Reset geht und keiner weiß warum.

Und weil man den internen Oszillator nicht im Programmcode auf den Quarz 
umschalten kann, werde ich es beim Resonator belassen.
Das scheint mir ein guter Mittelweg zwischen schnellem Start und 
Frequenzstabilität.
Gast #6838940
Lesenswert?

Tim schrieb:
> Aber vermutlich
> muss ich dann damit rechnen, dass der Controller irgendwann ungeplant
> über Reset geht und keiner weiß warum.

Das meine ich nicht!
Bei dem großen internen Pullup kommt er vermutlich einen Hauch langsamer 
aus dem Reset.
Aber du willst ja schnell.....
Gast #6838971
Lesenswert?

Also ich weiß nicht, wie der Aufbau bei Tim genau aussieht, aber hier in 
Assembler: ATtiny85 auf Steckbrett, 4 MHz-Quarz, sonst absolut nichts, 
bei 5.0 V mit Low-Fuse-Byte EF, das heißt '16K (16384) CK 14CK + 4 ms': 
vom Einschalten bis zum Pin-Wechsel dauert es ca. 8.6 ms. Wie zu 
erwarten war. Nichts mit 100 ms.

> Keramik-Kondensatoren am Quarz ... steht 100 drauf, also 10 pF
Sind das vielleicht doch 100 pF?
Gast #6838983
Lesenswert?

S. Landolt schrieb:

>> Keramik-Kondensatoren am Quarz ... steht 100 drauf, also 10 pF
> Sind das vielleicht doch 100 pF?

Eher nicht. Ich kenne jedenfalls keine Quarze, die mit 2x100pF Bürde 
noch in dem Bereich liegen würden, wo sie am Tiny85 noch (wenigstens 
wiederwillig) anschwingen würden.

Sehr viel wahrscheinlicher ist, dass es wirklich 10pF sind, das aber 
eben zu wenig für den verwendeten Quarz ist.
Gast #6839029
Lesenswert?

S. Landolt schrieb:

>> ... wirklich 10pF sind, das aber eben zu wenig ...
> Ob mein Steckbrett viel mehr hat?

Was du das stöpselst, ist doch bezüglich des Aufbaus des TO völlig 
irrelevant.

Es ist nunmal so, dass es verschiedene Quarze gibt. Bist du sicher, dass 
du exakt den verwendest, den auch der TO benutzt? Wenn ja, woher 
beziehst du diese Sicherheit? Der TO hat nur gucken lassen, dass es sich 
um einen 4MHz-Quarz handelt. Das war alles.

Es mag dich überraschen, aber ja, es gibt durchaus viele verschiedene 
4MHz-Quarze mit durchaus verschiedenen Anforderungen an die Bürde...
Gast #6840218
Lesenswert?

Besorgt man sich einen Standard-Quarz HC18  HC49  SMD mit 2...20 MHz 
für unter 0,40 EU bei den üblichen Einkaufsquellen für Amateure, (C - R 
- P) so ist die Frage nach einem dazu passenden Quarz-Datenblatt eher 
was Weltfremdes.

Fast immer sind an einem ATMega, oder ATTiny 2 x 33 pF (27...39 pF) die 
frequenzmäßig (!) passende Bürde, außer bei 4,1943 MHz - die wollen bei 
mir meist das Doppelte. Ich habe allerdings noch nichts Quarzgenaues 
gebaut, wo eine Startzeit weit unter 100 ms ein Kriterium war.

Hochgenaue Quarzoszillatoren mit (u.a. thermokompensierendem) 
Schwingkreis, Arbeitspunktregelung und weiterem pipapo haben vielleicht 
Anlaufzeiten, die ihrer hohen Güte entsprechen. Dass die vergleichsweise 
simple Oszillatorschaltung der Atmels diesen Effekt hat, möchte ich 
bezweifeln.

Neben der Reset-Beschaltung kommen noch FUSE-Einstellungen wie SUT, 
CKSEL, CKOPT, BOD, ..., oder gar die Anstiegszeit der 
Versorgungsspannung in Frage.

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