Forum: Mikrocontroller und Digitale Elektronik Arduino-ATtiny85: Startup Time verkürzen


von Tim (Gast)


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

von EAF (Gast)


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.

von MaNi (Gast)


Lesenswert?

Falls du noch Objekte erzeugst kommen natürlich auch noch die 
Konstruktoren dazu...

von Falk B. (falk)


Lesenswert?

Tim schrieb:
> 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?

Das könnte die per Fuses eingestellte Verzögerung nach dem Reset sein.

von Falk B. (falk)


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.

von EAF (Gast)


Lesenswert?

Eigentlich ist alles supernormal.
Aber dennoch: Nicht normal.

Kein Code.
Kein Schaltplan.

Und das wilde Raten setzt ein.

von Rüdiger B. (rbruns)


Lesenswert?

Ähnliches hatte ich auch bei einem Projekt, dort habe ich den Code in 
die Startup.a51 ( 8051 Code ) eingebaut um einen PIN möglichst früh in 
einen definierten zustand zu versetzen. Bei dir müsste es die Datei 
Startup.s sein.

Beitrag #6838783 wurde von einem Moderator gelöscht.
von c-hater (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Ich lache mich kaputt, wenn am Ende ein 100nF Kondensator am Reset Pin 
hängt - oder gar der ganze Programmieradapter.

von c-hater (Gast)


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.

von EAF (Gast)


Lesenswert?

Rüdiger B. schrieb:
> Bei dir müsste es die Datei
> Startup.s sein.
Das geht auch im Programm.
Der Gcc kennt die .init Sections.
Früher macht keinen Sinn, denn die Sections (min eine davon) kommen noch 
vor der SP und Variablen Initialisierung dran.

von Tim (Gast)


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.

von Stefan F. (Gast)


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.

von Stefan F. (Gast)


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.

von Wolfgang (Gast)


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.

von EAF (Gast)


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

von Tim (Gast)


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.

von EAF (Gast)


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

von S. Landolt (Gast)


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?

von c-hater (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Tim schrieb:
> Der Quarz wird mit zwei Kondensatoren mit je 10 pF betrieben, die gerade
> hier liegen hatte.

Auf einem Steckbrett?

von S. Landolt (Gast)


Lesenswert?

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

von c-hater (Gast)


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

von Stefan F. (Gast)


Lesenswert?

Ich habe nach dem Steckbrett gefragt, weil diese erhebliche Kapazitäten 
haben, nur nicht genau dort, wo man sie haben will. Als Resultat 
funktionieren Quarze auf Steckbrettern nur mit Glück.

von Rüdiger B. (rbruns)


Lesenswert?

Ich habe gearde ein Datenblatt eines TTL Quarzoszillators gelesen, 
Startup Time typ 3ms. Das wäre doch eine Lösung.

von Robbi (Gast)


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.

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.