PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : While-Schleife geht nicht!!!



Undergroundi
17.12.2007, 15:02
hallo alle zusammen!
ich habe ein problem!!!
ich bin asuro-anfänger und verstehe nicht warum die whileschleifen bei mir nicht funktionieren...
als beispiel:
...
while (PollSwitch>0)
if
{
(StatusLED(RED));
}
else
{
(StatusLED(GREEN));
}
...
so! gespeichert, make, und geflasht!
asuro aus wieder an StatusLED rot...drück ich jetzt die kollisionstaster passiert NICHTS! ](*,)
kennt jemd das problem??? wer kann mir helfen?

grüße undergroundi!

Jackie
17.12.2007, 15:07
Poste am besten erstmal den gesammten Code. Ich denke dann kann man dir sehr viel besser helfen.

mfg
jackie

radbruch
17.12.2007, 15:43
Hallo Undergroundi,

willkommen im RN-Forum.

Zu PollSwitch() (mit den Klammern) ist anzumerken, dass die Tastenwerte nicht immer korrekt zurückgegeben werden. Um sicherer zu prüfen, sollte man mehrere PollSwitch()-Aufrufe machen und vergleichen, ob immer der selbe Werte erkannt wurde bevor man im Progamm darauf reagiert. Häufig stimmt auch die Kallibrierung der Tastenwerte nicht genau weil die Widerstandswerte der Tastenbeschaltung zu große Toleranzen aufweisen. Zum Einstieg kannst dir mal den Artikel dazu im asurowiki durchlesen:
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

Außerdem sollte dein Codefetzen besser so aussehen:

while (PollSwitch()>0)
{
if
{
(StatusLED(RED));
}
else
{
(StatusLED(GREEN));
}
}
... mit zusätzlichen geschweiften Klammern für die While-Schleife.

Gruß

mic

Undergroundi
17.12.2007, 17:11
alles klar vielen dank!!!

damaltor
17.12.2007, 19:54
wichtig ist 1. dass du die klammern nicht vergisst. aber das meldet dir auch der compiler...

2. solltest du, wenn du code postest, den code-button verwenden. dann wird der code in so einer hübschen box eingefast wie bei radbruch.

PicNick
17.12.2007, 20:10
Weiss nicht, wie's bei Asuro ist. Aber normalerweise schreib' ich immer


while (bedingung)
{
if (andere bedingung)
{
tu_dieses();
}
else
{
tu_jenes();
}
}


Was is denn die Bedingung für StatusLED(RED) ??

Vermute: if ohne bedingung heißt "immer" , also ewiges rotes licht

damaltor
17.12.2007, 20:18
PollSwitch() ist eine funktion, die prüft ob (und welche) taster gedrückt werden.
aber eben nur wenn man die klammern setzt =)

radbruch
17.12.2007, 20:53
Hallo


Was is denn die Bedingung für StatusLED(RED) ??
Oje, das ist ja peinlich. *schäm* Vor lauter PollSwitch() und While glatt übersehen. Sorry. Was sagt denn der Compiler zu dieser Konstruktion?

Gruß

mic

Ceos
18.12.2007, 07:39
while (PollSwitch>0)
if
{
(StatusLED(RED));
}
else
{
(StatusLED(GREEN));
}

also ich möchte mal meinen dass das programm SO gar nicht richtig lauffähig ist ... wenn
while (PollSwitch>0)
die einzige schleife ist, purzelt dein Asuro logischerweise nach der ersten schleifenbedingung in das programmende ... ob die LED dann standardmäßig rot wird weis ich adhoc nicht, ist aber zu vermuten ...
versuchs mal mit


unsigned char ret = 0;
while(1){
ret = Pollswitch();
if ...
}

1nDaClu8
18.12.2007, 09:40
Also ich verstehe das auch nicht so ganz... Ein IF ohne Bedingung funktioniert doch gar nicht oder?
Sollte das ganze Konstrukt nicht eher so aussehen:



while(1){
if(PollSwitch()>0) {StatusLED(RED);} // Wird eine Taste gedrückt --> LED = Rot
else {StatusLED(GREEN);} // Keine Taste --> LED = Grün
return 0;
}

Ich hoffe ich habe nicht noch mehr Verwirrung gestiftet O:) !

Gruß,

1nDaCu8

Ceos
18.12.2007, 09:46
naja ich hab halt nur
if ... geschrieben damit die topic-ersteller auch noch bissl was zu denken hat :p

radbruch
18.12.2007, 11:18
Hallo


Ich hoffe ich habe nicht noch mehr Verwirrung gestiftet
Nein, ganz im Gegenteil. Mit Mehrfachabfrage und Return() außerhalb der While-Schleife würde es dann etwa so aussehen:

while(1){
taste1=PollSwitch();
taste2=PollSwitch();
if((taste1 > 0) && (taste1 == taste2)) {StatusLED(RED);} // Wird eine Taste gedrückt --> LED = Rot
else {StatusLED(GREEN);} // Keine Taste --> LED = Grün
}
return 0;

Und mit nur einem (langsamen) PollSwitch() und einer "Entprellung" durch die IF-Abfrage:

while(1){
taste1=PollSwitch();
if((taste1 > 0) && (taste1 == taste2)) {StatusLED(RED);} // Wird eine Taste gedrückt --> LED = Rot
else {StatusLED(GREEN);} // Keine Taste --> LED = Grün
taste2=taste1;
}
return 0;

Das ist übrigens mein persönlicher Favorit, mit drei Abfragen auch sehr sicher.

Gruß

mic

damaltor
18.12.2007, 19:58
standardmäßig passiert ebi einem mikrocontroller nichts. auch die statusled wird nicht rot.

im gegenteil, man sollte darauf achten dass das programmende nie erreicht wird; ansonsten steht de prozessor n einem sogenannten undefinierten zustand in dem (theoretisch) alles mögliche passieren könnte.

die beste lösung ist vermutlich tatsächlich eine endlosschleife, in der mit if abgefragt wird.

Weiti
22.12.2007, 14:23
hallo radbruch,
zwei sachen:
1. ist taste1=PollSwitch(); die deklaration von taste1 oder nur eine zuweisung? wenn ja: wie wird taste1 deklariert?

2. muss im zweiten code von dir nicht auch taste2=PollSwitch(); stehen?

radbruch
22.12.2007, 21:34
Hallo Weiti

taste1 sollte natürlich zuvor deklariert sein, als Byte bzw. Char weil der Rückgabewert von PollSwitch() so aussieht:
unsigned char PollSwitch (void)

taste2 speichert den letzten mit PollSwitch() ermittelten Wert (der ja in taste1 steht) und wird am Ende der Schleife zugewiesen (und muss natürlich auch zuvor als Char deklariert sein):

taste2=taste1

Dann kann man in der If-Abfrage die zwei nacheinander ermittelten Tastenwerte vergleichen. taste1 aus der aktuellen Schleife und taste2 aus der vorhergehenden Schleife. Dadurch spart man sich einen Aufruf von PollSwitch(). Zur Erhöhung der Zuverlässigkeit des Tastenwertes kann man dann noch einen dritten Tastenwert aus der vorletzen Schleife abfragen (if((taste1 > 0) && (taste1 == taste2) && (taste1 == taste3) den man mit

taste3=taste2;
taste2=taste1;

auch am Ende der Schleife gespeichert hat. Das funktioniert natürlich nur, wenn die Tasten halbwegs genau kalibriert sind und bei Betätigung (meistens) den ihnen zugewiesenen Wert erzeugen (1,2,4,8,16 und 32)

Gruß

mic