mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timerverwendung in Programmen


Autor: Sascha W. (bucky2k)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha W. (bucky2k)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha W. (bucky2k)
Datum:

Bewertung
0 lesenswert
nicht 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...

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.