PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : motor beeinflußt tastsensoren



cploj
10.01.2009, 22:32
Hallo, nun habe ich angefangen meinen asuro zu programmieren. leider bin ich auf folgendes problem gestoßen. sobald die motoren laufen wird das ergebnis der rechten tastsensoren verfälscht. irrtümlicherweise wird dort ein signal erzeugt als ob die taster gedrückt wären. was aber nicht der fall ist. lasse ich die motoren aus, dann funktionieren die tastsensoren einwandfrei.

hat da jemand erfahrung und/oder lösungsansätze?

danke schonmal für jeglichen input
grüße,
ello

radbruch
10.01.2009, 23:27
Hallo

Meist hilft schon eine einfache Überprüfung der Tastenwerte:

#include "asuro.h"

int t1, t2;

int main(void)
{

Init();
MotorSpeed(200,200);
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if((t1>0) && (t1==t2))
{
BackLED(t1 & 0b110000, t1 & 0b000011);
StatusLED((t1 & 0b001100) && 1);
}
else
{
BackLED(OFF,OFF);
StatusLED(0);
}
}
return 0;
}

Gruß

mic

cploj
11.01.2009, 13:59
Hallo, danke für deinen Tip. Das werd ich gleich mal ausprobieren.

cploj
11.01.2009, 14:39
so, ich habs nun mal mit der gesicherten Abfrage der SwitchPoll probiert, das funktioniert soweit auch. Aber die Sache mit t1 & 0b110000 usw. da bekomme ich vom Programmers Notepad eine Fehlermeldung "invalid suffix "b110000" on integer constant"

Warum dies? Und generell, was bedeutet dieses t1 & 0b110000 ?

simsbigfreak
11.01.2009, 15:00
also ich habs so gemacht:


void int frageTastenAb()
{
//20 mal Tasten abfragen und Mittelwert zurrückgeben
}

radbruch
11.01.2009, 15:41
Naja, 20 Abfragen sind vielleicht etwas viel, aber der Ansatz ist richtig. Eine weitere Verbesserung kann die "Kallibrierung" der Tasten bringen. In asuro.c, am Ende von PollSwitch(), steht die Formel nach der die gemessene Spannung in den Rückgabewert umgeformt wird. Bei mir funktioniert die letzte Zeile wunderbar:


//return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
return ((10240000L/(long)i-10000L)*63L+5000L)/10000;


0b000011 ist die binäre Schreibweise von 3. Manche Kompilerversionen können das aber leider nicht übersetzen. Die bitweise Darstellung ist praktisch wenn man, wie hier bei der Tastenabfrage, bestimmte Bits prüfen möchte. Im Rückgabewert von PollSwitch() ist jede Taste einem Bit zugeordnet, Bit0 (mit Wert 1) ist K6, Bit5(32) ist K1. 0b000011 prüft dann auf 3 (1+2=K5+K6), 0b001100 prüft auf 12 (4+8=K3+K4) und 0b110000 auf 48 (16+32=K1+K2). Wenn dein Kompiler also mit 0bxxxxxx nichts anfangen kann, dann ändere die betreffenden Stellen auf die dezimale Darstellung der Werte. Das sollte ja eigentlich nur eine Anzeige für die eingelesenen Tastenwerte sein....

Gruß

mic

cploj
11.01.2009, 16:56
danke euch, ich werd mir das mit der kalibrierung mal ansehen, aber mit der zweifachen abfrage klappt es jetzt doch schon sehr gut. und wenn ich 0b000000 in 0x000000 ändere dann gibts keine fehlermeldung, allerdings passiert damit auch nix. ich machs jetzt so wie im azuro handbuch z.b. t & 0x01...

uwegw
11.01.2009, 18:19
0x... macht aus der folgenden Zahl ne Hexadezimal- statt Binärzahl.
Probier mal, die Zahl auf volle acht Bit aufzufüllen, vielleicht mag das dein Compiler nicht, weil es nur 6 Bit sind.
Also
BackLED(t1 & 0b00110000, t1 & 0b00000011);

Welche Version nutzt du?

malediction
11.01.2009, 19:08
mal nen ganz anderer vorschlag:
hast du die stromversorgungskabel der motoren verdreht?!
falls nicht, könnte es theoretisch passieren, dass die entstehenden magnetfelder die schaltung beeinflussen, wobei e mich wundern würde, wenn davon die tastsensoren beeinflusst werden, weil das ansich ja absolut analoge schalter sind, die an und aus können und mehr nicht...

cploj
11.01.2009, 19:12
Hm, auch mit 0b00110000 funzt es nicht. Gleiche Fehlermeldung. Ich benutze Version 2.0.4.2.

Aber ich hab nun mal noch eine andere Frage. Ich hab einen relativ gut funktionierenden Code, der meinen Asuro auf Kachelboden die Fugen entlangfahren läßt und auch sonst mit einfachen Hindernissen gut klar kommt. Allerdings hab ich grad keinen Plan wie ichs nun schaffe, daß der Asuro so ein Wendemanöver macht wie beim Frontalaufprall, wenn er sich irgendwo festgefahren hat, wo die Taster keinen Kontakt haben, weil das Hindernis nicht den Boden berührt, die Taster also unter dem Hindernis sind.

Im gegenwärtigen Programm läuft dann der Motor aber der Asuro kann nicht weiter. Ich denke mal das ich da irgendwie mit der Odometrie arbeiten muß, aber da fehlt mir noch die nötige Kenntnis.

Hat da jemand Tips`?

Danke auch für die bisherige Hilfe...

radbruch
11.01.2009, 19:39
Schau mal hier:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=23163

Viel Text, aber genau das was du suchst ;)


weil das ansich ja absolut analoge schalter sind, die an und aus können und mehr nicht... Aha. Und wie erkennt der Mega8 welche Taste gedrückt ist?

malediction
11.01.2009, 20:01
ja, RADBRUCH!!! der arbeitet natürlich digital... sonst würde er nicht auf die platine und wahrscheinlich nicht mal in meine wohnung passen!! :P

ich habe jedoch von den schaltern gesprochen. und die sind nun mal analog.

alter klugscheißer ;) :twisted:

radbruch
11.01.2009, 20:15
Wie erkennt der Mega8 welche Taste gedrückt wird?

malediction
11.01.2009, 20:28
war das jetzt ne ernst gemeinte frage?! oder willst du mich testen/veräppeln? :-k

cploj
11.01.2009, 22:51
danke für den link