PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Probleme mit den Tastern



Excors
06.06.2012, 22:11
Hallo Leute :)

Ich habe ein Problem mit meinem Asuro: nicht alle der Taster wollen so richtig wie ich es will...

Erstmal verweigert der Taster K6 komplett seinen Dienst, und der Taster K1 kann sich auch nicht auch einen Wert einigen: meine bearbeitete Version des TastenSensorTest (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/TastSensorTestC) sagt mir, dass der Taster K1 von 25001 mal abfragen gerade mal 3x den gewünschten Wert(32) zurück gegeben hat, und er 24998x den Wert 33 zurück gegeben hat... nämlich mir aufgefallen ist: Wenn ich den Asuro in letzter Zeit länger angehabt habe, komm öfters ein falscher Wert zurück, als wenn ich den Asuro ca. 10-15 Stunden aus hatte: nachdem er lange aus war gibt er zu ca. 26% 32 zurück, nachdem ich ihn fast 30 Min an hatte gibt er nur noch zu 0,01% 32 wieder...

Auch habe ich ein Problem mit dem Taster K6, der hat nämlich noch keinen einzigen laut von sich gegeben, funktioniert also (momentan) gar nicht...

In dem Offiziellem Forum von Arexx (http://arexx.com/forum/viewtopic.php?f=19&t=1848) habe ich auch schon gefragt (http://arexx.com/forum/viewtopic.php?f=19&t=1848), wurde jedoch von "Arexx-Henk" auf dieses Forum hier aufmerksam gemacht :)

Dort wurde ich auch gefragt, ob ich die Widerstände R23 und R15 auch richtig, also in Fahrtrichtung eingebaut habe -> Ja, siehe dieses Foto von meinem kleinem Asuro :)
Foto von meinem Asuro(falls man so evtl. nen Fehler erkennen kann (http://pic.up-the-file.de/19L41R5QiK.jpg)

Und natürlich nochmal meine Modifizierte Version des TastenSensorTests, und ja, das kann sein, dass dort Fehler drinne sind, ist ja immerhin mein erstes Programm mit Asuro(und mein erstes in C):

/************************************************** *********************
*
* File Name: tastsensor.c
* Project : ASURO
*
* Description: Test der Tastensensoren
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.0 10.09.2005 Peter initial build
* 1.1 08.01.2006 Peter 2x PollSwitch + Vergleich, anstelle 8x PollSwitch
*
* benoetigt die modifizierte Asuro Bibliothek 'asuro.c'
* von waste, stochri und andun. Zu finden bei www.roboternetz.de
*/
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/

#include "asuro.h"

int main(void)
{
unsigned char t1, t2, tE;
unsigned int cO, cF;


Init();
tE = 0;
cO = 0;
cF = 0;
SerWrite("\r\nTastsensor Test Erweitert\r\n",29);
while((cO + cF) <= 25000)
{
StatusLED(GREEN);
t1 = PollSwitch();
t2 = PollSwitch();
if(t1 && t2 && t1 == t2) /* irgendeine Taste gedrueckt */
{
if(tE == 0)
{
tE = t1;
SerWrite("Expected: ",10);
PrintInt(tE);
SerWrite("\r\n\r\n\r\n\r\n",6);
}
if(t1 != tE)
{
StatusLED(RED);
cF = cF + 1;
}
if(t1 == tE)
{
cO = cO + 1;
}
Msleep(50);
}
if(((cO + cF) == 2500)||((cO + cF) == 5000)||((cO + cF) == 7500)||((cO + cF) == 10000)||((cO + cF) == 12500)||((cO + cF) == 15000)||((cO + cF) == 17500)||((cO + cF) == 20000)||((cO + cF) == 22500)) {
SerWrite("\r\n\r\n\r\n\r\n",6);
PrintInt(cO);
SerWrite("|",1);
PrintInt(cO + cF);
SerWrite("|",1);
PrintInt(cF);
SerWrite("\r\n\r\n\r\n\r\n",6);

}
}
StatusLED(YELLOW);
SerWrite("\r\n\r\n\r\n\r\n",6);
PrintInt(cO);
SerWrite("|",1);
PrintInt(cO + cF);
SerWrite("|",1);
PrintInt(cF);
}

Schon mal vielen Dank für eure Hilfe :)

radbruch
07.06.2012, 10:42
Hallo


Wenn ich den Asuro in letzter Zeit länger angehabt habe, komm öfters ein falscher Wert zurück, als wenn ich den Asuro ca. 10-15 Stunden aus hatteVermutlich erholen sich die Batterien, wenn der asuro längere Zeit ausgeschaltet ist.


Auch habe ich ein Problem mit dem Taster K6, der hat nämlich noch keinen einzigen laut von sich gegeben, funktioniert also (momentan) gar nicht...Einer der unzähligen Threads dazu: https://www.roboternetz.de/community/threads/50158-T9-glimmt-nur-und-Schalter-funktionieren-nicht-richtig?p=483552&viewfull=1#post483552
Mit dem Programm von Osser kannst du die gemessenen Tastenspannungen ausgeben:
https://www.roboternetz.de/community/threads/50158-T9-glimmt-nur-und-Schalter-funktionieren-nicht-richtig?p=483627&viewfull=1#post483627

Zu deinem (ersten) Programm: Ein Progamm darf NIE so enden:

PrintInt(cF);
}

Warum? So würde die Funktion main() beendet werden und das Programm würde an der Stelle fortgeführt von wo aus die Funktion main() aufgerufen wurde. Das ist normalerweise eine Art von Betriebssystem das es beim Microkontroller aber nicht gibt. Deshalb wird hier nach einem Rücksprung irgendwas undefiniertes ausgeführt und die möglichen Folgen sind nicht absehbar. Richtig wäre

PrintInt(cF);
while(1); // Progamm darf nie beendet werden
return(0); // wird nie erreicht
}

Hier noch dein nach meinem Geschmack umgebaute Programm:


// Tastenstatistik erstellen
// https://www.roboternetz.de/community/threads/58098-Probleme-mit-den-Tastern

#include "asuro.h"

unsigned char t1, t2, tE;
unsigned int cO, cF;

int main(void)
{
Init();
SerWrite("\r\nTastsensor Test Erweitert\r\n",29);
while(1)
{
cO = 0;
cF = 0;

StatusLED(YELLOW);
do
{
t1 = PollSwitch();
t2 = PollSwitch();
}while(t1 || t2); // warten bis keine Taste gedrückt ist

StatusLED(GREEN);
do
{
t1 = PollSwitch();
t2 = PollSwitch();
}while((t1 != t2) || (t1 == 0)); // warten auf gültigen Tastendruck

tE = t1; // die zu prüfende Taste in tE speichern und ausgeben
SerWrite("\n\n\rExpected: ",13);
PrintInt(tE);
SerWrite("\n\n\r",3);

while((cO + cF) <= 25000)
{
do
{
t1 = PollSwitch();
t2 = PollSwitch();
}while(t1 != t2); // Tastenstatus einlesen

if(t1 == tE)
{
StatusLED(OFF);
cO = cO + 1;
}
else
{
StatusLED(RED);
cF = cF + 1;
}

if(((cO + cF) % 2500) == 0) // alle 2500 Werte eine Zwischenstatistik
{
PrintInt(cO);
SerWrite("|",1);
PrintInt(cO + cF);
SerWrite("|",1);
PrintInt(cF);
SerWrite("\n\r",2);
}
Msleep(50);
}

SerWrite("\n\r",2);
PrintInt(cO);
SerWrite("|",1);
PrintInt(cO + cF);
SerWrite("|",1);
PrintInt(cF);
SerWrite("\n\r",2);
}
return(0);
}(ungetestet)

Gruß

mic


[Edit]
Zu deinen Lötkünsten: Du darfst gerne etwas mehr Lötzinn verwenden. Speziell am R30 würde ich wegen dem K6-Problem nochmals nachlöten. Die Drahtbrücke neben R17 fehlt. Leider hast du den asuro streng nach Anleitung aufgebaut und die möglichen Modifikationen nicht berücksichtigt:
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Modifikationen

radbruch
08.06.2012, 00:02
Was war denn nun die Lösung?

Excors
08.06.2012, 14:38
Naja, das K1 nicht ging lag da dran:

Die Drahtbrücke neben R17 fehlt.

Das Problem mit meinem K6 habe ich nach längerem sucher dadurch gelöst, dass ich einfach in der asuro.c in der Zeile 216 etwas "rumgetestet" habe: ich habe sie von

return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
zu

return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 62.7 + 0.5));
geändert, K6 gibt jetzt immer 32 aus, die anderen Taster geben auch alle den gewollten Wert aus, nur wegen K1 bin ich noch am Testen, da dieser manchmal anstatt der 1 eine 0 zurück gibt...

Aber danke für das mit der Drahtbrücke, ich hätte das nie gesehen :D