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.
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.