Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier. |
Home Periphere Bausteine Counter und Timer Programmierung des CTC | ||||||||||||||||||||||||||||
Siehe auch: Z80-CTC (Z8430, MK3883) | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
Programmierung des CTC
Jeder der vier Zähler des CTC kann unabhängig von den anderen Zählern in zwei verschiedenen Modi betrieben werden: dem Zählermodus und dem Timermodus. Beim Zählermodus wird ein externer Takt verwendet, beim Timermodus wird der Systemtakt über einen Vorteiler verwendet. Die Zählereingangsleitung steht dann als Triggerleitung zur Verfügung. Zählermodus Im Zählermodus werden die Schaltflanken des Signals am jeweiligen Pin CLK/TGx gezählt, wobei wahlweise die ansteigende oder die abfallende Flanke des Signals verwendet werden kann. Der 8-Bit-Zähler wird nach Auftreten einer Schaltflanke am Eingang jedoch nicht sofort weitergezählt, sondern erst synchron mit der nächsten ansteigenden Flanke des Systemtaktes (CLK). Dies bedeutet, dass der Zähler eines CTCs Signalfrequenzen bis zu einer Höchstfrequenz in der Höhe der Systemtaktfrequenz verarbeiten kann. Bei jeder Signalflanke am Eingang CLK/TGx wird der Zählerstand um eins erniedrigt. Erreicht der Zähler den Stand Null, so wird ein Impuls auf der Ausgangsleitung ZC/TOx ausgegeben (bei Zähler drei wurde diese Leitung aus Platzgründen gespart), der Zähler mit dem Inhalt des Zeitkonstantenregisters neu geladen und eventuell ein Interrupt generiert. Timermodus Im Timermodus wird als Eingangssignal der interne Systemtakt (Anschluss CLK) verwendet, der über einen einstellbaren Vorteiler (/16 oder /256) auf den Eingang des Zählers gelegt wird. Die jetzt nicht benötigte Eingangsleitung CLK/TGx wird als optionale Triggerleitung verwendet, um den Timer zu einem definierten Zeitpunkt zu starten. Jeder Impuls aus dem Vorteiler dekrementiert den Zähler. Beim Nulldurchgang wird der Zähler wieder aus dem Zeitkonstantenregister geladen und außerdem ein Impuls am Ausgang TOx erzeugt. Bei Bedarf wird auch ein Interruptsignal an die CPU abgegeben. Am Ausgang TOx wird also eine regelmäßige Impulsfolge ausgegeben, wobei der zeitliche Abstand durch das Produkt aus der Periodendauer des Systemtaktes (tCLK), aus dem eingestellten Teilerverhältnis des Vorteilers (P) und dem Inhalt des Zeitkonstantenregisters TC definiert ist: tCLK * P * TC Die Triggerleitung kann per Software aktiviert oder deaktiviert werden. Ist sie aktiviert, so beginnt der Timer nach dem Einstellen des Timermodus und dem Laden der Zeitkonstante erst nach Eintreffen eines Triggerimpulses zu arbeiten. Die Triggerleitung ist flankengesteuert, wobei die aktive Signalflanke per Software ausgewählt werden kann. Programmierung Die Programmierung eines jeden der vier vorhandenen Zählerkanäle erfolgt immer in derselben Weise: zuerst muss das entsprechende Kontrollregister geladen werden und dann eventuell das Zeitkonstantenregister. Möchte man Interrupts verwenden, so muss außerdem noch das Interruptregister entsprechend gesetzt werden. Die folgende Abbildung zeigt die Bedeutung der einzelnen Bits dieser drei Register.
Die drei Register pro Zählerkanal werden wie folgt angesprochen: Das Kontrollregister und das Interruptregister können direkt gesetzt werden, das Zeitkonstantenregister existiert als 'Schattenregister' und kann nur indirekt über das Kontrollregister angesprochen werden. Bit 0 des Kontrollregisters entscheidet, ob die restlichen Bits ins Kontrollregister oder ins Interruptregister geladen werden. Ist dieses Bit gleich 1, so wird das Kontrollregister angesprochen, ist es gleich null, so gelten die restlichen Bits als Interruptvektor. Das Zeitkonstantenregister wird geladen, indem man zuerst im Kontrollregister das Bit 2 auf 1 setzt und dann auf die Adresse des Kontrollregisters die Zeitkonstante schreibt. Ein interner Umschaltmechanismus leitet das zweite Byte ins Zeitkonstantenregister. Die einzelnen Bits des Kontrollregisters haben folgende Bedeutung:
Interruptverarbeitung Die Z80-CTC Interruptverarbeitung ermöglicht jedem der vier Zähler eine Interruptanforderung abzugeben, die den Interruptmodus 2 der CPU unterstützen, wobei jeder Zähler einen eindeutigen Interruptvektor generiert. Der für die Bearbeitung des Interrupts notwendige 16-Bit-Pointer (Startadresse der Interrupt-Service-Routine) wird aus dem Inhalt des CPU-Registers I (high Byte) und den Bits 3-7 des Interruptregisters des CTCs (low Byte) erzeugt. Zur eindeutigen Unterscheidung der einzelnen Zählerkanäle setzt der CTC in den Bits 1 und 2 automatisch die jeweilige Zählernummer (0-3) ein. Bit 0 des Interruptvektors ist immer gleich null. Die Priorisierung der Interruptanforderungen erfolgt intern über eine Daisy-Chain, wobei Kanal 0 die höchste und Kanal 3 die niedrigste Priorität besitzt. Die Interruptanforderungen eines jeden Zählers können durch das Bit 7 des Kontrollregisters ein- und ausgeschaltet werden. Eine interessante Eigenschaft des CTCs ist, dass dieser Baustein auch als Interruptcontroller eingesetzt werden kann. Dazu wird jeder Kanal in den Zählermodus gebracht und das Zeitkonstantenregister auf 1 gesetzt. Da der CTC bei jedem Nulldurchgang eines Zählers eine Interruptanforderung generieren kann, wird bei einer Zeitkonstante von 1 bei jeder Signalflanke (wahlweise fallend oder steigend, siehe Bit 4 des Kontrollregisters) ein Interrupt erzeugt. Natürlich können die Kanäle eines CTCs auch gemischt als Interruptcontroller und Zähler/Timer verwendet werden.
|
||||||||||||||||||||||||||||
Home Periphere Bausteine Counter und Timer Programmierung des CTC |