Go Down

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

Mendel13

äääh ja latürnich 2313 ...

und ja, der sketch (#45) funzt soweit. muss beim umschreiben auf 2313 ein fehler eingkopiert haben.

beim 2313 funktioniert

Code: [Select]
pinMode (i1, INPUT); // Definition Eingaenge
  digitalWrite (i1, HIGH); // ... als Pullup


und

Code: [Select]
pinMode (i1, INPUT_PULLUP); // Definition Eingaenge als Pullup
   pinMode (i2, INPUT_PULLUP);


definitiv nicht. messe am input tatsächlich HIGH und seh auch, dass der input-pin bei tastendruck auf LOW gezogen wird. aber reaktion= null.




Mendel13

#61
Jul 15, 2015, 10:07 am Last Edit: Jul 15, 2015, 10:13 am by Mendel13
okokok ... ich revidiere!!!

määächtig großer fehler:

habe den 2313 auf nem Attiny Shield gesteckt. über die isp-pins hab ich das shield der einfachheit halber mit dem diamex-avr usb-programmier-stick mit strom versorgt .... zu verlockend war es, das shield auch gleichzeitig als steckboard zum externen verschalten zu benutzen, da sämtliche pins mit reihenbuchsen versehen sind.
die pulldown-variante hat so funktioniert, nicht aber die pullup-version.

der (rendundante) sketch funktioniert mit dem 2313 -auf nem externen board, auch in der pullup-version!!

hier die pullup-version:
Code: [Select]



// Funktioniert mit 2313
// 8 Taster funktionieren!!
// PULLUP funktioniert!!


// Setup Variablen
//---------------------------------------
int t01 = HIGH; // setze die Variable mit Namen t01 und gib ihr den Wert HIGH
int t02 = HIGH; // etc
int t03 = HIGH; // Die Variablen t01 bis man stehen fuer
int t04 = HIGH; // die Funktions-Zustaende, gesetzt duch
int t05 = HIGH; // einmaligen Tastendruck
int t06 = HIGH;
int minus = HIGH;
int plus = HIGH;
int man = HIGH;
//---------------------------------------
const int f1 = 16; // Pin-Definition Ausgaenge fuer 2313
const int f2 = 15;
const int f3 = 14;
const int f4 = 13;
const int f5 = 12;
const int f6 = 11;
const int f7 = 10;
const int f8 = 9;
//---------------------------------------
const int i1 = 0; // Pin-Definition Eingaenge fuer 2313
const int i2 = 1;
const int i3 = 2;
const int i4 = 3;
const int i5 = 4;
const int i6 = 5;
const int i7 = 6;
const int i8 = 7;
//---------------------------------------


void setup() { // Einmalige Setup-Routine
  pinMode(i1, INPUT_PULLUP); // Definition Eingaenge, interne pullups
  pinMode(i2, INPUT_PULLUP);
  pinMode(i3, INPUT_PULLUP);
  pinMode(i4, INPUT_PULLUP);
  pinMode(i5, INPUT_PULLUP);
  pinMode(i6, INPUT_PULLUP);
  pinMode(i7, INPUT_PULLUP);
  pinMode(i8, INPUT_PULLUP);
  //---------------------------------------
  pinMode(f1, OUTPUT); // Definition Ausgaenge
  pinMode(f2, OUTPUT);
  pinMode(f3, OUTPUT);
  pinMode(f4, OUTPUT);
  pinMode(f5, OUTPUT);
  pinMode(f6, OUTPUT);
  pinMode(f7, OUTPUT);
  pinMode(f8, OUTPUT);
  digitalWrite(f1, HIGH); // Programmstart f1 auf HIH
}
//---------------------------------------
void loop() { // Start Endlos-Schleife
  t01 = digitalRead(i1); // setze Var. t01-plus gleich dem Eingangspegel
  t02 = digitalRead(i2); // der jeweils an den Inputs liegenden Tastern
  t03 = digitalRead(i3);
  t04 = digitalRead(i4);
  t05 = digitalRead(i5);
  t06 = digitalRead(i6);
  man = digitalRead(f6); // man wird durch Pegel von f6 logisch gesetzt,
  minus = digitalRead(i7); // minus durch Taste 7 und
  plus = digitalRead(i8); // plus durch Taste 8

//---------------------------------------

  if (t01 == LOW)  { // wenn t01 gleich LOW dann...
    digitalWrite(f1, HIGH); // setze f1 auf HIGH ...
    digitalWrite(f2, LOW); // ... und alle anderen auf LOW
    digitalWrite(f3, LOW);
    digitalWrite(f4, LOW);
    digitalWrite(f5, LOW);
    digitalWrite(f6, LOW);
  }
  else if (t02 == LOW) // ansonsten wenn t02 gleich LOW dann ...
  {
    digitalWrite(f1, LOW);
    digitalWrite(f2, HIGH); // setze f2 auf HIGH ...
    digitalWrite(f3, LOW); // ... und alle anderen auf LOW
    digitalWrite(f4, LOW);
    digitalWrite(f5, LOW);
    digitalWrite(f6, LOW);
  }
  else if (t03 == LOW)
  {
    digitalWrite(f1, LOW);
    digitalWrite(f2, LOW);
    digitalWrite(f3, HIGH); // ... usw ...
    digitalWrite(f4, LOW);
    digitalWrite(f5, LOW);
    digitalWrite(f6, LOW);
  }
  else if (t04 == LOW)
  {
    digitalWrite(f1, LOW);
    digitalWrite(f2, LOW);
    digitalWrite(f3, LOW);
    digitalWrite(f4, HIGH);
    digitalWrite(f5, LOW);
    digitalWrite(f6, LOW);
  }
  else if (t05 == LOW)
  {
    digitalWrite(f1, LOW);
    digitalWrite(f2, LOW);
    digitalWrite(f3, LOW);
    digitalWrite(f4, LOW);
    digitalWrite(f5, HIGH);
    digitalWrite(f6, LOW);
  }
  else if (t06 == LOW)
  {
    digitalWrite(f1, LOW);
    digitalWrite(f2, LOW);
    digitalWrite(f3, LOW);
    digitalWrite(f4, LOW);
    digitalWrite(f5, LOW);
    digitalWrite(f6, HIGH);
  }
//---------------------------------------

// Sonderfall Tasten 7,8 enspr. minus und plus
  if ((man == HIGH) && (minus == HIGH) && (plus == LOW))
  // wenn man (gesetzt duch f6) und minus (f7) und plus (f8) logisch ...
  {
    digitalWrite(f7, HIGH); // dann f7 auf HIGH ...
    delay(200); // und mind. 200ms bleiben
  }
  else // ansonsten, also wenn minus und plus nicht bedient werden ...
  {
    digitalWrite(f7, LOW); // ...auf LOW bleiben...
  }

  if ((man == HIGH) && (plus == HIGH) && (minus == LOW))
  {
    digitalWrite(f8, HIGH); /// gilt für f7 und f8.
    delay(200);
  }
  else
  {
    digitalWrite(f8, LOW);
  }
// werden minus (i7) und plus (i8) gleichzeitig getriggert, bleiben f7, f8 auf LOW!!
}



Der Sketch verwendet 1.382 Bytes (67%) des Programmspeicherplatzes. Das Maximum sind 2.048 Bytes.
Globale Variablen verwenden 27 Bytes (21%) des dynamischen Speichers, 101 Bytes für lokale Variablen verbleiben. Das Maximum sind 128 Bytes.

sehr verschwenderisch, werdet ihr sagen. aber der 2313 packts noch ;-)

so, nun gehts ans verinnerlichen ... und dann mal schauen, wie ich den sketch "kürze".



agmue

In Abwandlung eines Spruchs hier aus dem Forum: Ein Programm, das Du verstehst und das tut, was Du willst, ist ein gutes Programm!

Wenn es dann sogar in einen ATtiny paßt: Glückwunsch zum Röhrenradiotastaturprogramm!
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Mendel13

ääh  .... war das jetzt echt sowas wie ein kleiner schulterklopfer?

danke ... *schnüff* ...

Mendel13

#64
Jul 22, 2015, 06:57 am Last Edit: Jul 22, 2015, 06:59 am by Mendel13
Frage:

Wie kehre ich folgende Aussage um?

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


Ich möcht also:

wenn Leds.LED01 oder ... oder ...   LOW ist (also !=HIGH) dann:

setze pin 13 auf den umkehrwert von Leds.Led01
setze pin 12 auf den umkehrwert von Leds.Led02
usw.

hab schon gesucht, aber offensichtlich die falsche frage ...

Mendel13

Ok ... richtige Frage gefunden ... ein ! und gut ist ...


Nun hab ich eine Frage nach dem Warum:

Code: [Select]
//---------------------------------------
void loop() { // Start Endlos-Schleife
  t01 = digitalRead(i1); // setze Var. t01-plus gleich dem Eingangspegel
  t02 = digitalRead(i2); // der jeweils an den Inputs liegenden Tastern
  t03 = digitalRead(i3);
  t04 = digitalRead(i4);
  t05 = digitalRead(i5);
  t06 = digitalRead(i6);
 // man = digitalRead(f6); // man wird durch Pegel von f6 logisch gesetzt,
 // minus = digitalRead(i7); // minus durch Taste 7 und
 // plus = digitalRead(i8); // plus durch Taste 8

  //---------------------------------------

  if (t01 || t02 || t03 || t04 || t05 || t06 == !HIGH) {
    digitalWrite(f1, !t01);
    digitalWrite(f2, !t02);
    digitalWrite(f3, !t03);
    digitalWrite(f4, !t04);
    digitalWrite(f5, !t05);
    digitalWrite(f6, !t06);  }


Warum wird nach loslassen einer Taste txx der jeweilige fx wieder auf LOW gesetzt?
die IF bedingung wird doch nur dann erfüllt, WENN einer der txx auf LOW ist, oder? und somit wird auch NUR DANN die digitalWrite-Kette ausgeführt? geht einer auf LOW wird ensprechender pin fx auf !LOW gesetzt, geht aber wieder auf LOW sobald die Taste losgelassen wird und alle txx durch pullup wieder HIGH sind ...

agmue

Das Stichwort könnte "De Morgansche Gesetze" lauten. Mit dem Ausrufezeichen als Negation:

!(A || B || C || D) = (!A && !B && !C && !D)

Deine textliche Formulierung sagt aber !A || !B || !C || !D

Mit OOP Leds.Led kenne ich mich nicht aus.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

agmue

Zunächst: !HIGH == LOW

if (t01) {digitalWrite(f1, !t01);} Setzt f1 auf LOW, wenn der Eingang HIGH ist. Wenn der Eingang LOW ist, passiert aber nichts.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Mendel13


????

Code: [Select]
if (!t01 || !t02 || !t03 || !t04 || !t05 || !t06) {
    digitalWrite(f1, !t01);
    digitalWrite(f2, !t02);
    digitalWrite(f3, !t03);
    digitalWrite(f4, !t04);
    digitalWrite(f5, !t05);
    digitalWrite(f6, !t06);  }


so funktionierts. jeweilige LED leuchtet bis die nächste aktiviert wird.

echt klasse. hab den sketch "geschrumpft" von 1.382 auf 1280 bytes, globale Variablen von 27 auf 19 Bytes ... und hab nicht verstanden warum es so funktioniert, anders herum nicht. nicht im sinne des erfinders.

Mendel13

also, was ich ehrlich nicht verstehe:

Warum lässt
Code: [Select]
if (t01 || t02 || t03 || t04 || t05 || t06 == !HIGH) {
    digitalWrite(f1, !t01);
    digitalWrite(f2, !t02);
    digitalWrite(f3, !t03);
    digitalWrite(f4, !t04);
    digitalWrite(f5, !t05);
    digitalWrite(f6, !t06);  }

die LEDs nur leuchten, solange die jeweilige Taste gedrückt wird, während
Code: [Select]
if (!t01 || !t02 || !t03 || !t04 || !t05 || !t06) {
    digitalWrite(f1, !t01);
    digitalWrite(f2, !t02);
    digitalWrite(f3, !t03);
    digitalWrite(f4, !t04);
    digitalWrite(f5, !t05);
    digitalWrite(f6, !t06);  }

die jew. LED solange leuchten lässt, bis eine andere Taste gedrückt wird (so wie ich es vorgesehen hab)?


TelosNox

"==" geht vor "||"
In Mathe wäre das Punkt vor Strich. Dir fehlt die Klammer.

Darum ist if (t01 || t02 || t03 || t04 || t05 || t06 == !HIGH) dann wahr, wenn
t01 high ist oder t02 high ist oder t03 high ist oder t04 high ist oder t05 high ist oder t06 low ist.
Die condition ist also immer erfüllt (einer deiner Buttons ist immer high) und demnach wird immer der write durchgeführt und alles auf low gesetzt.

Im Gegenzug dazu:
if (!t01 || !t02 || !t03 || !t04 || !t05 || !t06)
ist nur dann wahr, wenn t01 low ist oder t02 low ist oder t03 low ist etc.

Mach es dir einfacher und invertiere den Wert direkt beim Auslesen. So dass die Variablen = true sind, wenn der Button gedrückt ist
Code: [Select]

t01 = !digitalRead(i1); // setze Var. t01-plus gleich dem Eingangspegel
  t02 = !digitalRead(i2); // der jeweils an den Inputs liegenden Tastern
  t03 = !digitalRead(i3);


Somit kann deine Abfrage komplett ohne die Negierung auskommen
Code: [Select]

if (t01 || t02 || t03 || t04 || t05 || t06) {
    digitalWrite(f1, t01);
    digitalWrite(f2, t02);
...


Ich denke dann ist es viel verständlicher

Mendel13

danke ... das hilft ;-)

Go Up