Forum: Compiler & IDEs Timer Interrupt Atmega128


von Mike (Gast)


Lesenswert?

kann mir jemand sagen wie man einen Interruptgesteuerten Zimer für den
Atmega schreibt

er soll alle 3 sec auslösen.

16MHz gesteckt.


Danke

Schreibe in WinAVR

von Karl H. (kbuchegg)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

POste docj mal dein Programm.
Dann können wir es durchgehen und dir den Fehler zeigen.
Dabei lernst du viel mehr als wenn du nur fertige
Programme auf den Controller brennst.

von Karl H. (kbuchegg)


Lesenswert?

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 )
    ;
}

von Mike (Gast)


Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

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?

von Mike (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

Hallo

Läuft jetzt.

Danke

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.