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!
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.
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
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
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.
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.