大家好
我有一个连接到 Arduino UNO 的旋转编码器,并试图编写一个代码来实现功能:如果它顺时针转动,打开 LED1,否则如果它逆时针转动,则打开 LED2。
我在网上找到了很多 c 代码来完成这项工作,但我想先在汇编中实现它,这样我才能完全理解它是如何工作的(所以请不要对我在 2021 年使用汇编的原因发表负面评论)
这是我的代码,我的问题是我只有一个方向。
我的代码背后的想法是:
当我旋转RE时,它在下降沿向PD2引脚发送中断,然后在ISR中,我检查信号B(PD3引脚),如果为高电平,则表示RE顺时针旋转,否则逆时针旋转 .
我知道我遗漏了一些东西,如果有人可以帮助我修复此代码,我将不胜感激!
先感谢您!
jmp main
.org 0x002
jmp int0_isr
main:
sbi ddrc,0
sbi ddrc,1
sbi portd,2 ; pull up resistor on Pd2
sbi portd,3; pull up resistor on Pd3 ; B signal
cbi ddrd,3
cbi ddrd,2
ldi r16,0x01 ;Int0 enabled
out eimsk,r16
ldi r16,0x02 ; falling edge
sts eicra,r16
sei
loop:
rjmp loop
.org 0x100
int0_isr:
sbis portd,3
rjmp ccw
sbi portc,1
cbi portc,0
rjmp exit
ccw:
sbi portc,0
cbi portc,1
exit:
reti
为获得更好的分辨率和对称性,请对两个编码器输入都使用引脚中断来提高灵敏度。将实际AB输入级与存储的先前状态进行比较以确定旋转方向,使用异或进行简单检测。如果两个输入都已更改,则标记溢出或硬件错误。
你好,
端口有输入和输出寄存器。
像 PIND 和 PORTD。
在您的 ISR 中,您(尝试)读取 PORTD,但它应该是 PIND。
也许这是一个机械开关,可能会有抖动。 因此,您需要对输入使用去抖动技术。
这可以通过软件来完成,但外部电容器也可以完成这项工作。
我不知道您的上拉电阻值:尝试使用 0.00001/R 的电容,电容值不需要太精确。
一周热门 更多>