Pages: [1] 2 3   Go Down
Author Topic: 4 einzelne digitale Pins als Variable zusammenfassen  (Read 2567 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Gruß Sam
Logged

Offline Offline
Edison Member
*
Karma: 38
Posts: 1164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
int var = digitalRead(4) *8 + digitalRead(3) * 4 + digitalRead(2) * 2 + digitalRead(1);

Logged

Grüße
Gunther

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 22, 2013, 02:39:51 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 149
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Jürgen

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

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 149
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

genau!
Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@guntherb

Code:
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:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schonmal danke für eure Hilfe

Was haltet ihr von dem Code:

Code:
#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);
}
« Last Edit: May 22, 2013, 03:35:43 pm by uwefed » Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bißchen einsam das setup() ohne loop()  smiley-wink smiley-wink

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

Grüß Uwe
Logged

Offline Offline
Full Member
***
Karma: 6
Posts: 159
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb uwefed vorgeschlagen hat):
Code:
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'
« Last Edit: May 23, 2013, 03:02:53 am by MGOS » Logged

Pages: [1] 2 3   Go Up
Jump to: