PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega32 + TouchScreen



Ratman2000
04.03.2009, 15:35
Hallo,

ich habe einen ATMega32 (Grundschaltung) mit 16 MHZ Quarz und Stabilisierter Spannung aufgebaut und von ledsee.com ein 128 x 64 Touch Display bestellt...

Das Display hab ich nun auch wunderbar laufen so wie es sollte... Grafiken funktionieren auch wunderbar...

Allerdings macht mir das Touch ein paar Probleme...

Und zwar habe ich die 4 Adern? (vom Flachkabel) jeweils auf ein 100 Ohm
Wiederstand (Schutz vor Zerstörung) und dann direkt auf einen ADC des ATMega32 gelötet...

Wenn ich nun die X und Y Werte auslese (Pin 1 und 3, 2 und 4 jweils high / low) dann erhalte ich bereits OHNE Berührung und auch ohne Schutzfolie einen Wert rund um 400 Schwankend...

Sollte nicht ein wert zwischen 0 - 2 normal sein ohne Berührung?
Weiss da jemand zufällig eine Abhilfe, denn dadurch ist es so gut wie garnicht möglich, zu erkennen wo jemand berührt hat, denn nach dem Berühren schwankt der Bereich des ADC bei dem Wert des Berührens weiter... Sprich berühre ich den Screen so dass er 220 anzeigt, dann schwankt er zwischen 200 - 300 weiter...

Ziemlich merkwürdig halt :)

Ich hoffe auf eure Hilfe!

Vielen Dank!

MFG

Ratman2000

Ratman2000
04.03.2009, 20:22
Hallo,

So viele "Leser"

Kann denn keiner Helfen?

MFG

Ratman2000

MelMan
06.03.2009, 17:25
Also mit dem TD-Controller erhalte ich ohne Berührung immer Werte schwankend zwischen 30-70 für X bzw. Y Achse. Poste mal den Code, den du zum Auslesen verwendest

Ratman2000
07.03.2009, 08:23
Hallo,

das sieht bei mir so aus:


Config Porta.0 = Output
Config Porta.2 = Output
Config Porta.1 = Input
Config Porta.3 = Input

Set Porta.0 'High
Reset Porta.2 'Low

Waitms 20

Y = Getadc(1)
Y = 1024 - Y
Lcdat 3 , 20 , "Y: " ; Y

Config Porta.0 = Input
Config Porta.2 = Input
Config Porta.1 = Output
Config Porta.3 = Output

Set Porta.1 'High
Reset Porta.3 'Low

Waitms 20

X = Getadc(2)
X = 1024 - X
Lcdat 4 , 20 , "X: " ; X

MFG

Ratman2000

T.J.
07.03.2009, 10:23
warum soll das komisch sein? kann doch sein dass eben genau die Touchfolie 400 hat ohne Berührung. Was hast du denn mit berührung?

Hast du ein Datenblatt zu dem Ding? Deine 100Ohm Schutzwiderstände musst du ja auch rausrechnen, oder?

Ratman2000
07.03.2009, 13:09
Hallo,

nein ein Datenblatt gibts dazu leider nicht...
Komisch ist es, weil die Folie ja als "Wiederstand" agieren soll...
Sprich kann er mir ohne Berührung nicht so einen hohen Wert ausgeben (wenn ich das richtig verstanden habe) Denn solange die Folien sich nicht berühren, kann ja auch eigentlich kein Wert (bzw nur ein minimaler) gemessen werden...

Das Problem ist, dass der Wert am ADC IMMER in dem Bereich schwankt, wo ich zuletzt berührt habe... Berühre ich ihn bei 400, schwankt er auch in dem Bereich weiter...

Normal fände ich wenn er zwischen 0 - 10 läge und bei berührung z.b. auf 400 springt und beim loslassen wieder zurück auf 0 - 10...

Das wäre nen Zustand, mit dem man arbeiten könnte...

Aber wie soll man, wenn der "Berühren Zustand" immer anhält, auswerten ob berührt wurde oder nicht? Das erscheint nicht logisch...

Berühre ich das Display z.b. weiter Links, dann geht der Wert auf 200 runter... weiter rechts auf 600 hoch usw... Verhält sich echt merkwürdig...

Das ich den Wiederstand setzen sollte habe ich aus einem Schaltplan entnommen siehe hier:

http://www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57

Ich habe folgenden Touch Display gekauft:

http://ledsee.com/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=93&category_id=23&option=com_virtuemart&Itemid=27

Das einzige was ich nicht mache ist den Treiber Baustein zu benutzen... Den das sollte der ATMega32 schon alleine hin bekommen wie es hier beschrieben wurde:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32952&highlight=touchscreen

Das einzige was bei diesem "Beispiel" anderst ist, ist das er nen anderen AVR nutzt und nen Display ne Nummer grösser...

Aber ich bekomms einfach nicht zum laufen *heul*

Ich bitte um eure Hilfe!

Das Display selbst kann ich ohne Probleme ansteuern... Also liegt es wirklich nur noch an den 4 Polen des Touches...

Danke für eure Hilfe!!!

MFG

Ratman2000

MelMan
07.03.2009, 14:13
Probier mal folgenden Code der funktioniert bei mit 100%ig



Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.0
Reset Porta.2
Ddra.1 = 0
Ddra.3 = 0
Waitms 20
Y = Getadc(3)
Y = 1024 - Y
Print "VALUE Y : " ; Y
Config Pina.1 = Output
Config Pina.3 = Output
Reset Porta.1
Set Porta.3
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
X = Getadc(2)
X = 1024 - X
Print "VALUE X : " ; X


Die Widerstände sind egal...kannst du auch weglassen. Die sind eig. nur als Kurzschlussschutz, falls sich die Ports berühren....dann hast du wenigstens einen Widerstand dazwischen

Ratman2000
07.03.2009, 18:53
Hallo,

habe den Snipped gerade probiert...

Aber mein Problem bleibt...

Ich habe nach jedem "lesen" nun mal 1 Sekunde Pause gemacht, um genau zu sehen, welche Werte er anzeigt...

Beim einschalten ist der erste Wert irgend etwas über 500...
Nach einer Sekunde dann bei ca 300 und pendelt sich dann bei ca 200 ein springt dann aber immer um Werte +-100

Sprich wenn er sich bei 210 eingependelt hat, springt er mal zu 110 und mal zu 310... Ganz merkwürdig...

Gibt es evtl irgend etwas, was solch ein Verhalten auslösen kann? Könnte das Touch defekt sein?

Vielen Dank für eure Hilfe!!!

MFG

Ratman2000

Ratman2000
07.03.2009, 19:02
Hallo nochmal,

ich habe gerade auch mal den X Wert aufs Display gebracht... Was
mir da auffällt ist, das der Wert zwischen 1 und 2 Schwankt, solange ich das Display nicht berühre...

Sobald ich es berührt habe (z.B. bei 210) dann bleibt der X Wert auch bei der Zahl und schwankt +- 100 wie der Y Wert...

Hab ich evtl irgend etwas falsch gemacht? Muss man vorher irgend etwas spezielles machen? Kann es z.B. am Quartz liegen oder sonst irgend eine Möglichkeit geben das was faul ist?

Danke!!!

MFG

Ratman2000

Ratman2000
07.03.2009, 19:45
Hallo,

ich habe gerade mal aus lauter verzweiflung alle 4 Pins vom ATMega32 abgezogen (sind auf Sockelleisten gelötet so das ich sie Stecken kann)

Das heist am ADC hängt nun nur noch der Wiederstand mit 100 Ohm...

Kein GND, kein VCC garnichts... Die Pins gehen also ins Leere^^

Der Witz: Auf dem Display bekomme ich schwankende Werte ausgegeben...

Wie kann der Mega32 etwas "messen", wenn garnichts dran hängt?

HILFE :D

Danke!

MFG

Ratman2000

Wsk8
07.03.2009, 22:03
Hallo,
wenn eben am pin nichts angeschlossen ist, dann ist er nicht definiert. Er hat also keinen bestimmten wert und wird durch die umgebung beinflusst.

So wie das bei dir aussieht, fehlt da irgendwo ein masseanschlusss.

Leg mal die beiden leitungen von dem touchscreen mit einem großen widerstand an massse.(jede leitung extra)

mfg

Ratman2000
07.03.2009, 23:03
Hallo,

Einem großen Wiederstand?
Welchen ca soll ich nehmen?

Du meinst also für JEDEN Touch Pin einen Pull-Down Wiederstand richtig?

MFG

Ratman2000

T.J.
07.03.2009, 23:10
jo, er meint pull down. nimm was zwischen 10k und 47k

Ratman2000
08.03.2009, 01:10
Hallo,

ich hab nun an alle 4 Pins einen Pull-Up gebastelt und siehe da, ich habe auf X und Y nur noch 1 - ca 3 an Schwankungen wunderbar :D

ABER nun hab ich auch schon das nächste Problem...

Und zwar möchte ich nun natürlich mit einem Stift etwas auf dem Display "Malen" können... Also hab ich mir den Code aus dem Beispiel angesehen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32952&highlight=touchscreen

Nun sehe ich dort eine Umrechnung von ADC auf Pixel:


If Y > 330 Then
Y3 = Y - 346
Y2 = Y3 / 2.89
Y4 = Y2
Else
Y4 = 0
End If

If X > 150 Then
X3 = X - 160
X2 = X3 / 2.78
X4 = X2
Else
X4 = 0
End If

Allerdings wenn ich den Code so übernehme, landet kein Punkt dort wo er hin soll...

Berühre ich z.b. im Linken Teil des Displays, so landet der Punkt im rechten Bereich des Displays und auch nicht genau dort, wo ich berührt habe... Was mir dabei auch aufgefallen ist, ist das ich damit das Display "Scrollen" kann... in Zeile 3 z.B. schreibe ich die Koordinaten und diese kann ich "aus dem Bild Scrollen" ziemlich merkwürdige Sache, obwohl ich nur mit pset nen Pixel setze... Diese Phänomän ist auch wieder nur auf dem Halben Display zu bemerken jeweils die andere Seite "scrollt"...

Aber zurück zum Problem: Woher stammen diese komischen umrechnungs-Faktoren?

Ich schätze mal, das mein Problem daran liegen wird...

Ich habe bereits ins Datenblatt von deren Display geschaut, aber ich kann die Werte dort nirgendst finden...

Vielen Dank für eure Hilfe!!!

MFG

Ratman2000

MelMan
08.03.2009, 10:26
dreh den stecker vom cntroller mal um...hatte ein ähnliches problem

Ratman2000
08.03.2009, 12:34
Hallo,

Den Stecker vom Controller umdrehen?
Wie meinst du das?

Den vom GLCD?

MFG

Ratman2000

Wsk8
08.03.2009, 15:08
Hallo,
wenn der (theoretische) Wert 0 von x und y links oben liegt, würde ich das so rechnen:

const ref a //x-wert
a = 128 / 1024 //bei 10bit adc
w = getadc(x)
x-koordinate = w * a

bei y dann halt 64 / 1024

mfg

MelMan
09.03.2009, 07:34
Den Stecker von Touchcontroller. Bei mir war das Problem dass irgendwie X- und Y Achse vertauscht waren und ich dadurch falsche Werte rausbekommen hab.

Ratman2000
09.03.2009, 10:04
Hallo,

es lag anscheinend an der Umrechnung...

Nun scheint es zu funktionieren!
Ich mache es nun so:



If X > 150 And Y > 218 Then
X3 = X - 162
X2 = X3 / 4.2
X4 = X2

Y3 = Y - 218
Y2 = Y3 / 6.2
Y4 = Y2

Pset X4 , Y4 , 255
End If


So weit funktioniert das nun prima... Allerdings "prellt" das Display ganz schön... Sprich mache ich nen Punkt mit einem Stift drauf, so zieht er mir fast schon eine linie... (Weil er wohl noch nicht die richtige Spannung aufgebaut hat)

Lasse ich die stelle berührt klappt es wunderbar...

Aber ein noch längeren Waitms kann ich ja auch nicht rein machen, dann wäre das Display ja wieder zu langsam um z.b. drauf zu "malen".

Kennt da jemand eine Abhilfe?

Und ich habe nun 2 Offsets verwendet: 4.2 und 6.2
Damit die Punkte auch da landen, wo ich sie haben will, aber woher kommen diese Werte?
Die sind jetzt bei mir durch ausprieren entstanden, obwohl die Y Axe immer noch nicht richtig genau ist oder ab der mitte ungenauer wird?

Vielen Dank für eure Hilfe!!

MFG

Ratman2000

Easter
10.03.2009, 13:32
http://www.embedded.com/story/OEG20020529S0046

Such mal im Forum, einige haben sowas schon implementiert.

MelMan
10.03.2009, 15:59
Du könntest die Werte öfter abfragen und erst wenn der Wert z.B 3 mal gleich ist wird ein Pixel gesetzt. So sollte auf jeden Fall das prellen weg sein, denn da wird denk ich mal immer ein anderer Wert kommen oder?

Ratman2000
10.03.2009, 21:35
Hallo,

das Problem beim prellen ist, das sich durch das mehrfache abfragen alles sehr stark verzögert und ich dadurch nur noch in Zeitlupe malen könnte...

Aber es sollte ja schon in echtzeit funktionieren :P

Danke!

MFG

Ratman2000

franzl
10.03.2009, 22:10
hallo,
also die beste möglichkeit ist eine mehrfache abfrage, 2 reichen in der Regel. Hab das display auch, zwar noch nicht drauf gemalt aber ein Zahlenschloss läuft super, kannst ja mal meine homepage anschauen. Das Programm ist zwar in C geschrieben, aber vielleicht hilfts ja doch.
http://www.rs-products.de/shop/main_bigware_34.php?pName=rsgrafiktouchatmega128bo ard-smd-vorbest%FCckt&bigwareCsid=d2f664c70dd245cb10f390e5f69fc6da
mfg franz

MelMan
11.03.2009, 07:12
Warum es reicht doch wenn du Pausen im ms Bereich machst.

Messen
Waitms 20
Messen
Waitms 20
Messen


Sind 40ms die du verzögerst

Ratman2000
11.03.2009, 08:56
Hallo,

das sind dann 40 ms pro Axe... Also 0,8 Sekunden pro PUNKT...

Das wäre schon eine üble verzögerung :)

MFG

Ratman2000

franzl
11.03.2009, 09:08
Hallo,
also nichts für ungut, aber das warten zwischen den Messungen ist wohl das bescheuertste Mittel das man anwenden kann. Dann steht der Controller und kann überhaupt nichts mehr machen, da ruf ich lieber alle 20ms den ADC aus und mache in der Zwischenzeit was anderes. Nix für ungut aber das mit dem wait Befehl ist keine gute Programmierung.
mfg franz

MelMan
11.03.2009, 13:15
Hmm 40ms pro Axe macht bei mir bei 2 Achsen 80ms, was 0.08 Sekunden entspricht =). War auch nur nen Beispiel wie es gehen könnte...klar gibt es besseres als den Waitbefehl aber war jez das spontanste was mir eingefallen ist

Ratman2000
11.03.2009, 21:30
Hallo,

was wäre denn das beste mittel es so genau wie möglich zu bekommen?

Aus dem Link werde ich nicht so wirklich schlau :)

MFG

Ratman2000

franzl
11.03.2009, 22:53
hi,
es gibt natürlich nicht die Lösung. Meiner Meinung nach wäre es am sinnvollsten auf zwei gleiche Werte hintereinander abzufragen. Dies lässt sich z.B. durch einen Timer, der nach einer bestimmten Zeit die Position an der gedrückt wird mit der vorherigen auswertung Vergleicht. Dann kannst du anhand deiner Zeit zwischen den Abfragen die entprellung anpassen. Nur ein Vorschlag, es führen ja bekanntlich mehrere Wege nach Rom.
mfg franz