Forum: Mikrocontroller und Digitale Elektronik Arduino: Programmablauf versch. Sketche (LED's / Schieberegister) ich komm nicht weiter


von Markus B. (b_markus)


Lesenswert?

Hallo ihr lieben,
ich neu hier und muss mich mit einem Problem an Euch wenden.
Und zwar haben wir in der Techniker-Schule ein Mikrcontroller-Projekt. 
Mittlerweile habe ich meinen Spaß daran gefunden und werde das 
Programmieren mit dem Arduino auch danach noch weiter verfolgen. Nun 
aber zum wesentlichen:

Ich habe mir einen Stern aus 35 LED's und 5 Schieberegistern (74HC595) 
gebastelt. Diverse Abläufe habe ich auch schon programmiert.
ABER: Ich möchte diese hinter einander durchlaufen lassen und eben das 
bekomme ich nicht hin.
Mein Fehler ganz zu Anfang war, dass ich 35 LED's genommen habe und 
leider den Q0 Ausgang "vergessen" habe; es sind mittlerweile 5 LED's 
hinzu gekommen.

Ich zeige mal 4 BspProgramme, wenn Ihr mir vll einen Tipp geben könnten 
wie ich die Programme hinter einander fortlaufen lassen kann ?? Z.B. 
Prog 1 3mal durchlaufen und dann zum zweiten usw...

Prog 1

int latchPin = 8;  // taktPin SH_CP
int clockPin = 12; // speicherPin ST_CP
int dataPin = 11;  // datenPin DS

int eingabe [5];

void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  eingabe[0] = B11111111;
}

void loop()
{
  for (int i = 0; i < 5; i++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
    digitalWrite(latchPin, HIGH);
    delay(150);
  }
}


Prog 2

int latchPin = 8;  // taktPin SH_CP
int clockPin = 12; // speicherPin ST_CP
int dataPin = 11;  // datenPin DS

 void setup(){
 pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
 }
 void loop(){
 for (int i=0; i<8; i++){
sendeBytes(0B0000000000000001 << i);
delay(50); }

 }
 void sendeBytes(int wert)
 {
 digitalWrite(clockPin, LOW);
 shiftOut(dataPin, latchPin, MSBFIRST, wert >> 8);
 shiftOut(dataPin, latchPin, MSBFIRST, wert & 255);
 digitalWrite(clockPin, HIGH);
 delay(20);

 }


Prog 3

int latchPin = 8;  // taktPin SH_CP
int clockPin = 12; // speicherPin ST_CP
int dataPin = 11;  // datenPin DS

 void setup(){
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 }
 void loop(){
 for (int i=0; i<40; i++){
sendeBytes(0B0000000000000001 << i);
delay(50); }

 }
 void sendeBytes(int wert){
 digitalWrite(clockPin, LOW);
 shiftOut(dataPin, latchPin, MSBFIRST, wert >> 8);
 shiftOut(dataPin, latchPin, MSBFIRST, wert & 255);
 digitalWrite(clockPin, HIGH);
 delay(20);

 }


Prog 4

int latchPin = 8;  // taktPin SH_CP
int clockPin = 12; // speicherPin ST_CP
int dataPin = 11;  // datenPin DS

int eingabe [6];

void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  eingabe[0] = B11111111;
  eingabe[1] = B11111111;
  eingabe[2] = B11111111;
  eingabe[3] = B00000000;
  eingabe[4] = B11111111;
  eingabe[5] = B11111111;
}

void loop()
{
  for (int i = 0; i < 6; i++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
    digitalWrite(latchPin, HIGH);
    delay(250);
  }
}

Hat jemand eine Idee ?

von us73 (Gast)


Lesenswert?

Typischerweise packt man Code, den man mehrfach ausführen will, in 
Funktionen, und kann diese dann gezielt in der Reihenfolge ausführen, 
wie man das haben will.

Alles klar ?

von Fabian O. (xfr)


Lesenswert?

Du musst doch nur die Inhalte der vier loop()-Funktionen in eine 
zusammenkopieren und die setup()-Funktion nehmen, in der alles drinnen 
ist. Hast Du das schon probiert? Wenn ja, was klappt daran nicht?

von Markus B. (b_markus)


Lesenswert?

us73 schrieb:
> Typischerweise packt man Code, den man mehrfach ausführen will, in
>
> Funktionen,

Genau das verstehe ich leider nicht. Habe mir diverse Sachen schon dazu 
durch gelesen, aber ich habe bei genau dem Thema grad ne Blockade im 
Kopf :-(

Fabian O. schrieb:
> die Inhalte der vier loop()-Funktionen in eine
>
> zusammenkopieren und die setup()-Funktion nehmen, in der alles drinnen
>
> ist.

Ja schon, das habe ich des öfteren versucht.
Wenn ich das mache meckert er zuerst an den Eingaben
"eingabe[0] = B11111111;
 eingabe[1] = B11111111;
 usw "

lasse ich die raus meckert er an
 for (int i = 0; i < ...**

Ich habe diverse Kombinationen ausprobiert und nichts von alledem 
funktioniert leider.

von Karl H. (kbuchegg)


Lesenswert?

Markus B. schrieb:

>> Funktionen,
>
> Genau das verstehe ich leider nicht. Habe mir diverse Sachen schon dazu
> durch gelesen

Wo hast du dir das durchgelesen?
In jedem C-Buch (oder C++ Buch) ist das Thema 'Funktionen' ein großes 
Kapitel!

> aber ich habe bei genau dem Thema grad ne Blockade im
> Kopf :-(

Die einfachen Dinge sind aber ganz einfach.

Welche Operationen willst du zusammenfassen?
Zum Beispiel die hier
1
void loop()
2
{
3
  for (int i = 0; i < 5; i++)
4
  {
5
    digitalWrite(latchPin, LOW);
6
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
7
    digitalWrite(latchPin, HIGH);
8
    delay(150);
9
  }
10
}

(gemeint sind die Operationen innerhalb der Funktion loop(). Ja auch das 
ist nichts anderes als eine Funktion!)

Also machst du dir eine Funktion
1
void Muster1()
2
{
3
  ...
4
}

und in diese Funktion verschiebst du alle Operationen, die fürderhin 
unter dem Namen 'Muster1' ausgeführt werden sollen:
1
void Muster1()
2
{
3
  for (int i = 0; i < 5; i++)
4
  {
5
    digitalWrite(latchPin, LOW);
6
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
7
    digitalWrite(latchPin, HIGH);
8
    delay(150);
9
  }
10
}

und in das loop() deines NEUEN(!) Programmes, kommt dann ein Aufruf 
dieser Funktion
1
void Muster1()
2
{
3
  for (int i = 0; i < 5; i++)
4
  {
5
    digitalWrite(latchPin, LOW);
6
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
7
    digitalWrite(latchPin, HIGH);
8
    delay(150);
9
  }
10
}
11
12
13
void loop()
14
{
15
  Muster1();
16
}

fertig.
Für das nächste Muster machst du dir wieder eine Funktion
1
void Muster2()
2
{
3
  ....
4
}

kopierst die Anweisungen da hinein, die du für dieses Muster benötigst 
und rufst diese Funktion aus loop() auf:
1
void Muster1()
2
{
3
  for (int i = 0; i < 5; i++)
4
  {
5
    digitalWrite(latchPin, LOW);
6
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
7
    digitalWrite(latchPin, HIGH);
8
    delay(150);
9
  }
10
}
11
12
void Muster2()
13
{
14
  for (int i=0; i<8; i++)
15
  {
16
    sendeBytes(0B0000000000000001 << i);
17
    delay(50);
18
  }
19
}
20
21
void loop()
22
{
23
  Muster1();
24
  Muster2();
25
}

Aus loop heraus werden jetzt nacheinander die Funktionen Muster1() und 
Muster2() aufgerufen, die daher auch nacheinander ihre Muster abspielen.


> Ich habe diverse Kombinationen ausprobiert und nichts von alledem
> funktioniert leider.

Löse dich von der Vorstellung, dass du 4 Programme irgendwie 
'zusammenkopierst'.
Du schreibst grundsätzlich ein NEUES Programm.
In dieses neue Programm kannst du Ideen und eventuell auch Code aus den 
4 vorhandenen Programmen teilweise übernehmen. Aber grundsätzlich 
schreibst du erst mal ein NEUES Programm! Und daher gelten alle Regeln 
wie sie eben für ein Programm gelten. Zum Beispiel die, dass man nichts 
doppelt haben kann. Wenn du daher aus deinen Vorlagen Namenskollisionen 
hast, dann musst du irgendwas umbenennen (wie bei dir zb eingabe) und so 
anpassen, dass innerhalb deines NEUEN Progammes wieder alles eindeutig 
ist.

Wenn Muster1 ein Array eingabe[] benutzt und die Funktion Muster3 
ebenfalls, dann kann das nicht gutgehen, wenn da verschiedene Inhalte im 
Array sein sollen. Also muss man dann eben eines dieser Array 
umbenennen, damit sie voneinander getrennte und verschiedene Variablen 
(Arrays) werden und daher in den Funktionen getrennt angesprochen werden 
können.


Wie gesagt: Löse dich von der Vorstellung, dass du 4 einzelne Programme 
irgendwie magisch zu einem einzigen zusammenkopieren kannst ohne dass du 
etwas tun musst. Dem ist nicht so. Du schreibst EIN NEUES Programm!

von Markus B. (b_markus)


Lesenswert?

Hey super!
Da war doch was dabei was mir weiter geholfen hat !
Jetzt, nach 2 Std Fehlersuche funktioniert dann auch endlich alles wie 
es soll. Es gab da einiges im Ablauf zu ändern.
Danke an euch. Ihr habt mir sehr geholfen :) :)

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.