Benutzer:The todd/Spielwiese
AVR-GCC/IO-Ports
[Bearbeiten]Digitale Eingänge
[Bearbeiten]Jeder Port lässt sich auch als digitaler Eingang verwenden. Ein Eingang ermöglichet es dir, Ereignisse von aussen zu erkennen und darauf zu reagieren.
Datenrichtung setzen
[Bearbeiten]Ein Eingang kannst du im Datenrichtungsregister mit einer logischen Null konfigurieren. Möchtest du beispielsweise PB1 als Eingang benutzen, sollte im Datenrichtungsregister an der Stelle PB1 eine Null stehen.
| PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
DDRB &= ~(1 << PB1);
Im nächsten Schritt ist es wichtig deine Hardware zu kennen, denn du solltest noch den internen Pull-Up Widerstand konfigurieren. Der interne Pull-Up Widerstand zieht den Pin auf einen definierten Zustand, in diesem Fall logisch Eins, wenn dieser nicht beschaltet ist. Wichtig wird das unter anderem Bei Schaltern bzw. bei Tastern, die schließlich nicht immer aktiv sind und meist in einer Ruhephase sind. Hast du allerdings einen externen Pull-Up Widerstand verbaut, oder willst dass der Pin in der Ruhephase auf Masse liegt, musst du den internen Pull-Up abschalten. Das erreichst du, indem du im PORTx-Register ebenfalls an die Stelle PB1 eine logische Null schreibst. Möchtest du den internen Pull-Up benutzen schreibst du an die Stelle eine Eins.
| PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PORTB &= ~(1 << PB1);
Damit ist der Pin nun im sogenannten Tri-State. Das ist ein spezieller dritter Zustand den ein Pin annehmen kann. Dieser Zustand hat den Vorteil, dass der Mikrocontroller den Pin nicht selbst beeinflusst und damit die Signale, die am Pin anliegen nicht verfälscht werden.
Aber Vorsicht! Setzt du den Eingang als Tri-State und setzt keinen externen Pull-Up oder Pull-Down Widerstand ein, hat der Pin in der Ruhephase einen undefinierten Zustand.
Pinzustand lesen
[Bearbeiten]Den Pinzustand kannst du im Register PINx abrufen. Dieses Register hat 8 Bit und symbolisiert den Zustand des gesamten Ports. Wenn du eine Maske über den Registerwert legst, kannst du auf einzelne Pinzustände prüfen.
Nehmen wir einmal an, dich interessiert der Zustand von Pin PB1, den wir vorhergehend als Eingang konfiguriert haben. Dazu legst du einfach eine Maske auf den Wert in PINB und prüfst, ob dieser ungleich Null ist.
#include <avr/io.h>
int main(void){
DDRB &= ~(1 << PB1); // damit ist dann PB1 ein Eingang
PORTB &= ~(1 << PB1); // PB1 als Tri-State
if((PINB & (1 << PB1))) {
//PB1 ist gesetzt
}
return 0;
}