Hi Leute !!!
Ich experimentiere gerade ein bißchen mit der Ganggenauigkeit eines
ATTiny45 herum. D. h. ich versuche möglichst ohne Quarz eine für meine
Anwendung ausreichend genaue Timer-Funktion zu realisieren. Der Tiny
steuert ein akkubetriebenes LED-Licht, das jeden Tag, immer zur selben
Zeit, angeschaltet werden soll, dann 5 Stunden lang leuchtet, und
anschließend wieder für 19 Stunden ausgeschaltet wird. Dazu generiert er
noch ein Kerzenflackern und überwacht die Akkuspannung. Funktioniert
alles wunderbar, nur das sich leider für den Zeitraum einer Akkuladung
(ca. 6 Tage) eine doch beträchtliche Abweichung von ca. 30 Minuten
ergibt. Ich dachte da so an maximal 10 Minuten, die doch eigentlich auch
mit dem RC-Oszillator hinzukriegen sein müßten?
Da ich die Warteschleifen in Bascom einfach mit dem "WAIT" Befehl
programmiere, jedoch immer wieder lesen mußte, daß man für solche Zwecke
doch besser zu einem Timer im CTC-Modus greift, da dieser genauer
arbeitet, habe ich diese beiden Methoden mal verglichen.
Einstunden-Timer mit "WAIT"
---------------------------
$regfile = "attiny45.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 5
$framesize = 20
Portb.0 = 1 ' LED an
Wait 3600 ' Stoppuhr starten
Portb.0 = 0 ' LED nach 1 h ausschalten
End
Einstunden-Timer mit CTC-Timer
------------------------------
$regfile = "attiny45.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 5
$framesize = 20
Dim Millisekunden As Long
Portb.0 = 1 ' LED an
Wait 2
Ocr0a = 124 ' CTC-Vergleichswert
Tccr0a = Bits(wgm01) ' CTC-Modus aktivieren
Tccr0b = 2 ' Vorteiler = 8
Timsk = Bits(ocie0a) ' Compare-Interrupt 0A
freigeben
On Oc0a Timer0_isr ' Interrupt-Vektor
Portb.0 = 0 ' LED aus
' Stoppuhr starten
Sei ' Interrupts freigeben
Do
If Millisekunden = 3600000 Then Portb.0 = 1 ' LED nach 1 h einschalten
Loop
End
Timer0_isr:
Incr Millisekunden
Return
Das Ergebnis der Messungen hat mich dann jedoch erstaunt.
> Abweichung mit "WAIT" Befehl: - 4 s> Abweichung mit CTC-Timer: -24 s
Tja, das spricht ja leider überhaupt nicht für den CTC-Timer. Da spare
ich mir doch lieber den zusätzlichen Programmcode und bleibe einfach
beim "WAIT", oder wie ist die sechs mal größere Abweichung des
CTC-Timers zu erklären? Die Konfigurationswerte habe ich mit einem "AVR
Timer Calculator" (AVR-PRAXiS.de) berechnet:
> Frequenz: 1 MHz> Interrupt-Time: 1000 µs> Prescaler: 8> Compare: 124
Danach beträgt der zu erwartende Fehler eigentlich 0.000 µs.
Grüße,
The SphereX
The SphereX schrieb:> D. h. ich versuche möglichst ohne Quarz eine für meine> Anwendung ausreichend genaue Timer-Funktion zu realisieren.
Du wirst nicht genauer als die mit Temperatur, Spannung und Alterung
schwankende Frequenz deines internen Oszillators werden können.
jmp to ISR und return kosten immer Zeit, dann wird es ungenau.
Zum Eichen einfach die angegebene Quarzfrequenz ändern.
zum Bsp. $crystal = 1000010 statt $crystal = 1000000
Joe
@ The SphereX (Gast)
>ATTiny45 herum. D. h. ich versuche möglichst ohne Quarz eine für meine>Anwendung ausreichend genaue Timer-Funktion zu realisieren.
Warum? Sind 30 Cent für einen 32 kHz Uhrenquarz zuviel?
>(ca. 6 Tage) eine doch beträchtliche Abweichung von ca. 30 Minuten>ergibt.
30 / (6*24*60) = 0,34%, das ist erstaunlich genau für einen
RC-Oszillator,
> Ich dachte da so an maximal 10 Minuten, die doch eigentlich auch> mit dem RC-Oszillator hinzukriegen sein müßten?
Würde ich nicht versuchen.
>doch besser zu einem Timer im CTC-Modus greift, da dieser genauer>arbeitet,
Tut er auch.
>Tja, das spricht ja leider überhaupt nicht für den CTC-Timer.
Zufall. Dein RC-Oszillator hat einen Fehler, der sich durch den Fehler
von WAIT ZUFÄLLIG ausgleicht.
>CTC-Timers zu erklären? Die Konfigurationswerte habe ich mit einem "AVR>Timer Calculator" (AVR-PRAXiS.de) berechnet:> Frequenz: 1 MHz> Interrupt-Time: 1000 µs> Prescaler: 8> Compare: 124
Ist OK.
Also erst mal danke für Eure Infos.
> Sind 30 Cent für einen 32 kHz Uhrenquarz zuviel?
32 kHz RTC wird beim ATTiny45 nicht unterstützt. Außerdem "verliere" ich
natürlich 2 Anschlüsse durch einen Quarz. Das wollte ich nach
Möglichkeit erst mal vermeiden. Und dann hat es mich halt ganz allgemein
mal interessiert, wie genau man ohne Quarz maximal arbeiten kann.
> Dein RC-Oszillator hat einen Fehler, der sich durch den Fehler von WAIT ZUFÄLLIG
ausgleicht.
Fehler im Sinne von "Defekt" oder "im Toleranzbereich"? Ich gehe mal von
letzterem aus, so daß das Ganze bei einem anderen Tiny sicherlich schon
wieder anders aussehen kann (?).
Ich würde es demnach dann wohl doch lieber mal mit einem Quarz
probieren. Welchen Typ würdet Ihr für meine Anwendung oder auch
grundsätzlich empfehlen (4 MHz, 8 MHz ...). Wie gesagt, 32 kHz
Uhrenquarz scheidet schon mal aus! Und was verbraucht so ein Quarz
eigentlich im Durchschnitt? Ich gehe mal davon aus, daß meine
Akkulaufzeit von ca. 6 Tagen dadurch nicht beeinträchtigt wird?
Grüße,
The SphereX
The SphereX schrieb:>> Dein RC-Oszillator hat einen Fehler, der sich durch den Fehler von WAIT
ZUFÄLLIG
> ausgleicht.>> Fehler im Sinne von "Defekt" oder "im Toleranzbereich"?
Fehler im Sinne von "mit veränderter Temperatur verändert auch der
eingebaute RC-Generator seine Frequenz". Bei den neueren Typen ist
dieser Fehler geringer, bei den älteren ist der Fehler schon recht hoch.
Baut man damit eine Uhr, dann hat man eher ein Schätzeisen, als eine
genau gehende Uhr. Wenn der Wind richtig steht, dann kann es sogar sein,
dass dieses Schätzeisen die Zeit korrekt misst.
Für kurze Zeiträume ist der interne Generator bei den neueren Typen
genau genug. Eine Schaltuhr, die im Minutenbereich operiert, und bei der
es auf die eine oder andere Sekunde nicht ankommt, würde ich damit
bedenkenlos bauen. Hab ich aber eine Uhr, die über Monate hinweg
einigermassen genau laufen soll, dann sieht die Sache anders aus. Dann
muss man tatsächlich die exakte(!) QUarzfrequenz ausmessen und im
Programm berücksichtigen. Denn auch wenn auf dem Quarz zb 16Mhz
aufgedruckt ist, so bedeutet das nicht, dass er mit exakt 16000000 Hz
schwingt (und auch ein 32kHz Quarz schwingt nicht aus dem Laden heraus
auf exakt 32768.0Hz). Selbst wenn der Quarz nur um 1 Hz daneben ist, so
mag das im Vergleich zu zb 16000000 Schwingungen/Sekunde nicht nach viel
klingen. Die Abweichungen summieren sich aber im Laufe der Zeit.
@The SphereX (Gast)
>Fehler im Sinne von "Defekt" oder "im Toleranzbereich"?
Toleranz.
>Ich gehe mal von>letzterem aus, so daß das Ganze bei einem anderen Tiny sicherlich schon>wieder anders aussehen kann (?).
Ja. UNd wenn sich die Temperatur ändert. Oder die Versorgungsspannung.
WIEVIEL sich dann der Takt ändert, muss man messen bzw. abschätzen.
Ansätze findet man im Datenblatt unter "Typical Characteristics".
>Ich würde es demnach dann wohl doch lieber mal mit einem Quarz>probieren. Welchen Typ würdet Ihr für meine Anwendung oder auch>grundsätzlich empfehlen (4 MHz, 8 MHz ...).
So niedriege Frequnez wie möglich.
> Wie gesagt, 32 kHz>Uhrenquarz scheidet schon mal aus!
Ein "normaler" Quarz am AVR braucht auch 2 Pins. Was du meinst ist
wahrscheinlich ein Quarzoszillator. DIE brauchen meist ganz ordentlich
Strom je nach Typ und Frequenz um die 5-50mA. Ein Quarz am AVR braucht
vielleicht deutlich weniger, vielleicht 0,1mA.
> Und was verbraucht so ein Quarz>eigentlich im Durchschnitt? Ich gehe mal davon aus, daß meine>Akkulaufzeit von ca. 6 Tagen dadurch nicht beeinträchtigt wird?
Wenn man einen großen Akku hat ;-)
1mA * 24h = 24mAh. Wieviel hat dein Akku?
> Ein "normaler" Quarz am AVR braucht auch 2 Pins. Was du meinst ist
wahrscheinlich ein Quarzoszillator.
Naja, mit " ... 32 kHz Uhrenquarz scheidet schon mal aus! ..." wollte
ich eigentlich nur darauf hinweisen, daß laut Datenblatt der Anschluß
eines solchen Quarzes beim ATTiny45 nicht möglich ist (32kHz RTC: NO).
> 1mA * 24h = 24mAh. Wieviel hat dein Akku?
Also das LED-Licht läuft mit 3 x AAA, ca. 1000 mAh. Verbraucht der Quarz
tatsächlich 1 mAh? Das wären bei 6 Tagen x 5 Stunden zwar auch nur 30
mAh, aber ich hatte eigentlich mit weniger gerechnet.
Grüße,
The SphereX
Falk Brunner schrieb:>> Und was verbraucht so ein Quarz>>eigentlich im Durchschnitt? Ich gehe mal davon aus, daß meine>>Akkulaufzeit von ca. 6 Tagen dadurch nicht beeinträchtigt wird?>> Wenn man einen großen Akku hat ;-)>> 1mA * 24h = 24mAh. Wieviel hat dein Akku?
Ich denke, in Relation dazu
> akkubetriebenes LED-Licht, das jeden Tag, immer zur> selben Zeit, angeschaltet werden soll, dann 5 Stunden lang leuchtet
kann man den Mehrverbrauch durch den Quarz getrost vernachlässigen.
Du willst ein LED-Licht basteln. Licht benötigt man wenn es dunkel ist.
Macht es da wirklich Sinn, die LED nach einem 5h-19h-Rythmus zu schalten
und nach der perfekten Zeitkonstante zu suchen? Es bietet sich doch an,
das Licht abhängig der Umgebungshelligkeit zu steuern, mittels LDR oder
ähnlichem.
The SphereX schrieb:> Verbraucht der Quarz> tatsächlich 1 mAh? Das wären bei 6 Tagen x 5 Stunden zwar auch nur 30> mAh, aber ich hatte eigentlich mit weniger gerechnet.
Du brauchst den Quarz auch in den "dunklen" Stunden.
@ The SphereX (Gast)
>Naja, mit " ... 32 kHz Uhrenquarz scheidet schon mal aus! ..." wollte>ich eigentlich nur darauf hinweisen, daß laut Datenblatt der Anschluß>eines solchen Quarzes beim ATTiny45 nicht möglich ist (32kHz RTC: NO).
Doch. Siehe Datenblatt, Abschnitt 6.2.5. Low Frequency crystal
oscillator
> 1mA * 24h = 24mAh. Wieviel hat dein Akku?>Also das LED-Licht läuft mit 3 x AAA, ca. 1000 mAh. Verbraucht der Quarz>tatsächlich 1 mAh?
Der tiny45 braucht mit dem 32 kHZ Quarz ca. 0,15mA! Das ist ziemlich
wenig. Mit etwas Sleep Mode kommt man vielleicht auf 50uA und
weniger.
> Ich denke, in Relation dazu ... kann man den Mehrverbrauch durch den Quarz
getrost vernachlässigen.
Genau das wollte ich hören ;-)
> Licht benötigt man wenn es dunkel ist.
Naja, dieses Licht vielleicht nicht unbedingt. Die LED steckt in einem
bzw. beleuchtet einen kleinen Schneemann, der lediglich als dekoratives
Element dient, also nicht als Raumbeleuchtung. Und der soll eben zur
Winterzeit immer so ungefähr von 16:30 Uhr bis 21:30 Uhr vor sich
hinflackern.
> Doch. Siehe Datenblatt, Abschnitt 6.2.5. Low Frequency crystal oscillator
Ohh, tatsächlich, Du hast Recht. Dann ist wohl mit "32kHz RTC: NO" in
der Parameterübersicht zum ATTiny45 (Atmel Homepage) das Fehlen einer
internen RTC gemeint?
Würde demnach also doch funktionieren mit dem Uhrenquarz. Wenn der
ATTiny45 dann mit diesem Takt läuft, bekomme ich ihn nach dem Setzen der
Fuses aber sicherlich nicht noch mal neu beschrieben. Genau das ist mir
nämlich schon mal mit einem ATTiny13 passiert, den ich testweise auf 128
kHz eingestellt hatte. Danach war er mit meinem Programmer (USBASP)
nicht mehr ansprechbar, auch nicht mit gesetztem Low-Speed Jumper.
Grüße,
The SphereX
The SphereX schrieb:> Würde demnach also doch funktionieren mit dem Uhrenquarz. Wenn der> ATTiny45 dann mit diesem Takt läuft, bekomme ich ihn nach dem Setzen der> Fuses aber sicherlich nicht noch mal neu beschrieben. Genau das ist mir> nämlich schon mal mit einem ATTiny13 passiert, den ich testweise auf 128> kHz eingestellt hatte. Danach war er mit meinem Programmer (USBASP)> nicht mehr ansprechbar, auch nicht mit gesetztem Low-Speed Jumper.
Wenn du keine Ururalt-Firmware auf dem USBASP hast, kannst du die
Geschwindigkeit in Software einstellen. avrdude z.B. kann das. Die
Programmiergeschwindigkeit darf maximal 1/4 der Taktgeschwindigkeit des
AVRs sein.
The SphereX schrieb:> Und der soll eben zur> Winterzeit immer so ungefähr von 16:30 Uhr bis 21:30 Uhr vor sich> hinflackern.
Ja, um so besser. Dann triggere mit einem LDR einfach das Einschalten
und lass die LED dann ~5h flackern. Kein Zeitgenaugikeitsproblem, kein
Zeiteinstellungsproblem.
> Wenn du keine Ururalt-Firmware auf dem USBASP hast ...
Sieht wohl aber leider ganz danach aus, denn auch mit der von Dir
angesprochenen Option (AvrDude) kam keine Kommunikation mit dem Tiny
mehr zustande :-( Und da ich zum Firmware-Update ja einen zweiten
Programmer bräuchte, den ich natürlich nicht habe, sieht's wohl mit dem
Programmieren von niedrigsgetakteten AVRs eher schlecht aus.
> Dann triggere mit einem LDR einfach das Einschalten und lass die LED dann ~5h
flackern.
Eine Überlegung wäre es in der Tat wert ;-) Aber wie auch beim Thema
"Quarz" muß ich auch hier leider wieder den Stromverbrauch ansprechen.
Was kostet mich ein Fotowiderstand denn zusätzlich (an Strom)?
Grüße,
The SphereX
The SphereX schrieb:> Was kostet mich ein Fotowiderstand denn zusätzlich (an Strom)?
Je nach Dimmensionierung des Spannungsteilers, vielleicht ein paar
100µA.
The SphereX schrieb:> Sieht wohl aber leider ganz danach aus, denn auch mit der von Dir> angesprochenen Option (AvrDude) kam keine Kommunikation mit dem Tiny> mehr zustande :-(
Was hast du denn genau probiert? Du musst die Option "-B" auf einen
hohen Wert setzen, z.B. 500.
> Und da ich zum Firmware-Update ja einen zweiten> Programmer bräuchte, den ich natürlich nicht habe, sieht's wohl mit dem> Programmieren von niedrigsgetakteten AVRs eher schlecht aus.
Es reicht wenn du einen zweiten Mega8 oder so hast.
Roland ... schrieb:> The SphereX schrieb:>> Was kostet mich ein Fotowiderstand denn zusätzlich (an Strom)?>> Je nach Dimmensionierung des Spannungsteilers, vielleicht ein paar> 100µA.
Wenn überhaupt.
In der genannten Aufgabenstellung reicht es ja wohl, wenn der AVR alle
10 Minuten mal den aktuell herrschenden Helligkeitsgrad misst. Und
dazwischen ist der Spannungsteiler dann ganz einfach stromlos, weil er
von einem Portpin 'befeuert' wird, der ihn in den Messpausen dazwischen
abschaltet.
Roland ... schrieb:> The SphereX schrieb:>> Was kostet mich ein Fotowiderstand denn zusätzlich (an Strom)?>> Je nach Dimmensionierung des Spannungsteilers, vielleicht ein paar> 100µA.
Wenn überhaupt.
In der genannten Aufgabenstellung reicht es ja wohl, wenn der AVR alle
10 Minuten mal den aktuell herrschenden Helligkeitsgrad misst. Und
dazwischen ist der Spannungsteiler dann ganz einfach stromlos, weil er
von einem Portpin 'befeuert' wird, der ihn in den Messpausen dazwischen
abschaltet.
Roland ... schrieb:> Je nach Dimmensionierung des Spannungsteilers, vielleicht ein paar> 100µA.
Der Strom durch den Spannungsteiler ist ziemlich egal. Es kommt auf den
mittleren Strom drauf an, d.h. wenn das Ding alle Minute mal für eine
Millisekunde nach dem Licht guckt, wird man das in der Akkulaufzeit
soetwas von überhaupt nicht merken.
Karl Heinz schrieb:> Und> dazwischen ist der Spannungsteiler dann ganz einfach stromlos, weil er> von einem Portpin 'befeuert' wird, der ihn in den Messpausen dazwischen> abschaltet.
Genau! Der LDR-Spannungsteiler kann ja abschaltbar sein, gefällt mir.
Ja, dann beläuft sich der mittlere Strom wohl auf deutlich < 1µA.
der wesentliche Vorteil von CTC gegenüber Wait ist, dass du den µC per
Timerinterrupt aus dem Sleep holen kannst, während beim Wait die Mühle
dauerläuft, das kann Dir ordentlich Strom und damit Akkutausch bzw.
Ladezyklen sparen.
PS: zum flashen kannst Du ja nen 1MHz Quarz dran hängen, danach wieder
den Uhrenquarz für den Betrieb. ggf. per Jumper ...
Sehr interessante Infos! Und mit dem LDR habt Ihr mich jetzt aber so
richtig angefixt. Da werde ich wohl doch noch mal über eine Modifikation
meines Schneemanns nachdenken ;-)
> ... zum flashen kannst Du ja nen 1MHz Quarz dran hängen ...
Ich bin eigentlich davon ausgegangen, daß der Tiny, wenn man die Fuses
einmal für die Verwendung eines "Low-Frequency Crystal Oscillators"
(CKSEL = 0110) gesetzt hat, auch einen LFCO als Taktgeber erwartet. Wenn
ich jetzt einfach wieder z. B. einen 1 MHz Quarz anschließe, müßte ich
doch vorher CKSEL erst auf 101 (für externe Takquellen von 0,9 MHz bis 3
MHz) setzen. Das kann ich aber natürlich nicht, wenn ich den 32 kHz
getakteten Tiny nicht mehr ansprechen kann.
Grüße,
The SphereX