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 ?
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 ?
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?
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.
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
voidloop()
2
{
3
for(inti=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
voidMuster1()
2
{
3
...
4
}
und in diese Funktion verschiebst du alle Operationen, die fürderhin
unter dem Namen 'Muster1' ausgeführt werden sollen:
1
voidMuster1()
2
{
3
for(inti=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
voidMuster1()
2
{
3
for(inti=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
voidloop()
14
{
15
Muster1();
16
}
fertig.
Für das nächste Muster machst du dir wieder eine Funktion
1
voidMuster2()
2
{
3
....
4
}
kopierst die Anweisungen da hinein, die du für dieses Muster benötigst
und rufst diese Funktion aus loop() auf:
1
voidMuster1()
2
{
3
for(inti=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
voidMuster2()
13
{
14
for(inti=0;i<8;i++)
15
{
16
sendeBytes(0B0000000000000001<<i);
17
delay(50);
18
}
19
}
20
21
voidloop()
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!
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 :) :)