Systemlautsprecher — Änderungen 2282 → 2469

Zeile 1: Zeile 1:
−
Der Systemlautsprecher kann für ein Betriebssystem ganz nützlich sein, z.B um auf Fehler aufmerksam zumachen oder einfach das Zeichen ''\a'' ausgeben zu können. Der Systemlautsprecher wird manchmal auch als "BIOS-Beeper" oder einfach nur als "Beeper" bezeichnet, da er ein monotones Piepen erzeugt. Man kann nur die Frequenz anpassen und nicht etwa die Form der Schwingungskurve. Der Systemlautspecher kann nur Rechteckkurven erzeugen, aber das reicht auch oft schon aus.
+
Der '''Systemlautsprecher''' kann für ein Betriebssystem ganz nützlich sein, z.B um auf Fehler aufmerksam zu machen oder einfach das Zeichen ''\a'' ausgeben zu können. Der Systemlautsprecher wird manchmal auch als "BIOS-Beeper" oder einfach nur als "Beeper" bezeichnet, da er ein monotones Piepen erzeugt. Man kann nur die Frequenz anpassen und nicht etwa die Form der Schwingungskurve. Der Systemlautspecher kann nur Rechteckkurven erzeugen, aber das reicht auch oft schon aus.
  
 
==Ansteuerung==
 
==Ansteuerung==
 
Zur Steuerung der Frequenz wird der 3. Kanal des [[PIT]] verwendet, man muss also vorher in das Latchregister des 3. Kanals des [[PIT]] den richtigen Wert hineinschreiben. Um den richtigen Wert zu ermitteln kann man diese Formel benutzen: ''teiler = 1193180/frequenz''.
 
Zur Steuerung der Frequenz wird der 3. Kanal des [[PIT]] verwendet, man muss also vorher in das Latchregister des 3. Kanals des [[PIT]] den richtigen Wert hineinschreiben. Um den richtigen Wert zu ermitteln kann man diese Formel benutzen: ''teiler = 1193180/frequenz''.
  
−
Man muss aber noch dem Lautsprecher mitteilen, wie er den Ton erzeugen soll. Dafür eignet es sich ''10110110b'' in das Kommanndoregister zu laden, damit wird:
+
Man muss aber noch dem Lautsprecher mitteilen, wie er den Ton erzeugen soll. Dafür eignet es sich ''10110110b'' in das Kommandoregister zu laden, damit wird:
 
* Kanal 3 des [[PIT]] verwendet (üblich für Lautsprecher)
 
* Kanal 3 des [[PIT]] verwendet (üblich für Lautsprecher)
 
* erst das Low-Byte und dann das High-Byte des Latch-Registers verwendet
 
* erst das Low-Byte und dann das High-Byte des Latch-Registers verwendet
−
* eine symetrische Pulsfolge erzeugt
+
* eine symmetrische Pulsfolge erzeugt
−
* das Kommandobyte binär interpretiert und nicht als BCD
+
* das Kommandobyte binär interpretiert und nicht als [[BCD]]
  
−
Ob man zuerst den Timer einstellt oder das Kommandoregister ist eigentlich egal, auf jeden Fall muss man dann den Ton anschalten und wieder ausschalten. Die Zeit dazwischen muss irgendwie überbrückt werden. Ich benutze dafür meinen Kernel-Timer, mitdem ich eine Callback-Funktion nach einer bestimmten Zeit aufrufen lassen kann.
+
Ob man zuerst den Timer einstellt oder das Kommandoregister ist eigentlich egal, auf jeden Fall muss man dann den Ton anschalten und wieder ausschalten. Die Zeit dazwischen muss irgendwie überbrückt werden. Ich benutze dafür meinen Kernel-Timer, mit dem ich eine Callback-Funktion nach einer bestimmten Zeit aufrufen lassen kann.
  
 
==Beispiel==
 
==Beispiel==
Zeile 18: Zeile 18:
 
  void sound_on() {
 
  void sound_on() {
 
   // 1. und 2. Bit setzen um Lautsprecher anzuschalten
 
   // 1. und 2. Bit setzen um Lautsprecher anzuschalten
−
   outb(0x61,inb(0x61)|3);
+
   outb(0x61, inb(0x61) | 3);
 
  }
 
  }
 
  void sound_off() {
 
  void sound_off() {
 
   // 1. und 2. Bit zurücksetzen um Lautsprecher auszuschalten
 
   // 1. und 2. Bit zurücksetzen um Lautsprecher auszuschalten
−
   outb(0x61,inb(0x61)&~3);
+
   outb(0x61, inb(0x61) & ~3);
 
  }
 
  }
−
  void sound(u32 frequenz,u32 dauer) {
+
  void sound(uint32_t frequenz, uint32_t dauer) {
−
   u32 teiler;
+
   uint16_t teiler;
−
   teiler = 1193180/frequenz;
+
   teiler = 1193180 / frequenz;
−
   outb(0x43,0xB6);
+
   outb(0x43, 0xB6);
−
   outb(0x42,teiler&0xFF);
+
   outb(0x42, teiler & 0xFF);
−
   outb(0x42,teiler>>8);
+
   outb(0x42, teiler >> 8);
 
   sound_on()
 
   sound_on()
−
   add_timeout(dauer,sound_off());
+
   add_timeout(dauer, sound_off());
 
  }
 
  }
 
</c>
 
</c>