Moin,
ein Mikrocontroller besteht vereinfacht gesagt aus vielen Registern, deren einzelne Werte (= Bits) man auf 1 oder 0 setzen kann.
Um einen Pin am Arduino UNO (=ATMEGA328) auf Ausgang zu setzen, heißt die Funktion in der Arduino IDE (im setup() deklarieren):
pinMode(pinNr, OUTPUT);
wenn man direkt das Register und in diesem Fall das Register für z.B. den PORT B, Pin 5 (beim Arduino also digital Pin 13) auf Ausgang setzen will, dann heißt der Befehl:
bitSet(DDRB,5);
eine andere Schreibweise wäre
DDRB |= (1<<5);
oder
DDRB |= _BV(5);
DDRB = The Port B Data Direction Register
Damit setzt man das Bit 5 von DDRB auf 1 und damit den Ausgang Port B 5 auf 1. Beim Arduino entspricht das dem Pin 13 (digital).
ATEMGA328 zu Arduino Pin-Map:
Will man nun den Pin 13 auf HIGH (oder logisch 1) schalten, dann heißt es in der Arduino IDE
digitalWrite (13, HIGH);
analog, wenn man das Register direkt beschreiben will
bitSet(PORTB,5);
oder
PORTB |= (1<<5);
oder
PORTB |= _BV(5);
PORTB – The Port B Data Register
Damit setzt man das Bit 5 in PORTB auf 1 und damit den Ausgang auf HIGH (bei einem 5V-Arduino UNO also z.B. auf 5V). Der ATMEGA328 braucht in diesem konkreten Fall
für den digitalWrite()-Befehl 66 Taktzyklen, also 66 * 62,5ns = 4.125 ns oder 4µs.
für das direkte Beschreiben der Register (bitSet()) 2 Taktzyklen (Stichwort: SBI) oder 2 * 62,5ns oder 125ns
(62,5ns wenn der ATMEGA328 mit 16 MHz = 16.000.000 Schwingungen/ Sekunde getaktet ist. 1 Sekunde/ 16.000.000 = 0.0000000625 = 62,5 ns pro Taktzyklus).
Ein direktes Beschreiben der Register beschleunigt die Verabeitung dieses einzelnen Befehls also um den Faktor 33.
Vorteil des direkten Beschreiben der Register ist demnach zum einen das i.d.R. schnellere Verarbeiten der Befehle und auch der (teilweise weitaus) geringere Platzbedarf im Flash-Speicher des Arduino.