Special Function Register
Es gibt einige wichtige Register, welche für den Eingang und Ausgang von Daten verwendet werden. Diese Register sind „case-sensitive“, wobei SFR immer UPPERCASE sind. Außerdem sind diese immer acht Bit breit, sprich 1 Byte. Standardmäßig sind alle DDRx und PORTx Register mit 0 initialisiert.
Nachstehende Tabelle fasst die SFR für die drei Ports jeweils zusammen.
| Data Direction Register | Ausgangsregister | Eingangsregister | |
|---|---|---|---|
| B | DDRB | PORTB | PINB |
| C | DDRC | PORTC | PINC |
| D | DDRD | PORTD | PIND |
| Beschreibung | Jedes Pin kann entweder ein Eingang oder ein Ausgang sein. Diese
Flussrichtung der Daten, kann mittels Data Direction Register eingestellt
werden. Da standardmäßig alle | Will man intern bei dem jeweiligen Pin | Die Eingangsregister erlauben Konfigurationen, welche beim Arbeiten mit Tasten von Entscheidung sind. |
Beispiele
Abschnitt betitelt „Beispiele“Eingang / Ausgang setzen
Abschnitt betitelt „Eingang / Ausgang setzen“So kann man den Pin 1 an Port D als Ausgang einstellen:
DDRD |= (1<<PORTD1);So kann man den Pin 1 an Port D als Eingang einstellen (Standard):
DDRD &= ~(1<<PORTD1);Spannung an Pin anlegen
Abschnitt betitelt „Spannung an Pin anlegen“So kann man am Pin 1 von Port D eine Spannung von 5V anlegen:
PORTD |= (1<<PORTD1);So kann man am Pin 1 von Port D keine Spannung anlegen (Standard):
PORTD &= ~(1<<PORTD1);Spannung von Pin abfragen
Abschnitt betitelt „Spannung von Pin abfragen“So kann man die Spannung von Pin 1, Port D abfragen:
if (PIND & (1<<PIND1)){ // Es liegt eine Spannung größer als 0.7V an.}Meistens verwendet man bei der Abfrage von Tasteneingaben die Interne Pull-Up Widerstand-Methode. Hierbei liegen 0V an, wenn die Taste gedrückt ist, was bedeutet, dass die Bedinung negiert werden muss. Um diese dann noch zu entprellen (auf Softwareebene) macht man ein Delay.
if (!(PIND & (1<<PIND1))){ // Taste (Pull-Up) 1x gedrückt}
// Prellen vermeiden_delay_ms(70);