www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Timer/Counter


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe folgendes Problem, verwende einen Philips P89C51 RD2, 
programmiert wird in C.
Habe 3 Timer/Counter zur Verfügung. 1 timer wird für die LCD - 
Ansteuerung benötigt, Der Nächste soll als Zeitgeber fungieren, aber wie 
kann ich es realiesieren, mehrere Zeiten mit einem Timer steuern (Signal 
auf Port ausgeben), oder ist das überhaupt möglich? Dann brauche ich 
mehrere Zählereingänge mind. 2 habe aber nur noch einen Timer Counter 
zur Verfügung.

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,
ich verwende eine Timertabelle. Dazu wird ein periodischer Timer 
benötigt, der nach Ablauf einen
Interrupthandler aufruft. In der Routine wird dann dort jeder 
eingetragene "Software-Timer" dekrementiert. Bei Null wird dann aus der 
Routine direkt die mit dem Software-Timer assoziierte Funktion
aufgerufen.

Gruß
Oliver

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim P89C51RD2 hast Du bis zu 5 Timer, davon können 4 auch als Counter 
arbeiten bzw. 4 können einen Interrupt erzeugen.

Wie schon Oliver sagte, nimmt man üblicher Weise für sämtliche 
Zeitabhängigkeiten nur einen Timer, der z.B. einen Takt von 1ms erzeugt 
und leitet daraus alle anderen Zeiten ab. Z.B. auch die Wartezeiten für 
das LCD.

Nach den 2 Zähleingängen hast Du also sogar noch 2 Timer übrig, z.B. für 
PWM-Output und UART-Baudrate.


Peter

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Danke erstmal!
D.h. ich schreibe in meine Timer Interruptroutine soviele Softwaretimer 
wie ich benötige und lade diese von der Funktion aus, die den Timer 
braucht und löse bei null die entsprechende aktion aus?
Das mit 5 Timern ist mir nicht ganz klar???
Da ich ja auch mehrere Ereignisse Zählen will...ist es doch sicher 
möglich jedem einen Port zu zu weisen und gleichzeitig den Timer bzw. 
counter zu starten und in der ISR den Port abzufragen?

Danke für die Hilfe

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,
hier sind ein paar Funktionsprotypen, die man fuer
eine Timertabelle so gebrauchen kann. Den Code kann ich leider nicht 
rausrücken, da er meiner Fa. gehört.
TIMERTAB_QUANTUM gibt den Takt des Hardwaretimers an.
Der Interrupthandler ist hier nicht aufgeführt, dieser wird durch 
timertab_init() initialisiert.

Gruß
Oliver


#ifndef  _TIMER_TAB
#define  _TIMER_TAB

enum {timertab_NICHTPERIODISCH=0, timertab_PERIODISCH};

void timertab_init(void);
  // Das Modul wird initialisiert.
  // Wichtig, dies muss immer als erstes getan werden.

int timertab_allocate(void (*fktptr)(unsigned int), int periodisch);
  // Sucht in der Timer Tabelle nach einem freien Timer.
  // Rückgabe: -1 falls keiner gefunden, sonst >= 0.
  // Übergebene Funktion vom Typ "void fkt(unsigned int)"
  // wird bei Ablauf des Timers ausgefuehrt.
  // periodisch == 1 : Nach Ablauf des Timers wird dieser wieder
  //                   automatisch gestartet.
  // periodisch == 0 : Nach Ablauf des Timers wird dieser nicht
  //                   wieder automatisch gestartet.

void timertab_deallocate(int nr);
  // Gibt einen Timer wieder frei, auch wenn dieser aktiv war.

void timertab_start(int nr, unsigned int arg, unsigned int ticks);
  // Startet den Timer mit Nummer nr.
  // Bei Ablauf des Timers wird die mit "int nr" assoziierte
  // Funktion mit dem Parameter "arg" aufgerufen
  // Die Laufzeit ist ticks*TIMERTAB_QUANTUM

void timertab_stop(int nr);
  // Stoppt den Timer mit Nummer nr.

void timertab_continue(int nr);
  // Laesst den Timer mit Nummer nr weiterlaufen, wenn dieser
  // zuvor gestoppt wurde.

#endif

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die 5 Timer sind:

TL0, TH0 (in Mode 3: je 8 Bit),
T1, T2, CH+CL (je 16 Bit)


Für Routinen, die zu lang sind, um sie direkt im Timerinterrupt 
abzuarbeiten, setzt man nur ein Bit, welches dann in der Mainloop 
abgefragt wird und dann wird die dazugehörende Routine ausgeführt.


Peter

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.