www.mikrocontroller.net

Forum: Compiler & IDEs Timer Interrupt Atmega128


Autor: Mike (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Läuft jetzt.

Danke

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.