Forum: Mikrocontroller und Digitale Elektronik ATtiny Timer overflow polling


von Friedrich K. (fiete)


Lesenswert?

Hey Jungs  [edit: und Mädels],

ich möchte etwas Wartezeit einbauen und habe dazu gedacht auf dem 
Tiny13A den Timer zu nutzen:

1
TCNT0 = 100;         // zähler setzen(hier 255-100 = 155 cycles)
2
TCCR0B |= (1<<CS00); // prescaler = 1
3
TIFR0 = (1<<TOV0);   // reset Timer flag (logisch 1 schreiben)
4
5
  // Zeit in der was sinnvolles getan wird.
6
7
while ( !(TIFR0 & (1<<TOV0))){}; // warten, bis counter fertig
8
TCCR0B = 0;          // Timer ausschalten

Es sieht so aus als hinge das Programm in der while-schleife. Also 
entweder Zähler läuft nicht, oder er ist irgendwie falsch 
konfiguriert...
Ich programmiere den Tiny mit einem Arduino ISP.

Hat jemand eine Idee?

Gruß, Fiete

von Friedrich K. (fiete)


Lesenswert?

... Okay habs herausgefunden. Es ist nicht ganz egal wann man was macht:
1
// timings for ATtiny13A internal clock (gemessen, ca. 40us loop overhead)
2
// TCNT0 = 0   --> 308us 
3
// TCNT0 = 56  --> 256us
4
// TCNT0 = 100 --> 220us 
5
// TCNT0 = 156 --> 168us
6
// TCNT0 = 200 --> 136us
7
8
9
TCNT0 = 100; // zähler setzen (! nur gerade Werte!)
10
TIFR0 = (1<<TOV0); // reset Timer flag
11
debug();
12
TCCR0B =1;//|= (1<<CS00); // prescaler = 1
13
14
  // Time to do something useful twait should not be exceeded!
15
16
while ( !(TIFR0 & (1<<TOV0))){}; // warten, bis counter fertig
17
TCCR0B = 0; // Timer stop

Also erst flag reset und dann Timer starten mit prescaler.

Komisch: Bei ungeraden Zähler (TCNT0) funktioniert es auch nicht. Jemand 
da eine Idee?

von Sudo (Gast)


Lesenswert?

Warum den Aufwand wenn du eh nix in der Zeit machst nim die Delay 
Funktion und gut ist es. Mit nem Timer Lohnt es sich nur wenn man 
asynchron wartet.

von Friedrich K. (fiete)


Lesenswert?

Naja, die Idee ist dass man da die Mindestzeit wartet. Während dieser 
Zeit macht man Berechnungen. Gehen sie schneller, wartet der Timer den 
rest. Konkret möchte ich warten, bis sich der Pegel am ADC-Pin 
eingestellt hat, bevor ich die Konversion starte.

Ich nehme an, dass du das meinst mit Asyncron warten.

von Thomas E. (thomase)


Lesenswert?

Friedrich K. schrieb:
> Konkret möchte ich warten, bis sich der Pegel am ADC-Pin
> eingestellt hat, bevor ich die Konversion starte.

Und warum machst du das nicht?

Wenn die Wartezeit von einem bestimmten Pegel abhängig ist, dann fragt 
man den Pegel solange ab, bis dieser Wert erreicht ist.

Was du machst, ist aber nichts anderes, als eine vorgegebene Zeit zu 
warten, bis sich der erwartete Pegel hoffentlich eingestellt hat. Dazu 
machst du an dieser Stelle ein Delay. Allerdings ein ziemlich 
kompliziertes.

Gut, ist dein Timer und dem Controller ist es auch egal.

mfg.

von Friedrich K. (fiete)


Lesenswert?

Thomas E. schrieb:
> Wenn die Wartezeit von einem bestimmten Pegel abhängig ist, dann fragt
> man den Pegel solange ab, bis dieser Wert erreicht ist.

Dieser Pegel ist i.A. unbekannt.

Da hst du recht, kompliziert ists. Ich möchte möglichst viele 
ADC-Wandlungen pro Sekunde haben. Das Mess-Musster sieht so aus:

SignalEin --> warten bis Sigalpegel voll da --> ADC --> Signal Aus --> 
warten bis refpegel  voll da --> ADC --> ...

Signal - Referenz - Signal - Referenz ...

Zwischendurch müssen noch ein paar Berechnungen gequetscht werden. Wenn 
ich den ADC im Free Running mode laufen lasse, dann muss ich jeden 
zweiten Wert verwerfen, daher dieses Heckmeck.

von Thomas E. (thomase)


Lesenswert?

Friedrich K. schrieb:
> Zwischendurch müssen noch ein paar Berechnungen gequetscht werden. Wenn
> ich den ADC im Free Running mode laufen lasse, dann muss ich jeden
> zweiten Wert verwerfen, daher dieses Heckmeck.

Aber doch nicht so.

Guck dir im Datenblatt an, wie man den ADC mit dem Timer triggert.

mfg.

von Friedrich K. (fiete)


Lesenswert?

Da hast du natürlich recht, das ist die elegantere Lösung. Dankeschön!

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.