-
-
Moderator
Robotik Einstein
fast richtig.
mit PORTx werden werte ausgegeben, oder die pullups werden eingestellt.
mit PINx wird der aktuelle status des tasters gelesen.
nehmen wir an, du hast folgende schaltung(eigentlich brauchen leds einen vorwiderstand, den lasse ich jetzt hier weg):
Prozessor --- LED --- GND am PD2, also port d, pin 2
zuerst schalten wir den pin auf ausgangsrichtung:
DDRD |= (1<<2);
dan schalten wir den pin auf HIGH, um die led einzuschalten:
PORTD |= (1<<2);
Die led leuchtet jetzt. wir wollen sie wieder ausschalten:
PORTD &= ~(1<<2);
jetzt ist sie wieder aus.
nun benutzen wir folgende schaltung am gleichen pin:
Prozessor --- Taster --- GND
zuerst schalten wir den pin auf eingang:
DDRD &= ~(1<<2);
Dann schalten wir den Pullup-widerstand ein:
PORTD |= (1<<2);
damit wurde das PORTx-register verwendet, welches normalerweise zum ausgeben eines pegels verwendet wurde.
jetzt wollen wir den status des tasters einlesen:
abfrage = PIND & (1<<2);
zuer erklärung: zuerst wird PIND eingelesen, es wird je nach den angelegten spannungen zB 01001101 sein. dann wird dieser wert mit & mit dem wert 00000100 verknüpft, also werden alle bits ausser dem an stelle 2 auf null gesetzt, weil ja nur dieser eine interessant ist.
wenn der taster nicht gedrückt wurde, ist der pin auf HIGH-pegel, da er ja über den pullup-widerstand mit VCC verbunden ist. folglich hat die abfrage jetzt den wert 00000100, also 4. alle werte ungleich null gelten als "WAHR"
wenn der taster gedrückt ist, dann ist der pegel am pin LOW. die variable abfrage hat jetzt den wert 00000000, also 0. der wert null gilt als "FALSCH".
folgendes programm wäre möglich, wenn du einen taster zur hand hast und den entsprechend anschliesst:
unsigned char abfrage;
DDRD &= ~(1<<2); //als eingang wählen
PORTD |= (1<<2); //pullups aktivieren
while(1){ //endlosschleife
abfrage = PIND & (1<<2); //abfrage durchführen
if(abfrage){ //wenn abfrage nicht null, also WAHR ist
SerWrite("Taster nicht gedrückt\n\r",23); //dann text ausgeben
} //ende if
else{ //wenn abfrage =0 also FALSCH
SerWrite("Taster gedrückt\n\r",17); //dann text ausgebeb
} //ende else
} //ende while
zusammenfassung:
DDRx : bestimmt, ob ein pin eingang (1) oder ausgang(0) ist
PORTx : bestimmt bei ausgängen, ob HIGH (1)oder LOW (0) ausgegeben wird, und bei eingängen pb die pullup-widerstände verwendet werden sollen(1) oder nicht(0).
PINx : enthält den aktuellen wert des von aussen angelegten spannung, (1) für 5V, (0) für GND
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen