PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Touch entprellen



hixc
17.09.2008, 16:25
Hi Leute,
Ich hab hier ein Touchpanel für ein 128x64 LCD. Es funktioniert alles auch schon soweit gut, allerdings hab ich ein Problem.
Das Touch prellt nämlich bzw. die Spannung ist nicht sofort auf dem richtigen Wert, wenn man drückt und wenn man loslässt erhällt man auch Werte, die nicht der position entsprechen.

Jetzt brauch ich eine Idee, wie ich die falschen Werte (die ja trotzdem im gültigen Bereich liegen) ausschließen kann.

Ich hatte es schon mit mehrfach abtasten versucht, also ein Wert muss mehrmals erfasst werden, damit er gültig ist. leider ohne erfolg.

vielleicht hat ja jemand ne idee oder schon etwas code (am besten in c)
hab im moment n brett vorm kopf ](*,)

greetz

kolisson
20.09.2008, 00:11
hallo hixc..
da hab ich gerade auch ein brett vor dem kopf, da ich eigentlich keine idee hatte und noch nie drüber nachgedacht habe, wie son touchscreen eigentlich arbeitet.
wieviel ausgänge hast du denn für die 128x64 pixels ?

meine spontane antwort wäre ja eigentlich "fensterkomparator" gewesen.


aber .... will ich wirklich, dass du 128x64 komparatoren aufbaust ? nein..
ich glaube nicht.

aber.... wenn diese touch-eigenschaft in reihen und spalten angeordnet ist, wäre eine fenterkomparator wohl keine falsche antwort auf das problem:

1. alle zeilen signale addieren
2. wenn die summe ein positiv ergibt...
3. nen INT ausklösen
4. schnell per ADC die spalten auslesen

vielleicht irgenwie so ?

was meinst du ?

gruss

hixc
23.09.2008, 16:01
dank dir kolission, dass du dich mit dem Thema beschäftigt hast.
Habs jetzt hinbekommen, indem ich mehrfach abfrage, ob ein gültiger Wert sich wiederholt (zumindest ungefähr).
Funktioniert sehr gut.
hier mal der code, ist vielleicht etwas schwierig zu durchblicken, aber vom prinzip her sollte mans verstehen.



void get_pos_pixel(void)
{
struct touch_position t_pos;
unsigned int xmax, ymax;
unsigned int prell_min, prell_max;
char count;
xmax = x[2] - x[0];
ymax = y[2] - y[3];
get_pos_AD(&t_pos);

if((t_pos.y < y[2]) | (t_pos.x < x[2])) {
get_pos_AD(&t_pos);

count = 0;
do{
if (count == 0) {
prell_min = t_pos.x - 8;
prell_max = t_pos.x + 8;
}

get_pos_AD(&t_pos);

if (count < 0x20) {
if((t_pos.x < prell_max) & (t_pos.x > prell_min))
count++;
else if (count == 0)
count = 0;
else
count--;
}
else { // count == 0xFF
positionX = (((t_pos.x - x[0])* 0x80) / xmax);
positionY = (((t_pos.y - y[3])* 0x40) / ymax);
count--;
}
}
while((t_pos.y < y[2]) | (t_pos.x < x[2]));
}
else{
positionX = 0x3FF;
positionY = 0x3FF;
}
}


also bis dann O:)