ATtiny Timer overflow polling

OP #4341651
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
... 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
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.
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.