Hallo
ich möchte mit einer 7 Segmentanzeige und einem Taster die funktion
darstellen, sobald ich den Taster drücke, soll die 7 Segmentanzeige
hochzählen.
Ich programmier mit dem Board arduino duemilanove
ich hab aus dem Internent ein Programm gefunden (tutorial), bei dem ich
das versuche zu verstehn. aber es kommt bei arduino immer eine
fehlermeldung,
wisst ihr warum, wer schön wenn ihr mir helfen könntet
http://www.freeduino.de/books/arduino-tutorial-lady-ada/lektion-5-arduino-inputs/tastendr%C3%BCcke-z%C3%A4hlen
"
sketch_oct16a.ino: In function 'void setup()':
sketch_oct16a:19: error: a function-definition is not allowed here
before '{' token
sketch_oct16a:29: error: expected `}' at end of input"
hast du auch ein arduino?
da passt irgendwas nicht mit den klammern?
das programm von der seite
hat nichts mit der 7 segemntanzeige zu tun, das mach ich für mich selber
ich hab das nur versucht zu verstehn wie er addiert, da ich aber das
programm nicht draufspielen kann, weiß ich nicht obs überhaupt geht!
biede1987 schrieb:> "> sketch_oct16a.ino: In function 'void setup()':> sketch_oct16a:19: error: a function-definition is not allowed here> before '{' token> sketch_oct16a:29: error: expected `}' at end of input">> hast du auch ein arduino?>> da passt irgendwas nicht mit den klammern?
Richtig.
Hier ist das Original, wenn man es mal ein wenig ordentlich formatiert
1
/* * Tastendrücke zählen */
2
intswitchPin=2;// Schalter ist mit Pin 2 verbunden
3
intval;// Variable für den Pin Zustand
4
intbuttonState;// Variable für den letzten Schalterzustand
5
intbuttonPresses=0;// Wie oft ist der Schalter gedrückt
6
7
voidsetup()
8
{
9
pinMode(switchPin,INPUT);// Schalter-Pin ist Input
10
Serial.begin(9600);// Start der seriellen Kommunikation mit 9600bps
val=digitalRead(switchPin);// Eingabewert lesen und in val speichern
17
if(val!=buttonState){// Der Zustand des Schalters hat sich verändert
18
if(val==LOW){// Ist der Schalter gedrückt?
19
buttonPresses++;// Inkrementieren der Variablen buttonPresses
20
Serial.print("Schalter wurde ");
21
Serial.print(buttonPresses);
22
Serial.println(" gedrueckt");
23
}
24
}
25
26
buttonState=val;// Den Zustand merken
27
}
da ist nichts von fehlerhaften Klammern zu sehen.
D.h. es ist die Vermutung naheliegend, dass du selbst irgendwo einen
Fehler gemacht hast, als du den Code übernommen, formatiert bzw.
angepasst hast.
-> zeige nicht den Code den du von irgendwo übernommen hast, sondern
zeige immer den Code, so wie DU ihn verwendest.
> ich hab das nur versucht zu verstehn wie er addiert, da> ich aber das programm nicht draufspielen kann, weiß ich> nicht obs überhaupt geht!
Lies die Fehlermeldung, versuch sie zu verstehen, bilde eine Hypothese
und ändere das was du hast entsprechend ab. Das gehört genauso zum
Programmieren dazu, wie alles andere, dass man mit Fehlermeldungen was
anfangen kann.
PS: man konzentriert sich immer auf die erste bzw. auf die ersten paar
Fehlermeldung.
Die erste lautet
> In function 'void setup()':
Das ist für sich alleine gesehen noch nicht sehr aussagekräftig. Aber es
gibt zumindest mal einen Hinweis darauf, an welcher Stelle ungefähr das
Problem existiert. Da ist von der Funktion setup die Rede. Also wird man
dort mal näher nachsehen.
> sketch_oct16a:19: error: a function-definition is not allowed> here before '{' token
Aha. da ist von der { die Rede.
Also sieht man sich da mal alle offnenden { an. Macht vielleicht erst
mal fehlende Einrückungen um zu sehen, wo da was nicht stimmt.
> das programm von der seite> hat nichts mit der 7 segemntanzeige zu tun, das mach ich für mich selber
Warum hast du dann genau dieses 'Detail' im Titel deiner Anfrage?
Deine Anfrage hat genau gar nichts mit 7-Segment-Anzeigen zu tun.
die } übersehen.
-> Es ist immer eine gute Idee, seinen Code ORDENTLICH zu formatieren.
Inklusive Einrückungen.
Denn dann SIEHT man optisch, wie die Dinge zusammenhängen. Zum Beispiel
findet man die zu einer schliessenden } gehörende entsprechende öffnende
{. Denn die muss in der Zeile stehen, in der der Programmtext in genau
der gleichen Spalte beginnt.
ne ich hab ganz zum schluss die Klammer nicht runter gesetzt
Serial.println(" gedrueckt");
}
}
buttonState = val; // Den Zustand merken}
hätte ich eigentlich selber sehen müssen, trotzdem vielen dank
leider ist es so sobald eine 1 kommt, zählt er ganz schnell hoch, dieses
sehe ich an meinem serial monitor,
ich bekomm dann gar nicht mit wie die anzeige hochzählt,
woran liegt das?
Ausserdem.
Überleg noch mal ganz stark, welche Variable im Originalcode welche
Bedeutung hat. Was repräsentiert sie?
Und dann überlag mal ganz stark, was deine Variable 'Runde' eigentlich
für eine Aufgabe hat. Kann es sinnvoll sein, in Runde das Ergebnis von
1
Runde=digitalRead(Lichtschranke);
abzulegen?
Eher nicht.
'Runde' soll darüber Buch führen, in welcher Runde sich dein (Carrera-)
Auto)?) sich befindet. Was bitte hat das damit zu tun, ob die
Lichtschranke unterbrochen ist oder nicht?
In welcher Variablen wird denn hier
1
voidloop()
2
{
3
val=digitalRead(switchPin);// Eingabewert lesen und in val speichern
4
if(val!=buttonState){// Der Zustand des Schalters hat sich verändert
5
if(val==LOW){// Ist der Schalter gedrückt?
6
buttonPresses++;// Inkrementieren der Variablen buttonPresses
7
Serial.print("Schalter wurde ");
8
Serial.print(buttonPresses);
9
Serial.println(" gedrueckt");
10
}
11
}
12
13
buttonState=val;// Den Zustand merken
14
}
eigentlich gezählt?
Hinweis: Es ist NICHT 'val'! Die Variable 'val' sollte in diesem Code
besser 'buttonStateNow' heißen. Der Name dieser Variablen ist nämlich
irreführend.
1
voidloop()
2
{
3
buttonStateNow=digitalRead(switchPin);// Eingabewert lesen und in val speichern
4
if(buttonStateNow!=buttonState){// Der Zustand des Schalters hat sich verändert
5
if(buttonStateNow==LOW){// Ist der Schalter gedrückt?
6
buttonPresses++;// Inkrementieren der Variablen buttonPresses
7
Serial.print("Schalter wurde ");
8
Serial.print(buttonPresses);
9
Serial.println(" gedrueckt");
10
}
11
}
12
13
buttonState=buttonStateNow;// Den Zustand merken
14
}
Hier ....
1
if(buttonStateNow==LOW){// Ist der Schalter gedrückt?
2
buttonPresses++;// Inkrementieren der Variablen buttonPresses
... steckt die Zählvariable! buttonPresses repräsentiert den Zähler!
Erkennt man auch am Kommentar, bzw. daran, dass in weiterer Folge im
Code mit dieser Variablen etwas gemacht wird ...
1
Serial.print("Schalter wurde ");
2
Serial.print(buttonPresses);
3
Serial.println(" gedrueckt");
... in diesem konkreten Fall eben über die Serielle ausgeben.
ja du hattest recht ich hab die "runde" als "var" geschrieben das war
falsch,
jetzt hab ich buttonpresses ersetzt durch Runde,
und meine alte Runde ist jetzt einfach ein variabler Wert.
ich glaub jetzt wirds logischer oder was meinst
biede1987 schrieb:> ich glaub jetzt wirds logischer oder was meinst
Ich seh noch nicht, inwiefern mir beim lesen des Codes ein Variablenname
von 'var' etwas über die Funktion der Variablen innerhalb des Programmes
verrät.
var ist reichlich nichtssagend. Wenn du eine Variable brauchst, deren
Aussage darin besteht, ob die Lichtschranke unterbrochen ist oder nicht,
dann sollte wohl der Variablenname das auch irgendwie andeuten. Ich
würde da irgendwie die Begriffe 'Lichtschranke' bzw. 'Unterbrochen' bzw.
'Status' ins Spiel bringen. Selbiges für 'buttonState'. Hast du denn
einen Button (einen Drückknopf)? Nein, hast du nicht. Du hast eine
Lichtschranke. Eine Lichtschranke ist aber kein Button.
Du magst das jetzt als kleinlich empfinden. Aber in größeren Programmen
ist es unabdingbar, dass mir der Code selber etwas erzählt. Zb durch gut
gewählte Variablennamen. Eine Codestelle
1
NettoPreis=BruttoPreis+BruttoPreis*Steuersatz;
braucht keinen Kommentar. Die Variablennamen sind so gewählt, dass mir
der Code selber erzählt, was hier passiert. Und genau das ist das Ziel:
Kommentare überflüssig machen, indem der Kommentar schon in der
Formulierung des Codes integriert ist.
jep funktioniert war noch ein fehler drin bei der
8
die hab falsch dargestellt,
und am anfang wenn 0 Runden sind,
zeigt er mir eine 8 statt eine 0 obwohl ich die ausgänge richtig gesetzt
habe
weißt du warum?
Wenn du deinen Code ordentlich Einrücken würdest, würdest du es auch
sehen.
Wenn am Anfang alles auf 0 ist, ist den Ausgängen noch nie irgendetwas
zugewiesen worden.
Erst mit dem ersten Puls, den dein Programm mittels Lichtschranke
feststellt, steuert dein Programm das erste mal die 7-Segment Ausgänge
an.
Deine Anzeige zeigt daher am Anfang deswegen '8' an, weil es so ist,
dass der Default-Zustand der Ausgänge nun mal 0 ist. D.h. alle deine
Ausgänge sind auf 0, womit alle Segmente leuchten und du das als 8
fehlinterpretierst. Wäre der Dezimalpunkt deiner Anzeige auch
angeschlossen, dann könntest du sehen, dass der genauso leuchtet.
deine Programmlogik sieht zur Zeit so aus
1
void loop()
2
{
3
if( Puls an der Lichtschranke )
4
{
5
erhöhe Zähler
6
gib den Zähler aus
7
}
8
}
Aber was ist am Anfang? Wenn noch kein Puls von der Lichtschranke
festgestellt wurde? Dann ist auch nie irgendetwas ausgegeben worden.
-> deutlicher Hinweis darauf, dass die Größe der Funktion loop schon das
Mass überschritten hast, das du noch überblicken kannst.
Es wird Zeit, dass du die Ansteurung der 7_Segment Anzeige in eine
eigene Funktion auslagerst.
ok ich versuch jetzt mal mit Hilfe eines zweiten Schalters die Runden
immer am Anfang auf 0 zurücksetzten. Ein Resetschalter.
wenn das funktioniert, will ich mich informieren wie ich eine 4
Segmentanzeige ansteuere.da kommen dann bestimmt wieder fragen auf!
ich versuch des jetzt mal mit dem Resettaster und tu nochmal mein
Programm verbessern.
biede1987 schrieb:> was heißt !=>
Vergiss bitte ganz schnell die Idee, du könntest C (oder C++) mit einem
Online-Tutorial lernen.
Du brauchst ein ordentliches C-Buch! Und zwar schnell!
!= ist 'ungleich'