Forum: Mikrocontroller und Digitale Elektronik Einfaches C Programm (Taster als Schalter) Problem


von Oxy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo mikrocontroller Community,

hab ihr ein einfaches programm um ein paar LEDs zu steuern mit ein 
ablauf so wie ein LED würfel 5x5x5....

Also Ich habe PD0 als Eingang für ein Taster. Hab schon die entprellung 
usw. kein problem.

Ich habe jetzt eine variable "RS" der gesetzt und zurück gesetzt wird 
wenn der Programm fertig ist. also ein taster als ein und aus schalter.

Ich weiss es ist ein einfaches programm, bin ja nur am lernen und am rum 
probieren.

also bei mir ist das problem das des programm ohne taster druck einfach 
los geht. ob wohl ich ein if befehl um den ganzen programm hab.

> was mach ich falsch?

-Oxycotton

von Ralf G. (ralg)


Lesenswert?

if((RS = 0xFF))

böser Fehler! ;-)

von Joe F. (easylife)


Lesenswert?

if((RS = 0xFF))

ist kein Vergleich, sondern eine Zuweisung.
Du brauchst "==" für einen Vergleich.

Du solltest DDRD auch noch auf 0 setzen, bevor du die einzelnen Bits 
setzt.

Das hier:
      RS = ~RS;
      RS=0;
ist auch ziemlich unsinnig.

Deine "Entprellung" wird auch nicht so wirklich funktionieren, das flag 
RS wird immer hin- und her toggeln, solange du den Taster drückst.

von Tom (Gast)


Lesenswert?

Ralf G. schrieb:
> böser Fehler! ;-)

..., den der Compiler problemlos findet. Man müsste nur die Warnungen 
lesen.

von Oxy (Gast)


Lesenswert?

Joe F. schrieb:
> if((RS = 0xFF))
>
> ist kein Vergleich, sondern eine Zuweisung.
> Du brauchst "==" für einen Vergleich.
>
> Du solltest DDRD auch noch auf 0 setzen, bevor du die einzelnen Bits
> setzt.
>
> Das hier:
>       RS = ~RS;
>       RS=0;
> ist auch ziemlich unsinnig.
>
> Deine "Entprellung" wird auch nicht so wirklich funktionieren, das flag
> RS wird immer hin- und her toggeln, solange du den Taster drückst.

danke für die schnelle antwort,
ja hab vergessen diese fehler raus zu nehmen, war am rum probieren, bin 
halt noch fresh mit C.
 Danke,

ich habe die änderungen gemacht aber jetzt geht überhaupt nichts, hab 
auch die RS = 0; im programm selber rausgenommen und es geht nichts.

von Oxy (Gast)


Lesenswert?

Tom schrieb:
> Ralf G. schrieb:
>> böser Fehler! ;-)
>
> ..., den der Compiler problemlos findet. Man müsste nur die Warnungen
> lesen.

da war keine warnung...

von xxx (Gast)


Lesenswert?

Oxy schrieb:
> da war keine warnung...

Ich habe es extra ausprobiert und würde mit gcc folgende Warnung 
bekommen (-Wall):
..\sizeTest.c:45:5: warning: suggest parentheses around assignment used 
as truth value [-Wparentheses]
     if (RC = 0xff)
     ^

von Joe F. (easylife)


Lesenswert?

xxx schrieb:
> suggest parentheses around assignment used
> as truth value

hat er ja gemacht ;-)

if((RS = 0xFF))

von Tcf K. (tcfkao)


Lesenswert?

Da hilft nur ein MISRA kompatibler Compiler...
https://de.wikipedia.org/wiki/MISRA-C

von xxx (Gast)


Lesenswert?

ja ich weiss, ich habe das nur ausprobiert weil oxy geschrieben hat, es 
werden keine Warnungen angezeigt.

von Marco G. (grmg2010)


Lesenswert?

Ich würde zum Testen deine Entprellung auskommentieren.
Wenn dein Programm weiterhin nicht so funktioniert wie du möchtest, muss 
man weiter sehen.
Achja, stell mal die "richtige" Version des Codes hier ein, nicht die 
"was ich eben noch ausprobiert habe"-Variante, sondern die von der du 
meinst, dass sie funktionieren sollte

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Deshalb gewöhnt man sich an die Konstante links zu schreiben:
1
if((0xFF = RS)) //Fehler
2
{
3
...
4
}
Dann bekommt man definitiv einen Fehler.

von Karl H. (kbuchegg)


Lesenswert?

Frank schrieb:
> Deshalb gewöhnt man sich an die Konstante links zu schreiben:
>
1
> if((0xFF = RS)) //Fehler
2
> {
3
> ...
4
> }
5
>
> Dann bekommt man definitiv einen Fehler.


Es würde auch schon reichen, sich zu überlegen was mir der Compiler mit 
einer Warnung sagen will. Wenn der Compiler (wörtlich) vorschlägt, den 
Ausdruck zu klammern, dann kann das eine Lösung sein - aber nur unter 
der Voraussetzung dass man wirklich auch eine Zuweisung meinte. Im 
anderen (häufigeren) Fall, wenn man sich fragt "was zum Teufel faselt 
der da von einer Zuweisung", sieht man dann auch das Problem und das der 
Vorschlag mit der zusätzlichen Klammerung nicht die Lösung ist.

Mit wachsender Erfahrung wird dieses "Problem" immer kleiner, bis es 
sich praktisch im Nichts auflöst. Diesen Fehler macht man am Anfang 
seiner Karriere ein paar mal, aber das wird schnell immer seltener. Und 
wenn, dann sieht man das vergessene = spätestens im Debugger sofotrt.
Die Umkehrung der Operanden hingegen hat das dauerhafte Problem, das 
Menschen meistens nicht so denken. Wir denken nun mal nicht "Wenn es 
wahr ist, dass 5 die Anzahl der Eier ist", sondern wir benennen den 
variablen Teil meistens zuerst. "Wenn es wahr ist, dass die Anzahl der 
Eier gleich 5 ist".
Obowhl ich natürlich auch zugebe, dass man sich an alles gewöhnen kann 
und dann auch die Umkehrung der Reihenfolge gegenüber der natürlichen 
Denkweise irgendwann völlig normal ist.

: Bearbeitet durch User
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.