uc/OS-II下ARM7定時(shí)器捕獲實(shí)現(xiàn)紅外解碼
LPC2103芯片帶有定時(shí)器捕獲,可以設(shè)置為下降沿,上升沿或雙邊沿捕獲中斷。因?yàn)榻Y(jié)合到此款紅外編碼方式,所以采用下降沿進(jìn)行捕獲。定時(shí)器0因?yàn)橛米髁讼到y(tǒng)節(jié)拍定時(shí)器,所以我選擇了定時(shí)器1的捕獲。
本文引用地址:http://butianyuan.cn/article/201611/319111.htm定時(shí)器1進(jìn)行如下的初始化。
[plain]view plaincopyprint?
- voidSetTimer(void)
- {
- T1TCR=0x02;//關(guān)閉復(fù)位定時(shí)器1
- T1PR=10;//11分頻,約1us計(jì)時(shí)一次(外設(shè)時(shí)鐘11.0592MHZ)
- T1CCR=0x06;//下降沿捕獲并產(chǎn)生中斷
- T1IR=0x10;//清除定時(shí)器1捕獲0中斷
- T1TCR=0x01;//開啟定時(shí)器1
- VICVectAddr1=(uint32)Timer1_Handler;//中斷向量相關(guān)設(shè)置
- VICVectCntl1=(0x20|0x05);
- VICIntEnable|=(1<<5);
- }
然后在定時(shí)器1中斷服務(wù)函數(shù)里,就算出相鄰兩次下降沿之間的差值。然后通過消息郵箱把消息發(fā)送到脈寬檢測(cè)任務(wù)進(jìn)行處理。
[plain]view plaincopyprint?
- voidTimer1_Exception()
- {
- staticuint32tOld;//保存舊的下降沿捕獲值
- uint32tNew;//保存新的下降沿捕獲值
- statici;
- OS_ENTER_CRITICAL();
- T1IR=0x10;//清除定時(shí)器1捕獲0中斷
- tNew=T1CR0;
- tValue=tNew-tOld;//得到兩次下降沿之間的差值
- tOld=tNew;//以便下次中斷處理
- OSMboxPost(Msg,(void*)tValue);//發(fā)送消息郵箱,行為同步
- OS_EXIT_CRITICAL();
- VICVectAddr=0x00;
- }
在檢測(cè)脈寬任務(wù)里,我只需要根據(jù)測(cè)定脈寬與本來編碼原有的脈寬進(jìn)行比較判斷,然后進(jìn)行相關(guān)移位數(shù)據(jù)操作,得到數(shù)據(jù)碼值。
因?yàn)槲业倪b控器有點(diǎn)不同,地址碼與地址反碼不互反,所以不能進(jìn)行地址的判斷,所以濾除掉了引導(dǎo)碼與地址碼,直接進(jìn)行了數(shù)據(jù)碼的處理。
只要數(shù)據(jù)碼與數(shù)據(jù)反碼取反相同,則調(diào)試LED閃爍一下。
當(dāng)然我還沒有具體知道遙控器按鍵對(duì)應(yīng)的具體碼制是多少,而且還沒有檢測(cè)到連發(fā)碼,留待下次把碼制通過串口發(fā)送到上位機(jī)進(jìn)行顯示。
[plain]view plaincopyprint?
[plain]view plaincopyprint?
這是檢測(cè)脈寬任務(wù)的核心代碼:
while(1) - {
- OSMboxPend(Msg,0,&err);//等待脈寬檢測(cè)消息
- if(tValue>2145&&tValue<2345)//進(jìn)行脈寬檢測(cè)
- {
- ucTemp=1;//邏輯1
- }
- elseif(tValue>1025&&tValue<1225)
- {
- ucTemp=0;//邏輯0
- }
- elseif(tValue>13400&&tValue<13600)
- {
- ucCounter=0;//引導(dǎo)碼
- usData0=0;
- usData1=0;
- flag=1;
- }
- else
- {
- continue;
- }
- if(flag)//數(shù)據(jù)處理過程
- {
- ucCounter++;
- if(ucCounter<16)
- {
- usData0|=(uint16)ucTemp;
- usData0<<=1;
- }
- elseif(ucCounter==16)
- {
- usData0|=(uint16)ucTemp;
- }
- elseif(ucCounter<32)
- {
- usData1|=(uint16)ucTemp;
- usData1<<=1;
- }
- elseif(ucCounter==32)
- {
- usData1|=(uint16)ucTemp;
- flag=0;
- OSSemPost(Sem);//發(fā)送信號(hào)量,進(jìn)行碼制轉(zhuǎn)換任務(wù),我的任務(wù)只是簡單的實(shí)現(xiàn)了判斷解碼是否成功。
- }
- }
- }
評(píng)論