ATtiny Timer overflow polling

OP #4341651
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
OP #4341731
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?
OP #4341828
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.
#4341867
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.
OP #4341910
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.