PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Touchscreen Ansteuerung 192x64 Display



ScummVM
29.11.2010, 12:55
Hallo,
Nach dem sich die mechanischen arbeiten an meinem Robby dem Ende nähern hab ich begonnen mit dem Display rumzuspielen.

Hab mir dieses Display geholt http://ledsee.com/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=143&category_id=74&option=com_virtuemart&Itemid=27
und im Prinzip so wie auf dem Bild angeschlossen, allerdings auf nem C-Control Pro Application Board (was anderes hab ich momentan nicht).

Text, Linien und Grafiken anzeigen funktioniert super, nur die Auswertung des Touchscreens funktioniert garnicht.
Ich hab mir nen Code aus dem Forum hier angepasst - aber das einzige was auf dem Display dann zu sehen ist, ist Pixelmüll.


$regfile = "m128def.dat" ' specify the used micro
$crystal = 14745600 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

$lib "glcdKS108-192x64.lib"


Wait 2

'First we define that we use a graphic LCD
Config Graphlcd = 192 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 0 , Ce2 = 1 , Ce3 = 2 , Cd = 3 , Rd = 4 , Enable = 5 , Reset = 6 , Mode = 8
Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim X As Word , Y As Word
Dim X2 As Single , Y2 As Single
Dim X3 As Single , Y3 As Single
Dim X4 As Byte , Y4 As Byte
Start Adc
'Cursor Off
Cls

Locate 1 , 1 : Lcd "KS108 mit Touchscreen an ATMega128"
Locate 3 , 1
Lcd "Y-Koordinate analog: "
Locate 4 , 1
Lcd "X-Koordinate analog: "

Do
Gosub Readtouch
Locate 3 , 22
Lcd Y ; " "
Locate 4 , 22
Lcd X ; " "

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

Locate 5 , 1
Lcd X4 ; " "
Locate 6 , 1
Lcd Y4 ; " "
Pset X4 , Y4 , 255
Loop
End




Readtouch:
Config Pinf.0 = Output ' Makes port F.0 output
Config Pinf.2 = Output ' Makes port F.0 output
Set Portf.0 ' Sets port F.0 High
Reset Portf.2 ' Sets port F.2 Low
Ddrf.1 = 0 ' Sets port F.1 as input
Ddrf.3 = 0 ' Sets port F.1 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
Y = Getadc(3) ' Read the ad value for the y
Y = 1024 - Y ' Invert the reading

Config Pinf.1 = Output ' Makes port F.1 output
Config Pinf.3 = Output ' Makes port F.3 output
Reset Portf.3 ' Sets port F.3 Low
Set Portf.1 ' Sets port F.1 High
Ddrf.0 = 0 ' Sets port F.0 as input
Ddrf.2 = 0 ' Sets port F.2 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
X = Getadc(2) ' Read the ad value for the x
X = 1024 - X ' Invert the reading
Return

Alls Einsteiger in Bascom und der ganzen µC Thematik stehts bei mir jetzt so ziemlich an - noch dazu weil das Programm ohne Fehler compiliert wird.
Hab mich schon durchs Forum gegraben aber nicht so wirklich was gefunden - wo hab ich da Fehler drin?

mat-sche
30.11.2010, 07:07
Hi,

schau mal auf der Seite von MCS. Dort wurde eine gute AN zu diesem Thema veröffentlicht. Dort wird auch zu gleich eine Menüstruktur vorgestellt, die ich auch nutze und hervorragend ist!
//www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57

Gruß mAT

ScummVM
30.11.2010, 22:32
Hi,
das Programm hab ich auch schon versucht - das Menü wird ohne Fehler angezeigt (auf der linken Seite, da ja mein Display größer ist). Nur auf Touchscreen eingaben wird absolut nicht reagiert.
Leider schweigt sich das Datenblatt über den Anschluss des Touchscreens völlig aus.

Gento
01.12.2010, 06:17
Fehlt da bei den 4 Touchscreens Widerständen nicht was ?
Was sagt denn ein Multimeter an den A/D Eingängen an Werten ?

Gento

mat-sche
01.12.2010, 08:29
Moin!

Wenn Du Dir schon die Seite reingezogen hast, dann weißt Du wie das Touch aufgebaut ist. Du musst jetzt nur herausfinden wie die einzelnen Anschlüsse zu x/y gehören.
Auf dem Touchglas siehst Du in den oberen Rändern Leiterbahnen die Du verfolgen kannst und dann mit nem Multimeter durchmessen! Hast Du ein paar gefunden, dann kannst du durch gedrücktes ziehen in x/y-Richtung am multi schön sehen, wie sich der Widerstandswert verändert. Sollte das nicht gehen, kann auch die Touchfläche defekt sein, ein User hier hatte auch mal nen schlecht gehendes (Accenter) und bei meinem Display war die Auflösung auch nicht die Welle...

Gruß MAT

ScummVM
03.12.2010, 17:16
Hi,

Ich messe 1x 198 Ohm und 1x 1,1 kOhm. aber die Werte ändern sich nicht, da kann ich aufm Touchscreen rumfahren wie ich will :(

Edit:
Man sollte schon richtig messen :D Nur was jetzt X und was Y ist, ist mir trotzdem noch nicht ganz klar...

mat-sche
04.12.2010, 07:43
Moin!
Geh noch mal auf die Seite von MCS s.o..
Dort siehst Du den chematischen AUfba eines Toch.
Zu erst musst Du jeweils X/Y herausfinden, hast Du das?
Dann legst Du z.bsp. das X-Pärchen an +5V:


Config Pinf.2 = Output ' PortA.4 als Ausgang setzen => X Scale
Config Pinf.0 = Output ' PortA.1 als Ausgang setzent
Set Portf.0 ' PortA.4 auf +5V setzen
Reset Portf.2

und nun kannst Du über das Y-Pärchen dann eine Spannung einlesen, welchen beider Pins ist egal, dabei ist dann nur die Richtung verkehrt herum.


Ddrf.3 = 0 ' PortA.2 als Eingang setzen
Ddrf.1 = 0 ' PortA.3 als Eingang setzen

Waitms 20 ' Wait until the port is stable
X = Getadc(3) ' Analogwert für X Scale auslesen -> PortA.2 und in X (Word) Schreiben
X = 1024 - X

Sollte jetzt gehen....
MAT

ScummVM
05.12.2010, 12:34
Hi,

X/Y konnte ich herausfinden. So weit läuft es mal - allerdings bekomme ich Y Werte nur auf der unteren Displayhälfte und X Werte nur auf der rechten Displayhälfte.

Hier mein Testcode:

$regfile = "m128def.dat" ' specify the used micro
$crystal = 14745600 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

$lib "glcdKS108-192x64.lib"


Wait 2

'First we define that we use a graphic LCD
Config Graphlcd = 192 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 0 , Ce2 = 1 , Ce3 = 2 , Cd = 3 , Rd = 4 , Enable = 5 , Reset = 6 , Mode = 8
Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim X As Word , Y As Word
Dim X2 As Single , Y2 As Single
Dim X3 As Single , Y3 As Single
Dim X4 As Byte , Y4 As Byte
Declare Sub Readtouch()

Start Adc
'Cursor Off
Cls

Setfont Font5x5
Lcdat 1 , 1 , "KS108 mit Touch an Mega128"
Lcdat 3 , 1 , "Y analog: "
Lcdat 4 , 1 , "X analog: "

Do
Gosub Readtouch
Lcdat 3 , 47 , Y ; " "
Lcdat 4 , 47 , X ; " "
Loop
End

Sub Readtouch()
Config Pinf.0 = Output ' Makes port F.0 output
Config Pinf.2 = Output ' Makes port F.0 output
Set Portf.0 ' Sets port F.0 High
Reset Portf.2 ' Sets port F.2 Low
Ddrf.1 = 0 ' Sets port F.1 as input
Ddrf.3 = 0 ' Sets port F.1 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
Y = Getadc(3) ' Read the ad value for the y
Y = 1024 - Y ' Invert the reading

Config Pinf.1 = Output ' Makes port F.1 output
Config Pinf.3 = Output ' Makes port F.3 output
Reset Portf.1 ' Sets port F.1 Low
Set Portf.3 ' Sets port F.3 High
Ddrf.0 = 0 ' Sets port F.0 as input
Ddrf.2 = 0 ' Sets port F.2 as input because we need it now as ad input
Waitms 20 ' Wait until the port is stable
X = Getadc(2) ' Read the ad value for the x
X = 1024 - X ' Invert the reading
End Sub

$include "font5x5.font"

mat-sche
05.12.2010, 13:58
hi,

na X sieht doch schon mal gut aus. Was passiert wenn Du auf einem Punkt von X dann Y verfährst?
Theoretisch sollte der Code laufen. Kannst Du per Multimeter alles nochmals gegenchecken? Ansonsten bin ich ratlos...

ScummVM
05.12.2010, 15:12
So, mitn Multimeter habe ich immer Werte egal wo auf dem Touchscreen -dass scheint alles in Ordnung zu sein.

Wenn ich die ADC Referenz auf Avcc stelle bekomme ich auf der ganzen Höhe und Breite Werte angezeigt. Damit läuft dann auch das Beispiel von MCS - alledings scheint die Auswertung etwas nach rechts verschoben zu sein.

Desweiteren muss ich immer ein Font einbinden - sonst gibts nur Pixelmüll, bei anderen Displays scheint das nicht der Fall zu sein.