Forum: Mikrocontroller und Digitale Elektronik 8051 Timer/Counter


von Sven (Gast)


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.

von Oliver K. (Gast)


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

von Peter D. (peda)


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

von Sven (Gast)


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

von Oliver K. (Gast)


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

von Peter D. (peda)


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

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.