Microchip
直播中

韩婧

7年用户 173经验值
私信 关注
[问答]

端口引脚写入和中断是因为XC8错误吗

嗨,我开始为PIC18F45 K20写一个非常简单的程序,只是为了测试。该程序做两件事:打开一个LED总是按下一个按钮,并关闭它,如果按钮不预设开关和关闭另一个LED每一个一定的时间。LED连接到RD0和RD1端口引脚,按钮连接到RB0端口引脚。这是我写的代码:我注意到。RD0中的LED在不规则的时间上打开和关闭。最后,我发现问题是关于主循环的不可分解的:正如您所见,PORTD的整个字节在一个临时变量中***纵,然后写回PORTD寄存器。问题是清楚的,如果中断是在这个临时变量***作时触发的,在中断例程中完成的RD0的更改被覆盖了。我做错什么了吗?这是XC8编译器中的一个bug吗?提前感谢。

回帖(19)

tijing忽忽

2020-5-15 10:31:50
这就是你想要的吗?您在这个语句中有RD0和RD1,可能只有RD1?编辑:哎呀,不顾这部分!在写入端口时也总是使用LATX SFR,它避免了RMW错误——可能是这里的一个问题。端口的各个位不能被处理器操纵,因为它被读写为一个字节,甚至BSF和BCF指令实际上读取整个端口,修改适当的位和n将整个端口写回。这就是PIC的工作原理。
举报

陈鲜孰

2020-5-15 10:46:44
PIC18只有BSF、BCF和BTG指令来操作单个比特,BTFSC和BTFSS对它们进行测试。没有位移动或复制指令,因此它将*ALWAYS*生成非原子代码以从非常量表达式或变量加载位。请尝试:编译器应该使用BSF/BCF执行哪些操作。
举报

陈晨

2020-5-15 11:01:16
你应该写信给LAT登记簿。
举报

tijing忽忽

2020-5-15 11:12:09
Ian显示的更改是个好主意(如我前面提到的,NKurzman-write to LATx SFR),但是这仍然不能减轻OP对上述中断的关注,if{}语句永远不会是原子语句。在操作这个(和类似的)代码期间,必须防止中断,以避免这些问题(暂时禁用中断)。还是我又错过了什么?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分