Timer Interrupt Atmega128

Hast du dir schon mal das AVR-GCC Tutorial
angeschaut? Dort gibt es einen Abschnitt über
Timer.
Was genau verstehst du denn daran nicht?
Im Grunde ist das ganz simpel:
Der Timer wird mit einem Vorteiler an den 'Quarz'
abgehängt. Dann zählt der ganz von alleine. Wenn
der Timer seinen Endstand erreicht hat, löst
er einen Overflow-Interrupt aus und fängt wieder bei
0 an.
Es liegt jetzt an dir den Vorteiler so einzustellen,
dass du eine Zeitbasis im Overflow Interrupt bekommst
mit der du weiter arbeiten kannst. Wenn du zb. das ganze
so einstellst, dass alle 1ms ein Overflow auftritt, dann
zählst du ganz einfach im Overflow Interrupt eine globale
Variable hoch. Da der Overflow alle 1ms kommt ist also
genau dann, wenn dieser Zähler 1000 erreicht hat, 1
Sekunde vergangen.
Gast
Kann mir einer mal ein beispiel geben.

Im Tutorial sind zwar schön die register beschrieben aber ohne
Beispiele.

Wenn ich im Forum suche und ein Beispiel übertrage dann stürzt mein
Atmega ab.
Aber was solls, hier ist ein Beispiel:

#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned int Counter;

ISR( TIMER0_OVF_vect )       // alle 0.000128 Sekunden / 8 Mhz
{
  Counter++;

  if( Counter == 10000 ) {
    PORTB = ~PORTB;
    Counter = 0;
  }
}

int main()
{
  Counter = 0;

  DDRB = 0xFF;

  TCCR0 = ( 1 << CS02 ) | ( 1 << CS00 ); // Teiler: 1024
  TIMSK = ( 1 << TOIE0 );         // Overflow Interrupt einschalten
  sei();                          // Interrupt generell zulassen

  while( 1 )
    ;
}
Gast
was hat das DDRB zu sagen an Port B hängt mein Display.


Mit diesm Code tut sich nichts.

ich möcht erreichen das ein Bild 3 secunden auf dem Display erscheint
und dann verschwindet und dann das nächste.


Deshalb der Timer

wenn 3 sekunden vergangen Timer soll abgeschalten werden(keine
Interrupt auslösung)neues bild laden und timer einschalten.
Gast
DDRB = 0xFF;
schalte alle PINS an PORTB auf Ausgang
>Mit diesm Code tut sich nichts
Wenn du das Beispiel der Timerbenutzung einfach übernommen und getestet
hast, dürften die Ausgänge deines Display's an PORTB nicht sehr
glücklich darüber sein. Ausgang auf Ausgang und der eine Ausgang
invertiert ständig , da wird es interesant welcher Treiber eher
aufgibt.
(das Display könnte kaputt sein)

>wenn 3 sekunden vergangen Timer soll abgeschalten werden(keine
>Interrupt auslösung)neues bild laden und timer einschalten
Du hast doch kapiert was du machen musst, du hast ein Bsp. wie man den
Timer benutzt. Warum schreibst DU nicht deine Anwendung?
Gast
Weil der Timer Interrupt nicht auslöst.

Das DDRB habe ich nicht verwendet zum Glück.

Wie schalte ich den Timer aus

so etwa
 TIMSK |= ( 1 << TOIE0 );         // Overflow Interrupt einschalten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.