www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer für Atmega32


Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will einen Timer programmieren, der bei einem Funktionsaufruf 
anfängt zu zählen und nach 3 Überläufen eine Funktion aufruft und sich 
anschließend wieder deaktivert. Bis zum nächsten anstoßen des Timers.

Kann mir da jemand helfen??

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

Bewertung
0 lesenswert
nicht lesenswert
TOM wrote:
> Hallo,
>
> ich will einen Timer programmieren, der bei einem Funktionsaufruf
> anfängt zu zählen und nach 3 Überläufen eine Funktion aufruft und sich
> anschließend wieder deaktivert. Bis zum nächsten anstoßen des Timers.
>
> Kann mir da jemand helfen??

Wobei hast du konkret Schwierigkeiten?
Welche Teile kriegst du alleine hin?


Vielleicht solltest du erst mal eine Vorübung machen:
Vergiss erstmal die ganze Geschichte mit Funktion und 3 Überläufe.
Programmier erst mal ein Programm, welches den Timer bei
Programmstart loslaufen lässt und bei dem ein Überlauf zu
einem Interrupt führt. In der Interrupt Funktion lässt du
zb. eine LED umschalten (damit du auch kontrollieren kannst,
ob der Interrupt auch wirklich ausgelöst wird).

Wenn du das Programmieren kannst (und das ist nicht wirklich
schwer), dann hast du eine Menge Dinge über die Timer gelernt
und die Umsetzung deines ursprünglichen Problems sollte dann
wirklich kein Problem mehr sein.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es richtig verstanden habe, soll mein Timer noch einem Überlauf 
automatisch eine Interrupt Routine auslösen.

SIGNAL ( SIG_OVERFLOW1 )
{
  zaehler++;
  if(zaehler == 3)
    {
      setzeFensterBits();
      TIMSK &= ~(1 << TOIE1);
    }
}


Ich verwende den TIMER1 und haben den Systemtakt um 1024 geteilt. So 
dass eigentlich alle 18 sec die Routine ansprechen soll. Aber leider 
kommt mein Timer nicht in die Routine. Was mache ich falsch??

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was mache ich falsch??

Du postest kein komplett-compilierbares Programm.
Dein Programmfragment sollte funktionieren - also liegt der Fehler 
woanders.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Definition:

TCCR1B = (1 << CS12)| (1 << CS10);   // Teiler 1024


Funktionsaufruf: Hier setze ich nur TIMSK zum ein und auschalten und den 
Startwert. Ansonsten schreibe ich nirgends was mit dem Timer

switch(spalteSteuerung)
{
case 0 :
       PORTA &= ~(1 << PA2);

       if ( tippen == TRUE )                {
       setzeFensterBits();                     timerTipp();
        }
       else
        {
         setzeFensterBits();                       TIMSK |= (1 << 
TOIE1);
          TCNT1 = 0;
         stopTaste = TRUE;                }
        break;
case 1 :
       PORTA |= (1 << PA2);
       if ( tippen == TRUE )                { 
setzeFensterBits();
                timerTipp();
        }
       else
  setzeFensterBits();                      TIMSK |= (1 << TOIE1); 
TCNT1 = 0;                        stopTaste = TRUE;
}
break;
}

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du nirgends ein SEI(); setzt, werden Interrupts überhaupt nicht 
bedient.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe so eben festgsstellt, dass mein Timer nicht Üperläuft.
Ich habe eine Systemtakt von ca 4MHz. Teiler ist 1024-> f=3,6kHz->bei 
ca. 65536 Zyklen pro Umlauf. Dann habe ich einen Überlauf alle 18 sec. 
Soweit richtig???

welche Einstellungen muss ich den vornehmen, damit der Timer los läuft??

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tom,
wo steht Dein SEI(), raul hat Dir schon die gleiche Frage gestellt. Ohne 
sei() keine Interrupts.

Wenn Du Deinen Code nicht zeigen willst, können wir Dir auch nicht 
helfen.

Gruß
Frank

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn Du Deinen Code nicht zeigen willst, können wir Dir auch nicht
>helfen.

Riiichtiiich!

Autor: TOM (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist nur das der Code etwa 10 Seiten lang ist und dies wollte 
ich euch ersparen!!

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

Bewertung
0 lesenswert
nicht lesenswert
TOM wrote:
> Das Problem ist nur das der Code etwa 10 Seiten lang ist und dies wollte
> ich euch ersparen!!

Dann speck ihn ab.

Das ist doch wohl nicht zuviel verlangt, dass du ein vollständiges
Program zusammenstellst, welches

* den Timer initialisiert
* eine Interrupt Funktion beinhaltet

Das alles zusammen hat maximal 40 Zeilen (grosszügig
gerechnet). Wenn dieses Testprogramm funktioniert, dann
vergleiche mit deinem richtigen Programm, wo die Unterschiede
liegen. Wenn du es nicht hinkriegst, dann poste es und jemand
wird dir in Windeseile sagen können, was daran nicht stimmt.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo TOM,

1. Du vermischt signal und isr. Entscheide Dich für eins, in diesem Fall 
isr und schmeiß als ersten die veraltete signal.h raus.

Beim ersten Durchlesen ist mir aufgefallen, dass Deine Implementierung 
für den Timer Interrupt den Timer1 betrifft.
SIGNAL ( SIG_OVERFLOW1 ) 
{
zaehler++;
if(zaehler == 3)
{
loescheFensterBits();
TIMSK &= ~(1 << TOIE1);
TCCR1B &= ~ (1 << CS12)| (1 << CS10);
}
}

In der Init() gibts Du aber Timer0 frei.
// Timer-Interrupt
TCCR0 = (1 << CS02)| (1 << CS00); // Systemtakt/1024
TIMSK = (1 << TOIE0); // Timer0 Interrupt frei
TCCR1B = (1 << CS12)| (1 << CS10);
//TIMSK = (1 << TOIE1);

Gruß
Frank

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze zwei Timer. Einmal für die Tastenentprellung (Timer0) und 
den Timer1. Leider bekomme ich den Timer1 nicht zum überlaufen! Der 
Timer1 soll dann loslaufen, wenn eine bestimmt Aktion ausgeführt würd. 
Deshalb will ich den Timer1 erst setzen, wenn die Funktion (Steuerung) 
ausgeführt wird.

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

Bewertung
0 lesenswert
nicht lesenswert
Tom wrote:
> Ich benutze zwei Timer. Einmal für die Tastenentprellung (Timer0) und
> den Timer1. Leider bekomme ich den Timer1 nicht zum überlaufen! Der
> Timer1 soll dann loslaufen, wenn eine bestimmt Aktion ausgeführt würd.
> Deshalb will ich den Timer1 erst setzen, wenn die Funktion (Steuerung)
> ausgeführt wird.

Dann mach das so, dass du den Timer immer für Interrupt
konfigurierst und auch konfiguriert lääst. Einen Timer
schaltet man ein/aus indem man den Vorteiler setzt bzw. auf
0 zurücksetzt.

Autor: du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
depp

Autor: veysel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bitch

Autor: veysel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kapier das nicht

Autor: sechsdreizwei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weshalb nicht alles mit einem Timer machen ?

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Weshalb nicht alles mit einem Timer machen ?

Das wäre doch viel zu einfach ;-)

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte meinen, dass nur Meister im Forum sind!!

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.