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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個單片機函數功能是16位自動重載模式中給定時器設定初值的,賦值給8位寄存器TL0

[復制鏈接]
跳轉到指定樓層
樓主
廢話不多說,先上代碼

/************************* 定時器設定計數(16位) *************************
        
                變量名                |                        取值范圍                |                        變量含義
                NUM                        |                        0 ~ 4                        |                        定時器編號
                COUNT                |                0 ~ 65535                |                        定時器計數值
        
*/


void _TIMER_COUNT_16_(uint8_t NUM, uint16_t COUNT){
        
        uint16_t Temp;
        Temp = 65536 - COUNT;
        
        switch (NUM){
                case 0 :
                        TL0 = Temp;
                        TH0 = _crol_(Temp,8);
                        break;
                case 1 :
                        TH1 = Temp;
                        TH1 = _crol_(Temp,8);
                        break;
                case 2 :
                        T2L = Temp;
                        T2H = _crol_(Temp,8);
                        break;
                case 3 :
                        T3L = Temp;
                        T3H = _crol_(Temp,8);
                        break;
                case 4 :
                        T4L = Temp;
                        T4H = _crol_(Temp,8);
                        break;
        }
        
}


我本來想寫一個庫函數,做一個長期的積累,結果就出怪事了。


這段代碼里的兩個變量在上面注釋里有,編譯之后單步運行,發現變量監視器里發生“靈異事件”。


這個函數功能是16位自動重載模式中給定時器設定初值的。假定 NUM = 0(給定時器0設定初值)。Temp是一個16位無符號變量,用來存放定時器初始值(65536 - 計數值COUNT)。賦值給8位寄存器TL0,直接將低8位送進去,沒有任何問題。然后Temp右移8位,幅值給TH0,但這中間發生了幾個奇怪的問題。


1、測試,Temp(定時器初值) = 65536 - COUNT(計數值)。但這條語句執行完之后,COUNT的值也發生了變化,雖說運算結果是正確的,而且COUNT是局部變量不影響主函數,但哪有把操作數改變的道理?萬一我下面再需要用到COUNT呢?那不全亂套了?




2、一開始我用的是 “>>” 右移運算符,但無論怎么改都沒有效果,Temp變量并沒有右移8位。后來改用 intrins.h 的庫函數 _cror_(),不用不要緊,一用更邪門了。_cror_(Temp,8)操作之后連NUM這個數都改變了,但這可是NUM啊!這是定時器編號啊,函數里沒有修改,也根本不需要修改,怎么莫名其妙地就被改了呢?而且說好的移位呢?也沒實現啊……




希望前輩答疑解惑,多謝啦!



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

使用道具 舉報

沙發
ID:47286 發表于 2020-9-25 20:13 | 只看該作者
用宏定義寫不好么 你這么寫是挺方便 但編譯后文件大 運行速度也有影響 畢竟要走一個switch

#define FOC 1 //1=11.0592 2=22.1148

#if FOC==1 //如果 頻率設置=1 編譯以下內容
THV=0x??; //高8位
THL=0x??; //低8位
#elif FOC==2 //如果 頻率設置=2 編譯以下內容
THV=0x??; //高8位
THL=0x??; //低8位
#endif 結束編譯

TL0 = THV;
TH0 = TLV;

這樣寫編譯的時候實際上只編譯實際值 沒有額外運算 而且 也可以實現靈活配置
回復

使用道具 舉報

板凳
ID:224104 發表于 2020-9-26 15:33 | 只看該作者
dzbj 發表于 2020-9-25 20:13
用宏定義寫不好么 你這么寫是挺方便 但編譯后文件大 運行速度也有影響 畢竟要走一個switch

#define FOC  ...

只是單純想寫個庫,而且初始化只有一次,不是循環調用,應該不影響運行效率
回復

使用道具 舉報

地板
ID:311846 發表于 2020-9-27 16:46 | 只看該作者
本帖最后由 權威人物 于 2020-9-27 16:51 編輯

親,移位操作這邊建議加括號哦!對于一些符號類型不匹配的也建議手動加強制轉換,對于_cror_建議仔細看看的函數說明,以后對函數有異議麻煩請自行找度娘,一般不會重現偏差。
回復

使用道具 舉報

5#
ID:311846 發表于 2020-9-27 16:49 | 只看該作者
對于NUM驗證直接,固定NUM的值,在其他所有地方的NUM使用屏蔽掉
回復

使用道具 舉報

6#
ID:224104 發表于 2020-9-28 10:45 | 只看該作者
權威人物 發表于 2020-9-27 16:46
親,移位操作這邊建議加括號哦!對于一些符號類型不匹配的也建議手動加強制轉換,對于_cror_建議仔細看看的 ...

剛剛查了一下才知道,_cror_ 是字節變量右移,謝謝啦
回復

使用道具 舉報

7#
ID:224104 發表于 2020-9-28 10:48 | 只看該作者
權威人物 發表于 2020-9-27 16:49
對于NUM驗證直接,固定NUM的值,在其他所有地方的NUM使用屏蔽掉

請問具體代碼怎么實現呢?
回復

使用道具 舉報

8#
ID:224104 發表于 2020-9-28 11:37 | 只看該作者
問題已經完全解決了,經測試是編譯器的鍋。

選擇8(默認)就會出現各種各樣莫名其妙的問題。改成3之后所有的錯誤都沒了。

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91av免费观看 | 国产有码 | 97超碰站| 夜久久| 欧美一区二区三区久久精品 | 麻豆久久久久 | www.v888av.com | 国产欧美视频一区二区 | 国产精品日韩一区 | www.中文字幕.com | 伊人精品在线 | 337p日本欧洲亚洲大胆鲁鲁 | 午夜影院视频 | 国产成人综合网 | 999国产精品视频 | 国产一区二区三区在线免费 | av一区二区三区 | 亚洲精品久久 | 国产精品一区在线观看 | 久久久久国产 | 91精品导航 | 亚洲精品乱码久久久久久按摩 | 欧美激情一区二区三区 | 粉嫩一区二区三区四区公司1 | 成人免费看 | 精品亚洲一区二区三区四区五区 | 久久综合成人精品亚洲另类欧美 | 一区二区三区精品在线 | 欧美成人一级 | 成人免费观看男女羞羞视频 | 久久久久国色av免费观看性色 | 在线播放国产视频 | 国产精品黄 | 啪啪毛片 | 精品欧美一区二区久久久伦 | 亚洲字幕在线观看 | 午夜寂寞影院列表 | 欧美成人精品一区二区男人看 | 亚洲精品国产偷自在线观看 | 欧美三级久久久 | 性福视频在线观看 |