PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit M32 und Tastern



Adleo
29.12.2009, 13:05
Hallo,

kann mir jemand Tipps zu dem folgenden Problem geben?

Wenn ich Taster 1 sehr schnell hintereinander drücke, führt mein Programm dann auf einmal Taster 2 aus und nicht nocheinmal den Teil von Taster 1.

Grüsse an Alle
Adleo

Mein Master-Code:



int main(void)
{
initRP6Control();
initLCD();
I2CTWI_initMaster(100); // Als Master initialisieren und Frequenz 100 einstellen

uint8_t key_abfrage=0;
uint8_t anzeige=1;
uint8_t Batterie;
uint16_t SpeedLight;

clearLCD();
showScreenLCD("Drucke einen","Taster!!!!!!!!!!");

while(true){
if(getStopwatch1()>2000){
clearLCD();
showScreenLCD("Drucke einen","Taster!!!!!!!!!!");
setStopwatch1(0);
}

key_abfrage=0;
key_abfrage=getPressedKeyNumber();

if (key_abfrage != 0){ //Taster gedrückt?

anzeige=1;

writeInteger(key_abfrage,DEC);
writeChar('\n');

sound(180,80,25);
sound(220,80,0);

switch(key_abfrage){ //Welcher Taster gedrückt....

case 1:
BaseADC(); //Auslesen

Durchschnitt(LichtL,LichtR);

SpeedLight=70+(80/950)*(DSchnitt-50);

BaseMotorSpeed(SpeedLight);




clearLCD();
showScreenLCD("Geschwindigkeit:","");
setCursorPosLCD(1,0);
writeIntegerLengthLCD(SpeedLight, DEC, 4);
setStopwatch1(0);
startStopwatch1();
//mSleep(2000);
key_abfrage=0;
break;

case 2:
clearLCD();

BaseLEDS(0b000000);

showScreenLCD("Die LED ist aus!","!!!!!!!!!!!!!!!!");
mSleep(2000);
clearLCD();
break;

case 3:
clearLCD();
showScreenLCD("Batterie: ","ist das OK?");

setCursorPosLCD(0, 10);

if (!I2CTWI_isBusy())
{
I2CTWI_transmitByte(10, 1);
Batterie = I2CTWI_readByte(10); //Batterie auslesen
}

writeIntegerLengthLCD(Batterie, DEC, 4);
mSleep(2000);
break;

case 4:
clearLCD();
showScreenLCD("Warnung! Der","Motor ist an!");

BaseMotorStart(); //Motor starten

clearLCD();
showScreenLCD("Motor lauft!","!!!!!!!!!!!!!!!!");
mSleep(2000);
break;

case 5:
BaseMotorStop();

clearLCD();
showScreenLCD("Motor wird","angehalten!!!!!!");
mSleep(2000);
break;
}

}

}
return 0;
}

Robotuner
29.12.2009, 13:13
Hallo Adle,
das ist bei mir auch so
man kan das alersings vverbessern indem man die werten in der controllib anpasst.

___________________

Gruß Robotuner

Virus
29.12.2009, 16:26
hab ich auch das problem, aber nur wenn ich ganz schnell hintereinander einen taster drücke.

warum musst du denn den taster sehr schnell hintereinander drücken?
dafür sind sie garnicht ausgelegt.

SlyD
29.12.2009, 16:41
Die Taster sind ALLE über ein Widerstandsnetzwerk mit einem Analog/Digital Wandler verbunden um Pins zu sparen (s. Schaltplan). Würden ja sonst 5 I/O Pins dafür verschwendet...

d.h. jeder Tastendruck resultiert in einer bestimmte Spannung die vom ADC gemessen wird und dem jeweiligen Taster zugeordnet werden kann. Die Taster müssen schon eine gewisse Zeit gedrückt sein damit die korrekt erkannt werden können. Und ja man kann die Werte in der Lib noch anpassen (mit den Messwerten Vergleichen die im Display angezeigt werden und ggf. erhöhen oder verringern). Und es bringt natürlich auch was über mehrere Messwerte zu mitteln.

MfG,
SlyD

Virus
29.12.2009, 17:27
ich hab es mal mit dem beispiel probiert, bei t1 kommt 0002 bis 0024 raus, bei T2 511-550, bei T3 680-720, bei T4 760-816 und T5 818-825.

wenn ich die taster und den darunterliegenden platienenteil mit der hand erwärme verbessert sich die genauigkeit, das heist ein druck auf einem taster bringt mit deutlich höherer genauigkeit auch den dazugehöhrigen effekt am beeper und aufm display und die werte der unterschiedlichen taster distanzieren sich