PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro / C



MrBean93
10.08.2008, 10:23
Habe da ein Programm für den Asuro, das keine Errors enthält.
Normalerweise sollte es so funktionieren: Geradeaus fahren, Status LED auf Grün schalten, Vorderes LED einschalten. Wenn eine Kollision erfolgt, Motor Stoppen, Status LED auf Rot schalten, Vorderes LED Abschalten, über Infrarot Diode "AUA!" Senden.



#include "asuro.h"
int main(void) {
Init();
while (1) {
{StatusLED (GREEN);
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed (180,180);}

if (PollSwitch()>0) {MotorSpeed (0,0);
StatusLED (RED);
FrontLED(OFF);
SerWrite("AUA!", 4);
}

}
}



Trotzdem führt er das Prog. anders aus. Es ist etwa so, als würde er zwischen den 2 Blöcken "Fahrt" und "Kolision" hin und her springen. = Status LED Flackert, Vorderes LED Flackert, Motor zittert, "AUA!" wird permanent gesendet. Wenn mann einen Kollisionstaster drückt, Leuchtet das Front LED schwach, und das Status LED Fllackert glaub ich auch noch. (Das ist aber so schwach, dass man ganz genau hinsehen muss).
Gibt es da jetzt einen Fehler in der Programmierung oder ist ein Kollosionstaster oder der IC defekt?

Dann hätte ich noch eine Frage: Wie kann man eine Verzögerung Programieren, die länger als 1 Sekunde anhält?

Kingstor
10.08.2008, 11:41
wenn ein taster gedrückt ist wird der teil oberhalb der if bedingung auch ausgeführt daher flackert das ... setzte doch den oberen teil in eine else oder mach Msleep(2000); am ende der if dann wird das zumindest für ne zeit lang angezeigt

hai1991
10.08.2008, 11:56
hallo MrBean93

was dein asuro macht ist föllig richtig.
aber dazu schauen wir uns jetzt mal an was in deinem programm steht:



//den anfang lassen wir weg ...

while(1)
{ //Endlosschleife, wird immer wiederholt

//statusled auf grün und frontled ein
//motor auf vorwärts mit 180, 180

if(PollSwitch()>0)
{//falls eine taste gedrückt wird:

//motor aus
//statusled auf rot und frontled aus
//AUA über hyperterminal ausgeben

}//ende der if-schleife. da kein else vorhanden ist wird einfach fortgesetzt

}//ende der while(1)-schleife, dh. es wird wieder von oben begonnen!


noch kurz zum ablauf:

nach dem einschalten tritt asuro in die endlosschleife ein
- schalten der leds
- schalten des motors
- prüfen ob taste gedrückt ist:
-- wenn ja: motor aus, leds schalten.
dann gehts einfach weiter, egal ob noch eine taste gedrückt ist oder nicht!
- sprung zum anfang der endlosschleife!


altenativ könntest du es zb. so machen:


#include "asuro.h"
int main(void) {
Init();
while (1)
{
StatusLED (GREEN);
FrontLED(ON);
MotorDir(FWD,FWD); //motor ein
MotorSpeed (180,180);

if(PollSwitch()>0) //falls ein taster gedrückt wir in der if-anweisung fortsetzen
{
MotorSpeed (0,0);
StatusLED (RED);
FrontLED(OFF);
SerWrite("AUA!", 4);
while(PollSwitch()>0) {} //solange ein taste gedrückt ist soll er nichts machen
}//ende der if-anweisung

}//ende der endlosschleife, von oben wieder anfangen
return 0; //sollte normaler weiße immer am ende der main()-funktion stehen
}



was mir noch aufgefallen ist: die runden kalmmern ( { und } ) um den ausführungsblock nach while(1){ kannst du dir sparen

MrBean93
10.08.2008, 21:49
Danke für die Raschen Antworten, vorallem an hai1991. Super Erklärt, habs verstanden. Werd's heute noch Ausprobieren :D

E
11.08.2008, 01:39
ähm, was macht denn Msleep(2000); ?
2000 Milisekunden = 2 Sekunden warten?
Danke
E

MrBean93
11.08.2008, 11:44
DAS GIBTS DOCH NICH! :evil: Immer, wenn ich flaschen will, dann gibt es schon beim ersten Package einen Timeout! Aber gestern hat er noch ein paar mal Funktioniert! ](*,) Ich krieg das einfach nicht hin, egal wie oft und mit welchen Lichtverhältnissen ich das probier! Aber genau das war schonmal der Fall, hab es dann noch ein paar mal probiert, und dann is es wieder für ne Weile (bis jetzt) gegangen! :cry: Was mach ich da Falsch?