PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage bzgl. Abarbeitung des Programms



mechatronikilm
21.08.2012, 16:01
Hallo, Asuro- und C-Kenner.
Bin grad dabei mir C beizubringen und nebenbei erprobe es an Asuro. Folgendes Problem habe ich: ich habe ein kleines Programm erstellt, wo Asuro in seiner Bewegung auf vordere Tastendrücken reagiert. Hier das Programm:

#include "asuro.h"
int main()
{ Init();
while(1)
{ FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(200,255);
Msleep(10);
if (PollSwitch() != 0)
{FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(100,250);
Msleep(1000);
BackLED(OFF,OFF);}
}
return 0;
}

Wie ihr nicht schwer erkennen könnt, fährt er solange gerade aus (musste Geschwindigkeit korrigieren für Geradeausfahren, mechanische Lösung folgt). Auf jeden Fall, wenn die Taste gedrückt wird, dann fährt Asuro kurz zurück mit einer kleinen Drehung und fährt weiter. Das Problem liegt in "Msleep()". Wenn ich Msleep(); nach MotorDir(FWD,FWD), MotorSpeed() auslasse, dann fährt er nur rückwärts. Wenn ich Msleep(1000) stelle dann läuft es fehlerfrei. Wenn ich Msleep(10) lasse, dann führt er Rückwärtsbewegung zufällig auch ohne an die Wand zu stoßen. Programm sollte auch ohne Msleep(10) funktionieren, doch das tut es nicht. Für mich scheint das Programm in Ordnung zu sein, aber ich hab ja auch erst gestern angefangen :) . Es ist so als ob bei der Abarbeitung die Bedingung in if ab und zu übersprungen wird und Anweisungen ausgeführt ohne dass die Tasten gedrückt werden. Hätte jemand ein Rat, was genau im Programm falsch läuft?

radbruch
21.08.2012, 17:10
So vielleicht?


#include "asuro.h"

char t1, t2;

int main(void)
{
Init();
t1=PollSwitch();

FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(200,255);

while(1)
{
t2=t1;
t1=PollSwitch();
if((t1==t2) && (t1!=0))
{
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(100,250);
Msleep(1000);
BackLED(OFF,OFF);
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(200,255);
}
}
return 0;
}(ungetestet)

Die Tastenwerte sind nur gültig, wenn zweimal der selbe Wert eingelesen wurde.

Valen
21.08.2012, 17:56
Stimmt. Mit Motordrehungen können ab und zu falsche Tastenerkennungen platz finden. Mit MSleep(
1000) wird 1 Sekunde gewartet. Aber mit MSleep(10) nur 10 Millisekunden, deshalb passiert das öfter. Entweder den Motortreibung sollte getrennt werden von den Bordspannung Vcc, und damit von den Tasterschaltung. Oder man benutzt eine Softwaremäßige Filter, wie Radbruchs Lösung.

mechatronikilm
21.08.2012, 18:10
Danke sehr für die Hilfe, jetzt gehts. muss nur noch das Problem mit geradeausfahren lösen, denn selbst mit diesen Korrektruwerten für Geschwindigkeit fährt er im Kreis mit einem Radius von etwa 40 cm. Der rechte Motor ist "schwach", muss nach der Lösung noch suchen. Das Thema kann man als erledigt abstempeln. Danke nochmal!

radbruch
21.08.2012, 18:38
Hallo

Tipp fürs Motorproblem: Tausche die Motoranschlußleitungen (und wirklich nur die Anschlußleitungen!) zwischen dem linken und dem rechten Motor. Bleibt der rechte Motor auch an der linken H-Brücke schwach liegt das Problem am rechten Antrieb oder Getriebe. Wandert die Schwäche nach links ist der Fehler bei der rechten H-Brücke zu suchen.

Mechanische Fehler: Achsen schief, kein Zahnspiel am Motorritzel, Klemmring an der Radachse zu eng, Achsen nicht sauber.... dreht das Rad leicht wenn das Motorritzel nicht im Eingriff ist? Motor mit zuviel Kleber befestigt? Kunststoffkappe am Motor nicht ganz reingedrückt?

Elektrische Mängel: Falsche Bauteile/Widerstandswerte, Transistoren vertauscht (PNP/NPN), Freilaufdioden D1-8 verpolt, Lötbrücken oder "kalte" Lötstellen, Verunreinigungen, abgebrochene Lötaugen oder unterbrochene Leiterbahnen...

Viel Spass und Erfolg bei der Fehlersuche.

Gruß

mic