Ein-/Ausgangsport beim Attiny45/85

Wie auch beim Arduino erlaubt der direkte Port-Zugriff beim Attiny45/85 eine wesentlich schnellere Ein-/Ausgabe bei den einzelnen Pins als mit den Anweisungen digitalRead() und digitalWrite(). Mit einer Anweisung kann eine ganze Gruppe von Pins quasi gleichzeitig gesetzt oder gelesen werden.

Zum Unterschied zum Atmega328P-Mikrocontroller besitzt der Attiny45/85 nur ein Port, nämlich Port B:

Die Zuordnung des Port B zu den Binär-Pins des Attiny45/85 ist im nachfolgenden Bild ersichtlich:


Zur Programmierung stehen 3 Register zur Verfügung:

1. Data Direction Register B (DDRB):

Die einzelnen Bits geben die an, ob der jeweilige Pin als Eingang oder als Ausgang fungiert:

DDBn = 0 -> Eingang

DDBn = 1 -> Ausgang

2. Port B Data Register (PORTB)

Wenn ein Pin im Data Direction Register B (DDRB) als Ausgang definiert ist:

PORTBn = 0 -> Ausgabe von logisch "0"

PORTBn = 1 -> Ausgabe von logisch "1"

Wenn ein Pin im Data Direction Register B (DDRB) als Eingang definiert ist:

PORTBn = 0 -> Interner Pullup-Widerstand deaktiviert

PORTBn = 1 -> Interner Pullup-Widerstand aktiviert

3. Port B Input Pins Register (PINB)

Ist ein Pin im Data Direction Register B (DDRB) als Eingang definiert, gibt PINBn den Zustand des Pins zurück. Der interne Pullup-Widerstand für den jeweiligen Pin kann mit dem Port B Data Register (PORTB) aktiviert oder deaktiviert werden.

n ........ Bit Nr. 0 - 5


Beispiele:

Setzen der Binär-Pins PB2 und PB5 als Ausgang:

DDRB |= B00100100; // PB2 und PB5 werden verändert

oder

DDRB |= (1 << DDB2); //PB2 ist Ausgang

DDRB |= (1 << DDB5); //PB5 ist Ausgang

oder

DDRB |= (1 << DDB2) | (1 << DDB5); //PB2 und PB5 sind Ausgaenge


Ausgabe von logisch "1" und logisch "0" am Beispiel Pin PB1:

//PB1 als Ausgang setzen

DDRB |= (1 << DDB1);


//PB1 auf "1" setzen

PORTB |= (1 << PORTB1);


//PB1 auf "0" setzen

PORTB &= ~(1 << PORTB1);


Einlesen des Pins PB4 mit internem Pullup-Widerstand:

//PB4 als Eingang setzen

DDRB &= ~(1 << DDB4);


//Pullup-Widerstand aktivieren

PORTB |= (1 << PORTB4);


//Abfrage des Eingangs-Pin PB4

byte bitStatus = (PIND & (1 << PINB4)) >> PINB4;