Forum: Mikrocontroller und Digitale Elektronik Timerverwendung in Programmen


von Sascha W. (bucky2k)


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

von Jadeclaw D. (jadeclaw)


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.

von Sascha W. (bucky2k)


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

von johnny.m (Gast)


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.

von Bastler (Gast)


Lesenswert?

Zu deinen LED's! Setze diese einfach in dem Interrupt! Du kannst ja auch 
über Schleifen mehrere Variablen hochzählen und dir dann im Interrupt 
mehrere Timer selber basteln.

von Sascha W. (bucky2k)


Lesenswert?

Ok, danke... Dann ist es ja so wie ich es mir gedacht habe.

@Bastler:

Das Progrämmchen oben war nur um zu schauen ob die Timer laufen... Und 
nun mache ich mich halt gerade mit den Interrupts vertraut... Beim UART 
war ich faul und habe Peter Fleurys lib genommen...

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.