ich bin noch ein Neuling beim Thema Arduino und habe deshalb eine Frage.
Ich möchte 4 digitale Pins schon beim einlesen zu einer Variable zusammenfassen.
Ich habe 4 Lichtsensoren, welche alle durch diese Variable abgefragt werden sollen.
Ich habe die 4 Digitalen Anschlüsse meiner Sensoren (welche die Zustände High und Low einnehmen können) an die digitalen Eingänge 4-7 angeschlossen.
Aus diesen Werten möchte ich eine Variable machen, welche die Werte 0 bis 15 einnehmen kann.
Ich hoffe, dass diese Schilderung verständlicher ist.
Falls du dem Link, den Uwe gepostet hat, folgen möchtest, könntest du dort lesen
"The chips used on the Arduino board (the ATmega8 and ATmega168) have three ports:
B (digital pin 8 to 13)
C (analog input pins) D (digital pins 0 to 7)"
Aber ich denke, das ist etwas zu komplex.
Probiers mal so:
byte var;
var = digitalRead(4); // Pin 4 ins unterste Bit schreiben
var << 1; // eines nach links schieben.,
var | digitalRead(5);
var << 1;
var | digitalRead(6);
var << 1;
var | digitalRead(7);
jetzt sollte (ich habe es nicht ausprobiert) ein 4-Bit Wert in var stehen, der deine Eingänge repräsentiert.
Es ginge auch so, kostet aber mehr Zeit:
int var = digitalRead(4) *8 + digitalRead(3) * 4 + digitalRead(2) * 2 + digitalRead(1);
SamBOT:
Was versteht man unter einem Port?
1 Port = 1 Pin
Oder
1 Port mehrere Pins
???
Gruß Sam
Ein Port ist ein Register dessen 1 bzw 0 Zustände die einzelnen Pins auf H bzw LOW setzen bzw falls Eingänge den Zustand der einzelnen Pins lesen.
Grüß Uwe
Hallo Sam,
er schreibt immer den Zustand (egal ob Low oder High) rein, schiebt dann den gesamten Inhalt des Byte um ein nach links usw. Dann steht in den untersten 4 Bit in "var" der Zustand der Eingänge.
Wenn zum Beispiel alle 4 High wären, würde das Byte Bitweise dargestellt so aussehen:
00000001 Der erste Eingang
00000010 einmal geschogben
00000011 der zweite Eingang dazu
00000110 nochmal geschoben
00000111 dritter Eingang dazu
00001110 erneut geschoben
00001111 vierter Eingang dazu
byte var;
var = digitalRead(4); // Pin 4 ins unterste Bit schreiben
var << 1; // eines nach links schieben.,
var | digitalRead(5);
var << 1;
var | digitalRead(6);
var << 1;
var | digitalRead(7);
Du hast die = vergessen
byte var;
var = digitalRead(4); // Pin 4 ins unterste Bit schreiben
var <<= 1; // eines nach links schieben.,
var |= digitalRead(5);
var <<= 1;
var |= digitalRead(6);
var <<= 1;
var |= digitalRead(7);
#include <Servo.h>
Servo SERVO_LINKS; // Linkes Rad
Servo SERVO_RECHTS; // Rechtes Rad
int SERVOANSCHLUSS_RECHTS=2; //Zuordnung Servoanschluss vom rechten Rad
int SERVOANSCHLUSS_LINKS=3; //Zuordnung Servoanschluss vom linken Rad
byte var;
void setup()
{
SERVO_LINKS.attach(SERVOANSCHLUSS_LINKS); //linkes Rad 89-0 Vorwärts 91-180 Rückwärts
SERVO_RECHTS.attach(SERVOANSCHLUSS_RECHTS); //rechtes Rad 91-180 Vorwärts 89-0 Rückwärts
}
void LICHTSENSOREN()
{
var = digitalRead(4); // Pin 4 ins unterste Bit schreiben
var <<= 1; // eines nach links schieben.,
var |= digitalRead(5);
var <<= 1;
var |= digitalRead(6);
var <<= 1;
var |= digitalRead(7);
}
Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb uwefed vorgeschlagen hat):
var = PORTD >> 4
Das liest den gesamten PORTD (also die Pins 0-7) rein und schiebt das Ganze um 4 Bit nach rechts, da wir ja nur die oberen 4 Bit (Pins 4-7) brauchen. Der Rest wird einfach unten rausgeschoben, oben kommen Nullen rein.
PORTD: b 'pin7-pin6-pin5-pin4-pin3-pin2-pin1-pin0'
Nach dem Schieben:
var: b '0-0-0-0-pin7-pin6-pin5-pin4'