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?
> 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
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
>
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
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.
:
Bearbeitet durch User
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.