Touch Screen Library: Unterschied zwischen den Versionen
Mat (Diskussion | Beiträge) K |
Mat (Diskussion | Beiträge) K |
||
Zeile 61: | Zeile 61: | ||
Control port for touch screen (standard I/O port): | Control port for touch screen (standard I/O port): | ||
<pre>Touch_ctrl_port Alias Porta</pre> | <pre>Touch_ctrl_port Alias Porta</pre> | ||
+ | |||
+ | (ATmega only) Port of standby interrupt pin ''X+'': | ||
+ | <pre>Touch_int_port alias Portb</pre> | ||
Control port pin connections: | Control port pin connections: | ||
Zeile 68: | Zeile 71: | ||
Const Touch_pin_yn = 3</pre> | Const Touch_pin_yn = 3</pre> | ||
− | ADC port pin connections ( | + | (ATXmega only) ADC port pin connections (Adca is used): |
<pre>Const Touch_pin_xn_adc = 4 | <pre>Const Touch_pin_xn_adc = 4 | ||
Const Touch_pin_yn_adc = 5 | Const Touch_pin_yn_adc = 5 | ||
Zeile 150: | Zeile 153: | ||
===Electrical Connection=== | ===Electrical Connection=== | ||
[[File:lcd-connections.jpg|thumb|frameless|LCD connection schematic]] | [[File:lcd-connections.jpg|thumb|frameless|LCD connection schematic]] | ||
− | To connect to an ATmega controller, simply connect the pins of the ADC port straight to the sense lines (X-, Y+, Y-), no additional components are needed. X+ has to be connected to an external interrupt pin (''INT0'', to use | + | To connect to an ATmega controller, simply connect the pins of the ADC port straight to the sense lines (X-, Y+, Y-), no additional components are needed. X+ has to be connected to an external interrupt pin (''INT0'', to use another, see above). |
The ADC module of the ATXmega controllers can't sample at the CPU's voltage level, therefore a few additional components are needed to interface to the touch screen. The reference voltage for the ADC module is set to VCC/1,6 (VCC 3,3V: 2,06V), the resistor network yields a maximum voltage of about 1,98V (VCC 3,3V). To ensure correct measurements, the sample & hold circuit of the ADC module needs a low signal impedance, that is the job of the operational amplifier (any standard opamp should do, here it is a ''TL274''). | The ADC module of the ATXmega controllers can't sample at the CPU's voltage level, therefore a few additional components are needed to interface to the touch screen. The reference voltage for the ADC module is set to VCC/1,6 (VCC 3,3V: 2,06V), the resistor network yields a maximum voltage of about 1,98V (VCC 3,3V). To ensure correct measurements, the sample & hold circuit of the ADC module needs a low signal impedance, that is the job of the operational amplifier (any standard opamp should do, here it is a ''TL274''). |
Version vom 21. November 2014, 21:22 Uhr
Inhaltsverzeichnis
Overview
Based on the Appnote AVR341 - Four and five-wire Touch Screen Controller by Atmel, this library handles everything needed to use a 4-wire resistive touchscreen in Bascom.
Features:
- Interrupt-controlled sampling
- Touch contact pressure measurement
- Adjustable sampling rate
- Filtering
- Screen coordinate calibration (stored in EEPROM)
- Screen rotation
- Click/Drag detection
- ATXmega, ATmega (untested)
How to use
Before including the library, a display has to be set up (for the calibration routine draw functions) and the settings (below) need to be done.
Config Graphlcd = Const Touch_updaterate = 200 $include "4wireResistiveTouch.inc"
The application could look like:
Dim Status As Byte Touch_init Do Status = Touch_get_sample() If Status = True Then ' new coordinates are available in Touch_x and Touch_y (and Touch_r if enabled) End If ' ... more code Loop
Options
Options and settings need to be set before the $include-statement, every setting has a default value that will be used if not specified otherwise. (in the list below the default values are shown)
Width of the underlying screen in pixels:
Const Touch_screen_width = 240
Height of the underlying screen in pixels:
Const Touch_screen_height = 320
If the display supports rotation, then the touch coordinates need to be rotated too. To enable this function, set to true:
Const Touch_enable_rotation = False
Measure the touch contact resistance:
- False: Off
- 1: Method 1 (needs one additional sample cycle)
- 2: Method 2 (needs two additional sample cycles)
Const Touch_read_resistance = False
If the contact resistance measurement is enabled, the touch ITO layer resistances need to be known (in Ohms, measured between + and - contact of the unconnected touch layers, Y-resistance is only needed for Method 1, X for both):
Const Touch_resistance_x = 200 Const Touch_resistance_y = 600
Control port for touch screen (standard I/O port):
Touch_ctrl_port Alias Porta
(ATmega only) Port of standby interrupt pin X+:
Touch_int_port alias Portb
Control port pin connections:
Const Touch_pin_xp = 0 Const Touch_pin_xn = 1 Const Touch_pin_yp = 2 Const Touch_pin_yn = 3
(ATXmega only) ADC port pin connections (Adca is used):
Const Touch_pin_xn_adc = 4 Const Touch_pin_yn_adc = 5 Const Touch_pin_yp_adc = 6
Measurements per sample (The median value is taken as coordinate sample):
Const Touch_samples = 5
Coordinate update rate (coordinates generated per second)
Const Touch_updaterate = 100
No. of invalid coordinate samples to be sure the touch screen has been released
Const Touch_release_count = 5
Debounce time in seconds (touch screen tend to bounce badly, during this time, invalid samples are ignored and the state will not switch to released):
Const Touch_time_debounce = 0.05
After changing the type of sample to be measured, the screen needs some time for the voltages to settle, this depends on RC time constant of touch screen, 0.2ms should work for most (in seconds):
Const Touch_time_switch_measurement = 0.0002
Click/Drag detection delta in pixels (Drag: first and actual coordinate delta above threshold, Click: first and last coordinate below threshold and not dragging, applied on the raw ADC values, may not be 100% pixel-correct):
Const Touch_click_delta = 15
Maximum speed in pixels/sec (delta between last and actual coordinates, also applied on the raw ADC values, same as for Click/Drag detection):
Const Touch_max_delta = 3000
API
Status Flags:
Dim Touch_touched As Bit Dim Touch_newsample As Byte Dim Touch_sample_invalid As Bit Dim Touch_clicked As Byte Dim Touch_dragging As Bit Dim Touch_calibrated As Bit
Coordinates:
Dim Touch_x As Word , Touch_y As Word #if Touch_measure_resistance >= 1 Dim Touch_r As Word #endif
Display rotation:
- 0: 0°
- 1: 90°
- 2: 180°
- 3: 270°
If the touch screen supports rotation, the transformed screen coordinates need to be rotated to. The rotation information needs to be provided with this variable. It can be declared in the main application, above the $include statement (for example as an overlay to the display driver's rotation variable), if not set, it is declared automatically.
Dim Touch_rotation As Byte
Sub routines:
Initializes the hardware modules (Timer, ADC, Pin Interrupt) and enters standby mode
Sub Touch_init()
Starts the calibration procedure, calculates the coefficients and stores the calibration values in EEPROM
Sub Touch_calibrate()
Loads the calibration values from EEPROM. If they are not set, the calibration procedure is started. This sub routine is called from Touch_init(), no need to call again after init.
Sub Touch_load_calibration()
Resets the stored calibration values
Sub Touch_reset_calibration()
Returns True (1) if new valid coordinate data is available, otherwise returns False (0). The coordinate data is transformed into screen coordinates if calibration values are available. The coordinate variables are updated.
Function Touch_getsample() As Byte
Returns True (1) if the touch screen has been clicked (delta between first and last point below threshold and touch screen released), otherwise returns False (0). The coordinate variables are updated.
Function Touch_click() As Byte
Other Display Types
The calibration function uses some graphic functions (Cls, Circle and Rotate, if supported by the display) to draw the reference points. LCDs configured via Bascom (Config Graphlcd = ) do not need any changes in the code, as well as for my ILI9341 library (which supports rotation). Other display types could be used as well with small changes, the corresponding lines in the Touch_calibrate() sub routine are marked with # DISPLAY CLS #, # DISPLAY CIRCLE # and # DISPLAY ROTATE #.
Change Timer-, ADC-Hardware-Module and Pin Interrupt
To simplify modifications, all hardware-related functions and settings are kept at a single location, for both ATmega and ATXmega, starting at around line 400, section Portability.
For the ATmega, TIMER0, the ADC module and INT0 are used, the ATxmega is set up to use TCC1, ADCA.CH0, and PORT.INT0.
Electrical Connection
To connect to an ATmega controller, simply connect the pins of the ADC port straight to the sense lines (X-, Y+, Y-), no additional components are needed. X+ has to be connected to an external interrupt pin (INT0, to use another, see above).
The ADC module of the ATXmega controllers can't sample at the CPU's voltage level, therefore a few additional components are needed to interface to the touch screen. The reference voltage for the ADC module is set to VCC/1,6 (VCC 3,3V: 2,06V), the resistor network yields a maximum voltage of about 1,98V (VCC 3,3V). To ensure correct measurements, the sample & hold circuit of the ADC module needs a low signal impedance, that is the job of the operational amplifier (any standard opamp should do, here it is a TL274).
If contact resistance measurement is disabled or method 1 is used, just the two pins X- and Y+ need to be connected to an ADC pin, for method 2 Y- needs an additional ADC pin.
The schematic also shows the connections of the display controller I've used and the backlight control circuit.
Sample
Donate
This Software is Donationware. <paypal>1</paypal> See here for more informations