Bit-Banging

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Unter Bit-Banging versteht man eine Technik, die mittels Software und I/O-Leitungen eine Hardware-Schnittstelle emuliert, die gewöhnlich mit einem spezifischen Peripherie-Baustein realisiert wird. Auf einem PC können sowohl der Seriell-Port als auch der Parallel-Port genutzt werden. Bei Mikrocontrollern nutzt man die I/O-Pins.

Für den Einsatz der Bit-Banging-Technik sprechen verschiedene Gründe. Eine bestimmte Schnittstelle ist nicht in Hardware vorhanden, z. B. verfügt kein Standard-PC über eine SPI. Bei Mikrocontrollern ist eine Ressource oft bereits belegt. Besonders häufig dient Bit-Banging der Kosteneinsparung durch Ersetzen der teuren Peripheriebausteine.

Eine Vielzahl von Schnittstellen kann durch Bit-Banging emuliert werden. Hier einige Beispiele:

Entsprechend der Komplexität des Schnittstellen-Protokolls kommen unterschiedliche Methoden zum Einsatz. Die einfachste Art ist das Polling. Der Prozessor fragt, so oft er kann, Änderungen an den I/O-Leitungen ab. Ist ein bestimmtes Zeitverhalten einzuhalten, benutzt man Warteschleifen oder Timer-Funktionen. Die Nutzung der Interrupt-Leitungen reduziert weiter die Prozessorauslastung. Speziell zur Erzeugung eines PWM-Signals dienen häufig die direkten Timer-Ausgänge. Trickreich ist die Aufwertung einer einfacheren Schnittstelle zu einem komplexen Protokoll.

Nachteile des Bit-Bangings sind die hohe Prozessorauslastung, der erhöhte Softwareaufwand und meist starkes Jitter beim Timing.

Programmbeispiel in C[Bearbeiten]

Im folgenden Fragment in der Programmiersprache C ist der Sendeteil einer synchronen seriellen Schnittstelle (SPI) mittels Bit-Banging dargestellt. Die I/O-Pins sind als SD_CS (Chip Select), SD_DI (Data) und als SD_CLK (Clock) bezeichnet.

// transmit byte serially, MSB first
void send_8bit_serial_data(unsigned char data)
{
   int i;
 
   // select device
   output_high(SD_CS);
 
   // send bits 7..0
   for (i = 0; i < 8; i++)
   {
       // consider leftmost bit
       // set line high if bit is 1, low if bit is 0
       if (data & 0x80)
           output_high(SD_DI);
       else
           output_low(SD_DI);
 
       // pulse clock to indicate that bit value should be read
       output_low(SD_CLK);
       output_high(SD_CLK);
 
       // shift byte left so next bit will be leftmost
       data <<= 1;
   }
 
   // deselect device
   output_low(SD_CS);
}

Weblinks[Bearbeiten]