久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2482|回復: 11
打印 上一主題 下一主題
收起左側

應廣單片機邊沿中斷觸發改主程序循環執行,求幫忙分析

[復制鏈接]
跳轉到指定樓層
樓主
右邊為例程的,但是是邊沿觸發中斷。我這硬件的是是普通引腳沒法使用。于是改參考例子,改主程序循環。
但是解出來的值不同,求指點

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

a.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:401564 發表于 2022-7-8 23:28 | 只看該作者
應廣的沒法指導
一是應廣好像都是OTP的,工作中用不到的話,幾乎沒人學,燒錄器貴上天,沒法驗證
二是應廣用的不是標準C,迷你C估計學的人不多
回復

使用道具 舉報

板凳
ID:887371 發表于 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. }
復制代碼
回復

使用道具 舉報

地板
ID:962286 發表于 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
復制代碼
回復

使用道具 舉報

5#
ID:161164 發表于 2022-7-9 22:33 | 只看該作者
要留意主循環的周期要少于信號電平保持時間的1/3
如信號中低電平時間最短為250us
那么主循環時間就應少于83us
否則會掉偵
回復

使用道具 舉報

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

應廣的確實是如你所說的這樣.。我剛剛好工作需要/.
回復

使用道具 舉報

7#
ID:835574 發表于 2022-7-10 11:37 | 只看該作者
datouyuan 發表于 2022-7-9 17:18
我也沒用過應廣的。不會應廣的語法。
我發現右圖代碼是有些問題。
假設左圖的代碼正常。

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

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

使用道具 舉報

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

思路是用讀IO的值來替換,電平改變的時候執行一次,然后開啟計數器算時間,否則波形解出來不對,然后我加了各種判斷。把我自己給繞暈了。。。
回復

使用道具 舉報

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

因為函數是在main里面循環的。如果RF=0的時候,時間有900us. 那么timer_250us 就一直清0 ,無法計算時間。和中斷觸發有差異了
回復

使用道具 舉報

10#
ID:835574 發表于 2022-7-10 11:53 | 只看該作者
lkc8210 發表于 2022-7-9 22:33
要留意主循環的周期要少于信號電平保持時間的1/3
如信號中低電平時間最短為250us
那么主循環時間就應少于 ...

我也懷疑過是否因為主程序執行時間過長,然后導致時間線出錯。然后我搞了個例子,主循環里面什么都做,就只執行這函數,然后一樣的問題。我就懷疑是不是我判斷的條件和中斷雙邊沿觸發的對不上,而不是時間線
回復

使用道具 舉報

11#
ID:835574 發表于 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;
                }
        }
回復

使用道具 舉報

12#
ID:887371 發表于 2022-7-11 10:58 | 只看該作者
剛仔細分析了下左圖代碼,這段代碼是用于315M433MHz無線接收模塊解碼的,代碼寫得非常好,可適用于各種單片機,值得收藏。

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天影视亚洲综合网 | www.亚洲国产精品 | 91动漫在线观看 | 午夜视频在线免费观看 | 一区视频| 九九久久在线看 | 日韩av高清 | 九九九视频在线观看 | 久久精品中文 | 在线中文视频 | 日韩精品久久一区 | 久久精品国产一区二区三区 | 亚洲www啪成人一区二区麻豆 | 久草网址 | 亚洲视频中文字幕 | 国产精品久久久久久久久久三级 | 国精产品一区二区三区 | 免费永久av | 午夜看电影在线观看 | 国产精品日韩欧美一区二区 | 91国内外精品自在线播放 | a级毛片国产 | 国产综合久久 | 亚洲日本欧美日韩高观看 | 中文字幕在线免费观看 | 日韩欧美在线视频播放 | 中文字幕一区二区三区乱码在线 | www日本在线观看 | 国产亚洲精品精品国产亚洲综合 | 久久一热 | 亚洲国产18 | 精品日韩欧美一区二区 | 91在线免费观看 | 欧美精品久久久 | 成人高清在线 | www.天天操.com | 国产一区二区三区视频 | 91偷拍精品一区二区三区 | 亚洲欧美中文日韩在线v日本 | 国产一级片免费视频 | 黄色网址在线播放 |