Eigene Funktion macht nicht was sie soll

Ich hoffe ihr könnt mir weiter helfen.

Ich möchte bei meiner ModellBahn die Beleuchtung der Häuser, Straßen, etc. mit dem Arduino Steuern über eine Infarot Fernbedienung.

Das arbeiten mit einem Schieberegister und einer Fernbedienung mit 43 Tasten funktioniert einwandfrei.

Ich nutze shiftOut und ändere die Bits des auszuschiebenden Bytes mit bitRead und bitWrite. Auch das funktioniert einwandfrei.

Ich schiebe 5 Bytes in 5 Schieberegister. Dazu nutze ich folgenden Code:

digitalWrite(storePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, data5);
  shiftOut(dataPin, shiftPin, MSBFIRST, data4);
  shiftOut(dataPin, shiftPin, MSBFIRST, data3);
  shiftOut(dataPin, shiftPin, MSBFIRST, data2);
  shiftOut(dataPin, shiftPin, MSBFIRST, data1);
  digitalWrite(storePin, HIGH);

Da das ziemlich viel Text ist, diesen bei jeder if Abfrage einzusetzen, wollte ich es in eine Funktion auslagern, die ich dann immer nur über einen Befehl ausführe.

Solange das Rausschieben direkt in der if Abfrage mache, wechselt das Level der entsprechenden LED. Wenn ich das aber über die eigene Funktion ausführe, ändert sich das Level nicht an der LED.
Die Bits der auszuschiebenden Daten werden aber korekt geändert laut serialem Monitor.

Warum funktioniert der Code also in einer If Abfrage aber nicht in einer eigenen Funktion.

Hier nochmal der komplette Sketch

// Das Programm greift an dieser Stelle auf eine „Library“ zurück. Das erleichtert einem viel Arbeit. 
// Denn das Infrarotlicht wird mit einem Code verschlüsselt gesendet. Um diesen Code selber auszulesen 
// und in passende Werte umzuwandeln, wären sehr viele Zeilen Code erforderlich.
#include <IRremote.h>   
//  Der Kontakt der am Infrarotsensor die Daten ausgibt, wird mit Pin 02 des Arduinoboards verbunden.
int RECV_PIN = 2;  
// An dieser Stelle wird ein Objekt definiert, dass den Infrarotsensor an Pin 02 ausliest.
IRrecv irrecv(RECV_PIN); 
decode_results results; // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.

int shiftPin = 8; //Pin verbunden mit SRCK des TPIC6C595N  //Shift im Lochrasterlayout
int storePin = 9; //Pin verbunden mit RCK des TPIC6C595N  // Set im Lochrasterlayout
int dataPin = 10; //Pin verbunden mit SER IN des TPIC6C595N  // IN im Lochrasterlayout

byte data1 = 0; //Bytes zum Speichern der IR FB Signale
byte data2 = 0;
byte data3 = 0;
byte data4 = 0;
byte data5 = 0;

long taste[] = { //fantec Fernbedienung // ArayNr. / Taste
  275759677, // 1 / On/Off
  275722957, // 2 / Mute
  275727037, // 3 / 1
  275743357, // 4 / 2
  275710717, // 5 / 3
  275735197, // 6 / 4
  275751517, // 7 / 5
  275718877, // 8 / 6
  275731117, // 9 / 7
  275747437, // 10 / 8
  275714797, // 11 / 9
  275722447, // 12 / GOTO
  275755597, // 13 / 0
  275738767, // 14 / INFO
  275769877, // 15 / SLOW
  275773957, // 16 / ZOOM
  275771917, // 17 / REPEAT
  275712757, // 18 / A-B
  275744887, // 19 / Rückwärts spulen
  275724487, // 20 / Play/Pause
  275720407, // 21 / Vorwärts spulen
  275757127, // 22 / Kapitel zurück
  275730607, // 23 / Stopp
  275736727, // 24 / Kapitel vor
  275757637, // 25 / Menü
  275720917, // 26 / Vol-
  275716837, // 27 / Vol+
  275724997, // 28 / Return
  275739277, // 29 / Hoch
  275714287, // 30 / Links
  275753047, // 31 / OK
  275718367, // 32 / Rechts
  275741317, // 33 / Runter
  275728567, // 34 / OPTION
  275740807, // 35 / SETUP
  275734687, // 36 / TV-SYS
  275751007, // 37 / AUDIO
  275753557, // 38 / SUBTITLE
  275769367, // 39 / 16:9/4:3
  275761207, // 40 / Rot
  275771407, // 41 / Grün
  275773447 // 42 / Auswurf
};
 

void setup() {
  Serial.begin(9600); //Im Setup wird die Serielle Verbindung gestartet, damit man sich die Empfangenen Daten der Fernbedienung per seriellen Monitor ansehen kann.
  
  irrecv.enableIRIn(); //Dieser Befehl initialisiert den Infrarotempfänger.
  
  pinMode(storePin, OUTPUT); // Pins 8,9,10 auf Ausgabe stellen
  pinMode(shiftPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  
  digitalWrite(storePin, LOW); // Alle Ausgänge LOW beschreiben (oben festgelegt)
  shiftOut(dataPin, shiftPin, MSBFIRST, data5);
  shiftOut(dataPin, shiftPin, MSBFIRST, data4);
  shiftOut(dataPin, shiftPin, MSBFIRST, data3);
  shiftOut(dataPin, shiftPin, MSBFIRST, data2);
  shiftOut(dataPin, shiftPin, MSBFIRST, data1);
  digitalWrite(storePin, HIGH);
}

void loop () {
  if (irrecv.decode(&results)) { //Wenn Daten empfangen wurden,
    Serial.println(results.value, DEC); //werden sie als DEC  an den Serial-Monitor ausgegeben.
    Serial.println(bitRead(data1,0));
    irrecv.resume(); //Der nächste Wert soll vom IR-Empfänger eingelesen werden
    if (results.value==taste[0]){
      bitWrite(data1,0,!bitRead(data1,0));
      digitalWrite(storePin, LOW);
      shiftOut(dataPin, shiftPin, MSBFIRST, data5);
      shiftOut(dataPin, shiftPin, MSBFIRST, data4);
      shiftOut(dataPin, shiftPin, MSBFIRST, data3);
      shiftOut(dataPin, shiftPin, MSBFIRST, data2);
      shiftOut(dataPin, shiftPin, MSBFIRST, data1);
      digitalWrite(storePin, HIGH);     }
    if (results.value==taste[1]){
      bitWrite(data1,1,!bitRead(data1,1));
      myShift;
    }
    if (results.value==taste[2]){
      bitWrite(data1,2,!bitRead(data1,2));
      myShift;
    }
    if (results.value==taste[3]){
      bitWrite(data1,3,!bitRead(data1,3));
      myShift;
    }
    if (results.value==taste[4]){
      bitWrite(data1,4,!bitRead(data1,4));
      myShift;
    }
    if (results.value==taste[5]){
      myShift;
    }
    if (results.value==taste[6]){
      bitWrite(data1,6,!bitRead(data1,6));
      myShift;
    }
    if (results.value==taste[7]){
      bitWrite(data1,7,!bitRead(data1,7));
      myShift;
    }
    if (results.value==taste[8]){
      bitWrite(data2,0,!bitRead(data2,0));
      myShift;
    }
    if (results.value==taste[9]){
      bitWrite(data2,1,!bitRead(data2,1));
      digitalWrite(storePin, LOW);
      myShift;
    }
    if (results.value==taste[10]){
      bitWrite(data2,2,!bitRead(data2,2));
      myShift;
    }
  }
}

void myShift () {
  digitalWrite(storePin, LOW);
  shiftOut(dataPin, shiftPin, MSBFIRST, data5);
  shiftOut(dataPin, shiftPin, MSBFIRST, data4);
  shiftOut(dataPin, shiftPin, MSBFIRST, data3);
  shiftOut(dataPin, shiftPin, MSBFIRST, data2);
  shiftOut(dataPin, shiftPin, MSBFIRST, data1);
  digitalWrite(storePin, HIGH); 
}

Der erste Bit von data1 funktioniert einwandfrei, da dort die anweisung noch direkt in der If Abfrage stattfindet (Habe ich testweise wieder eingefügt)
Bei den andern, die sozusagen myShift ausführen sollen, geht das nun nicht mehr.

Wo mache ich einen Fehler?

Entschuldigt bitte wenn ich mich nicht Sachgemäß oder Unverständlich Ausdrücke, ich bin noch ziemlicher Anfänger.

In deinem Sketch steht myShift; da muss aber myShift(); hin, also mit Klammern am Ende zum Aufruf der Funktion.

Ich würde zudem das Unterprogramm an den Anfang des Sketches verschieben, um noch weitere (ungewollte) Automatismen der IDE auszuschließen.

Ahhh, ok.

Also nur ein kleiner Fehler. Danke es funktioniert.

Ich bilde mir ein, gelesen zu haben, das es egal ist, ob die eigenen Funktionen vor oder nach loop() gesetzt werden. Aber ich werde sie mal nach oben verschieben. Danke

Tips, was man anders machen sollte, sind natürlich gern gesehen.

Ich bilde mir ein, gelesen zu haben, das es egal ist, ob die eigenen Funktionen vor oder nach loop() gesetzt werden.

Das stimmt, weil der Arduino Builder eigenständig Vorwärtsdeklarationen erzeugt.
Nur leider gelingt das nicht unter allen Umständen.

Diesen Problemen kann man durch etwas Disziplin vollständig aus dem Weg gehen.