Go Down

Topic: Tasterschaltung (Read 10430 times) previous topic - next topic

combie

#15
Jun 22, 2015, 06:13 pm Last Edit: Jun 22, 2015, 06:17 pm by combie
Quote
Spart vier Byte
Code: [Select]
struct LedZustand
{
    bool Led00:1;
    bool Led01:1;
    bool Led02:1;
    bool Led03:1;
    bool Led04:1;
    bool Led05:1;
    bool Led06:1;
    bool Led07:1;
};
LedZustand Leds ;

// ---- Verwendung:
 Leds.Led04 = LOW;
// ----



Spart nochmal 3 Byte
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

agmue

Mir wurde hier im Forum geschrieben, vor der Verwendung von structs müßte ich noch viiiiiiiel lernen, darum hatte ich dieses Thema bisher umgangen. Dein Beispiel erklärt sich ja von selbst, könnte ein Einstieg sein.  :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Serenifly

Das ist mehr als einfaches struct. Nämlich ein Bitfeld:
http://www.c-howto.de/tutorial-strukturierte-datentypen-bitfelder.html

Sieht man recht selten.

combie

Mir wurde hier im Forum geschrieben, vor der Verwendung von structs müßte ich noch viiiiiiiel lernen ...
Och...
Das würde ich nicht sagen.
"Struct bringt (Daten)Struktur ins Projekt!"
Das kann man nicht früh genug verstehen.
Die Feinheiten kommen durch Übung.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

agmue

Die Feinheiten kommen durch Übung.
Ich zähle auf Dich!

Dann hier mein "structurierter" Vorschlag (ungetestet, aber mein Compiler ist einverstanden):
Code: [Select]
struct LedZustand
{
  bool Led00: 1;
  bool Led01: 1;
  bool Led02: 1;
  bool Led03: 1;
  bool Led04: 1;
  bool Led05: 1;
  bool Led06: 1;
  bool Led07: 1;
};
LedZustand Leds ;

void setup() {
  pinMode(14, INPUT); // Pin 14 = A0 ist Eingang für Taster, PullDown
  pinMode(15, INPUT);
  pinMode(16, INPUT);
  pinMode(17, INPUT);
  pinMode(13, OUTPUT); // Pin13 .. als Ausgang
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(13, HIGH); // Programmstart Pin 13 auf HIGH
}

void loop() {
  Leds.Led01 = digitalRead(14); // setze Var. t01-04 gleich dem Eingangspegel
  Leds.Led02 = digitalRead(15);
  Leds.Led03 = digitalRead(16);
  Leds.Led04 = digitalRead(17);


  if (Leds.Led01 == HIGH)  { // wenn t01 gleich HIGH dann...
    digitalWrite(13, HIGH); // setze Pin 15 auf HIGH ... und alle anderen auf LOW
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
  }
  else if (Leds.Led02 == HIGH)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
  }
  else if (Leds.Led03 == HIGH)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, HIGH);
    digitalWrite(10, LOW);
  }
  else if (Leds.Led04 == HIGH)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
  }
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

TelosNox

Steht ihr alle auf redundanten Code oder gehts um das einfachere Verständnis?

Hier nochmal die Variante mit dem Struct, aber deutlich kürzer. Eine Boolsche Variable braucht man übrigens nicht auf true prüfen
if (var == true)
das passiert automatisch und es reicht
if (var)

Hier das Sketch von agmue mit der Änderung
Code: [Select]

struct LedZustand
{
  bool Led00: 1;
  bool Led01: 1;
  bool Led02: 1;
  bool Led03: 1;
  bool Led04: 1;
  bool Led05: 1;
  bool Led06: 1;
  bool Led07: 1;
};
LedZustand Leds ;

void setup() {
  pinMode(14, INPUT); // Pin 14 = A0 ist Eingang für Taster, PullDown
  pinMode(15, INPUT);
  pinMode(16, INPUT);
  pinMode(17, INPUT);
  pinMode(13, OUTPUT); // Pin13 .. als Ausgang
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(13, HIGH); // Programmstart Pin 13 auf HIGH
}

void loop() {
  Leds.Led01 = digitalRead(14);
  Leds.Led02 = digitalRead(15);
  Leds.Led03 = digitalRead(16);
  Leds.Led04 = digitalRead(17);


  if (Leds.Led01 || Leds.Led02 || Leds.Led03 || Leds.Led04)  { // wenn irgend ein Button auf HIGH ist
    digitalWrite(13, Leds.Led01);
    digitalWrite(12, Leds.Led02);
    digitalWrite(11, Leds.Led03);
    digitalWrite(10, Leds.Led04);
  }
}

michael_x

#21
Jun 23, 2015, 02:54 pm Last Edit: Jun 23, 2015, 02:55 pm by michael_x
Quote
Steht ihr alle auf redundanten Code
Also bei mir macht das keinen Unterschied ob ich
if (boolvar)
oder
if (boolvar == HIGH)
schreibe. Der Code hat die gleiche Größe.
Getestet mit einer bool Variable, die nur 1 Bit in einer struct groß ist

combie

Schön; der Optimierer erkennt die sinnfreie Aktion.
Was dann umso klarer macht, dass sie sinnfrei ist.
 8)  8)  8)
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Serenifly

Sinnfrei ist es nicht. Ich finde es macht den Code manchmal etwas einfacher lesbar, da man vielleicht eher sieht was gemeint ist. Gerade für Anfänger. Ich kann mich aber nicht wirklich entscheiden welche Schreibweise ich bevorzuge. Bei einer Abfrage auf true ist es egal, aber ich finde var == false besser lesbar als !var

Ansonsten ist das aber reine Geschmackssache

TelosNox

Steht ihr alle auf redundanten Code oder gehts um das einfachere Verständnis?

Hier nochmal die Variante mit dem Struct, aber deutlich kürzer...
@michael_x
Gemeint war NICHT das weglassen von == HIGH, sondern die Verkürzung durch weglassen des if/else if/else if etc...
Du solltest schon den Code lesen, den ich poste  ;)

Mendel13

okokokok .... das ist viel input grad ... wenn ich nicht gleich dazusenfe bitte nicht als undank ansehen ... ich kopfe nur darüber und freu mich wirklich über euer output ....

also die codes funzen alle. bis auf eines: das bei zwei (versehentlich gleichzeitig) gedrückten tasten auch die beiden entsprechenden funktionen (hier die LEDs) ON sind.

nun muss ich aber erst mal die befehle bool und struct verinnerlichen  :o
und was das auf deutsch heissen soll:
digitalWrite(13, Leds.Led01);
setze Pin 13 auf den wert Leds.Led01 ... aber was ist Leds.Led01?? eine variable ... mit nem "." dazwischen? und hängt mit dem befehl "bool Led01: 1;" zusammen?

ok ... in den krampf ... äh ... kampf :-)


combie

#26
Jun 23, 2015, 06:26 pm Last Edit: Jun 23, 2015, 06:34 pm by combie
Schön, wenn es dir gefällt!

Quote
nun muss ich aber erst mal die befehle bool und struct verinnerlichen  :o
und was das auf deutsch heissen soll:
digitalWrite(13, Leds.Led01);
setze Pin 13 auf den wert Leds.Led01 ... aber was ist Leds.Led01?? eine variable ... mit nem "." dazwischen? und hängt mit dem befehl "bool Led01: 1;" zusammen?
Genau!
In der Variablen Leds steckt eine Datenstruktur namens LedZustand.
Und darin steckt eine 1 Bit große Variable namens Led01

Und den PunktOperator solltest du schon kennen, aus:
Code: [Select]
Serial.begin(9600);


Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Serenifly

bool ist mein Befehl, sondern ein Datentyp. Wie int oder long

Das mit dem struct und :1 ist ein Bitfeld. Dadurch kann der Compiler direkt einzelne Bits in einer Variable ansprechen ohne dass man den Code dazu selbst schreiben muss. Man belegt also nicht 8 Bit für einen Zustand, sondern in diesem Fall nur 1 Bit.

Siehe den Link oben:
http://www.c-howto.de/tutorial-strukturierte-datentypen-bitfelder.html

Ist aber für Anfänger etwas weit ausgeholt. Man braucht das nicht. Spart lediglich Speicher.

TelosNox

und was das auf deutsch heissen soll:
digitalWrite(13, Leds.Led01);
Mit Leds.Led01 erhältst du den Wert, der gerade Leds.Led01 zugewiesen ist.
Weiter oben im Code machst du ja Leds.Led01 = digitalRead(14);
Somit setzt du Leds.Led01 auf den Wert, den dir digitalRead(14) geliefert hat (also HIGH falls Taster gedrückt und LOW, falls nicht gedrückt).

Du machst mit digitalWrite(13, Leds.Led01) also nichts anderes, als die LED auf den Zustand zu setzen, den der Taster zum Zeitpunkt des Auslesens hatte.

michael_x

@TelosNox:
Ich habe mich hierauf bezogen:
Quote
Hier nochmal die Variante mit dem Struct, aber deutlich kürzer. Eine Boolsche Variable braucht man übrigens nicht auf true prüfen
if (var == true)
das passiert automatisch und es reicht
if (var)
Schön, dass wir uns mit der Optimierung durch den Compiler einig sind.

Wenn dein Code auch noch eher das macht als was im Original programmiert war, auch gut.
Dafür spricht der seltsame Kommentar "// setze Var. t01-04 gleich dem Eingangspegel"
Genaugenommen macht er aber was anderes, wenn mehr als ein Bit gesetzt ist. Bei agmue und Mendel13 leuchten immer nur eine LED. ( unterschiedliche  ;) )
pinMode(14, INPUT) ; ist übrigens wirklich redundant.

@Mendel13: Danke für deinen Thread, den wir gerne missbrauchen.
Einen 328 kriegst du mit solchen Aufgaben nicht überlastet, ist also vollkommen egal, wie "redundant" du programmierst. Ein Sketch der das macht was er soll, ist immer gut ;)

Go Up