




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育交流合同范本
- 2024年中國太平洋人壽保險股份有限公司招聘筆試真題
- 買賣物品合同范本
- 2024年內(nèi)蒙古興安盟實驗高中教師招聘考試真題
- 2024年納雍縣鴿子花農(nóng)業(yè)有限公司招聘考試真題
- 農(nóng)夫山泉公司勞動合同范本
- 創(chuàng)業(yè)投資協(xié)議合同范本
- 2024年河南省黃河科技學(xué)院附屬醫(yī)院招聘考試真題
- 公司系統(tǒng)服務(wù)合同范本
- 全體村民土地流轉(zhuǎn)合同范本
- 半生熟紙制作工藝
- 國防動員建設(shè)總體規(guī)劃方案
- 教案檢查總結(jié)及整改措施
- 商業(yè)銀行經(jīng)營管理課件
- ESD靜電管理標(biāo)準(zhǔn)課件
- 19.SL-T19-2023水利基本建設(shè)項目竣工財務(wù)決算編制規(guī)程
- 火葬場管理制度
- 《老年護理》教學(xué)教案
- 25題退役軍人事務(wù)員崗位常見面試問題含HR問題考察點及參考回答
- 駕駛服務(wù)外包投標(biāo)方案(完整版)
- 全日制普通高級中學(xué)體育教學(xué)大綱
評論
0/150
提交評論