作者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/cn.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