Also es leuchtet dann rein gar nichts mehr, als wär er aus ^^ also eingentlich "keine erkennbaren Aktionen" ^^
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.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?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; }Ist es so nicht schon fertig?
Weiter viel Erfolg, vor allem Spaß und viel Geduld mit Rolf
wünscht euch Sternthaler
Lieber Asuro programieren als arbeiten gehen.
Ach so ist das
Die Programmiersprache C liegt quasie direkt an der substanz... nicht läuft von selbst... hat vor und nachteile
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 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".
Lesezeichen