INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unterprogramme
27.01.2020, 21:04
Beitrag #1
Unterprogramme
Hallo.

Ich habe den folgen Code. Dieser soll drei MCP ansteuern. Was Grundsätzlich auch funktioniert.
Das ganze steuert zur Zeit ein Rollo zum testen an und funktioniert wie gewünscht.

Jetzt möchte ich weitere 9 Rollos ansteuern, aber den Code nicht unendliche male kopieren, sondern ein Funktion davon machen.

Stelle mir das so in etwas vor:

Funtion
RollSteur (mcp1, IN_Rauf, IN_Runter, OUT_Rauf, OUT_Runter, Time_Max)

void loop()
{
RollSteur (mcp1, mcp1_IN_B0, mcp1_IN_B1, mcp1_OUT_A0, mcp1_OUT_A1, 50000);
RollSteur (mcp2, mcp2_IN_B0, mcp2_IN_B1, mcp2_OUT_A0, mcp2_OUT_A1, 100000);
.....
}

Leider weiß ich nicht ansatzweise wie ich das machen soll.
Habe auch schon gegoogel und mehrere Beispiel mir angeschaut, aber komme da nicht weiter.

Wäre super wenn mir jemand helfen könnte.

Vielen Dank.


Code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>

//Adressierung MCP Module
const uint8_t         mcp1_ADDRESS = 0;                                                                       //Adresse des mcp1 (Einstellen mit A0, A1, A2) / Codierung: 0, 0, 0  0
const uint8_t         mcp2_ADDRESS = 7;                                                                       //Adresse des mcp2 (Einstellen mit A0, A1, A2) / Codierung: 1, 1, 1  7
const uint8_t         mcp3_ADDRESS = 6;                                                                       //Adresse des mcp3 (Einstellen mit A0, A1, A2) / Codierung: 0, 1, 1  6

//Ausgänge festlegen
const uint8_t         mcp1_OUT_A0 = 14;                                                                       //mcp1_OUT_A0 an GPIO_A0
const uint8_t         mcp1_OUT_A1 = 15;                                                                       //mcp1_OUT_A0 an GPIO_A1

//Eingänge festlegen
const uint8_t         mcp1_IN_B0 = 5;                                                                         //Taster an GPIO_B0
const uint8_t         mcp1_IN_B1 = 7;                                                                         //Taster an GPIO_B1

//Hilfsmerker
boolean               HilfFlanke_mcp1_IN_B0;                                                                  //Hilfsmerker
boolean               HilfFlanke_mcp1_IN_B1;                                                                  //Hilfsmerker

//Zeiit wie lange ein Relais max. angezogen hat
const uint32_t        A0_A1_TimerCounter           = 50000;                                                   //Zeit festlegen in ms
uint32_t              A0_A1_TimerComparison        = 0;                                                       //Vergleichswert für den TimerComparison(Startwert muss 0 sein)

  
Adafruit_MCP23017 mcp1;                            
Adafruit_MCP23017 mcp2;
Adafruit_MCP23017 mcp3;


void setup()
{  
  //Adressierung MCP Module
  mcp1.begin     (mcp1_ADDRESS);                                          //Adresse vom Modul 1 festlegen
  mcp2.begin     (mcp2_ADDRESS);                                          //Adresse vom Modul 2 festlegen
  mcp3.begin     (mcp3_ADDRESS);                                          //Adresse vom Modul 3 festlegen

  //bei den Ausgängen den internen Pullup aktivieren
  mcp1.pullUp    (mcp1_IN_B0, HIGH);                                      //Pullup aktivieren
  mcp1.pullUp    (mcp1_IN_B1, HIGH);                                      //Pullup aktivieren

  //E/A als Ausgänge setzen
  mcp1.pinMode   (mcp1_OUT_A0, OUTPUT);                                   //als Ausgang setzen
  mcp1.pinMode   (mcp1_OUT_A1, OUTPUT);                                   //als Ausgang setzen
  
  //E/A als Eingänge setzen
  mcp1.pinMode   (mcp1_IN_B0, INPUT);                                     //als Eingang setzen
  mcp1.pinMode   (mcp1_IN_B1, INPUT);                                     //als Eingang setzen  
}


void loop()
{
  //Taster auswerten
  boolean Flanke_mcp1_IN_B0 = PosFlanke((!mcp1.digitalRead(mcp1_IN_B0)), HilfFlanke_mcp1_IN_B0);
  boolean Flanke_mcp1_IN_B1 = PosFlanke((!mcp1.digitalRead(mcp1_IN_B1)), HilfFlanke_mcp1_IN_B1);

  //Beide Ausgänge sind LOW und Eingang runter ist HIGH: Ausgang runter wird gestzt (Rollo startet)
  if (Flanke_mcp1_IN_B0 && mcp1.digitalRead(mcp1_OUT_A0) == LOW && mcp1.digitalRead(mcp1_OUT_A1) == LOW)
  {
    mcp1.digitalWrite(mcp1_OUT_A0, HIGH);    
    Flanke_mcp1_IN_B0 = false;
  }

  //Beide Ausgänge sind LOW und Eingang hoch ist HIGH: Ausgang hoch wird gestzt (Rollo startet)
  if (Flanke_mcp1_IN_B1 && mcp1.digitalRead(mcp1_OUT_A1) == LOW && mcp1.digitalRead(mcp1_OUT_A0) == LOW)
  {
    mcp1.digitalWrite(mcp1_OUT_A1, HIGH);
    Flanke_mcp1_IN_B1 = false;
  }

  //Wenn einer der Ausgänge HIGH ist und einer der beiden Taster HIGH ist: Beide Ausgänge auf LOW setzen (Rollo stoppt)
  if ((Flanke_mcp1_IN_B0 || Flanke_mcp1_IN_B1) && (mcp1.digitalRead(mcp1_OUT_A0) == HIGH || mcp1.digitalRead(mcp1_OUT_A1) == HIGH))
  {
    mcp1.digitalWrite(mcp1_OUT_A0, LOW);
    Flanke_mcp1_IN_B0 = false;
    mcp1.digitalWrite(mcp1_OUT_A1, LOW);
    Flanke_mcp1_IN_B1 = false;
    A0_A1_TimerComparison = 0;
  }  

  //interner Timer, wie lange das Rollo max. laufen darf
  if (millis() - A0_A1_TimerComparison >= A0_A1_TimerCounter)
  {
    A0_A1_TimerComparison = millis();
    mcp1.digitalWrite(mcp1_OUT_A0, LOW);
    mcp1.digitalWrite(mcp1_OUT_A1, LOW);
  }
}


//Funkionen
boolean PosFlanke( boolean input, boolean &hilfsmerker)
{
  if (input && !hilfsmerker )
  {                                                           //wenn Signal true und hilfsmerker false
    hilfsmerker = true;                                       //Zustand von Signal abspeichern
    return true;                                              //Funktion mit Rückgabe true verlssen
  }
  
  if (!input)
  {                                                           //wenn Signal false ist Hilfsmerker auch auf false setzten
    hilfsmerker = false;
  }
  
  return false;                                               //Funktion mit Rückgabe false verlassen
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.01.2020, 21:20
Beitrag #2
RE: Unterprogramme
MCP23017 kannst Du nur 8 Stück an einem I2C-Strang unterbringen. (3 Adressbit)

Für mehr musst Du I2C-Multiplexer benutzen, um mehrere umschaltbare I2C-Busse zu schaffen.
Wie Funktionen gebaut werden, sagt Dir jedes gute C/C++ Tutorial. Das wird auch kurz in der Code-Referenz hier im Forum erklärt.
Fange erst mal mit einfacheren Funktionen an.

Das, was Du in Deinem Sketch verwendest, sind Instanzen der Klasse Adafruit_MCP23017.

Evtl. wäre auch eine eigene Klasse der Weg, da ist das Lernpensum aber noch eine Nummer größer.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 00:20
Beitrag #3
RE: Unterprogramme
(27.01.2020 21:04)hd458 schrieb:  Das ganze steuert zur Zeit ein Rollo zum testen an und funktioniert wie gewünscht.

Jetzt möchte ich weitere 9 Rollos ansteuern, aber den Code nicht unendliche male kopieren, sondern ein Funktion davon machen.

Laut "Deinem" Code braucht das zur Zeit getestetes Rollo 4 Pins des MCP23017.
Wenn Du dazu noch weitere 9 Rollos Steuert möchtest:
Rechnung:
Gesamt 10 Rollos
4 Ports (Pins) pro Rollo = 40 Pins (Ports)
1 MCP23017 besitzt insgesamt 16 wechselbare I/O Ports
40 / 16 = 2.5 -> also die 3 MCP23017 ( = 48 I/O Ports) reichen Dir aus.

Was die Programmierung angeht sollst Du aussagenkräftige Namen benutzen.
Z.B.:

Rollo1_Steuer(Param1 … ){ … }

Rollo9_Steuer(Param1 … ){ … }

Dein Vorschlag die Steuerung in die Funktionen zu unterbringen ist ok.
Die Steuerung werde ich auch in die Funktionen implementieren. Im Loop aber, werde ich einfach nur die Zustände prüfen:

Code:
void loop()
{
if( was macht Rollo1 …) { Rollo1_Steuer(Param1 … ); }

if( was macht Rollo7 …) { Rollo7_Steuer(Param1 … ); }

Aber es ist nur eine (von vielen) Überlegung / Vorschlag wie man es lösen kann.
Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 18:19
Beitrag #4
RE: Unterprogramme
Hallo.

Vielen Dank.

Also das ich nur drei brauche hatte ich oben geschrieben, dass bei 8 Schluss ist, war mit bekannt Smile

Wie gesagt die Schaltung als solches ist fertig. Siehe Anhang.

Ich habe mit dem Programmieren, besonders mit den mehrfachen Aufrufgen von Funktionen ein Problem.

Ich fange mal mit der ersten Frage an.

Code:
//Funkionen
boolean PosFlanke( boolean input, boolean &hilfsmerker)
{
  if (input && !hilfsmerker )
  {                                                           //wenn Signal true und hilfsmerker false
    hilfsmerker = true;                                       //Zustand von Signal abspeichern
    return true;                                              //Funktion mit Rückgabe true verlssen
  }
  
  if (!input)
  {                                                           //wenn Signal false ist Hilfsmerker auch auf false setzten
    hilfsmerker = false;
  }
  
  return false;                                               //Funktion mit Rückgabe false verlassen
}

In dieser Funktion gibt es &hilfsmerker, warum der da ist und warum ich das so gemacht habe ist mir klar. Aber wie bekomme ich es hin, das ich keinen Hilfsmerker brauche. Ich kann doch in der Funktion einen internen Hilfsmerker setzen oder?

Irgendwie so Sad
Code:
//Funkionen
boolean PosFlanke( boolean input, boolean &hilfsmerker)
{
static boolean hilfsmerker;

....

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 18:26
Beitrag #5
RE: Unterprogramme
Ich sehe kein Schaltbild.

Und bitte formatiere deinen Sketch in der IDE mit Strg +T vor der Übertragung in das Forum.
Dann kann man den vermutlich besser lesen.
Und nimm nicht so viele Leerzeichen zwischen Code und Beschreibung, dann wird es auch besser.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 19:06
Beitrag #6
RE: Unterprogramme
>Ich sehe kein Schaltbild.
Gibt es nicht, habe ich im Kopf gemacht.
Aber das hat doch nichts mit meiner Frage zu tun ?!

>Und bitte formatiere deinen Sketch in der IDE mit Strg +T vor der Übertragung in das Forum.
>Dann kann man den vermutlich besser lesen.
Finde da nicht, aber werde ich machen.

>Und nimm nicht so viele Leerzeichen zwischen Code und Beschreibung, dann wird es auch besser.
Naja.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 19:43 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2020 19:47 von hotsystems.)
Beitrag #7
RE: Unterprogramme
(28.01.2020 19:06)hd458 schrieb:  >Ich sehe kein Schaltbild.
Gibt es nicht, habe ich im Kopf gemacht.

Und warum schreibst du:
Schaltung ist fertig, siehe Anhang ?

Und ich verstehe nicht, warum du if-Abfragen mit Return verlassen willst ?
Liegt evtl. daran, weil der Sketch nicht komplett und schlecht formatiert ist.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2020, 19:52
Beitrag #8
RE: Unterprogramme
>Und warum schreibst du:
>Schaltung ist fertig, siehe Anhang ?

Ups ,da Anhang ist nicht hoch geladen worden

>Und ich verstehe nicht, warum du if-Abfragen mit Return verlassen willst ?
>Liegt evtl. daran, weil der Sketch nicht komplett und schlecht formatiert ist.
Hab den Code mit Strg + T formatiert aber sieht gleich aus?!

Code:
//Funkionen
boolean PosFlanke( boolean input, boolean &hilfsmerker)
{
  if (input && !hilfsmerker )
  { //wenn Signal true und hilfsmerker false
    hilfsmerker = true;                                       //Zustand von Signal abspeichern
    return true;                                              //Funktion mit Rückgabe true verlssen
  }

  if (!input)
  { //wenn Signal false ist Hilfsmerker auch auf false setzten
    hilfsmerker = false;
  }

  return false;                                               //Funktion mit Rückgabe false verlassen
}


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Smile Unterprogramme seriell abarbeiten fliegerx 25 6.107 08.03.2018 19:11
Letzter Beitrag: Tommy56
  Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten Marlox 42 23.251 28.12.2014 22:49
Letzter Beitrag: Marlox
  Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4 Marc2014 4 2.527 17.08.2014 21:07
Letzter Beitrag: Thorsten Pferdekämper
  Unterprogramme, if vergleich >9 ? Marc2014 2 2.620 11.08.2014 16:45
Letzter Beitrag: Marc2014

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste