在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > uc/OS-II下ARM7定時(shí)器捕獲實(shí)現(xiàn)紅外解碼

            uc/OS-II下ARM7定時(shí)器捕獲實(shí)現(xiàn)紅外解碼

            作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            今天下午的時(shí)候,調(diào)試努力之下,終于把紅外解碼弄出來了。其實(shí)以前有次比賽的時(shí)候就已經(jīng)用到了紅外,只是那次用的是51單片機(jī),用的是外部中斷和延時(shí)檢測脈寬來進(jìn)行解碼,因?yàn)?1的時(shí)鐘這些比較簡單,所以解碼很容易就正確了。但是現(xiàn)在換到了ARM7平臺(tái)下,由于對(duì)它的不是很熟悉,怎么用普通語句實(shí)現(xiàn)精確延時(shí)對(duì)我來說是個(gè)難點(diǎn)。最后考慮用兩個(gè)方案來實(shí)現(xiàn)紅外的解碼。方案一是用外部中斷加定時(shí)器延時(shí)檢測脈寬進(jìn)行解碼,但是結(jié)果并沒有我想的那樣美好,調(diào)試了半天也沒有實(shí)現(xiàn)正確的解碼,個(gè)人認(rèn)為是任務(wù)節(jié)拍的影響,但是確實(shí)不知道該怎么修改,最后放棄方案一,改用方案二,用定時(shí)器捕獲實(shí)現(xiàn)紅外的解碼,并最終實(shí)現(xiàn)。

            LPC2103芯片帶有定時(shí)器捕獲,可以設(shè)置為下降沿,上升沿或雙邊沿捕獲中斷。因?yàn)榻Y(jié)合到此款紅外編碼方式,所以采用下降沿進(jìn)行捕獲。定時(shí)器0因?yàn)橛米髁讼到y(tǒng)節(jié)拍定時(shí)器,所以我選擇了定時(shí)器1的捕獲。

            本文引用地址:http://www.biyoush.com/article/201611/319111.htm

            定時(shí)器1進(jìn)行如下的初始化。

            [plain]view plaincopy
            print?
            1. voidSetTimer(void)
            2. {
            3. T1TCR=0x02;//關(guān)閉復(fù)位定時(shí)器1
            4. T1PR=10;//11分頻,約1us計(jì)時(shí)一次(外設(shè)時(shí)鐘11.0592MHZ)
            5. T1CCR=0x06;//下降沿捕獲并產(chǎn)生中斷
            6. T1IR=0x10;//清除定時(shí)器1捕獲0中斷
            7. T1TCR=0x01;//開啟定時(shí)器1
            8. VICVectAddr1=(uint32)Timer1_Handler;//中斷向量相關(guān)設(shè)置
            9. VICVectCntl1=(0x20|0x05);
            10. VICIntEnable|=(1<<5);
            11. }



            然后在定時(shí)器1中斷服務(wù)函數(shù)里,就算出相鄰兩次下降沿之間的差值。然后通過消息郵箱把消息發(fā)送到脈寬檢測任務(wù)進(jìn)行處理。

            [plain]view plaincopy
            print?
            1. voidTimer1_Exception()
            2. {
            3. staticuint32tOld;//保存舊的下降沿捕獲值
            4. uint32tNew;//保存新的下降沿捕獲值
            5. statici;
            6. OS_ENTER_CRITICAL();
            7. T1IR=0x10;//清除定時(shí)器1捕獲0中斷
            8. tNew=T1CR0;
            9. tValue=tNew-tOld;//得到兩次下降沿之間的差值
            10. tOld=tNew;//以便下次中斷處理
            11. OSMboxPost(Msg,(void*)tValue);//發(fā)送消息郵箱,行為同步
            12. OS_EXIT_CRITICAL();
            13. VICVectAddr=0x00;
            14. }

            在檢測脈寬任務(wù)里,我只需要根據(jù)測定脈寬與本來編碼原有的脈寬進(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)的具體碼制是多少,而且還沒有檢測到連發(fā)碼,留待下次把碼制通過串口發(fā)送到上位機(jī)進(jìn)行顯示。

            [plain]view plaincopy
            print?

            [plain]view plaincopy
            print?
            1. 這是檢測脈寬任務(wù)的核心代碼:

              while(1)
            2. {
            3. OSMboxPend(Msg,0,&err);//等待脈寬檢測消息
            4. if(tValue>2145&&tValue<2345)//進(jìn)行脈寬檢測
            5. {
            6. ucTemp=1;//邏輯1
            7. }
            8. elseif(tValue>1025&&tValue<1225)
            9. {
            10. ucTemp=0;//邏輯0
            11. }
            12. elseif(tValue>13400&&tValue<13600)
            13. {
            14. ucCounter=0;//引導(dǎo)碼
            15. usData0=0;
            16. usData1=0;
            17. flag=1;
            18. }
            19. else
            20. {
            21. continue;
            22. }
            23. if(flag)//數(shù)據(jù)處理過程
            24. {
            25. ucCounter++;
            26. if(ucCounter<16)
            27. {
            28. usData0|=(uint16)ucTemp;
            29. usData0<<=1;
            30. }
            31. elseif(ucCounter==16)
            32. {
            33. usData0|=(uint16)ucTemp;
            34. }
            35. elseif(ucCounter<32)
            36. {
            37. usData1|=(uint16)ucTemp;
            38. usData1<<=1;
            39. }
            40. elseif(ucCounter==32)
            41. {
            42. usData1|=(uint16)ucTemp;
            43. flag=0;
            44. OSSemPost(Sem);//發(fā)送信號(hào)量,進(jìn)行碼制轉(zhuǎn)換任務(wù),我的任務(wù)只是簡單的實(shí)現(xiàn)了判斷解碼是否成功。
            45. }
            46. }
            47. }



            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉