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