2016年7月29日 星期五

DIY - PIC24:2.8吋 TFT LCD 電阻式觸摸屏實驗 (二十九)

DIY - PIC242.8 TFT LCD 電阻式觸摸屏實驗 (二十九): 

終於花了接近兩個月時間(20160507 ~ 20160629) 順利完成了 2.8 TFT LCD 液晶屏 ILI9341 驅動初始化(Initialization)和讀出 XPT2046 電阻式觸摸屏 XY 數值,便可以作 LCD 觸摸屏實驗。實驗是用作 LCD 圖案顯示和觸摸屏控制,測試程式(Testing program)是圖案顯示後,然後觸摸圖案,並作出反應。

2.8 TFT LCD 電阻式觸摸屏圖案顯示實驗
載入測試程式後,顯示 Button Slider 圖示,當按下 LEFT 圖示,圖示便會發生變化,測試圖案顯示和觸控完成!

2.8 TFT LCD 電阻式觸摸屏觸控實驗
2.8 TFT LCD 電阻式觸摸屏實驗板
2016年 7月 29日 天氣報告
氣溫:29.1@ 21:30
相對濕度:百分之 75%
天氣:天色良好

2016年7月26日 星期二

DIY - PIC24:讀取 XPT2046 電阻式觸摸屏 XY 值 (二十八)

DIY - PIC24:讀取 XPT2046 電阻式觸摸屏 XY 值 (二十八): 

MCU 通過 SPISerial Peripheral Interface Bus)接口,首先發送命令 0XD0,然後讀取 X座標的 2個位元組(2 Bytes)資料,然後再發送命令 0X90,再讀取 Y座標的 2個位元組(2 Bytes)資料。 MCU 便有了 XY 的座標值,可以知道在屏的那位置接觸。由於精度設定在 ADC12 位精度,所有讀出的 2個位元組中,只有高 12位元是有效資料。

XPT2046 電阻式觸摸屏的 Control Bit 資料
Microchip PIC24FJ64GA008 XPT2046 觸摸屏 Read_ADC 程式定義:
int xpt2046_Read_ADC(char data){

char i;
int res = 0;

// XPT2046 Total Conversion Complete within 1.6ms
T_CS_LAT_BIT = 0; // Chip Select Enable CS = 0
delayus(1);       // CS Enable Aftre Min 100ns Start Bit

for (i=0; i<8 i="" span="">
    if ((data & 0x80) == 0) {T_MOSI_LAT_BIT=0;}
       else {T_MOSI_LAT_BIT=1;}
      
delayus(1);
T_SCK_LAT_BIT = 1; // Rising Edge Min 200ns Data Valid
delayus(1);
T_SCK_LAT_BIT = 0; // Falling Edge Min 200ns
data <<=1;
}

T_MOSI_LAT_BIT = 0; // Data Output SDO = 0

// Clock 12 bit Read Data from XPT2046
for (i=0; i<12 i="" span="">
T_SCK_LAT_BIT = 0; // Falling Edge Min 200ns
delayus(1);
T_SCK_LAT_BIT = 1; // Rising Edge Min 200ns Data Valid
delayus(1);
res <<=1;
    if (T_MISO_PORT_BIT != 0){ res |= 0x0001;}
       else {res &= 0xFFFE;}
}

T_SCK_LAT_BIT = 0; // Falling Edge Min 200ns
T_CS_LAT_BIT  = 1; // Chip Select Disable CS = 1
return res;
}

由於電阻式觸摸屏的品質和讀數問題,在開始時首先要將觸摸屏校準(Calibration),方法是通過觸摸液晶屏的4個角,採集 X Y 座標的 12位值,再通過數學等比公式計算,就可以得到比例值。座標最小值約為 100 左右,而座標最大值約為 1900 左右,並非 12bit 的最大值 4095

※ 注意:由於電阻式觸摸屏的品質,很可能發現觸摸屏是非線性(nonlinera)比例,那麼便要作多比例調校。

XPT2046 電阻式觸摸屏校準
Microchip PIC24FJ64GA008 XPT2046 觸摸屏計算 XY 位置程式定義:
    x = xpt2046_Read_ADC(0xD0);
    y = xpt2046_Read_ADC(0x90);   

    // Calaculate X Position
        x = x/10;
        x = ((Ax*x)/100)+Bx;

    // Calaculate Y Position
           if (y < 1100 ){
        y = y/10;
        y = ((Ay*y)/100)+By-5;

           } else if (y > 1750) {
        y = y/12;
        y = ((Ay*y)/100)+By+43;
           } else {

        y = y/10;
        y = ((Ay*y)/100)+By-15;
           }

XPT2046 電阻式觸摸屏測試
XPT2046 電阻式觸摸屏讀出的 XY 數值
2016年 7月 26日 天氣報告
氣溫:30.2@ 20:00
相對濕度:百分之 82%
天氣:微雨

2016年7月25日 星期一

DIY - PIC24:XPT2046 電阻式觸摸屏初始化(二十七)

DIY - PIC24XPT2046 電阻式觸摸屏初始化(二十七): 

2.8ILI9341 TFT LCD 液晶屏的驅動蕊片需要複雜初始化(Initialization),但 XPT2046 的初始化便來得簡單,基本上是不需要,祇需要連接好 SPISerial Peripheral Interface Bus)、T_CS T_PEN 的腳,在每次讀取 X Y 的數據時通知 XPT2046 便可。

XPT2046 電阻式觸摸屏工作時序
單端工作模式(Single-Ended Reference):
SER/-DFR 置為高電平時,XPT2046 工作為單端模式,單端工作模式的應用原理如下圖所示。單端模式簡單,在採樣過程完成後,轉換過程中可以關閉驅動開關,降低功耗。但這種模式的缺點是精度直接受參考電壓源的精度限制,同時由於內部驅動開關的導通電阻存在,導通電阻與觸摸屏電阻的分壓作用,也會帶來測量誤差。

XPT2046 電阻式觸摸屏的單端工作模式
XPT2046 電阻式觸摸屏的單端工作模式原理>
差分工作模式(Differential Reference):
SER/-DFR 置為低電平時,XPT2046 為差分工作模式,如下圖所示。差分模式的優點是 +REF -REF 的輸入分別直接接到 YPYN 上,可消除由於驅動開關的導通電阻引入的座標測量誤差。缺點是無論是採樣還是轉換過程中,驅動開關都需要接通,相對單端模式而言,功耗增加了。

XPT2046 電阻式觸摸屏的差分工作模式
XPT2046 電阻式觸摸屏的差分工作模式原理
XPT2046 資料介面是使用 SPISerial Peripheral Interface Bus)串列介面,其典型工作時序如下圖所示,圖中展示的信號來自帶有基本串列介面的單片機或資料信號處理器。處理器和轉換器之間的的通信需要 8個時鐘週期,可採用 SPISSI Microwire 等同步串列介面。一次完整的轉換需要 24個串列同步時鐘(DCLK)來完成。前 8個時鐘用來通過 DIN 引腳輸入控制位元組。當轉換器獲取有關下一次轉換的足夠資訊後,接著根據獲得的資訊設置輸入多路選擇器和參考源輸入,並進入採樣模式,如果需要,將啟動觸摸面板驅動器。3個多時鐘週期後,控制位元組設置完成,轉換器進入轉換狀態。這時,輸入採樣-保持器進入保持狀態,觸摸面板驅動器停止工作(單端工作模式)。接著的 12個時鐘週期將完成真正的模數轉換。如果是度量比率轉換方式(SER/-DFR0),驅動器在轉換過程中將一直工作,第 13個時鐘將輸出轉換結果的最後一位。剩下的 3個多時鐘週期將用來完成被轉換器忽略的最後位元組(DOUT置低)。

XPT2046 電阻式觸摸屏的工作時序
2016年 7月 25日 天氣報告
氣溫:29.7@ 20:10
相對濕度:百分之 75%
天氣:天色良好

2016年7月17日 星期日

DIY - PIC24:XPT2046 電阻式觸摸屏模塊電路(二十六)

DIY - PIC24XPT2046 電阻式觸摸屏模塊電路(二十六): 

2.8 TFT LCD 液晶屏模塊(Thin Film Transistor Liquid Crystal Display Module)的電阻式觸摸屏是使用 Xptek(矽普特)的 XPT2046 控制器芯片,XPT2046 控制器芯片是使用採用 3線制 SPI 通信介面,資料線和控制線都連接到 34腳(2x17腳)的連接器上。

XPT2046 電阻式觸摸屏模塊電路
工作原理:
XPT2046 控制器芯片與 Microchip PIC24FJ64GA008 是採用 SPI Serial Peripheral Interface Bus)連接,而 XPT2046 I/O 控制已經連接到 34腳的連接器,SPI_MISOSPI Master Input Slave Output - Pin 29)接至 MCU RG7/SDI2SPI Data Input 2 - Pin 7),SPI_MOSISPI Master Output Slave Input - Pin 30)接至 MCU RG8/SDO2SPI Data Output 2 - Pin 8),T_PENTouch Pen Output - Pin 31)接至 MCU RE8/INT1Interrupt 1 - Pin 13),T_CSTouch Chip Select - Pin 68)接至 MCU RD6Pin 68)和SPI_CLKSPI Clock Input - Pin 34)接至 MCU RG6/SCK2SPI Clock Output - Pin 6)。

Microchip PIC24FJ64GA008 2.8 TFT LCD 液晶屏連接:
LCD
Signal
MCU
Signal
LCD
Signal
MCU
Signal
1
LCD_CS
57
RD11
2
LCD_RS
39
RF4
3
LCD_WR
66
PMWR
4
LCD_RD
67
RD5
5
LCD_RST
65
RF4
6
DB1

GND
7
DB2

GND
8
DB3

GND
9
DB4

GND
10
DB5

GND
11
DB6

GND
12
DB7

GND
13
DB8

GND
14
DB10
76
PMD0
15
DB11
77
PMD1
16
DB12
78
PMD2
17
DB13
79
PMD3
18
DB14
80
PMD4
19
DB15
1
PMD5
20
DB16
2
PMD6
21
DB17
3
PMD7
22
SD_CS


23
BL_CTR
55
RD9
24
VCC

3.3V
25
VCC

3.3V
26
GND

GND
27
GND

GND
28
NC


29
SPI_MISO
7
RG7
30
SPI_MOSI
8
RG8
31
T_PEN
13
RE8
32
FLASH_CS


33
T_CS
68
RD6
34
SPI_CLK
6
RG6

就算 XPT2046 是採用 SPI 連接,但亦可以使用一般的 I/O,不用 SPI 功能,但筆者仍然選用了 SPI 腳作連接,可以使用一般 I/OSPI 功能。T_PEN 是當觸摸屏有觸摸事件發生,這個引腳就會拉低,所以把這個引腳接到 MCU 的中斷1引腳,就可以隨時偵測到觸摸屏有被按下,但也可以不用中斷功能。 

Microchip PIC24FJ64GA008 XPT2046 觸摸屏接腳程式定義:
//Definitions for T_MOSI pin (SDO2) Output
#define T_MOSI_TRIS_BIT                            TRISGbits.TRISG8
#define T_MOSI_LAT_BIT                             LATGbits.LATG8

//Definitions for T_MISO pin (SDI2) Input
#define T_MISO_TRIS_BIT                            TRISGbits.TRISG7
#define T_MISO_PORT_BIT                           PORTGbits.RG7

//Definitions for T_CLK pin (SCK2) Output
#define T_SCK_TRIS_BIT                               TRISGbits.TRISG6
#define T_SCK_LAT_BIT                                LATGbits.LATG6

//Definitions for T_PEN INT1 pin LCD=31P (RE8) Input
#define T_PEN_TRIS_BIT                               TRISEbits.TRISE8
#define T_PEN_PORT_BIT                             PORTEbits.RE8

// Definitions for Chip Select enable pin (RD6)
#define T_CS_TRIS_BIT                               TRISDbits.TRISD6 // Chip Select
#define T_CS_LAT_BIT                                 LATDbits.LATD6


2016年 7月 17日 天氣報告
氣溫:31.4@ 16:10
相對濕度:百分之 70%
天 氣:間有陽光