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
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.
> 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
$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
Ä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.
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)
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.
>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...
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