Forum: Mikrocontroller und Digitale Elektronik Timer0 - mega8


von Sandmännchen (Gast)


Lesenswert?

Ok, also ich habe den timer 0 folgendermaßen initialisiert:

TCCR0 = _BV(CS00) | _BV(CS02);     //Clock Source: Clk/1024

TIMSK = _BV(TOIE1);                     //Overflow interrupt enable

sei();


Was fehlt da noch, um den Timer zu starten? Der zählt nämlich nicht?!

von Sandmännchen (Gast)


Lesenswert?

Ach und noch etwas...verstehe den Sinn der Flags nciht so ganz.

Wenn ich z.B.einen mit einem timeroverflow ein Ereignis auslösen
möchte, schreib ich das so:

ISR(TIMER0_OVF_vect)
{
  _delay_ms(50);
  timerstand = TCNT0;      //Lese aktuellen timerstand aus
  nr_overflows++ ;

}

von Thomas B. (yahp) Benutzerseite


Lesenswert?

Hi,

> TIMSK = _BV(TOIE1);

1 != 0

Du setzt das falsche Flag...
Ausserdem willst du kein Delay in einer ISR benutzen ;-) !!!

von Sandmännchen (Gast)


Lesenswert?

Sry, hab noch eine anderen Thread aufgemacht, war ein Irrtum !

ENTSCHULDIGT BITTE,war ein Versehen!!

von Sandmännchen (Gast)


Lesenswert?

Und wieso das falsche Flag?

Laut Datenblatt:

When the TOIE0 bit is written to one, and the I-bit in the Status
Register is set (one), the
Timer/Counter0 Overflow interrupt is enabled.

Das will ich doch!!


Udn zum Delay in der ISR.....weiß nicht, wie ich den taster sonst
entprellen soll(softwaremäßig) :-)

von Hubert.G (Gast)


Lesenswert?

Sieh mal hier nach:
www.mikrocontroller.net/articles/Entprellung

von KoF (Gast)


Lesenswert?

@Thomas Burkhardt
hmm, das mit den delays in interruptroutinen habe ich hier jetzt in den
letzten tagen des öfteren bei anfängern gesehen (z.b. einen beitrag mit
einer seriellen schnittstelle)! eventuell sollte man mal nen kleinen
eintrag ins wiki machen, der delay`s beschreibt, wie sie zu erzeugen
sind und wann man sie (nicht) benutzt.

von Sandmännchen (Gast)


Lesenswert?

Aha, danke, werd mich darüber schlau machen..
Wobei ich schon ein kleines Programm ahbe, um einen Pin zu entprellen,
allerdings müsste der Code dann ja auch in der ISR Routine stehen, und
das ist auch nicht optimal, oder?!

Aber bevor ich mir darüber Gedanken machen, sollte der Timer mal laufen
:-)

von Thomas B. (yahp) Benutzerseite


Lesenswert?

Hoi!

> When the TOIE0 bit is written to one, and the I-bit in the Status
> Register is set (one), the
> Timer/Counter0 Overflow interrupt is enabled.

> Das will ich doch!!

Ja, du willst, aber du schreibst es nicht ;)

TOIE0 != TOIE1

Im Code steht eine EINS wo eine NULL stehen sollte...

Ansonsten den vorgeschlagenen Artikel zur Entprellung ansehen, wenn
das sowieso dein Ziel ist.

Gruß, Thomas

von Sandmännchen (Gast)


Lesenswert?

Ach verdammt, jetzt seh ichs erst...mann..*ggg*

Danke euch allen, ich war wohl soeben blind :-)

von Sandmännchen (Gast)


Lesenswert?

Und obwohl das nun richtig ist, zählt der Timer anscheinend net, da der
Nie in die ISR kommt, die aufgerufen wird, wenn der Overflow Interrupt
kommt.. :-(

von Hubert.G (Gast)


Lesenswert?

Hast du dir den Interruptaufruf so definiert?

von Sandmännchen (Gast)


Lesenswert?

TCCR0 = _BV(CS00) | _BV(CS02);

TIMSK = _BV(TOIE0);

sei();

................................

ISR(TIMER0_OVF_vect)
{

  timerstand = TCNT0;
  //andere anweisungen;

}

von Hubert.G (Gast)


Lesenswert?

#include <avr/interrupt.h>
und der ISR Aufruf: INTERRUPT(SIG_OVERFLOW0)

so mache ich es zumindest immer und es funktioniert.

von Michael W. (mictronics) Benutzerseite


Lesenswert?

>> #include <avr/interrupt.h>
>> und der ISR Aufruf: INTERRUPT(SIG_OVERFLOW0)
>> so mache ich es zumindest immer und es funktioniert.

Aber nicht mehr mit avr-libc 1.4.0 oder besser. Dort sind die
Funktionen signal() und interrupt() nur noch als "deprecaded" Macros
drin. die werden in späteren Versionen rausfallen.

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.