www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik aus mehrere Timer nur ein Timer aktiv


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes vor:

Ich benutze mehrere Timer für verschiede Ereignisse (zBsp. Tastendruch, 
Lauflicht, externer Interrupt, Ein- und Ausgaben...). Manche Timer 
müssen immer aktiv bleiben und bei Überlauf einen Interrupt auslösen. 
Und hier liegt mein Problem: Ich möchte an bestimmte Programmstellen 
alle Timer stoppen (den Zählerzustand kurz anhalten) bis auf den einen 
Timer, der an der Stelle aktiv sein sollte.
Nachdem die Routine abgearbeitet wurde, sollen alle anderen Timer wieder 
weiterzählen (und zwar von dem Zählerzustand, wo sie stehen geblieben 
waren).

Ich habe keine Idee, wie das gelöst werden kann.

Bin für jede Hilfe sehr dankbar

Gruß
Tim


Ps.:
Ich arbeite mit einem ATMega32-Mikrocontroller


so stelle ich mir das ganze vor
init(); //alle Timer gestzt und aktiv

...
...

//nur Timer1 aktiv, alle anderen stoppen
while ( !Timer1_ueberlauf) //Flag wird gesetzt, wenn Timer1 überläuft
{
  tu_was;
  tu_was;
  tu_was;
}

//->Ab dieser Stelle wieder alle Timer aktiv (weiterzählen)

...
...


Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Indem Du CSxx auf 0 setzt -> Datenblatt.

Gruß
Andy

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was genau meinst Du mit CSxx?

Bin zwar kein Anfänger aber an vielen Stellen fehlt mir noch an 
Erfahrung

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich benutze mehrere Timer für verschiede Ereignisse

Gehts mit einem permanent laufenden Timer, der z. B. alle 10 ms einen 
Interrupt auslöst, an dem das komplette Programm "aufgehangen" wird, 
nicht?

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim wrote:
> was genau meinst Du mit CSxx?

CSxx ist das entsprechende Clock Select Register (z.B. CS00, CS01,CS02 
für Timer 0) der Timer. Damit mußt Du aber schon zu tun gehabt haben. 
Wie hast Du sonst die Timer zum Laufen gebracht ?

Gruß
Andy

Genauer(und richtiger): CSxx sind die entsprechenden Clock Select Bits 
im Timer/Counter Control Register.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein geht leider nicht..

ich brauche mehrere Timer, die für verschiedene Aufgaben gedacht sind.
Wie soll ich zBsp. mit einem Timer es schaffen 5 msec lang mit dem 
AD-Wandler abtasten und dabei alle 15msec schauen ob ein Taster betätigt 
wurde.

Nach 5msec muss signalisiert werden, dass der AD-Wandler mit der 
Abtastung aufhören soll und das Programm zu nächsten Schritt weitergehen 
soll.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>CSxx ist das entsprechende Clock Select Register (z.B. CS00, CS01,CS02
>für Timer 0)

ich dachte, Du meinst vielleicht irgendetas mit Chip Select :-/

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
?????
Du wolltest wissen, wie Du einzelne Timer abstellen und anschließend mit 
gleichen Zählerstand weiterlaufen lassen kannst.

Wenn das nicht die Frage war, dann denke mal drüber nach und stelle die 
Frage neu.

Gruß
Andy

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

Bewertung
0 lesenswert
nicht lesenswert
Du klemmst dem Timer den Prescaler ab (mit den CSxx Bits)
und er bleibt stehen. Wie soll er denn zählen, wenn er keinen
Eingangsimpuls bekommt?
Wenn du soweit bist, daß es weitergehen kann, dann hängst
du den Prescaler wieder an.

Ist so einfach wie einem Baby den Schnuller klauen.

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch mal in das Datenbblatt:
Register TCCR0 mit Bit CS00,CS01 und CS02 für Timer 0.

Gruß
Andy

Autor: Andreas B. (bitverdreher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist so einfach wie einem Baby den Schnuller klauen.

Du bist böse.;-)

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du wolltest wissen, wie Du einzelne Timer abstellen und anschließend mit
>gleichen Zählerstand weiterlaufen lassen kannst.

genau das war meine Frage :-D

>Du klemmst dem Timer den Prescaler ab (mit den CSxx Bits)
>und er bleibt stehen.

und so einfach geht das. Ich dachte schon es wird mich Tage kosten, bis 
ich es raus hab :-)

Vielen Dank

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim wrote:
> Wie soll ich zBsp. mit einem Timer es schaffen 5 msec lang mit dem
> AD-Wandler abtasten und dabei alle 15msec schauen ob ein Taster betätigt
> wurde.

Die Lösung sollte einem schon fast ins Auge springen:

5 * 3 = 15

Du nimmst nen 5ms Interrupt und zählst darin ne Variable hoch. Wird sie 
3 setzt Du sie wieder auf 0 und machst das 15ms Ding.

Dem Prinzip sind keinerlei Grenzen gesetzt.
Du kannst 100 verschiedene Zeitaufgaben mit einem Timer erschlagen.

Solche Timer zu stoppen ist auch kein Problem.
Du setzt eine weitere Variable und die Zählvariablen zählen nur hoch, 
wenn diese einen bestimmten Wert enthält.


Peter

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Peter, das ist eine gute Lösung.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich brauche mehrere Timer, die für verschiedene Aufgaben gedacht sind.
>Wie soll ich zBsp. mit einem Timer es schaffen 5 msec lang mit dem
>AD-Wandler abtasten und dabei alle 15msec schauen ob ein Taster betätigt
>wurde.

"Software-Timer" heißt das Zauberwort.  Das Prinzip: (1) Du läßt den 
zeitlichen Ablauf jedes Prozesses in Deinem Programm von einem eigenen 
Software-Timer steuern.  (2) Alle Software-Timer werden von nur einem 
Hardware-Timer getaktet.  Das ist alles.

Ein Beispiel in Pseudocode:
Reset:
    [Hardware-Timer konfigurieren] 

    Process_ADC_Init
    Process_Key_Init
    Process_XXX_Init
    Process_YYY_Init
    Process_ZZZ_Init

    [Hardware-Timer starten]
    [--> Programm in Endlosschleife schicken <--]

//-----------------------------

Timer_Tick:      // wird permanent alle 1 ms ausgeführt
  {   
  Process_ADC_Run
  Process_Key_Run
  Process_XXX_Run
  Process_YYY_Run
  Process_ZZZ_Run
  }

//-----------------------------

Process_ADC_Run: 
    {
    IF (i>-1)       // i = -1  <--> Prozess 'ADC' inaktiv
        {
        inc(i)

        IF (i=5)    // Software-Timer-Prescaler = 5
            {
            i = 0
            [AD-Wandler abtasten]
            }
        }
    }

//-----------------------------

Process_Key_Run: 
    {
    IF (k>-1)        // k = -1  <--> Prozess 'Key' inaktiv
        {
        inc(k)

        IF (k=15)    // Software-Timer-Prescaler = 15
            {
            k = 0
            [Status der Tasten abfragen]
            }
        }
    }

//-----------------------------

Process_XXX_Run:
    {
    IF (l>-1)         // l = -1  <--> Prozess 'XXX' inaktiv
        {
        inc(l)

        IF (l=100)    // Software-Timer-Prescaler = 100
            {
            l = 0
            
            IF (l=0)  [XXX-Event 1 ausführen]
            IF (l=20) [XXX-Event 2 ausführen]
            IF (l=38) [XXX-Event 3 ausführen]
            IF (l=75) [XXX-Event 4 ausführen]
            IF (l=76) [XXX-Event 5 ausführen]
            }
        }
    }

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.