mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer0 - mega8


Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++ ;

}

Autor: Thomas B. (yahp) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> TIMSK = _BV(TOIE1);

1 != 0

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

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sry, hab noch eine anderen Thread aufgemacht, war ein Irrtum !

ENTSCHULDIGT BITTE,war ein Versehen!!

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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) :-)

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh mal hier nach:
www.mikrocontroller.net/articles/Entprellung

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
:-)

Autor: Thomas B. (yahp) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach verdammt, jetzt seh ichs erst...mann..*ggg*

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

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.. :-(

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir den Interruptaufruf so definiert?

Autor: Sandmännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCCR0 = _BV(CS00) | _BV(CS02);

TIMSK = _BV(TOIE0);

sei();

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

ISR(TIMER0_OVF_vect)
{

  timerstand = TCNT0;
  //andere anweisungen;

}

Autor: Hubert.G (Gast)
Datum:

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

so mache ich es zumindest immer und es funktioniert.

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.