PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuros Schalter



campino
13.11.2005, 12:54
hi,

mein Asuro behauptet, dass Schalter gedrückt wurden, die eigentlich nicht gedrückt sind (K5 und K6 werden vom Programm für K1 gehalten). In der Anleitung steht drinn:


In seltenen Fällen kann es vorkommen, dass durch Bauteiletoleranzen ein falsches Muster erkannt wird.
Das kann aber später softwareseitig behoben werden.”

Wie sieht dieses "Softwareseitig beheben" aus? Habt ihr Beispielcode? Ich bin mir recht sicher, dass mein Code, der aus der Ausgabe von PollSwitch() einen Array mit Werten für die einzelnen Schalter macht funktioniert. Es muss also dieser Fehler sein, der Selbsttest hat das selbe Problem.

Danke schonmal,
campino

maze2k
14.11.2005, 12:14
Poste doch mal deinen Code. Meiner sieht so aus:




int poll = PollSwitch();

...

int switches[6] = { 0, 0, 0, 0, 0, 0 };
int i, switchValue;
for (i=0; i<6; i++) {
switchValue = power(2, (6-i-1));
if (poll-switchValue >= 0) {
switches[i] = 1;
poll -= switchValue;
}
}



Damit hab ich ziemlich genau die Werte der Taster. 0 = nicht gedrückt, 1 = gedrückt.

Softwareseitig beheben heisst in diesem Fall:

Probier aus, was du für Werte bekommst. Dazu einfach ein kleines Programm schreiben, das in einer Endlosschleife die Taster abfrägt (am besten nach jeder Abfrage eine Pause von 1000ms oder so) und über die IR Schnittstelle an den PC sendet.

Dort liest du im Hyperterminal die Werte ab und siehst dann, welchen Wert du für welchen Taster bekommst.

Am besten probierst du erstmal jeden Taster einzeln. Dann hast du die Einzelwerte (die bei gleichzeitigem Drücken nur addiert werden).

Wenn du die hast, kannst du deinen Code dementsprechent modifizieren.

campino
14.11.2005, 16:20
EDIT:
sry, hatte alles nach der ersten Zeile deines Codes übersehen...Was macht power()?

maze2k
14.11.2005, 17:02
Ja das kann leicht passieren. Die Code-Boxen könnten etwas größer sein....

power(2,x) bedeutet einfach 2^x, also in Worten "Zwei hoch x".

Code hier:


int power(int base, int e) {
if (e == 0) { return 1; }
else if (e == 1) { return base; }
else { return base*power(base, e-1); }
}

campino
14.11.2005, 17:25
Das ist aber nicht so sonderlich performant, oder? Kann es sein, dass es ein paar Sekunden dauert, power() auszuführen?

ich hatte bisher follgendes:


int k[6]={0, 0, 0, 0, 0, 0};
int b=PollSwitch();
int i;
for(i=0;i<k.length;i++){
k[i]=b%2;
b=(b-k[i])/2;
}


ich glaube das geht schneller, ist da irgendwo ein Fehler drin? Lag mein Problem vielleicht daran, dass ich k leer gelassen hatte?

m.a.r.v.i.n
15.11.2005, 12:37
Hallo,

ich verstehe nicht ganz, warum ihr die Tastenauswertung so kompliziert mit arrays macht.
Geht es nicht viel einfacher mit einem character als Tastenwert und bitweise vergleichen?



...
unsigned char t1, t2;
...
t1=PollSwitch();
t2=PollSwitch();
if (t1 && t1 == t2)
{
if (t1 & 0x01) do_K6();
if (t1 & 0x02) do_K5();
if (t1 & 0x04) do_K4();
...
}
...


2x o. 3x aufrufen von PollSwitch() und vergleichen der Rückgabewerte korrigiert Schwankungen der A/D Werte durch Lade/Entladevorgänge von C7.

Vorraussetzung ist natürlich, das die PollSwitch() Funktion auch tatsächlich
die richtigen Werte liefert (2er Potenzen). Deshalb erst mal mit einem Testprogramm die Werte sich ausgeben lassen.



...
char str[8];
unsigned char t1,t2;
...
t1=PollSwitch();
t2=PollSwitch();

if (t1 && t1 == t2)
{
sprintf(str, "%3d\r\n", t1);
SerWrite(str, 5);
}


Falls K1 o. K2 nicht ganz korrekte Werte liefern kann, man dies in der PollSwitch() Funktion anpassen.
Guckt ihr hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=12475
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=82999


Gruß Peter