欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 應廣單片機邊沿中斷觸發改主程序循環執行,求幫忙分析 [打印本頁]

作者: dingding16    時間: 2022-7-8 16:40
標題: 應廣單片機邊沿中斷觸發改主程序循環執行,求幫忙分析
右邊為例程的,但是是邊沿觸發中斷。我這硬件的是是普通引腳沒法使用。于是改參考例子,改主程序循環。
但是解出來的值不同,求指點

a.jpg (96.84 KB, 下載次數: 66)

a.jpg

作者: Y_G_G    時間: 2022-7-8 23:28
應廣的沒法指導
一是應廣好像都是OTP的,工作中用不到的話,幾乎沒人學,燒錄器貴上天,沒法驗證
二是應廣用的不是標準C,迷你C估計學的人不多
作者: datouyuan    時間: 2022-7-9 17:18
我也沒用過應廣的。不會應廣的語法。
我發現右圖代碼是有些問題。
假設左圖的代碼正常。
假設右圖中的變量RF_LV為RF的暫存值。

  1. void main()
  2. {
  3.         while(1){
  4.                 if(RF!=RF_LV)
  5.                 {
  6.                         //RF不等于RF_LV,表示發生了跳變。
  7.                         RF_LV=RF;//RF_LV=0表示為下降沿 RF_LV=1表示為上升沿
  8.                         RF_Receive();//左圖代碼(邊沿觸發中斷的),注意把所有的RF要替換為RF_LV。                       
  9.                 }
  10.         }
  11. }
復制代碼

作者: MCU_FANS    時間: 2022-7-9 18:34
用讀IO的方式代替用邊沿中斷,只需要讀到IO跟原來不一樣,然后執行應廣的例程即可:
  1. RF_RECEIVE        expand
  2.         static        Byte        Icnt;
  3.         if(RF == 0)
  4.         {
  5.                 if(RF_LV == 0)
  6.                 {
  7.                         Timer_250us = 0;
  8.                 }
  9.                 RF_LV = 1;
  10.         }
  11.         else
  12.         {
  13.                 if(RF_LV == 1)
  14.                 {
  15.                         if(RF_Start == 0)
  16.                         {
  17.                                 if((Timer_250us >= 32) && (Timer_250us <= 48))
  18.                                 {
  19.                                         RF_Start = 1;
  20.                                         Data_In = 0;
  21.                                         Icnt = 0;
  22.                                 }
  23.                         }
  24.                         else
  25.                         {
  26.                                 Icnt ++;
  27.                                 if((Timer_250us >= 3) && (Timer_250us <= 5))
  28.                                 {
  29.                                         CF = 1;
  30.                                         Data_In <<<= 1;
  31.                                 }
  32.                                 else if((Timer_250us >= 1) && (Timer_250us <= 2))
  33.                                 {
  34.                                         CF = 0;
  35.                                         Data_In <<<= 1;
  36.                                 }
  37.                                 else
  38.                                 {
  39.                                         Icnt = 0;
  40.                                         RF_Start = 0;
  41.                                 }
  42.                         }
  43.                         if(Icnt >= 24)
  44.                         {
  45.                                 Icnt = 0;
  46.                                 RF_End = 1;
  47.                                 RF_Start = 0;
  48.                                 .printf("ÂëÖμ:%03X\n",Data_In)
  49.                         }
  50.                 }
  51.                 RF_LV = 0;
  52.         }
  53. endm
復制代碼

作者: lkc8210    時間: 2022-7-9 22:33
要留意主循環的周期要少于信號電平保持時間的1/3
如信號中低電平時間最短為250us
那么主循環時間就應少于83us
否則會掉偵

作者: dingding16    時間: 2022-7-10 11:24
Y_G_G 發表于 2022-7-8 23:28
應廣的沒法指導
一是應廣好像都是OTP的,工作中用不到的話,幾乎沒人學,燒錄器貴上天,沒法驗證
二是應廣用 ...

應廣的確實是如你所說的這樣.。我剛剛好工作需要/.
作者: dingding16    時間: 2022-7-10 11:37
datouyuan 發表于 2022-7-9 17:18
我也沒用過應廣的。不會應廣的語法。
我發現右圖代碼是有些問題。
假設左圖的代碼正常。

看了下,發現搞錯了。原諒我左右不分。尷尬
左右是示例代碼(中斷觸發)。右邊是我的轉換的普通引腳的
RF_LV 我本來是用來標志,是想讓電平剛改變時執行一次,后面電平相同的時間不再執行這里面的代碼.

大佬,get到我的點了,我改下試試先。感謝建議

作者: dingding16    時間: 2022-7-10 11:43
MCU_FANS 發表于 2022-7-9 18:34
用讀IO的方式代替用邊沿中斷,只需要讀到IO跟原來不一樣,然后執行應廣的例程即可:

思路是用讀IO的值來替換,電平改變的時候執行一次,然后開啟計數器算時間,否則波形解出來不對,然后我加了各種判斷。把我自己給繞暈了。。。
作者: dingding16    時間: 2022-7-10 11:50
MCU_FANS 發表于 2022-7-9 18:34
用讀IO的方式代替用邊沿中斷,只需要讀到IO跟原來不一樣,然后執行應廣的例程即可:

因為函數是在main里面循環的。如果RF=0的時候,時間有900us. 那么timer_250us 就一直清0 ,無法計算時間。和中斷觸發有差異了
作者: dingding16    時間: 2022-7-10 11:53
lkc8210 發表于 2022-7-9 22:33
要留意主循環的周期要少于信號電平保持時間的1/3
如信號中低電平時間最短為250us
那么主循環時間就應少于 ...

我也懷疑過是否因為主程序執行時間過長,然后導致時間線出錯。然后我搞了個例子,主循環里面什么都做,就只執行這函數,然后一樣的問題。我就懷疑是不是我判斷的條件和中斷雙邊沿觸發的對不上,而不是時間線
作者: dingding16    時間: 2022-7-11 09:24
datouyuan 發表于 2022-7-9 17:18
我也沒用過應廣的。不會應廣的語法。
我發現右圖代碼是有些問題。
假設左圖的代碼正常。

這方面實測可以了。。感謝大佬.
就是應廣的引腳不能直接判斷,需要迂回下
        while (1)
        {
                if(RF){
                        RF_TEMP = 1;
                }else{
                        RF_TEMP = 0;
                }

                if(RF_TEMP != RF_LV){ //RF不等于RF_LV,表示發生了跳變。
                        RF_LV=RF_TEMP; //RF_LV=0表示為下降沿 RF_LV=1表示為上升沿
                        RF_Receive;
                }
        }
作者: datouyuan    時間: 2022-7-11 10:58
剛仔細分析了下左圖代碼,這段代碼是用于315M433MHz無線接收模塊解碼的,代碼寫得非常好,可適用于各種單片機,值得收藏。

這段代碼同其它常見代碼比,占用mcu實踐極短,幾乎是0耗時,非常方便的嵌入到各種項目中,對項目的其它模塊無任何影響。缺點是需要使用外中斷或引腳變動中斷+定時器中斷,全局變量也多了幾個。

初學者逛論壇,應該多收集這類優秀代碼,并分析理解。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1