看板 Electronics 關於我們 聯絡資訊
我用的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
hongsiangfu: 沒用過pic,有其他硬體中斷搶佔程序嗎? 01/31 12:58
沒使用中斷的時候仍然會有這問題
god145145: XC8 01/31 13:06
※ 編輯: IOP14759 (60.248.158.217 臺灣), 01/31/2023 15:24:55
HiJimmy: 可以看編譯出來的組語,或是關閉優化功能試試看 01/31 20:17
mmonkeyboyy: 關優化先 你可能有東西佔了資源但沒有用 02/01 02:19
mmonkeyboyy: 這時編譯器就會自動優化 反而變奇怪動作 02/01 02:19
m490521: 直接看組合語言 02/01 11:17
ureikaze: 試看看用同樣週期的nop取代重複的指令 02/01 13:20
DaveLu: 開發環境或除錯工具有掛著嗎?它有時會主動產生中斷好獲得 02/01 13:47
DaveLu: 程式運行資訊 02/01 13:48
suspect1: 首先,你應該寫if(bit[i]==1) 02/05 01:07
suspect1: RC1是gpio? register? 02/05 01:09
suspect1: 查一下datasheet,每個instruction的執行週期 02/05 01:11
suspect1: 我知道你沒用中斷,但hongsiangfu說『其他』的硬體 02/05 01:12
suspect1: 有可能發出signal,或是preemptive 02/05 01:13
yugi2567: 用chatgpt寫啊...... 02/09 12:51