PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm funktioniert nicht



janse
15.02.2010, 22:05
Ich bin Anfänger und habe mein erstes Programm geschrieben. Der Asuro soll, wen er auf ein Hinderniss trifft sofort anhalten. Aber es passiert gar nichts nur die LED leuchtet grün woran liegts? Was mach ich falsch?
Hier das Programm:

#include "asuro.h"

int main(void)
{
Init();

while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
}

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);



while(1)
return 0;
}

radbruch
15.02.2010, 22:55
Hallo


Aber es passiert gar nichts nur die LED leuchtet grünDas liegt in erster Linie daran, dass die StatusLED schon bei Init() auf grün geschaltet wird und sich das im Programm nie mehr ändert...

Dieser Programmteil

while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
}
wird solange ausgeführt bis mit PollSwitch() ein Tastenwert eingelesen wird der ungleich null ist. Blöderweise ist PollSwitch() ziemlich zickig und meldet gelegentlich auch einen Wert ungleich null wenn keine Taste gedrückt wird. Ursache dafür ist zum einen die Bauteilestreuung der Tastenbeschaltung (R24-32) die man eventuell durch eine bessere Kalibrierung der Tasten ausgleichen kann. Zum anderen stören die Motoren enorm, dies kann man durch Mehrfachabfragen und Plausibilitätsprüfungen ausmerzen.

Wenn nun eine Taste erkannt wird, wird die Schleife verlassen, mit

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
werden die Motoren abgeschaltet und mit
while(1)
return 0;
wird endlos zum aufrufenden Programm zurückgesprungen. Da bei den AVRs kein aufrufendes Programm existiert, springt das erste return() irgendwo in den Speicher des AVRs und dieser stürzt dadurch ab.

Ungetestet:

#include "asuro.h"

int main(void)
{
Init();

StatusLED(YELLOW); // starten
MotorDir(FWD,FWD);
MotorSpeed(120,120);

// weiterfahren solange bei drei Lesungen mindestens einmal null dabei war
while((PollSwitch()==0) || (PollSwitch()==0) || (PollSwitch()==0));

StatusLED(RED); // anhalten
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);

while(1); // Endlosschleife (mit Semikolon an Ende!)
return 0; // dieser Befehl wird nie erreicht
}

Infos zu den Tasten:
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

Gruß

mic

janse
15.02.2010, 23:52
vielen Dank für die schnelle antwort aber leider funktiert es so auch nicht. gibt es also noch eine weitere möglichkeit?

Thund3r
17.03.2010, 17:53
Hallo

Was macht er denn wenn du radbruchs Programm benutzt?
Das sieht eig. korrekt aus.

Gruß Thund3r

Metze
22.03.2010, 18:01
Hallo das Grundgerüst für das Programm:


#include "asuro.h"

int main(void)
{
Init();

while(1)//Endlosschleife!!!
{
//hier der Programmcode rein!!!

return 0;
}//Ende while

}

Gruss
Markus

Thund3r
22.03.2010, 18:04
Hallo

Das ist das Grundgerüst für jedes Asuro-Programm ;)
Ich denke das ist nich das Problem.

Gruß Thund3r

Metze
22.03.2010, 18:06
Wenn ich mir sein Code anschaue, dann schon!!!

Gruss Markus

Thund3r
22.03.2010, 18:09
Hallo


Der Asuro soll, wen er auf ein Hinderniss trifft sofort anhalten

Mehr nicht.

Also ist eine Endlosschleife überflüssig.

In radbruchs Programm fährt er solange bis er auf ein Hindernis trifft --> also so wie gewünscht.

Gruß Thund3r

radbruch
22.03.2010, 18:36
Hallo

Das ist als "Grundgerüst" ungeeignet:


#include "asuro.h"

int main(void)
{
Init();

while(1)//Endlosschleife!!!
{
//hier der Programmcode rein!!!

// DIESES RETURN DARF NICHT INNERHALB DER SCHLEIFE STEHEN!!!
// return 0;
}//Ende while

}

Gruß

mic