Also es leuchtet dann rein gar nichts mehr, als wär er aus ^^ also eingentlich "keine erkennbaren Aktionen" ^^
Druckbare Version
Also es leuchtet dann rein gar nichts mehr, als wär er aus ^^ also eingentlich "keine erkennbaren Aktionen" ^^
So...
Habs nun schon mal so hinbekommen, dass es ohne probleme funktioniert... nur teilweise hat er seinen spinnenden momente wo er einfach neustartet, oder einfach einen gedrückten button simuliert und dementsprechend reagiert. Oder manchmal blingt die Statusled gelb grün (abwechselnd) und er sendet unlesbare zeichen ^^
Teilweise aber funktioniert es wieder tadelos... müsste ein hardwarefehler sein oder? Vll mischen sich auch alte programmteile ein?
Vll ist es aber doch mein Code... wer ihn mal anguggen will :)
Code:#include "asuro.h"
void erwarten(unsigned int male); //Rufe Wartemodus ab
void collusion(unsigned int lang); //Rufe Collusion ab
int main(void)
{
Init();
//Ab hier beginnt Rolf zu "Leben"
//Morgenmassage senden
SerPrint("\r\nMuah... muss ich aufstehen?\r\n");
//Rolf wartet erstmal ab
erwarten(1);
//Rolf startet Kollusionsfahrt
collusion(10000);
//miau
RWARD();
Msleep(1000);
STOP();
return 0;
}
//Funktionen
//Rolf wartet auf etwas
void erwarten(unsigned int male) {
unsigned int i;
for (i = 0; i <= male; i++)
{
Msleep(500);
StatusLED(GREEN);
Msleep(10);
BackLED (OFF, ON);
Msleep(500);
StatusLED(OFF);
Msleep(10);
BackLED (ON, OFF);
Msleep(500);
BackLED (OFF, ON);
Msleep(500);
BackLED (ON, OFF);
if (i == male) BackLED (OFF, OFF); //Schalte Alles ab wenn am ende
}
}
//Rolf vorwaerts
void FWARD(void)
{
FrontLED(ON); //Kuendige Anfahren an
Msleep(300);
FrontLED(OFF);
Msleep(150);
FrontLED(ON);
Msleep(300);
FrontLED(OFF);
MotorDir(FWD,RWD); //Beide Motoren vorwaerts
MotorSpeed(150,150); //Los gehts
}
//Rolf rueckwaerts
void RWARD(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,120); //Los gehts
}
//Rolf rueckwaerts links
void RWDL(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,0); //Los gehts
}
//Rolf rueckwaerts rechts
void RWDR(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(0,120); //Los gehts
}
//Rolf stoppen
void STOP(void)
{
MotorSpeed(0,0);
FrontLED(OFF);
}
//Rolf kollusionsprogramm
void collusion(unsigned int lang)
{
unsigned long zeit = 0;
unsigned long startzeit = Gettime();
unsigned char t1;
unsigned char t2;
while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
{
zeit = Gettime();
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0 && zeit < (startzeit+lang)) //Keine Taste gedrueckt, Rolf feahrt vorwaerts
{
FWARD(); //Auf gehts
}
else if (t1 && t2 && t1 == t2 && zeit < (startzeit+lang))
{
STOP(); //Stoppen
if (t1 & 0x07 && zeit < (startzeit+lang)) //Linke tasten beruehrt
{
RWDL(); //LinksRueckwaerts ausweichen
SerPrint("\r\n Hab links was beruehrt, weiche aus...\r\n");
}
if (t1 & 0x38 && zeit < (startzeit+lang)) //Rechte tasten beruehrt
{
RWDR(); //RechtsRueckwearts ausweichen
SerPrint("\r\n Hab rechts was beruehrt, weiche aus...\r\n");
}
Msleep(1000); //Eine Sekunde rueckwarts fahren
}
SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n");
PrintLong(zeit);
}
STOP();
SerPrint("\r\nVerlasse Collisionsschleife.\r\n");
}
Hallo Rolf, äh meine natürlich Hardest,
erst einmal ein herzliches Willkommen im Forum.
anguggen hab ich getan.Zitat:
Vll ist es aber doch mein Code... wer ihn mal anguggen will :)
Die while()-Geschichte habt ihr ja schon zusammenbekommen.
Die 'spinnerten Momente', ja da liegst du richtig, es ist dein main()-Programm, welches das Problem erzeugt. Die Hardware können wir bestimmt ausschliessen.
Das main() läuft bei dir einmal von oben nach unten durch. Startet zwischendurch deine Funktionen und endet unten bei der }.
Das ist nicht gut, da die CPU dann Langeweile bekommt und ein bisschen rumspinnt.
2 Möglichkeiten führen zu einer Besserung.
1) Dein main() wird genau ein mal durchlaufen:
2) Oder Rolf wird senil und wiederholt immer alles:Code:int main(void)
{
Init();
//Ab hier beginnt Rolf zu "Leben"
.
.
//miau
RWARD();
Msleep(1000);
STOP();
while (1); // <<<<<------ Hier wird die CPU geparkt. KOMA-Zustand
// Wiederbeleben von Rolf nur noch mit aus- und einschalten moeglich.
return 0; // Sieht ueberfluessig aus, verhindert aber ein waring beim Compiler.
}
Ob dies schon ausreicht alle von dir beschriebenen Sonderlebensfunktionen zu beheben, weiss ich nicht genau. Vor allem die Taster-Funktion hat im Rolf so ihr Eigenleben. Aber ist es nicht genau das was du mit deinem Programm erreichen wolltest? ;-) Ist es so nicht schon fertig? ;-)Code:int main(void)
{
Init();
//Ab hier beginnt Rolf zu "Leben"
//Morgenmassage senden
SerPrint("\r\nMuah... muss ich aufstehen?\r\n");
while (1) // <<<<---- die Schleife der Wiederholung beginnen ...
{
//Rolf wartet erstmal ab
erwarten(1);
.
.
STOP();
} // <<<<---- ... und natürlich die Schleife zumachen.
while (1); // Das ist zwar nun ueberfluessig, aber schuetzt vor
// 'spinnenden Momenten', falls die Schleife oben durch einen
// Programmfehler verlassen wird.
return 0;
}
Weiter viel Erfolg, vor allem Spaß und viel Geduld mit Rolf
wünscht euch Sternthaler
Ach so ist das :D
Die Programmiersprache C liegt quasie direkt an der substanz... nicht läuft von selbst... hat vor und nachteile :D
Aber eher vorteile weil es den Programmierer nervt bis er sich beugt und intelligenz "fressen" muss ^^
Wunderbar... vielen dank... werd ich gleich mal ausprobieren hehe
hrhr... fang mal assembler an. DAS liegt dann wirklich an der substanz... da geht überhaupt nix mehr von allein. allerdings kann man mit assembler auch die absolut kleinsten und schnellsten programme schreiben. wenn man den überblick behält.
also kann ich assembler gleich mal vergessen ^^
Also ich habe nun Rolfs ablauf in eine unendliche schleife gepackt... und darunter auch eine die den Atmega am laufen hält, wenn er aus der ersten schleife ausbrechen sollte.
Jedoch spinnt er so genauso... hmmh.. sagen wir mal... sogar noch einwenig mehr ^^
Hier der geänderte code:
Er macht nur das was er soll wenn ich auf keinen taster drücke... warum bringen die taster alles durcheinander? Eine sehr sehr nervige angelegenheit.. grmlCode:#include "asuro.h"
void erwarten(unsigned int male); //Rufe Wartemodus ab
void collusion(unsigned int lang); //Rufe Collusion ab
int main(void)
{
Init();
//Ab hier beginnt Rolf zu "Leben"
//Morgenmassage senden
SerPrint("\r\nMuah... muss ich aufstehen?\r\n");
//Rolfs ablaufchema in eine unendliche schleife setzen
while (1)
{
//Rolf wartet erstmal ab
erwarten(1);
//Rolf startet Kollusionsfahrt
collusion(10000);
//miau
RWARD();
Msleep(1000);
STOP();
}
//Rolfs durchdrehverhinderungsschleife
while (1);
return 0;
}
//Funktionen
//Rolf wartet auf etwas
void erwarten(unsigned int male) {
unsigned int i;
for (i = 0; i <= male; i++)
{
Msleep(500);
StatusLED(GREEN);
Msleep(10);
BackLED (OFF, ON);
Msleep(500);
StatusLED(OFF);
Msleep(10);
BackLED (ON, OFF);
Msleep(500);
BackLED (OFF, ON);
Msleep(500);
BackLED (ON, OFF);
if (i == male) BackLED (OFF, OFF); //Schalte Alles ab wenn am ende
}
}
//Rolf vorwaerts
void FWARD(void)
{
FrontLED(ON); //Kuendige Anfahren an
Msleep(300);
FrontLED(OFF);
Msleep(150);
FrontLED(ON);
Msleep(300);
FrontLED(OFF);
MotorDir(FWD,RWD); //Beide Motoren vorwaerts
MotorSpeed(150,150); //Los gehts
}
//Rolf rueckwaerts
void RWARD(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,120); //Los gehts
}
//Rolf rueckwaerts links
void RWDL(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,0); //Los gehts
}
//Rolf rueckwaerts rechts
void RWDR(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(0,120); //Los gehts
}
//Rolf stoppen
void STOP(void)
{
MotorSpeed(0,0);
FrontLED(OFF);
}
//Rolf kollusionsprogramm
void collusion(unsigned int lang)
{
unsigned long zeit = 0;
unsigned long startzeit = Gettime();
unsigned char t1;
unsigned char t2;
while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
{
zeit = Gettime();
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0 && zeit < (startzeit+lang)) //Keine Taste gedrueckt, Rolf feahrt vorwaerts
{
FWARD(); //Auf gehts
}
else if (t1 && t2 && t1 == t2 && zeit < (startzeit+lang))
{
STOP(); //Stoppen
if (t1 & 0x07 && zeit < (startzeit+lang)) //Linke tasten beruehrt
{
RWDL(); //LinksRueckwaerts ausweichen
SerPrint("\r\n Hab links was beruehrt, weiche aus...\r\n");
}
if (t1 & 0x38 && zeit < (startzeit+lang)) //Rechte tasten beruehrt
{
RWDR(); //RechtsRueckwearts ausweichen
SerPrint("\r\n Hab rechts was beruehrt, weiche aus...\r\n");
}
Msleep(1000); //Eine Sekunde rueckwarts fahren
}
SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n");
PrintLong(zeit);
}
STOP();
SerPrint("\r\nVerlasse Collisionsschleife.\r\n");
}
Gibt es noch eine möglichkeit, die rolf das machen lässt was man ihn auch vorschreibt? ;)
Hallo Hardest,
Erstmall, was mir auffällt ist das du in jeder If-schleife testet ob die zeit schön passiert ist (... && zeit < (startzeit+lang)... ). Das is nicht nötig weil das schön beim eintrit die while-schleife sicher ist. Dieser test wird immer die selbe antwort geben im selben durchlauf. Fur deine asuro ist das nur sinlose arbeit. Und persönlich wurde ich die zeit = Gettime(); am ende die while-schleife platzen, sondern nützt die while-schleife (testen fur einer neue eintrit) eine veralterte zeit. Das werde dein program nicht besser laufen lassen (ich meine dein taster problem auflösen) sondern wurde es etwas netter machen.
Deine taster-testen problem liegt vielleicht an t1 & 0x38. 38=32+4+2. Also ich bin nicht ganz sicher welcher bestimmte taster das sind aber ich denke taster 6, 3 und 2. Das sind taster an die linker (6?) und rechter seite (3,2?). Versuche mall mit 0x46 (=32+16+8, oder taster 6, 5 und 4 wenn ich ´s recht habe). 0x07 stimmt wenn es taster 1,2 und 3 meinen söllte. Wenn 's nicht (besser) geht wechsel dieser zahlen mal fur die linke und rechter fahrt.
Hmm, ich habe mir geirrt. 0x38 ist ein hexadecimal nummer, nicht decimal. Also 0x38=3*16+8=32+16+8, und so stimmt mit taster 4,5,6. Vergesse mein 0x46.
So ich habe die änderungen vorgenommen... teilweise funktioniert es... nur teilweise spinnt er wieder völlig, schaltet sich manchmal sogar ab, oder startet einfach von neu. Ich hab wirklich keine ahnung ^^ warum er so ein eigenleben entwickelt ^^ ist ja auch irgendwie beabsichtigt, nur irgendwie kontrollierter ^^Code:#include "asuro.h"
void erwarten(unsigned int male); //Rufe Wartemodus ab
void collusion(unsigned int lang); //Rufe Collusion ab
int main(void)
{
Init();
//Ab hier beginnt Rolf zu "Leben"
//Morgenmassage senden
SerPrint("\r\nMuah... muss ich aufstehen?\r\n");
//Rolfs ablaufchema in eine unendliche schleife setzen
while (1)
{
//Rolf wartet erstmal ab
erwarten(1);
//Rolf startet Kollusionsfahrt
collusion(10000);
//miau
RWARD();
Msleep(1000);
STOP();
}
//Rolfs durchdrehverhinderungsschleife
while (1);
return 0;
}
//Funktionen
//Rolf wartet auf etwas
void erwarten(unsigned int male) {
unsigned int i;
for (i = 0; i <= male; i++)
{
Msleep(500);
StatusLED(GREEN);
Msleep(10);
BackLED (OFF, ON);
Msleep(500);
StatusLED(OFF);
Msleep(10);
BackLED (ON, OFF);
Msleep(500);
BackLED (OFF, ON);
Msleep(500);
BackLED (ON, OFF);
if (i == male) BackLED (OFF, OFF); //Schalte Alles ab wenn am ende
}
}
//Rolf vorwaerts
void FWARD(void)
{
FrontLED(ON); //Kuendige Anfahren an
Msleep(300);
FrontLED(OFF);
Msleep(150);
FrontLED(ON);
Msleep(300);
FrontLED(OFF);
MotorDir(FWD,RWD); //Beide Motoren vorwaerts
MotorSpeed(150,150); //Los gehts
}
//Rolf rueckwaerts
void RWARD(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,120); //Los gehts
}
//Rolf rueckwaerts links
void RWDL(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,0); //Los gehts
}
//Rolf rueckwaerts rechts
void RWDR(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(0,120); //Los gehts
}
//Rolf stoppen
void STOP(void)
{
MotorSpeed(0,0);
FrontLED(OFF);
}
//Rolf kollusionsprogramm
void collusion(unsigned int lang)
{
unsigned long zeit = 0;
unsigned long startzeit = Gettime();
unsigned char t1;
unsigned char t2;
while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) //Keine Taste gedrueckt, Rolf feahrt vorwaerts
{
FWARD(); //Auf gehts
}
else if (t1 && t2 && t1 == t2)
{
STOP(); //Stoppen
if (t1 & 0x07) //Linke tasten beruehrt
{
RWDL(); //LinksRueckwaerts ausweichen
SerPrint("\r\n Hab links was beruehrt, weiche aus...\r\n");
}
if (t1 & 0x38) //Rechte tasten beruehrt
{
RWDR(); //RechtsRueckwearts ausweichen
SerPrint("\r\n Hab rechts was beruehrt, weiche aus...\r\n");
}
Msleep(1000); //Eine Sekunde rueckwarts fahren
}
zeit = Gettime();
SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n");
PrintLong(zeit);
}
STOP();
SerPrint("\r\nVerlasse Collisionsschleife.\r\n");
}
Wie bist du sicher das er abschaltet und von neu startet? Kanst du die output von serielen schnittstellen auf ihren rechner sehen? Sagt er "Muah... muss ich aufstehen?" mit einiger regelmäß? Dann denke ik mall an eine hardware-reset das passiert, oder ähnliches. Weil er das nur einmall ausgeben sollte am start. Ich denke zu viel spannungsabfall durch bremsenden motoren oder etwas. Dein programm seht ganz gut aus.Zitat:
Zitat von Hardest
Vieleicht kannst du versuchen mehr 'debug-messages' in dein programm einzufügen und uber serielen schittstelle ubertragen. Dan kannst du besser sehen wenn und was er eigentlich tut, und wenn er etwas nicht söllte. Also wie "Ich gehe nach links" oder "t1 ist: xx, und t2 ist: xx".