Forum: Mikrocontroller und Digitale Elektronik Kalibrierung touchscreen


von Marcel (Gast)


Lesenswert?

Hallo Leute,
Ich habe mir ein Display gekauft. Das als controler einen ssd2119 chip 
nutzt.
Dieses Display hat einen Touchscreen mit drauf. Der durch einen ads7843 
gesteuert wird.
Ich habe folgendes Problem: wenn ich auf der selben Höhe die y werte 
vergleiche habe ich eine
Differenz von 5000. Wohl bemerkt auf der selben y Höhe! Kann es sein das 
dass Touchscreen kaputt ist? Oder muss ich da irgendwas Kalibriren?
Danke im voraus!
Mit freundlichen grüße
Marcel

von Karl H. (kbuchegg)


Lesenswert?

Marcel schrieb:

> Ich habe folgendes Problem: wenn ich auf der selben Höhe die y werte
> vergleiche habe ich eine
> Differenz von 5000.

?
Da das Ding im Prinzip nur ein 12-Bit ADC ist, ist der Wertebereich pro 
Achse auf 0..4096 beschränkt. Wenn du da also Differenzen von 5000 hast, 
dann tippe ich mal ganz stark auf einen Softwarefehler.

von Marcel (Gast)


Lesenswert?

Ich lese doch nur die x und y werte als 12 bit aus. Kannst du mir 
erklären wo da der Fehler liegen könnte?

von Ralf (Gast)


Lesenswert?

> Ich lese doch nur die x und y werte als 12 bit aus. Kannst du mir
> erklären wo da der Fehler liegen könnte?
Bevor dir jetzt jemand "der Fehler liegt in Zeile 42" sagt, zeig halt 
mal deinen Code.

Ralf

von marcel (Gast)


Lesenswert?

1
$regfile = "m1284pdef.dat"                                  ' specify the used micro
2
$crystal = 20000000                                         ' used crystal frequency
3
$baud = 38400                                               ' use baud rate
4
$hwstack = 100                                              ' default use 32 for the hardware stack
5
$swstack = 100                                              ' default use 10 for the SW stack
6
$framesize = 40                                             ' default use 40 for the frame space
7
8
9
10
Waitus 1
11
12
'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1 , Spiin = 0
13
14
Declare Sub Readtouch
15
16
17
Enable Interrupts
18
$include "Config_mmc.bas"                                   ' Does drive init too
19
$include "Config_AVR-DOS.BAS"
20
21
Tp_cs Alias Portb.3
22
Config Tp_cs = Output
23
Set Tp_cs
24
Spiinit
25
26
Dim I As Word
27
Dim Temp As Integer
28
Dim Touchx As Integer
29
Dim Touchy As Integer
30
Dim Readtouch_x As Integer
31
Dim Readtouch_y As Integer
32
33
Do
34
35
Waitms 100
36
37
Call Readtouch
38
39
40
41
Print "x: " ; Touchx ; " y " ; Touchy
42
43
44
45
46
47
Loop
48
End
49
50
51
52
Sub Readtouch                                               'Read y value from ads7843
53
Local Tempspi As Byte , Adh As Byte , Adl As Byte
54
Local Spiregister As Byte
55
Spiregister = Spcr                                          'Save the spi spcr register to a temp variable to restore the settings after
56
Reset Spcr.2                                                'Set phase to 0
57
Reset Spcr.3
58
Tempspi = &H93                                              '12bit resolution
59
Reset Tp_cs
60
Spiout Tempspi , 1                                          'send 1 byte
61
Spiin Adl , 1                                               'Read the low byte
62
Spiin Adh , 1                                               'Read the high byte
63
Set Tp_cs
64
Readtouch_x = Makeint(adh , Adl)
65
Readtouch_x = 32760 - Readtouch_x
66
Touchx = Readtouch_x
67
'If Readtouch_x < 0 Then
68
'Touchx = 0
69
'End If
70
71
'Touchx = Touchx - 8000
72
'Touchx = Touchx / 51.25                         'Combine the high & low byte and give it back to the function
73
Spcr = Spiregister                                          'Restore the original spi register settings
74
75
76
                           'Read x value from ads7843
77
78
79
Spiregister = Spcr                                          'Save the spi spcr register to a temp variable to restore the settings after
80
Reset Spcr.2
81
Reset Spcr.3                                                'Set phase to 0
82
Tempspi = &HD0                                              ''12bit resolution
83
Reset Tp_cs
84
Spiout Tempspi , 1                                          'send 1 byte
85
Spiin Adl , 1                                               'Read the low byte
86
Spiin Adh , 1                                               'Read the high byte
87
Set Tp_cs
88
Readtouch_y = Makeint(adh , Adl)
89
Touchy = Readtouch_y
90
                          'Combine the high & low byte and give it back to the function
91
Spcr = Spiregister                                          'Restore the original spi register settings
92
End Sub



Ich habe heraus gefunden wenn ich avr-dos nicht benutze sind die wert 
gut. Da ich aber auch eine sd karte nutzen möchte und den touchscreen. 
Habe ich das problem das ich nicht weiß wie ich das alles unter einen 
Hut bringen soll... Die Cs leitungen sind selbstverständlich 2 
unterschiedliche.
Danke

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

>
1
> Spiin Adl , 1                                               'Read the low
2
> Spiin Adh , 1                                               'Read the high
3
> Set Tp_cs
4
> Readtouch_x = Makeint(adh , Adl)
5
>

Äh. Wenn ich ins Datenblatt zum  ads7843 schaue, dann ist dort aber die 
Bitaufteilung eine ganz andere.

Im ersten Byte sind die höherwertigen Bits, im 2. Byte sind die 
niederwertigen Bits, wobei die um 4 Bits verschoben sind.
Kein Wunder dass du da Zahlen rauskriegst, die physikalisch von den 
Eiegnschaften des Wandlers her gar nicht möglich sind.

: Bearbeitet durch User
von marcel (Gast)


Lesenswert?

Das probel ist nicht die große zahl die ich raus bekomme sondern das ich 
auf ein und der selbern y position rechts und links einen anderen y wert 
bekomme.

|--------------------------|
|                          |
|                          |
|                          |
|                          |
|                          |
|                          |
|--------------------------|
(0/23000)                (23000/17000)

(X/Y)

von Karl H. (kbuchegg)


Lesenswert?

marcel schrieb:
> Das probel ist nicht die große zahl die ich raus bekomme

> |--------------------------|
> |                          |
> |                          |
> |                          |
> |                          |
> |                          |
> |                          |
> |--------------------------|
> (0/23000)                (23000/17000)

Nochmal:
Wenn dir der ADC 12 BIt Werte liefert, dann ist es nicht möglich, dass 
da als Zahlenwert 23000 rauskommt. Es geht nicht! Du kannst dich Kopf 
stellen, aber deswegen ist das immer noch nicht möglich!

Du kriegst von deinem IC Werte im Bereich 0 bis 4095 (wegen der 12 Bit). 
Wenn du Ergebnisse bekommst, die ausserhalb dieses Bereichs liegen, dann 
ist deine Auswertung dessen, was du vom IC bekommst fehlerhaft. Mit 
fehlerhaften Daten kann man aber nichts anfangen.

Und das du links und rechts einen leicht anderen Wert rauskriegst, ist 
jetzt nicht so verwunderlich. Das Problem ist aber, da deine 
Zahlenauswertung schon falsch ist, ist auch der Fehler, der dir 
Kopfzerbrechen macht falsch. Der Fehler wird in der Größenordnung von 1 
oder 2 liegen. Vielleicht auch mal 5. Die 5000 kommen dir nur raus, weil 
du deine Zahlen schon falsch zusammensetzt.
Korrigier das als erstes und DANN kümmerst du dich um die Differenz 
zwischen den dann richtigen Messwerten von rechts und links.

: Bearbeitet durch User
von Matthias L. (Gast)


Lesenswert?

>Die 5000 kommen dir nur raus, weil du deine Zahlen schon falsch >zusammensetzt.

Wenn HI und LO Byte vertauscht sind, wirkt sich eine echte Differenz von 
eins schon mal mit 256 aus. Und ist dann das ganze noch :
>wobei die um 4 Bits verschoben sind.

dann sind das nochmal mal 16, ergibt 256*16 = 4096.... daneben...

von marcel (Gast)


Lesenswert?

Leute,
Danke ihr hattet recht! Ich hatte ein Brett vorm kopf. Durch die 
tauschung von High und Low und durch das verschieben nach Rechts hat 
sich das komplette problem Gelöst!
Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.