[問題] mcu(pic)請教

看板Electronics作者 (iop14759)時間1年前 (2023/01/31 09:35), 1年前編輯推噓3(306)
留言9則, 7人參與, 1年前最新討論串1/1
我用的mcu是pic16f877a 我要控制的東西(rgbled)是單線控制,根據data線HIGH的時長來決定是BIT"0"或BIT"1" 所以我在用mcu控制的時候常常會這樣寫 if(bit[i]=1) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;}//BIT"1"800nS HIGH else {RC1=1;RC1=0;} //BIT"0"200nS HIGH 我的振盪器是20MHZ,所以指令週期是(1/20M)*4=200nS 當bit"1"時送一個800nS HIGH的脈波(4次RC1=1;) 當bit"0"時送一個200nS HIGH的脈波(1次RC1=1;) 但是我發現偶爾在不知道什麼時候,BIT"1"High的脈波寬會變成2000nS 拿掉一個RC1=1;,BIT"1"High的脈波寬會變成1800nS 拿掉兩個RC1=1;,BIT"1"High的脈波寬會變成1600nS (表示RC1=1;這指令仍然是200nS,那為什麼High的脈波寬會跑掉) 這狀況是偶而才發生一次,每次遇到這個問題時,我將程式改為 if(bit[i]=1) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;RC1=0;RC1=0;RC1=0;}//BIT"1"800nS HI else {RC1=1;RC1=0;} //BIT"0"200nS HIGH 把RC1=0;的次數跟RC1=1;的次數相同,BIT"1"High的脈波寬就正常了 就很好奇了,請問這個是編譯器的問題嗎?因為單純以程式來看我想不通 我只是瞎基巴改,然後就正常動作了 所以想來問看看這到底是什麼原因 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.158.217 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1675128955.A.36B.html

01/31 12:58, 1年前 , 1F
沒用過pic,有其他硬體中斷搶佔程序嗎?
01/31 12:58, 1F
沒使用中斷的時候仍然會有這問題

01/31 13:06, 1年前 , 2F
XC8
01/31 13:06, 2F
※ 編輯: IOP14759 (60.248.158.217 臺灣), 01/31/2023 15:24:55

01/31 20:17, 1年前 , 3F
可以看編譯出來的組語,或是關閉優化功能試試看
01/31 20:17, 3F

02/01 02:19, 1年前 , 4F
關優化先 你可能有東西佔了資源但沒有用
02/01 02:19, 4F

02/01 02:19, 1年前 , 5F
這時編譯器就會自動優化 反而變奇怪動作
02/01 02:19, 5F

02/01 11:17, 1年前 , 6F
直接看組合語言
02/01 11:17, 6F

02/01 13:20, 1年前 , 7F
試看看用同樣週期的nop取代重複的指令
02/01 13:20, 7F

02/01 13:47, 1年前 , 8F
開發環境或除錯工具有掛著嗎?它有時會主動產生中斷好獲得
02/01 13:47, 8F

02/01 13:48, 1年前 , 9F
程式運行資訊
02/01 13:48, 9F
文章代碼(AID): #1Zs71xDh (Electronics)