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.
:
Bearbeitet durch User
@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.
:
Bearbeitet durch User
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 ...
:
Bearbeitet durch User
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.