Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm funktioniert nicht
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, 23: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
vielen Dank für die schnelle antwort aber leider funktiert es so auch nicht. gibt es also noch eine weitere möglichkeit?
Hallo
Was macht er denn wenn du radbruchs Programm benutzt?
Das sieht eig. korrekt aus.
Gruß Thund3r
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
Hallo
Das ist das Grundgerüst für jedes Asuro-Programm ;)
Ich denke das ist nich das Problem.
Gruß Thund3r
Wenn ich mir sein Code anschaue, dann schon!!!
Gruss Markus
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, 19: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.