Fabian Müller schrieb:
Zunächst mal:
Du solltest dir ein gewisses Grundwissen an C aneignen.
Und zwar BEVOR du an ein konkretes Projekt gehst. Denn sonst
verzweifelst du an blödsinnigen Fehlern.
1 | if(!(PIND & (1<<Taster))){ // wenn Taste gedrueckt
|
2 | if(Keydown = 1){
|
3 | Sendmidinoteon();
|
4 | Keydown = 0;
|
5 | }
|
6 | }
|
7 | else{ // wenn Taste nicht gedrueckt
|
8 | if(Keydown = 0){
|
9 | Sendmidinoteoff();
|
10 | Keydown = 1;
|
11 | }
|
12 | }
|
Eine Zuweisung schreibt sich in C mit einem einfachen =.
Ein Vergleich auf Gleichheit schreibt sich mit einem doppelten ==.
Also
1 | if(!(PIND & (1<<Taster))){ // wenn Taste gedrueckt
|
2 | if(Keydown == 1){
|
3 | Sendmidinoteon();
|
4 | Keydown = 0;
|
5 | }
|
6 | }
|
7 | else{ // wenn Taste nicht gedrueckt
|
8 | if(Keydown == 0){
|
9 | Sendmidinoteoff();
|
10 | Keydown = 1;
|
11 | }
|
12 | }
|
Gerade in der µC Programmierung sollte man aber meiner Meingung nach
weitgehend auf derartig explizite Vergleiche verzichten. Die haben
nämlich ein gewisses Potential falsch gemacht zu werden.
Im konkreten Fall, mit der Variablen 'Keydown' geht das so: Wir wissen,
dass diese Variable nur 2 Zustände haben kann. Entweder die ist 0 (was
soviel wie 'nicht gedrückt' bedeutet wie der Name der Variablen schon
sagt - es ist nicht wahr, dass die Taste gedrückt ist; ergo ist sie
nicht gedrückt), oder sie ist es nicht (dann ist die Taste gedrückt,
ebenfalls wie es der Variablenname aussagt - es ist wahr, dass die Taste
gedrückt ist). Und genau so sollte man das auch schreiben und dabei
ausnutzen, dass in C alles was ungleich 0 ist, als logisch wahr gewertet
wird. Nur eine 0 gilt als logisch falsch.
D.h. man kann das auch so schreiben
1 | if(!(PIND & (1<<Taster))){ // wenn Taste gedrueckt
|
2 | if( Keydown ){
|
3 | Sendmidinoteon();
|
4 | Keydown = 0;
|
5 | }
|
6 | }
|
7 | else{ // wenn Taste nicht gedrueckt
|
8 | if( !Keydown ){
|
9 | Sendmidinoteoff();
|
10 | Keydown = 1;
|
11 | }
|
12 | }
|
das liest sich dann gleich auch viel besser, denn
'übersetzt' sich in normales Deutsch als
"wenn die Taste nicht gedrückt ist".
BZw. da steht dann
oder eben in normalem Deutsch
"Wenn die Taste gedrückt ist".
Die zusätzlichen Vergleiche mit == 1 bzw. == 0, bringen hier keinerlei
zusätzliche Klarheit und bringen nur zusätzliches Fehlerpotential mit
sich. Wähle deine Variablennamen in solchen Fällen immer so, dass sich
ein
unmittelbar durch Einsetzen des Variablennamens in einen vernünftigen
deutschen Satz übersetzt, der genau dann wahr ist, wenn die Variable den
Wert 1 hat. BZw. so, dass die Negation davon
genau dann wahr ist, wenn die Variable den Wert 0 hat.
Auf lange Sicht gesehen machst du so wesentlich weniger Fehler und das
Programm wird um einiges leichter verstehbar beim Code-lesen. Der erste
Schritt - einen ordentlichen Variablennamen - ist schon gemacht worden.
Jetzt muss man nur noch über seinen Schatten springen, und das ganze als
boolsche Variable ansehen, die in sich selbst bereits auch ohne
zusätzlichen Vergleich eine Information trägt.
> Wäre super, wenn euch was einfällt was falsch ist.
Besorg dir ein C-Buch und fang auf dem PC an, die Grundlagen von C zu
trainieren. Ansonsten fällst du unweigerlich immer wieder unnötigerweise
auf die Schnauze und alles dauert 10 mal so lang, als wenn du erst mal
ein paar Tage investierst.