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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

一條MCU指令走600多個機器周期正常嗎?新手求答

查看數: 4016 | 評論數: 16 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-5-11 17:01

正文摘要:

重載TM2的高位初始值  這條指令走了600多個機器周期 重載低位初始值也是   這合理嗎(First和FRE是全局變量,First是設定不變的初試值,FRE是計算好的儲存值)

回復

ID:592807 發表于 2021-5-12 20:59
旅途1 發表于 2021-5-12 16:59
uint curvalue;
uint error;
uint enlarge;

你在做PWM調節嗎?
1 確定鍵全局變量換成普通數字是否會恢復正常   
2 中斷是否會嵌套  例如TIM1中斷里面觸發TIM2中斷
3 你的全局變量是否在主函數頻繁出現  例如if(First > 0){delay_ms(10);這里是中斷{First = 0;}First = First - 100;}
ID:130230 發表于 2021-5-12 18:11
不合理,進debug看匯編代碼大概查一下。
ID:826204 發表于 2021-5-12 16:59
黃youhui 發表于 2021-5-12 10:11
這樣試試看,你初始化時不要計算(65536-1000)/256這些,你就直接TH0 = 252;TH1 = 24;.可能是你的單片機 ...

uint curvalue;
uint error;
uint enlarge;
uint FRE=0;
uint First=500;
uint setvalue=20;     //數據類型  uint為"unsigned int"


void time1()
{
  TMOD |=0X01;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void TIM2Inital()
{
        T2MOD=0;
        TH2=(65536-(First+FRE))/256;      //設置定時初值
        TL2=(65536-(First+FRE))%256;      //設置定時初值
  RCAP2H = (65536-(First+FRE))/256; //設置定時重載值
  RCAP2L = (65536-(First+FRE))%256; //設置定時重載值
        EA=1;                             //打開總中斷
  ET2=1;                           //打開定時器中斷                    
  TR2=1;                           //打開定時器開關
}
void timer1(void)interrupt 1
{
  TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        RCAP2H = (65536-(First+FRE))/256; //設置定時重載值
  RCAP2L = (65536-(First+FRE))%256; //設置定時重載值
}
void TM2(void) interrupt 5 using 1
{
        TF2=0;                           //自動清零
        if(curvalue<=20)
        {
        error=setvalue-curvalue;         //偏差,靠近設定值時遞減
        enlarge=50*error;                //放大
        FRE=1000-enlarge;                             //靠近設定值時FRE遞增,脈沖頻率變大,速度變慢
        DIR=1;
          if(error<3)                    
          {
            ET2=0;
          }
  }
        else
        {
                DIR=0;
                error=curvalue-setvalue;        //同上
                enlarge=5*error;
                FRE=1000-enlarge;
        }
        shudu2=~shudu2;
}
ID:826204 發表于 2021-5-12 16:57
黃youhui 發表于 2021-5-12 10:11
這樣試試看,你初始化時不要計算(65536-1000)/256這些,你就直接TH0 = 252;TH1 = 24;.可能是你的單片機 ...

謝謝您的回答   
這個  我試了下  定時器0 寫(65536-1000)/256和直接寫“256”這樣都是兩個機器周期
TM2定時器直接寫“256”這樣的也是兩個機器周期    而(65536-(First+FRE))/256這樣寫就600多個機器周期   不知道是不是First 和FRE調用的時候   走了很多指令  
下面附上部分程序
ID:592807 發表于 2021-5-12 10:11
旅途1 發表于 2021-5-12 10:00
不是  就這一個  所以很納悶

這樣試試看,你初始化時不要計算(65536-1000)/256這些,你就直接TH0 = 252;TH1 = 24;.可能是你的單片機不具備多位數的算法(浮點算法)
ID:826204 發表于 2021-5-12 10:00
黃youhui 發表于 2021-5-12 08:24
是每個指令都600機器周期嗎?如果是的話就是單片機問題。

不是  就這一個  所以很納悶
ID:826204 發表于 2021-5-12 10:00
名字不是重點 發表于 2021-5-11 23:21
這個要看C代碼展開后的匯編代碼是什么。。
一行C可能會編譯成N條匯編指令。。

用keil5仿真  可以看匯編語言嗎
ID:592807 發表于 2021-5-12 08:24
TTQ001 發表于 2021-5-12 07:45
600個機器指令周期似乎是不可能的。

是每個指令都600機器周期嗎?如果是的話就是單片機問題。
ID:420836 發表于 2021-5-12 07:45
600個機器指令周期似乎是不可能的。
ID:889094 發表于 2021-5-12 01:13
寫的timer1實際上是定時器0。。。。一個加法減法除法應該用不了那么多,仔細檢查一下
ID:824490 發表于 2021-5-11 23:21
這個要看C代碼展開后的匯編代碼是什么。。
一行C可能會編譯成N條匯編指令。。
ID:834651 發表于 2021-5-11 22:25
確認First和FRE是否為浮點數據類型
ID:826204 發表于 2021-5-11 22:13
花心的劉備 發表于 2021-5-11 21:33
First和fre是什么類型的?是不是float類型的?

不是  為unsigned int類型
ID:826204 發表于 2021-5-11 22:13
npn 發表于 2021-5-11 17:55
請確認First和FRE是否為浮點數據類型。

不是  無符號整數型
ID:684049 發表于 2021-5-11 21:33
First和fre是什么類型的?是不是float類型的?
ID:57657 發表于 2021-5-11 17:55
請確認First和FRE是否為浮點數據類型。

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线视频一区二区 | 99精品电影 | 99精品观看 | 精品伊人| a在线视频 | 免费日本视频 | 亚洲视频在线免费观看 | 在线视频亚洲 | 国产91亚洲精品 | 久久久xxx | 黄色网址av | 亚洲综合在线视频 | 国产精品无 | 婷婷五月色综合香五月 | 久久精品无码一区二区三区 | 国产精品视频在线播放 | 看av在线 | 国产精品视频一 | 国产传媒| 欧日韩不卡在线视频 | 69av网| 欧美日韩不卡合集视频 | 一区二区在线 | 99热精品久久 | 免费日韩av | 日韩免费av一区二区 | 久久精品一区二区三区四区 | 日韩毛片在线观看 | 色嗨嗨| 另类一区| 秋霞电影一区二区三区 | 久久精品久久久 | 亚洲成人午夜在线 | 一区二区久久 | 国产欧美日韩一区二区三区在线 | 亚洲精品中文字幕av | h视频在线观看免费 | 国产高清亚洲 | 国产精品久久久久久久白浊 | 一区二区三区国产精品 | 国产精品欧美一区喷水 |