Go Down

Topic: 4 einzelne digitale Pins als Variable zusammenfassen (Read 3050 times) previous topic - next topic

SamBOT

Hallo zusammen,

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.

Kann mir da jemand weiterhelfen?


Mit freundlichen Grüßen
Sam

uwefed

Wenn alle 4 Sensoren auf dem gleichen Port sind, geht das mit direktem Zugriff auf den I/O Port am einfachsten.
http://www.arduino.cc/en/Reference/PortManipulation

Grüße Uwe



SamBOT

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.

Wie müsstemeine Programm dafür aussehen??


Gruß Sam

uwefed

Hast Du wenigstens versucht zu verstehn was ich Dir vorgeschlagen habe?
Grüße Uwe

SamBOT

Was versteht man unter einem Port?
1 Port = 1 Pin
Oder
1 Port mehrere Pins
???


Gruß Sam

guntherb

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:
Code: [Select]

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:
Code: [Select]

int var = digitalRead(4) *8 + digitalRead(3) * 4 + digitalRead(2) * 2 + digitalRead(1);


Grüße
Gunther

uwefed

#6
May 22, 2013, 09:34 pm Last Edit: May 22, 2013, 09:39 pm by uwefed Reason: 1

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

SamBOT

Danke Gunther habe es jetzt glaube ich ein wenig verstanden.

Wann schreibt er die Variablen rein, wenn es Low oder wenn es High ist?


Gruß Sam

JuergenR

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



Grüße,
Jürgen

SamBOT

Danke Jürgen

Bedeutet das, wenn ein Wert Low ist, wird einfach eine 0 geschrieben?


J3RE

@guntherb

Code: [Select]
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

Code: [Select]
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 der Code funktionieren.

Grüße,
J3RE

SamBOT

#12
May 22, 2013, 10:21 pm Last Edit: May 22, 2013, 10:35 pm by uwefed Reason: 1
Schonmal danke für eure Hilfe

Was haltet ihr von dem Code:

Code: [Select]
#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);
}

uwefed

Bißchen einsam das setup() ohne loop()  ;) ;)

Das ist nicht der ganze Sketch.
Bitte benutze die code Tags für den sketch (Ikone mit dem Doppelkreuz).

Grüß Uwe

MGOS

#14
May 23, 2013, 12:17 am Last Edit: May 23, 2013, 10:02 am by MGOS Reason: 1
Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb uwefed vorgeschlagen hat):
Code: [Select]
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'

Go Up