ARM9S3C2440-ADC和觸摸屏控制_第1頁
ARM9S3C2440-ADC和觸摸屏控制_第2頁
ARM9S3C2440-ADC和觸摸屏控制_第3頁
ARM9S3C2440-ADC和觸摸屏控制_第4頁
ARM9S3C2440-ADC和觸摸屏控制_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

-.zARM9S3C2440—ADC和觸摸屏控制詳解S3C2440芯片內(nèi)部共有8路A/D轉(zhuǎn)換通道,AIN0-AIN7,轉(zhuǎn)換器只有一個,轉(zhuǎn)換精度為10位,最大轉(zhuǎn)換率為2.5MHzA/D轉(zhuǎn)換器時鐘下的500KSPS。A/D轉(zhuǎn)換器支持片上采樣-保持功能和掉電模式的操作。在常見的設(shè)計中,一般AIN4,AIN5,AIN6,AIN7被用作四線電阻觸摸屏的YM、YP、*M、*P通道,剩余的AIN0~AIN3被引出,其中AI0外接一個可調(diào)電阻。ADC的配置流程如下:ADCDLY〔P446〕rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms2、ADCCON〔P444〕的設(shè)置,選擇轉(zhuǎn)換通道和設(shè)置轉(zhuǎn)換頻率ADCCON[0],AD轉(zhuǎn)換開場有效,1轉(zhuǎn)換開場且該位在轉(zhuǎn)換開場后變?yōu)?,通過這個特點可以判斷是否開場轉(zhuǎn)換。什么意思呢,設(shè)為1只是認(rèn)為地讓它轉(zhuǎn)換開場,但是未必開場轉(zhuǎn)換,還必須通過while循環(huán)查詢方式判斷該位是否變?yōu)?,變?yōu)?表示轉(zhuǎn)換開場。ADCCON[1],AD轉(zhuǎn)換通過讀取有效,1通過讀取操作有效;ADCCON[2],備用操作模式選擇,0普通操作模式,1,備用操作模式;ADCCON[5:3]:轉(zhuǎn)換通道選擇;000=AIN0001=AIN1010=AIN2011=AIN3100=YM101=YP110=*M111=*PADCCON[13:6],AD轉(zhuǎn)換器預(yù)分頻器值0~255,ADC頻率應(yīng)該小于PCLK的1/5;ADCCON[14],AD轉(zhuǎn)換器預(yù)分頻器使能,1使能;ADCCON[15],AD轉(zhuǎn)換完畢標(biāo)志,0:轉(zhuǎn)化過程中,1:轉(zhuǎn)換完畢;ADC初始化程序例如如下:*defineADC_FREQ2500000//希望的ADC轉(zhuǎn)換頻率volatileU32preScaler;volatileU32adc_value=0;//在程序開場處聲明voidadc_init(void){ rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms //選擇輸入通道,AIN0,對應(yīng)開發(fā)板上W1可調(diào)電阻 intchannel=0; /*設(shè)置分頻時鐘*/ preScaler=ADC_FREQ; preScaler=50000000/ADC_FREQ-1;//PCLK=50M /*AD轉(zhuǎn)換頻率設(shè)置,最大頻率為2.5MHz*/ rADCCON=(1<<14)|(preScaler<<6)|(channel<<3); //setupchannel delay(1000); }3、ADCDAT0〔ADCDAT1〕P447,讀取轉(zhuǎn)換值A(chǔ)DCDAT0[9:0],*坐標(biāo)轉(zhuǎn)換結(jié)果值,包括普通模ADC轉(zhuǎn)換結(jié)果值;〔ADCDAT1[9:0],Y坐標(biāo)轉(zhuǎn)換結(jié)果;〕ADC轉(zhuǎn)換程序例如,通過輪詢方式voidMain(void){/*時鐘初始化*/Set_Clk();/*adc初始化*/adc_init();while(1){ /*讀取轉(zhuǎn)換值*/adc_value=ReadAdc(0); delay(1000);}} intReadAdc(intchannel){/*開場AD轉(zhuǎn)換*/rADCCON|=0*01;//startADCwhile(rADCCON&0*1); //checkifEnable_startislow/*檢查轉(zhuǎn)換是否完畢*/while(!(rADCCON&0*8000)); //checkifEC(EndofConversion)flagishighreturn((int)rADCDAT0&0*3ff);}ADC通過中斷方式讀取轉(zhuǎn)換值注意ADC的中斷有兩個子中斷,INT_ADC_S和INT_TC需要先處理一下子中斷INT_ADC_S,再處理INT_ADC。voidadc_init(void){ intchannel=0;/選擇輸入通道,AIN0,對應(yīng)開發(fā)板上W1可調(diào)電阻preScaler=ADC_FREQ;//設(shè)置分頻時鐘 preScaler=50000000/ADC_FREQ-1;//PCLK=50MrADCCON=(1<<14)|(preScaler<<6)|(channel<<3); ClearSubPending(BIT_SUB_ADC);//清子中斷處理存放器ClearPending(BIT_ADC);//清中斷處理存放器

pISR_ADC=(U32)adc_ISR;EnableSubIrq(BIT_SUB_ADC);//開AD子中斷

EnableIrq(BIT_ADC);//開AD中斷delay(1000);

}void__irqadc_ISR(void)

{

intadc_value;//adc_value應(yīng)該設(shè)為全局變量,這里放這里以便分析ClearSubPending(BIT_SUB_ADC);//清子中斷處理存放器ClearPending(BIT_ADC);//清中斷處理存放器adc_value=(int)rADCDAT0&0*3ff;

}

觸摸屏工作流程以及程序設(shè)計流程:觸摸屏初始化:

1、ADCTSC設(shè)置〔P445〕,[1:0]:11設(shè)置觸摸屏接口為中斷等待模式,等待觸摸筆按下[2]:0ADC普通轉(zhuǎn)換模式,1自動連續(xù)測量*坐標(biāo)和Y坐標(biāo)[3]:0*P上拉有效,1*P上拉無效

2、ClearSubPending(BIT_SUB_ADC);//清子中斷處理存放器ClearPending(BIT_ADC);//清中斷處理存放器ClearSubPending(BIT_SUB_TC);去除源掛起存放器(SRCPND)、中斷掛起存放器(INTPND)、子源掛起存放器(SUBSRCPND)。注意有兩個中斷,觸摸屏中斷:當(dāng)觸摸筆按下或抬起產(chǎn)生的中斷,ADC中斷:觸摸屏坐標(biāo)AD轉(zhuǎn)換完畢產(chǎn)生的中斷。

3、EnableSubIrq(BIT_SUB_ADC);//開AD子中斷EnableIrq(BIT_ADC);//開AD中斷EnableSubIrq(BIT_SUB_TC);//開AD子中斷TC關(guān)中斷屏蔽存放器和子中斷屏蔽存放器(INTMSK,INTSUBMSK)。4、pISR_ADC=(U32)AdcTsAuto;程序入口函數(shù),中斷模式和中斷優(yōu)先級默認(rèn)即可。

二、觸摸屏中斷效勞子程序:

一〕觸摸筆按下中斷

4、如果中斷發(fā)生,設(shè)置*,y坐標(biāo)為自動轉(zhuǎn)換模式rADCTSC=(1<<3)|(1<<2);[2]:0ADC普通轉(zhuǎn)換模式,1自動連續(xù)測量*坐標(biāo)和Y坐標(biāo)[3]:0*P上拉有效,1*P上拉無效

5、啟動AD轉(zhuǎn)換,然后檢測AD轉(zhuǎn)換是否啟動rADCCON|=0*1;//startADCwhile(rADCCON&0*1); //checkifEnable_startislow

6、檢測AD轉(zhuǎn)換是否完畢,假設(shè)完畢,獲取*,y坐標(biāo)的值通過輪詢方式,也可以是中斷方式判斷轉(zhuǎn)換完畢。while(!(rADCCON&0*8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!!while(!(rSRCPND&0*80000000));//checkifADCisfinishedwithinterruptbit/*獲取*,Y坐標(biāo)*/*data=(rADCDAT0&0*3ff);ydata=(rADCDAT1&0*3ff);

7、對幾個存放器寫1清零,防止反復(fù)發(fā)生中斷(這里的中斷是筆尖按下中斷)

ClearSubPending(BIT_SUB_TC);ClearPending(BIT_ADC);/rSRCPND=0*80000000;rINTPND=0*80000000;也可以再次允許中斷允許觸摸筆被彈起的中斷EnableSubIrq(BIT_SUB_TC);EnableIrq(BIT_ADC);//rINTMSK=0*7fffffff;觸摸筆抬起中斷

9、設(shè)置觸摸屏即可為等待中斷模式,等待觸摸筆抬起(ADCTSC,關(guān)鍵是要設(shè)置觸摸筆抬起中斷信號)rADCTSC=0*d3;//WaitingforinterruptrADCTSC=rADCTSC|(1<<8);//Detectstylusupinterruptsignal.

10、如果發(fā)生中斷,不做任何操作,只打印出一句觸摸筆抬起中斷信息while(1) //tocheckPen-upstate { if(rSUBSRCPND&(BIT_SUB_TC)) //checkifADCisfinishedwithinterruptbit { Uart_Printf("StylusUpInterrupt~!\n"); break; //ifStylusisup(1)state } } /****************stylusup**************************/ Uart_Printf("count=%03d*P=%04d,YP=%04d\n",count++,*data,ydata);

11、觸摸筆抬起之后,把得到的*,y坐標(biāo)值發(fā)送給PC機,顯示出具體數(shù)值

三)再次設(shè)置觸摸屏為等待中斷模式,等待下次觸摸屏被按下

/*設(shè)置觸摸屏為等待中斷模式,等待下次觸摸筆按下*/rADCTSC=0*d3;//Waitingforinterrupt ClearSubPending(BIT_SUB_TC);ClearPending(BIT_ADC);EnableSubIrq(BIT_SUB_TC); EnableIrq(BIT_ADC);例如程序如下:*define GLOBAL_CLK 1*include<stdlib.h>*include<string.h>*include"def.h"*include"option.h"*include"2440addr.h"*include"2440lib.h"*include"2440slib.h"*include"mmu.h"*include"profile.h"*include"memtest.h"*defineADC_FREQ2500000intcount=0;volatileU32preScaler;int*data,ydata;voidTest_Touchpanel(void);staticvoid__irqAdcTsAuto(void);staticvoidcal_cpu_bus_clk(void);voidSet_Clk(void);/*延時函數(shù)*/voiddelay(inttimes){inti,j;for(i=0;i<times;i++)for(j=0;j<400;j++);}/*主函數(shù)*/intMain(void){ intS=0;Set_Clk();Uart_Init(0,115200);Uart_Select(S);Test_Touchpanel();while(1);return0;} /*觸摸屏初始化*/voidTest_Touchpanel(void){rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms/*設(shè)置AD轉(zhuǎn)頻率*/preScaler=ADC_FREQ;preScaler=50000000/ADC_FREQ-1;//PCLK=50MrADCCON=(1<<14)|(preScaler<<6); //ADCPRSEn,PRSCVL/*設(shè)置觸摸屏為等待中斷模式,等待觸摸筆被按下*/rADCTSC=0*d3;//Wfait,*P_PU,*P_Dis,*M_Dis,YP_Dis,YM_En/*clearirq*/rSRCPND=0*80000000;rINTPND=0*80000000;ClearSubPending(BIT_SUB_TC);pISR_ADC=(U32)AdcTsAuto;/*enableINT_TCirq*/rINTMSK=0*7fffffff; EnableSubIrq(BIT_SUB_TC);}/*************************************************Functionname:AdcTsAutoParameter:voidDescription :中斷效勞程序Return :voidArgument:voidAutor&date:Daniel**************************************************/staticvoid__irqAdcTsAuto(void){U32 saveAdcdly;/****************stylusdown************************//*檢測子中斷源,判斷是否是INT_TC中斷,且觸摸筆按下*/if(rSUBSRCPND&(BIT_SUB_TC)){ if(!(rADCDAT0&0*8000)) Uart_Printf("\nStylusdown\n"); elseUart_Printf("\nStylusup\n"); }/*pull-updisable,自動連續(xù)*,Y坐標(biāo)轉(zhuǎn)換*/rADCTSC=(1<<3)|(1<<2);saveAdcdly=rADCDLY;rADCDLY=40000;//Normalconversionmodedelayabout(1/50M)*40000=0.8ms /*開場AD轉(zhuǎn)換*/ rADCCON|=0*1;//startADCwhile(rADCCON&0*1); //checkifEnable_startislow while(!(rADCCON&0*8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!! while(!(rSRCPND&0*80000000));//checkifADCisfinishedwithinterruptbit /*獲取*,Y坐標(biāo)*/ *data=(rADCDAT0&0*3ff);ydata=(rADCDAT1&0*3ff);ClearSubPending(BIT_SUB_TC);//ClearPending(BIT_ADC);rSRCPND=0*80000000; rINTPND=0*80000000;EnableSubIrq(BIT_SUB_TC); //EnableIrq(BIT_ADC);rINTMSK=0*7fffffff;/****************stylusdown************************//****************stylusup**************************/ /*設(shè)置觸摸屏為等待中斷模式,等待觸摸筆抬起*/rADCTSC=0*d3;//Waitingforinterrupt rADCTSC=rADCTSC|(1<<8);//Detectstylusupinterruptsignal. while(1) //tocheckPen-upstate { if(rSUBSRCPND&(BIT_SUB_TC)) //checkifADCisfinishedwithinterruptbit { Uart_Printf("StylusUpInterrupt~!\n"); break; //ifStylusisup(1)state } } /****************stylusup**************************/ Uart_Printf("count=%03d*P=%04d,YP=%04d\n",count++,*data,ydata); rADCDLY=saveAdcdly; /*設(shè)置觸摸屏為等待中斷模式,等待下次觸摸筆按下*/rADCTSC=0*d3;//Waitingforinterrupt ClearSubPending(BIT_SUB_TC);//ClearPending(BIT_ADC);rSRCPND=0*80000000; rINTPND=0*80000000;EnableSubIrq(BIT_SUB_TC); //EnableIrq(BIT_ADC);rINTMSK=0*7fffffff;}/*************************************************Functionname:Set_Clk()Parameter:voidDescription :設(shè)置CPU的時鐘頻率Return :voidArgument:voidAutor&date:Daniel**************************************************/voidSet_Clk(void){ inti; U8key; U32mpll_val=0; i=2; //don'tuse100M! //boot_params.cpu_clk.val=3; switch(i){ case0: //200 key=12; mpll_val=(92<<12)|(4<<4)|(1); break; case1: //300 key=13; mpll_val=(67<<12)|(1<<4)|(1); break; case2: //400 key=14; mpll_val=(92<<12)|(1<<4)|(1); break; case3: //440!!! key=14; mpll_val=(102<<12)|(1<<4)|(1); break; default: key=14; mpll_val=(92<<12)|(1<<4)|(1); break; } //initFCLK=400M,sochangeMPLLfirst ChangeMPllValue((mpll_val>>12)&0*ff,(mpll_val>>4)&0*3f,mpll_val&3);//settheregister--rMPLLCON ChangeClockDivider(key,12);//theresultofrCLKDIVN[0:1:0:1]3-0bit cal_cpu_bus_clk();//HCLK=100MPCLK=50M}/*************************

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論