Forum: Mikrocontroller und Digitale Elektronik Bascom "WAIT" genauer als CTC-Timer?


von The SphereX (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Joe (Gast)


Lesenswert?

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

von Joe (Gast)


Lesenswert?


von Falk B. (falk)


Lesenswert?

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

von The SphereX (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

@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?

von The SphereX (Gast)


Lesenswert?

> 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

von Karl H. (kbuchegg)


Lesenswert?

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
von Roland .. (rowland)


Lesenswert?

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.

von Maxx (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von The SphereX (Gast)


Lesenswert?

> 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

von greg (Gast)


Lesenswert?

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.

von Roland .. (rowland)


Lesenswert?

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.

von The SphereX (Gast)


Lesenswert?

> 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

von Roland .. (rowland)


Lesenswert?

The SphereX schrieb:
> Was kostet mich ein Fotowiderstand denn zusätzlich (an Strom)?

Je nach Dimmensionierung des Spannungsteilers, vielleicht ein paar 
100µA.

von greg (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Roland .. (rowland)


Lesenswert?

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.

von Weingut P. (weinbauer)


Lesenswert?

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
von The SphereX (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.