Skip to content

Special Function Register

Switch to Zen Mode

This content is not available in your language yet.

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 RegisterAusgangsregisterEingangsregister
BDDRBPORTBPINB
CDDRCPORTCPINC
DDDRDPORTDPIND
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 DDR auf 0 gesetzt sind, ist auch standardmäßig alles ein Eingang. Mit dem Code unten kann man die jeweilgen Pins auf Ausgänge setzen (für LED zB).

Will man intern bei dem jeweiligen Pin 5V anlegen, so kann man dies tun, indem man das korrespondierende Ausgangsregister auf 1 setzt.

Die Eingangsregister erlauben Konfigurationen, welche beim Arbeiten mit Tasten von Entscheidung sind.

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);

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);

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);