Timerverwendung in Programmen

OP #460311
Lesenswert?

Hallo,

ich beginne erst mit der Programmierung von µC (atmega128) und habe eine 
Frage:

Ich brauche eine Art Zeitbasis um verschiedene Dinge Zeitgesteuert 
ablaufen zu lassen. Das wären z.B. das Entprellen der Taster, das 
anwerfen und abfragen des ADCs in bestimmten Zeitabständen, irgendwas 
blinken lassen, etc.

Lasse ich dazu einfach einen 16Bit Timer hochlaufen und nutze den 
CompareMatch oder Overflow Interrupt und zähle damit zyklisch eine 
globale Variable hoch, die ich dann an den vereizelten Stellen auf ihren 
Wert abfrage? Oder wie Stelle ic das am Besten an?


Gesamtaufgabe:

Einlesen von Analogen Werten über Zeitbereich (Oszilloskop-Funktion), 
Steuerung des Vorgangs über ein Tastenfeld und über die serielle (aus 
Windows, VB Programm), Übertragen der Werte an das VB Programm, Anzeige 
einer Trendkurve aus den Werten auf einem Farbdisplay 132x132, etc...
#460323
Lesenswert?

Quote:""Einlesen von Analogen Werten über Zeitbereich 
(Oszilloskop-Funktion)""
Das über den Timer machen, um da eine feste Zeitbasis zu bekommen, diese 
Sache ist zeitkritisch.
Alles andere kann in einer freilaufenden Schleife abgearbeitet werden. 
Denn weder Tasten, noch Display oder serielle Übertragung sind 
zeitkritisch.

Gruss
Jadeclaw.
OP #460332
Lesenswert?

Ok,

danke soweit. Aber ich hatte hier z.B. ein Programm zum Entprellen der 
Taster gesehen (Debounce - Bulletproof), da wurde ein Timer so verwendet 
das man einen "Takt" von 10ms erhält... Wie mache ich es ohne Timer?

Im GCC Tutorial wird es über die delay.h gemacht, aber das blockiert ja 
wieder alles. Ist evtl. nicht schlimm, aber doch eher unschön, gerade 
wenn ich schnellen Code brauche um auch das Display schnell ansteuern zu 
können...


Und vor allem generell: Was ist wenn ich viele Zeikritische Dinge habe? 
Immer für jede Aufgabe einen Timer? Wie ihr bemerkt bin ich mir generell 
nicht ganz sicher wie ich einen Timer sinnvoll einsetze. Einfaches 
Beispiel: Eine LED blinkt im sekundentakt, die andere alle 5 sekunden. 
Ich werfe nen Timer an und mache mit dem Interrupt was? Globale Variable 
hochzählen und diese im Mainprogramm abfagen um die LEDs passend blinken 
zu lassen? Abfragen auf Gleichheit (Könnte dann doch sein das der Timer 
schneller läuft als mein Main-Prog und somit die abgefagte Zahl schon 
wieder vorüber ist ohne erkannt worden zu sein, oder?)?


Mein erster Versuch um zu schauen ob die Timer laufen war wie im Code 
unten, jetzt möchte ich halt schauen wie man die Dinger sinnvoll mit den 
Interrupts nutzt:

int main(void)
{
  uint8_t i;
         //Ausgang deklarieren
  DDRC = (1<<PC0) | (1<<PC7);
         //Ausgang rücksetzen
  PORTC = 0x00;
         //8-Bit Timer starten, Vorteiler 1024        TCCR0 |= (1<<CS02) 
| (1<<CS01) | (1<<CS00);
         //16-Bit Timer starten, Vorteiler 1024
  TCCR1B |= (1<<CS12) | (1<<CS10);

  while(1) {  //Endlosschleife
    i = 0;
    while (i < 10) {
      TCNT0 = 0x00;       //Timer Reset
      while (TCNT0 < 200);
      i++;
    }
    PORTC = 0x80;
    i = 0;
    while (i < 10) {
      TCNT1L = 0x00;    //Timer Reset L
      while (TCNT1L < 200);
      i++;
    }
    PORTC = 0x01;
  }
  return 0;
}
Gast #460370
Lesenswert?

Nee, das ist schon richtig mit dem Timer. Gesetzt den Fall, Du brauchst 
für andere Funktionen einen Millisekunden-Takt. Alle 20 ms willst Du die 
Taster abfragen. Also wird in dem "Millisekunden-Takt-Interrupt-Handler" 
(sinnvollerweise ein Compare Match Interrupt von einem Timer) eine 
Zählvariable inkrementiert und wenn diese den Wert 20 erreicht, werden 
die Taster eingelesen.

Was die A/D-Wandler-Geschichte angeht: Wenn Du nicht zu 100% an den 
Mega128 gebunden bist, dann nimm lieber nen (pinkompatiblen) Mega1281 
oder verwandtes. Die haben nämlich die Möglichkeit, den ADC per Auto 
Trigger zu starten, ohne dass das Programm noch eingreifen muss. Da kann 
man unterschiedliche Quellen auswählen (z.B. denselben Compare, mit dem 
man den Millisekunden-Takt erzeugt) und muss den ADC nicht per Software 
starten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren