Zum Inhalt springen

Bit-Banging

aus Wikipedia, der freien Enzyklopädie

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 die serielle als auch die parallele Schnittstelle genutzt werden. Bei Mikrocontrollern nutzt man die I/O-Pins.

Das Bit-Banging-Verfahren kann dann sinnvoll sein, wenn eine bestimmte Schnittstelle nicht in Hardware vorhanden ist, z. B. hat kein Standard-PC ein SPI, oder wenn bei Mikrocontrollern eine Ressource bereits belegt ist. Besonders häufig dient Bit-Banging der Kosteneinsparung durch Ersetzen relativ teurer 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 Zeitverhalten. Einige Schnittstellen, etwa SPI, sind dagegen immun, andere, etwa UART, haben strikte Zeitforderungen.

Programmbeispiel in C

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.

<syntaxhighlight lang="C"> // 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);
      delay();
      output_high(SD_CLK);
      // shift byte left so next bit will be leftmost
      data <<= 1;
  }
  // deselect device
  output_low(SD_CS);

} </syntaxhighlight>

Weblinks

  • Definition im elektronik.net-Lexikon
  • Herbert Valerio Riedel: <templatestyles src="Webarchiv/styles.css" />{{#if:20120722015829
      | {{#ifeq: 20120722015829 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20120722015829}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20120722015829}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: UART: A Software Implementation Approach. | {{#invoke:WLink|getEscapedTitle|UART: A Software Implementation Approach.}} | {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20120722015829|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://web.student.tuwien.ac.at/~e9725348/Theses/}}
    || {{#if:  || }}
  }}{{#if: UART: A Software Implementation Approach.
    | {{#if: {{#invoke:WLink|isBracketedLink|UART: A Software Implementation Approach.}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://web.student.tuwien.ac.at/~e9725348/Theses/%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://web.student.tuwien.ac.at/~e9725348/Theses/%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://web.student.tuwien.ac.at/~e9725348/Theses/ }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} Diplomarbeit zum Thema, TU Wien.