Atmega328p-旋转编码器连接到Arduino调试求助!

2021-06-22 08:30发布

大家好

  我有一个连接到 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


3条回答
李春明
1楼 · 2021-06-22 15:00.采纳回答

为获得更好的分辨率和对称性,请对两个编码器输入都使用引脚中断来提高灵敏度。将实际AB输入级与存储的先前状态进行比较以确定旋转方向,使用异或进行简单检测。如果两个输入都已更改,则标记溢出或硬件错误。

linda
2楼-- · 2021-06-22 08:39

你好,


  端口有输入和输出寄存器。

  像 PIND 和 PORTD。


  在您的 ISR 中,您(尝试)读取 PORTD,但它应该是 PIND。


人中狼
3楼-- · 2021-06-22 16:51

也许这是一个机械开关,可能会有抖动。 因此,您需要对输入使用去抖动技术。

这可以通过软件来完成,但外部电容器也可以完成这项工作。

我不知道您的上拉电阻值:尝试使用 0.00001/R 的电容,电容值不需要太精确。


一周热门 更多>