| Zeile 1: | Zeile 1: | ||
| − | Der Programmable Interval Timer (PIT) ist ein | + | Der Programmable Interval Timer (PIT) ist ein signalerzeugender Baustein auf dem Mainboard. Er arbeitet intern mit einer Frequenz von 1193180 Hz und kann z. B. für präemptives Multitasking oder als Systemuhr genutzt werden. |
== Register == | == Register == | ||
| Zeile 22: | Zeile 22: | ||
== Channels == | == Channels == | ||
| − | Der PIT besitzt drei Channels, wobei lediglich der erste (Channel 0) beliebig benutzt werden kann | + | Der PIT besitzt drei Channels, wobei lediglich der erste (Channel 0) beliebig benutzt werden kann. |
=== Channel 0 === | === Channel 0 === | ||
| − | Dieser Channel ist mit dem [[PIC]] verbunden und löst je nach Modus den [[IRQ|IRQ 0] | + | Dieser Channel ist mit dem [[PIC]] verbunden und löst je nach Modus in regelmäßigen Abständen den [[IRQ|IRQ 0]] aus. |
| − | Im [[Real Mode]] hat das BIOS den PIT darauf initialisiert alle 54,9254 ms den IRQ 0 auszulösen. Die entsprechende [[ISR]] inkrementiert dann den Wert 0000:046C. | + | Im [[Real Mode]] hat das BIOS den PIT darauf initialisiert alle 54,9254 ms den IRQ 0 auszulösen. Die entsprechende [[ISR]] inkrementiert dann den Wert 0000:046C. |
=== Channel 1 === | === Channel 1 === | ||
| − | Dieser Channel wurde früher verwendet, um den Arbeitsspeicher zu synchronisieren. Heutzutage hat er keinen Nutzen mehr, sollte aber dennoch nicht verwendet werden, da es keine Garantie gibt, | + | Dieser Channel wurde früher verwendet, um den Arbeitsspeicher zu synchronisieren. Heutzutage hat er keinen Nutzen mehr, sollte aber dennoch nicht verwendet werden, da es keine Garantie gibt, dass er nicht doch von irgendeinem Bauteil verwendet wird. |
=== Channel 2 === | === Channel 2 === | ||
| Zeile 35: | Zeile 35: | ||
== Modi == | == Modi == | ||
| − | Der am häufigste verwendete | + | Der am häufigste verwendete Modus ist Mode 2, da man mit diesem leicht eine Systemuhr implementieren kann. |
=== Mode 0: Interrupt on terminal count === | === Mode 0: Interrupt on terminal count === | ||
| − | Wenn das Counter-Register mit einem neunen Wert geladen wurde, wird dieses inkrementiert, bis es | + | Wenn das Counter-Register mit einem neunen Wert geladen wurde, wird dieses inkrementiert, bis es 0 erreicht. Dann wird der wird der IRQ ausgelöst. Der Vorgang beginnt erst wieder von vorne, wenn ein neuer Wert ins Counter-Register geladen wird. |
=== Mode 1: Hardware Retriggerable One-Shot === | === Mode 1: Hardware Retriggerable One-Shot === | ||
| − | In diesem | + | In diesem Modus wird der IRQ in regelmäßigen Abständen ausgelöst. Dabei wird das Counter-Register bis 0 heruntergezählt, dann dessen ursprünglicher Wert wiederhergestellt und der IRQ ausgelöst. Danach beginnt der Vorgang von vorn. |
=== Mode 2: Rate Generator === | === Mode 2: Rate Generator === | ||
| − | Es wird ein Zähler inkrementiert, bis dieser den Wert | + | Es wird ein Zähler inkrementiert, bis dieser den Wert 1 enthält, dann wird der IRQ ausgelöst und der ursprüngliche Wert des Zählers wiederhergestellt. Der Vorgang beginnt von vorn. |
Der Wert des Zählers ergibt sich folgendermaßen: | Der Wert des Zählers ergibt sich folgendermaßen: | ||
Zähler=Interne Freqenz / Counter-Register | Zähler=Interne Freqenz / Counter-Register | ||
| Zeile 52: | Zeile 52: | ||
=== Mode 4: Software Triggered Strobe === | === Mode 4: Software Triggered Strobe === | ||
| − | Das Counter-Register wird bis | + | Das Counter-Register wird bis 0 heruntergezählt, ein Interrupt ausgelöst und der ursprüngliche Wert wiederhergestellt. Der Vorgang beginnt von vorn. |
=== Mode 5: Hardware Triggered Strobe === | === Mode 5: Hardware Triggered Strobe === | ||
| − | Das Herunterzählen beginnt erst, wenn andere Hardware dieses auslöst. Der IRQ wird bei Erreichen des Wertes | + | Das Herunterzählen beginnt erst, wenn andere Hardware dieses auslöst. Der IRQ wird bei Erreichen des Wertes 0 ausgelöst, dann wird wieder auf das Hardwaresignal gewartet usw. |
== Initialisierung == | == Initialisierung == | ||
| Zeile 88: | Zeile 88: | ||
<c> | <c> | ||
| − | + | void pit_init(int freq) | |
{ | { | ||
freq = 1193180 / freq; | freq = 1193180 / freq; | ||
| Zeile 98: | Zeile 98: | ||
=== Frequenzberechnung === | === Frequenzberechnung === | ||
| − | Frequenzen haben die Einheit 1/s, wodurch man sich leicht deren Bedeutung klar machen kann: Hat die Frequenz z.B den Wert 10, wird | + | Frequenzen haben die Einheit 1/s, wodurch man sich leicht deren Bedeutung klar machen kann: Hat die Frequenz z. B. den Wert 10, wird zehnmal pro Sekunde der IRQ 0 ausgelöst, also alle 100 ms (1 s = 1000 ms). |
Im Mode 2 wird die interne Frequenz durch den Wert des Counterregisters geteilt, um den Zähler zu erhalten. Wenn man nun eine bestimmte Frequenz benötigt, berechnet man den zu übergebenen Wert des Counter-Registers wie folgt: | Im Mode 2 wird die interne Frequenz durch den Wert des Counterregisters geteilt, um den Zähler zu erhalten. Wenn man nun eine bestimmte Frequenz benötigt, berechnet man den zu übergebenen Wert des Counter-Registers wie folgt: | ||