mini2440上連接的是一個電阻式觸摸屏,電阻式觸摸屏是基于AD轉換實現的,即某個位置按下之后,這點的電壓會發生改變,通過電壓就可以判斷出是哪一個點被按下了,arm可以得到這個點的坐標。因為觸摸屏和lcd是兩個設備,因此,觸摸屏得到的坐標一般不能夠與lcd上的坐標對應起來,所以需要我們在程序中手動的進行校正(雖然不對應,但是他們之間的關系式線性的,因此通過三個點的采樣,就可以把系數確定下來。)
s3c2440是不支持中斷嵌套的。
arm與觸摸屏通過tsxptsxm tsyptsym 四根線相連接,數據手冊中有一句話:When Touch Screen device is used; XM or PM is only connected ground for Touch Screen I/F.s3c2440一共有4種觸摸屏接口模式,其中,自動(連續)XY坐標轉換模式和等待中斷模式是我們用到的。
(1)等待中斷模式是在觸筆落下時產生一個中斷,在這種模式下,A/D觸摸屏控制寄存器ADCTSC的值應為0xD3,在系統響應中斷后,XY坐標的測量模式必須為無操作模式,即寄存器ADCTSC的低兩位必須清零。
(2)自動(連續)XY坐標轉換模式是系統依次轉換觸點的X軸坐標和Y軸坐標,其中X軸坐標值寫入寄存器ADCDAT0的低10位中,Y軸坐標寫入寄存器ADCDAT1的低10位中,在這種模式下,系統同樣會產生中斷信號。
在一般情況下,為實現觸摸屏功能,先是設置為等待中斷模式,在產生int_tc中斷后,在中斷函數中再設置為自動(連續)XY坐標轉換模式,依次讀取觸點的坐標值。
與觸摸屏的功能實現相關的有兩個中斷:int_adc和int_tc,這兩個中斷源屬于subinterrupt source,都屬于int_adc,因此在配置中斷的時候就需要按照sub中斷源的配置方法進行配置。其中,int_tc是在觸摸屏被按下或被釋放時產生,一個時刻只能檢測其中一種事件,具體是檢測觸摸屏按下還是釋放,需要我們在寄存器ADCTSC的第8位能夠設置。int_adc是在ad轉換完成之后產生的。
寄存器ADCTSC的第3位可以選擇上拉電阻的使能,在等待中斷模式下,上拉電阻要有效,在觸發中斷后,上拉電阻要無效。寄存器ADCTSC的第2位用于選擇自動(連續)XY坐標轉換模式。觸筆抬起/落下中斷狀態寄存器ADCUPDN的低2位能夠判斷觸筆在何種狀態下引起的中斷。A/D延時寄存器ADCDLY可以設置開始中斷到真正開始A/D轉換這段時間的延時長度,它的時鐘源頻率為3.68MHz。
實現觸摸屏功能的流程是這樣的:
1. 設置觸摸屏為等待中斷模式,配置ADCTSC為檢測觸摸屏被按下 產生中斷。
2. 產生中斷后,證明觸摸屏被按下。在中斷函數中修改ADCTSC和ADCCON,配置觸摸屏為連續轉換功能。同時要屏蔽int_adc中斷。因為我們是在中斷函數中,所以,通過while循環檢測srcpnd 和 subsrcpnd寄存器來檢測是否產生了adc轉換完成的中斷。也就是屏蔽中斷,但是通過檢測是否產生中斷,來判斷adc轉換是否完成。
3. adc轉換結束后,提取想要的數據。然后配置ADCSTC為檢測觸摸屏被釋放產生中斷,同時也要繼續屏蔽中斷。通過檢測srcpnd和subsrcpnd來判斷是否產生了觸摸屏被釋放的中斷。當檢測到觸摸屏被釋放后,結束中斷函數。
當然,采用其他方法來實現我覺也是可以的,比如說檢測到觸摸屏被按下后,就結束中斷函數。也就是把上面的三個步驟,分別在三個中斷函數中實現,也是可行的。
此外,涉及到觸摸屏的校正,轉載趙老師的方法如下:
比較常見的校正方法是三點校正法,它的原理是:
設LCD上每個點PD的坐標為[XD,YD],觸摸屏上每個點PT的坐標為[XT,YT]。要實現觸摸屏上的坐標轉換為LCD上的坐標,需要下列公式進行轉換:
XD=A×XT+B×YT+C
YD=D×XT+E×YT+F
因為其中一共有六個參數(A,B,C,D,E,F),因此只需要三個取樣點就可以求得這六個參數。這六個參數一旦確定下來,只要給出任意觸摸屏上的坐標點PT,代入這個公式,就可以得到它所對應的LCD上像素點的坐標PD。具體的求解過程就不細講,只給出最終的結果。已知LCD上的三個取樣點為:PD0,PD1,PD2,它們所對應的觸摸屏上的三個點為:PT0,PT1,PT2。A,B,C,D,E,F這六個參數最終的結果都是一個分式,而且都有一個共同的分母,為:
K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)
那么這六個參數分別為:
A=[(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2)] / K
B=[(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2)] / K
C=[YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+YT2×(XT1×XD0-XT0×XD1)] / K
D=[(YD0-YD2)×(YT1-YT2)-(YD1-YD2)×(YT0-YT2)] / K
E=[(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2)] / K
F=[YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+YT2×(XT1×YD0-XT0×YD1)] / K
具體操作,就是先在lcd上顯示三個點,然后等用于點擊這三個點之后,采集這三個點的實際坐標和理論坐標,這樣就可以計算得到上面的參數。
下面附上我的代碼。
static void __irq touchscreen_irq(void)
{
int xdata, ydata;
rADCTSC = (1<<3)|(1<<2); //上拉電阻無效,自動連續XY坐標轉換模式開啟
rADCDLY = 40000; //延時
rADCCON|=0x1; //開始A/D轉換
while(rADCCON & 0x1); //檢查A/D轉換是否開始
while(!(rADCCON & 0x8000)); //等待A/D轉換的結束
while(!(rSRCPND & (BIT_ADC))) ; //判斷A/D中斷的懸掛位
xdata=(rADCDAT0&0x3ff); //讀取X軸坐標
ydata=(rADCDAT1&0x3ff); //讀取Y軸坐標
uart_printf("xdata = %x, ydata = %x adcdata0 = %x ", xdata, ydata, rADCDAT0);
rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);
rADCTSC =0xd3; //再次設置等待中斷模式,這一次是判斷觸筆的抬起
rADCTSC = rADCTSC|(1<<8); //設置觸筆抬起中斷
while(1) //等待觸筆的抬起
{
if(rSUBSRCPND & (0x1<<9)) //檢查A/D觸摸屏中斷懸掛
{
break; //如果觸筆抬起,則跳出該循環
}
}
uart_printf("adcdata0 = %x ", rADCDAT0);
rSUBSRCPND = 1<<9;
ClearPending(BIT_ADC);
uart_printf("irq finishrn");
rADCTSC=0xd3; // important here
}
void touchscreen_init(void)
{
rADCDLY=50000; //設置延時
rADCCON=(1<<14)+(9<<6); //設置A/D預分頻
rADCTSC=0xd3; //設置觸摸屏為等待中斷模式。
pISR_ADC = (U32)touchscreen_irq;
rINTSUBMSK &= ~(BIT_SUB_TC);
rSUBSRCPND = 1<<9;
ClearPending(BIT_ADC);
EnableIrq(BIT_ADC);
}
void touchscreen_test(void)
{
touchscreen_init();
}
上一篇:S3C2440 (4.3寸)LCD驅動程序之層次分析(十六)
下一篇:ARM處理器架構------可嵌套中斷的實現
推薦閱讀
史海拾趣
臺灣第一電阻(Firstohm)公司的發展故事
故事一:創立與早期技術積累
臺灣第一電阻電容器股份有限公司(Firstohm)成立于1969年,初期便專注于電阻器的生產制造。在那個電子工業剛剛起步的年代,Firstohm憑借其敏銳的市場洞察力和對技術的不懈追求,逐步在電阻器領域站穩腳跟。1970年,公司開始接受日本東京應瀨無線公司的代工訂單,外銷至日本市場,這一合作為Firstohm打開了國際市場的大門。此后,公司不斷引進和吸收先進技術,如1986年從日本橫演電子精工取得的精密級金屬皮膜電阻技術,為公司的技術積累奠定了堅實基礎。
故事二:晶圓電阻的突破
1987年,Firstohm成功研發并量產晶圓電阻(又稱MELF電阻),這一成就標志著公司在電阻器制造技術上的重大突破。晶圓電阻以其優異的性能和廣泛的應用領域,迅速獲得了市場的認可。Firstohm也因此成為全球少數幾家具備晶圓電阻生產能力的廠商之一,為公司后續的發展奠定了技術領先地位。
故事三:國際認證與品質提升
進入21世紀,Firstohm更加重視產品品質和國際化發展。2001年,公司獲得ISO14001 Green Dove獎項及ISO9001認證,標志著公司在環境管理和質量管理方面達到了國際先進水平。此后,公司不斷通過國際認證,如ISO9001:2008、IECQ品質認證等,進一步提升了產品的競爭力和市場信譽。這些認證不僅是對公司產品質量的認可,也為公司拓展國際市場提供了有力支持。
故事四:創新產品的研發
Firstohm始終堅持創新驅動發展戰略,不斷推出符合市場需求的新產品。例如,2012年,公司間隙式突波吸收器(SGS)獲得日本、中國大陸及韓國專利許可;2017年,成功開發AEC-Q200車規級晶圓電阻;2020年,又成功開發出心電導線圖(ECG cable)專用電阻器SSWAT系列。這些創新產品的研發和推出,不僅豐富了公司的產品線,也進一步鞏固了公司在電阻器領域的市場地位。
故事五:自動化生產與全球化布局
隨著電子行業的快速發展和市場競爭的加劇,Firstohm不斷加大在自動化生產和全球化布局方面的投入。公司生產線高度自動化,生產效率和產品品質顯著提升。同時,Firstohm積極拓展海外市場,與全球多家知名電子企業建立了長期穩定的合作關系。例如,與美國通用、THOMSON、法國雷諾等公司的合作,不僅提升了公司的品牌知名度,也為公司帶來了更多的市場機遇和發展空間。
隨著電子行業的快速發展和市場競爭的加劇,Dolphin Interconnect Solutions ASA面臨著前所未有的挑戰。為了應對這些挑戰,公司積極調整戰略方向,加大在人工智能、物聯網等新興領域的投入。同時,Dolphin還加強了與產業鏈上下游企業的合作,共同推動產業鏈的轉型升級。這些努力使得Dolphin在激烈的市場競爭中保持了穩健的發展態勢。
隨著技術的不斷進步和市場競爭的加劇,FIDELIX意識到單靠自身的力量難以在全球市場上立足。因此,公司開始尋求國際合作,與全球多家知名半導體企業建立合作關系,共同研發新技術、新產品。這些國際合作不僅提升了FIDELIX的技術水平,也為其產品打開了國際市場的大門。
隨著技術的不斷進步和市場競爭的加劇,FIDELIX意識到單靠自身的力量難以在全球市場上立足。因此,公司開始尋求國際合作,與全球多家知名半導體企業建立合作關系,共同研發新技術、新產品。這些國際合作不僅提升了FIDELIX的技術水平,也為其產品打開了國際市場的大門。
隨著技術的不斷進步和市場競爭的加劇,FIDELIX意識到單靠自身的力量難以在全球市場上立足。因此,公司開始尋求國際合作,與全球多家知名半導體企業建立合作關系,共同研發新技術、新產品。這些國際合作不僅提升了FIDELIX的技術水平,也為其產品打開了國際市場的大門。
如果有一輛車:前面看象奔馳,后面看象寶馬;這一定是吉利。 如果有一輛車:樣子一直沒變,但名稱一直在改;這一定是桑塔那。 如果有一輛車:三廂和二廂賣一 ...… 查看全部問答∨ |
|
哪位同仁能提供一份s3c2440從Norflash啟動的Bootload代碼啊,網上的Bootload代碼鋪天蓋地啊,不夠都是Nandflash啟動滴!最好是Ads編譯環境下的啊,給個下載的鏈結地址就行了!… 查看全部問答∨ |
|
UCOS中創建任務時返回OS_NO_MORE_TCB 急救! 如題,UCOS中創建任務時返回OS_NO_MORE_TCB,此時創建了才9個任務,竟然說沒有空余的TCB了,那可如何是好,還有好多任務要創建呢。會不會是哪里出了錯而導致OS_NO_MORE_TCB。請教達人指路!… 查看全部問答∨ |
|
搞了半天也沒出來,郁悶死了。。。 哪位能跟我簡要說下LWIP 作為客戶端,建立一個TCP 連接的簡要流程啊,包括都要調用哪幾個函數。另外我對各個函數里的callback函數一直沒搞明白,比如tcp_connect()里的回調函數。… 查看全部問答∨ |