Forum: Mikrocontroller und Digitale Elektronik Timer für Atmega32


von TOM (Gast)


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??

von Karl H. (kbuchegg)


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.

von TOM (Gast)


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??

von Rahul D. (rahul)


Lesenswert?

>Was mache ich falsch??

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

von TOM (Gast)


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

von Rahul D. (rahul)


Lesenswert?

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

von TOM (Gast)


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??

von Frank L. (franklink)


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

von Rahul D. (rahul)


Lesenswert?

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

Riiichtiiich!

von TOM (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Frank L. (franklink)


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.
1
SIGNAL ( SIG_OVERFLOW1 ) 
2
{
3
zaehler++;
4
if(zaehler == 3)
5
{
6
loescheFensterBits();
7
TIMSK &= ~(1 << TOIE1);
8
TCCR1B &= ~ (1 << CS12)| (1 << CS10);
9
}
10
}

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

Gruß
Frank

von Tom (Gast)


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.

von Karl H. (kbuchegg)


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.

von du (Gast)


Lesenswert?

depp

von veysel (Gast)


Lesenswert?

bitch

von veysel (Gast)


Lesenswert?

ich kapier das nicht

von sechsdreizwei (Gast)


Lesenswert?

Weshalb nicht alles mit einem Timer machen ?

von AVRFan (Gast)


Lesenswert?

>Weshalb nicht alles mit einem Timer machen ?

Das wäre doch viel zu einfach ;-)

von Hans (Gast)


Lesenswert?

Man könnte meinen, dass nur Meister im Forum sind!!

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.