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 = (PINB & (1 << PINB4)) >> PINB4;