Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
資深會員
|
感覺 是你的邏輯分析儀 取樣太慢
發表於: 2023/3/22 10:33
|
|||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
新會員
|
我想要請教的是,為什麼RC1在輸出時固定在1.1mS會有延遲
是硬體架構還是編譯器導致的?
發表於: 2023/3/15 17:06
|
|||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
新會員
|
補充一下,已知error時間點是在1mS左右,加一段2mS的Delay
原本的DATA會有error,但是現在避開出現error的時間點就正常了 所以可以證明這一個現象是跟著時間走,跟程式沒有任何關係 https://imgur.com/LA1bRLQ
發表於: 2023/3/10 17:21
Edited by IOP14759 on 2023年03月10日 17:59:20
Edited by IOP14759 on 2023年03月10日 18:00:25 |
|||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
新會員
|
補充一下
我有修改程式,將副程式直接拿掉只剩基本的程式,中斷部分也簡化到直接計數 https://imgur.com/2B4uJJ5 https://imgur.com/YdxcHHS https://imgur.com/BOPMKZP 現在只跑下列這一部份,但還是會出現同樣的問題 https://imgur.com/iXyGDC8 st: if(ck==32) { for(i=0;i<50;i++) { for(j=0;j<24;j++) { RC1=1;NOP();NOP();NOP();RC1=0;NOP();NOP();NOP(); } } ck=0; } goto st; 我已經簡化到無法再簡化了,感覺想不出到底哪裡有問題
發表於: 2023/3/10 16:17
|
|||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
新會員
|
非常感謝您的回覆,我好像搞錯問題了,非常抱歉
可以看到這個突然變長的時間 https://imgur.com/p1J2jQF https://imgur.com/aWW9wQh 是固定出現在1.15mS附近 所以其實跟我怎麼修改都無關,是我不知道怎麼寫的程式導致固定在這個時間會有一個延遲 但是就很奇怪,我不斷重複檢察我的程式,因為整體架構非常簡單,我完全找不到這個狀況是怎麼發生的 基本上程式都是在st這個循環裡,但我還是沒看出有什麼地方會固定在1.15mS的時候延遲 (我SPI Dongle送完一次32bit命令後就停止了,所以暫時排除是中斷造成的) st: if(ck==32)//等待SPI DONGLE收滿32BIT,順便將每一個CLK收到的DATA放到data[]陣列中 { BIN_TO_DEC();//把data_bit[24~31]=pcs SEND_CODE(); //RC1送出0或1 ck=0;//CLEAR } goto st; 抱歉我發現.C檔貼到論壇上會顯示怪怪的,我把程式分別截圖重新上傳 設置 https://imgur.com/nyd2391 主程式 https://imgur.com/Pb4q4il 中斷 https://imgur.com/cR08tQ3 副程式 https://imgur.com/rESzClQ https://imgur.com/1HUemyo 因為邏輯分析儀是勾在RC1,RC1要觸發需要進到SEND_CODE()副程式才會有將RC1=1的動作,所以我只能猜在SEND_CODE()副程式裡有出錯,但是現在回頭一看感覺SEND_CODE()副程式並沒有錯,但是其他地方我也實在找不出問題,就算中斷有問題也需要中斷達到32次才會影響程式吧?
發表於: 2023/3/10 10:19
Edited by IOP14759 on 2023年03月10日 10:40:20
Edited by IOP14759 on 2023年03月10日 10:41:24 Edited by IOP14759 on 2023年03月10日 10:42:59 Edited by IOP14759 on 2023年03月10日 10:48:20 |
|||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
管理員
|
Hi IOP14759
Q:為了數起來方便,我每24個bit前面8bit是bit"1",後面16bit是bit"0",重復48顆LED 我PIC的RC1直接勾邏輯分析儀得到這個錯誤 可以看到,在迴圈跑到i=10,j=18這個地方,很明顯RC1在低電位突然比其他的bit還長 可是我明明是用For迴圈,照理說應該是要每個bit都一樣 A:依造您所提供的訊息,我們覺得可能是這個問題 Read-modify-write https://zh.wikipedia.org/zh-tw/Read-modify-write 建議如果你要一直送1或是送0,可以使用NOP();這個函示去取代 直到I/O 須轉態,再去改變型態即可;其餘相同型態建議用NOP();取代 謝謝
發表於: 2023/3/7 12:04
|
|||
|
PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
---|---|---|---|---|
新會員
|
震盪是20Mhz,所以一次RC1=1應該是200nS
我要控制其他LED產品,該產品每顆LED就要送24bit 所以我用了兩個for迴圈 最外面的迴圈i是顆數,裡面的迴圈j是24個bit 然後每bit都會判斷是0或1來輸出一個高電位給RC1 https://imgur.com/lnSHLEa 我的主程式就只是收完CODE之後決定24bit分別是多少,然後有幾顆LED要重覆幾次 https://imgur.com/M2bXN8W 為了數起來方便,我每24個bit前面8bit是bit"1",後面16bit是bit"0",重復48顆LED 我PIC的RC1直接勾邏輯分析儀得到這個錯誤 https://imgur.com/p1J2jQF 可以看到,在迴圈跑到i=10,j=18這個地方,很明顯RC1在低電位突然比其他的bit還長 可是我明明是用For迴圈,照理說應該是要每個bit都一樣 而且這個突然比其他bit長的有時候會出現在我高電位的時候 因為我要控製的產品對低電位要求不大 但是只要高電位一出現這個問題,整個指令就都亂掉了,因為產品內部是去計數高電位的時間來判斷是0或1 我目前只能先把迴圈j改成這樣 https://imgur.com/g3olKNU 直接複製bit的判斷式24次 再勾邏輯分析儀才表現正常 https://imgur.com/S8BWEcB 但是這個方法總覺得不是長久之計,想問看看這問題可能發生在哪裡
發表於: 2023/3/3 13:45
|
|||
|