我一直在尝试对我的 ATtiny817-XPRO 进行编程以解释来自旋转编码器(Arduino 模块)的输入数据,但是我遇到了一些麻烦,似乎无法弄清楚问题所在。我要做的基本上是对数字组合锁进行编程,每次旋转编码器旋转一个“滴答”(在任一方向)时,红色 LED 都会闪烁,一旦检测到正确的“组合”,就会闪烁绿色 LED . 它比这更复杂一些,所以当我在测试我的代码时遇到麻烦时,我决定编写一个简单的方法来帮助我解决/调试问题。我已将其包括在下面:
void testRotaryInput(){
if(!(PORTC.IN & 0b00000001)){ // if rotary encoder is turned clockwise
PORTB.OUT = 0b00000010; // turn on green LED
}
else if(!(PORTC.IN & 0b00000010)){ // if rotary encoder is turned CCW
PORTB.OUT = 0b00000001; // turn on blue LED
}
else{ // if rotary encoder remains stationary
PORTB.OUT = 0b00000100; // turn on red LED
}
RTC.CNT = 0;
while(RTC.CNT<16384){} // wait 500ms
PORTB.OUT = 0x00; // turn LED off
while(RTC.CNT<32768){} // wait another 500ms
}
int main(void)
{
PORTB.DIR = 0xFF; // PORT B = output
PORTC.DIR = 0x00; // PORT C = input
RTC.CTRLA = RTC_RTCEN_bm; // Enable RTC
PORTB.OUT = 0x00; // Ensure all LEDs start turned off
// ^(not necessary but I do it just in case)^
//testLED(); <-- previous test I used to make sure each LED works upon start-up
while(1)
{
testRotaryInput();
}
}
这里的想法是,无论哪条输出线首先到达 AVR,都应该指示旋转编码器的旋转方向,因为这决定了两个信号之间的相移。根据旋转方向(或没有旋转方向),红色/绿色/蓝色 LED 将闪烁一次 500 毫秒,然后程序将再等待 500 毫秒,然后再次收听旋转编码器输出。但是,当我运行此代码时,LED 将持续闪烁一段时间的红色或绿色,最终从一种颜色切换到另一种颜色,偶尔(单次)蓝色闪烁。这似乎每次都是完全随机的,并且似乎完全忽略了我应用于旋转编码器的任何旋转。
我为解决问题所做的事情:
将旋转编码器的两个输出连接到示波器以查看是否有任何输出(一切看起来都应该)
使用外部电源为旋转编码器供电,因为当我连接到 ATtiny817-XPRO 时,我只能从 5.0V VCC 引脚读取 1.6V(我怀疑这是因为 LED 和旋转编码器可能消耗太多当前的)
测量来自所述电源的电压以确保旋转编码器接收到 5.0V(我测量到大约 4.97V)
检查以确保电路正确并正常工作
不幸的是,这些事情都没有解决手头的问题。因此,我怀疑我的代码可能是罪魁祸首,因为这是我第一次尝试使用旋转编码器,更不用说解释由旋转编码器生成的数据了。但是,如果我的代码看起来应该可以正常工作,我将不胜感激,这样我就可以将精力集中在其他地方。
任何人都可以阐明可能导致此问题的原因吗?我不认为这是一块有问题的电路板,因为我在两天前将这些引脚用于不同的应用程序而没有任何问题。此外,在 AVR 方面,我还是个新手,所以我确信我的代码远未达到应有的健壮程度。
谢谢!