Forum: Mikrocontroller und Digitale Elektronik For-Variable 6 Taster


von Addi S. (staasi)


Lesenswert?

Hallo,

ich bin dabei einen Sketch zu kürzen. Ich weiß bloß nicht genau was 
fehlt.
Vorweg die Funktion.
Eingang 1, schaltet Ausgang 1
Eingang 2, schaltet Ausgang 2
Eingang 3, schaltet Ausgang 3
Eingang 4, schaltet Ausgang 4
Eingang 5, schaltet Ausgang 5
Eingang 6, schaltet Ausgang 6

Ist der Eingang HIGH, dann Ausgang HIGH - Ist der Eingang LOW, dann 
Ausgang LOW

Anfangs hatte ich alle Ein/Ausgänge deklariert und 6 variablen 
genutzt(viel Tippen und kopieren). Fuktionierte ohne Probleme.
Dann hatte ich die Überlegung, dass man es bestimmt mit einer 
for-Variable genau so lösen könnte. Und da ist das Problem.
Was fehlt hier noch?
Danke für die hilfe.

const int TaPin[6] = {8,9,10,11,12,13};  //Eingang festlegen
const int LEDPin[6] = {2,3,4,5,6,7};     //Ausgang festlegen


void setup()
{
    Serial.begin(9600);
    for (int i = 0; i<6; i++)            // Von 1 bis 6
    {
      pinMode(TaPin[i], INPUT);          // Eingang zuordnen
      pinMode(LEDPin[i], OUTPUT);        // Eingang zuordnen
    }
   }

void loop ()
{
  for (int i = 0; i<6; i++)              //
  {
  if (TaPin[i] == HIGH )                 // Taster 1-6
  {
  digitalWrite(LEDPin[i], HIGH);         // Ausgang 1-6
  }
  else
  {
  digitalWrite(LEDPin[i], LOW);
}
}
}

von asdfg (Gast)


Lesenswert?

1
void loop ()
2
{
3
    for (int i = 0; i<6; i++)
4
    {
5
        digitalWrite(LEDPin[i], TaPin[i]);
6
    }
7
}

von Dieter F. (Gast)


Lesenswert?

Addi S. schrieb:
> Ist der Eingang HIGH, dann Ausgang HIGH - Ist der Eingang LOW, dann
> Ausgang LOW

Wie sieht denn Deine Schaltung /Schaltplan aus?

von Addi S. (staasi)


Lesenswert?

Danke für die Antwort,
ich nutze einen Ardoino Uno und nutze die Digitalen Ports auf dem Board.
Als Eingangssignale nutze ich Lichtschranken von 
Fischertechnik/Selbstgebaute mit Fotodioden(nur 1 oder 0 Signal).

Pinbelegung:

Pin 2-7 Ausgang
Pin 8-13 Eingang

Der Schaltplan ist nicht Falsch, da bin ich im ziemlich sicher.
Lichtschranke auf Eingang.
Ausgang auf Relais.

Es lief ja vorher mit dem anderen Code.

von Dieter F. (Gast)


Lesenswert?

Addi S. schrieb:
> Der Schaltplan ist nicht Falsch, da bin ich im ziemlich sicher

Na, dann muss es ja auch funktionieren ;-)

von Joe F. (easylife)


Lesenswert?

lass' mal das "const" bei den array deklarationen weg.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Joe F. schrieb:
> lass' mal das "const" bei den array deklarationen weg.

Warum?

von Addi S. (staasi)


Lesenswert?

Den Code, den ich hier reingestellt habe (siehe oben) ist die gekürzte 
Version, die momentan leider noch nicht Funktioniert. Der vorherige Code 
(funktionsfähig) besteht aus 6 Variablen und viel Text, die ich nun 
einsparen möchte.

von Leo C. (rapid)


Lesenswert?

Addi S. schrieb:
> if (TaPin[i] == HIGH )                 // Taster 1-6

Fehlt da nicht ein DigitalRead() oder so was ähnliches?

von Dieter F. (Gast)


Lesenswert?

Leo C. schrieb:
> DigitalRead()

Details ... :-) - hat ja vorher funktioniert!

von Joe F. (easylife)


Lesenswert?

Dieter F. schrieb:
> Joe F. schrieb:
>> lass' mal das "const" bei den array deklarationen weg.
>
> Warum?

Weil const manchmal (Un-)Variablen in den Programspace verschiebt, was 
u.U. Probleme machen kann. Es war nur als Versuch gemeint, vermutlich 
macht es keinen Unterschied.

Leo C. hat den echten Fehler ja entdeckt. Ist mir auch durch die Lappen 
gegangen.

Nachtrag:
Besser wäre natürlich sowieso, den ganzen 8-Bit Port auf einmal 
umzukopieren.
Das sieht das Ardouino-Universum aber vermutlich nicht vor...
1
PORTD = (PORTB)>>2;

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Joe F. schrieb:
> Das sieht das Ardouino-Universum aber vermutlich nicht vor...
> PORTD = PORTB;

Besser :-P
1
PORTD = PINB;
2
//

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Joe F. schrieb:
> Weil const manchmal (Un-)Variablen in den Programspace verschiebt, was
> u.U. Probleme machen kann.

Wenn er nur liest (lt. Code-Strecke) sehe ich da kein Problem.

Wenn er aber nicht den kompletten Code zeigt - bzw. den "bisher 
funktionierenden" Code auch nicht zeigt und seine Schaltung / seinen 
Schaltplan nicht offen legt - ist ihm nur schwer zu helfen.

von Joe F. (easylife)


Lesenswert?

Matthias S. schrieb:
> Besser :-PPORTD = PINB;

noch besser
1
PORTD = PINB << 2;

von Addi S. (staasi)


Lesenswert?

Oh man, danke...
Es funktioniert. Gibt es sonst noch Optimierungsbedarf?
Ich weiß wohl das ich mit dem Beschreiben // noch Probleme habe.
Bin noch nicht so lange mit dem System vertraut.

Der Code lautet nun wie folgt:

int TaPin[6] = {8,9,10,11,12,13};  //Eingang festlegen
int LEDPin[6] = {2,3,4,5,6,7};     //Ausgang festlegen

void setup()
{
    Serial.begin(9600);
    for (int i = 0; i<6; i++)            // Von 1 bis 6
    {
      pinMode(TaPin[i], INPUT);          // Eingang zuordnen
      pinMode(LEDPin[i], OUTPUT);        // Eingang zuordnen
    }
   }

void loop ()
{
  for (int i = 0; i<6; i++)
  {
  int va1_1=(digitalRead(TaPin[i]));
  if (va1_1 == HIGH)
   {
    digitalWrite(LEDPin[i], LOW);
   }
    else
    {
    digitalWrite(LEDPin[i], HIGH);
    }
  }
}

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> PORTD = PINB;

Was ist daran besser?

von Joe F. (easylife)


Lesenswert?

Dieter F. schrieb:
> und seine Schaltung / seinen
> Schaltplan nicht offen legt

Braucht man nicht immer. Schon gar nicht als 2 MB Foto vom Steckbrett 
mit 50 wilden Kabeln... ;-)

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Addi S. schrieb:
> Gibt es sonst noch Optimierungsbedarf?

Tasten-Entprellung? Aber das ist in der Arduino-Fraktion verpönt :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter F. schrieb:
> Matthias S. schrieb:
>> PORTD = PINB;
>
> Was ist daran besser?

Och, Eingänge liest man besser aus dem PIN Register als aus dem PORT 
Register - nur deswegen :-)

von Addi S. (staasi)


Lesenswert?

Dieter F. schrieb:

> Tasten-Entprellung? Aber das ist in der Arduino-Fraktion verpönt :-)

Fand ich jetzt nicht nötig für die Lichtschranken.
Der 10K Widerstand ist jeweils verbaut.

von Joe F. (easylife)


Lesenswert?

Addi S. schrieb:
> Es funktioniert. Gibt es sonst noch Optimierungsbedarf?

ja
1
void setup()
2
{
3
  DDRD = DDRD | B11111100;
4
  DDRB = 0;
5
  Serial.begin(9600);
6
}
7
8
void loop ()
9
{
10
  PORTD = PINB << 2;
11
}

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Dieter F. schrieb:
>> Matthias S. schrieb:
>>> PORTD = PINB;
>>
>> Was ist daran besser?
>
> Och, Eingänge liest man besser aus dem PIN Register als aus dem PORT
> Register - nur deswegen :-)

Liest Du auch den bezogenen Post?

von Addi S. (staasi)


Lesenswert?

@Autor: Joe F. (easylife)
@Autor: Dieter F. (jim_quakenbush)
@Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)

Ich danke euch für eure Hilfe.
Wenn ihr klären wollte was nun besser ist von wegen:

Matthias S. schrieb:
> Dieter F. schrieb:
>> Matthias S. schrieb:
>>> PORTD = PINB;
>>
>> Was ist daran besser?

Bitte ich euch ein neues Topic zu erstellen.
Mein E-Mail Konto explodiert gleich, Danke.

von Dieter F. (Gast)


Lesenswert?

Addi S. schrieb:
> Bitte ich euch ein neues Topic zu erstellen.
> Mein E-Mail Konto explodiert gleich, Danke.

Dann machst etwas falsch - gerne ...

von Addi S. (staasi)


Lesenswert?

Dieter F. schrieb:
> Addi S. schrieb:
>> Bitte ich euch ein neues Topic zu erstellen.
>> Mein E-Mail Konto explodiert gleich, Danke.
>
> Dann machst etwas falsch - gerne ...


Dann klärt mich bitte auf, tut mir leid. Dachte das wäre etwas Abseits 
von meinem Thema.

von Joe F. (easylife)


Lesenswert?

Addi S. schrieb:
> Dann klärt mich bitte auf, tut mir leid. Dachte das wäre etwas Abseits
> von meinem Thema.

https://www.arduino.cc/en/Reference/PortManipulation

von Dieter F. (Gast)


Lesenswert?

Addi S. schrieb:
> Dann klärt mich bitte auf, tut mir leid. Dachte das wäre etwas Abseits
> von meinem Thema.

Deinen Account muss man sich wohl merken müssen ... :-)

Addi S. schrieb:
> Und da ist das Problem.
> Was fehlt hier noch?
> Danke für die hilfe.

Welches Thema - wenn Du uns wesentliche Veränderungen nicht transparent 
machst, wie soll Dir dann qualifiziert geholfen werden? Natürlich wird 
auch über "Randbedingungen" diskutiert. Interessant ... würde Spock 
sagen ...

von Addi S. (staasi)


Lesenswert?

Dieter F. schrieb:
> Addi S. schrieb:
>> Dann klärt mich bitte auf, tut mir leid. Dachte das wäre etwas Abseits
>> von meinem Thema.
>
> Deinen Account muss man sich wohl merken müssen ... :-)
>

Ich hoff das ist jetzt nicht negativ gemeint....

Den link werde ich mir genauer zuführen lassen, danke.
https://www.arduino.cc/en/Reference/PortManipulation

Ansonsten ist für mich im Moment alles geklärt, bin wie gesagt noch 
nicht so in der Materie.

von Wolfgang (Gast)


Lesenswert?

Dieter F. schrieb:
> Tasten-Entprellung? Aber das ist in der Arduino-Fraktion verpönt :-)

Woher weisst du, dass die LEDs nicht den direkten Zustand der Eingänge 
wiederspiegeln sollen, sondern einen gefilterte?

von Dieter F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Woher weisst du, dass die LEDs nicht den direkten Zustand der Eingänge
> wiederspiegeln sollen, sondern einen gefilterte

Di weißt, dass Tasten üblicher Weise prellen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter F. schrieb:
> Liest Du auch den bezogenen Post?

Dieter F. schrieb:
> Di weißt, dass Tasten üblicher Weise prellen?

Anscheinend liest du nicht so alles. Es sind gar keine Taster am 
Arduino, sondern Lichtschranken:

Addi S. schrieb:
> Als Eingangssignale nutze ich Lichtschranken von
> Fischertechnik/Selbstgebaute mit Fotodioden(nur 1 oder 0 Signal).

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Es sind gar keine Taster am
> Arduino, sondern Lichtschranken:

Ja, dann schreibe ich LiSchraPin statt TaPin oder synonym ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.