Я пытался запрограммировать свой ATtiny817-XPRO для интерпретации входных данных с поворотного энкодера (модуля Arduino), однако у меня возникли некоторые проблемы, и я не могу понять, в чем проблема. По сути, я пытаюсь запрограммировать цифровой кодовый замок, который мигает красным светодиодом каждый раз, когда вращающийся энкодер поворачивается на одну «галочку» (в любом направлении), и мигает зеленым светодиодом, когда обнаружена правильная «комбинация». , Это немного сложнее, поэтому, когда я столкнулся с проблемами при тестировании своего кода, я решил написать простой метод, который помог бы мне устранить или устранить проблему. Я включил это ниже:
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 первой, она должна указывать, в каком направлении вращался энкодер, поскольку это диктует сдвиг фазы между двумя сигналами. В зависимости от направления вращения (или его отсутствия) красный / зеленый / синий светодиод будет мигать один раз в течение 500 мс, а затем программа будет ждать еще 500 мс, прежде чем снова прослушивать выходной сигнал поворотного энкодера. Однако, когда я запускаю этот код, светодиод будет постоянно мигать красным некоторое время или зеленым некоторое время, в конечном итоге переключаясь с одного цвета на другой с периодическим (одиночным) синим миганием. Это кажется абсолютно случайным каждый раз, и, кажется, полностью игнорирует любое вращение, которое я применяю к поворотному энкодеру.
Что я сделал для устранения неполадок:
Подключил оба выхода поворотного энкодера к осциллографу, чтобы увидеть, есть ли какой-либо выход (все выглядело так, как должно)
Использовал внешний источник питания для питания поворотного энкодера, поскольку я считывал только 1,6 В с вывода VCC 5,0 В на моем ATtiny817-XPRO, когда он был подключен к этому (я подозреваю, что это произошло потому, что светодиоды и поворотный энкодер, вероятно, потребляет слишком много тока)
Измерено напряжение от указанного источника питания, чтобы убедиться, что вращающийся датчик получает 5,0 В (я измерял прибл. 4,97 В)
Проверяется, чтобы убедиться, что схема исправна и работает как надо
К сожалению, ни одна из этих вещей не устранила проблему под рукой. Таким образом, я подозреваю, что мой код может быть виновником, так как это моя первая попытка использования поворотного энкодера, не говоря уже о интерпретации данных, сгенерированных одним из них. Однако, если мой код выглядит так, как будто он должен работать просто отлично, я был бы признателен за любые советы, чтобы я мог сосредоточить свои усилия в другом месте.
Может ли кто-нибудь пролить свет на то, что может быть причиной этой проблемы? Я не думаю, что это неисправная плата, потому что я использовал эти контакты две ночи назад для другого приложения без каких-либо проблем. Кроме того, я все еще новичок, когда дело доходит до AVR, поэтому я уверен, что мой код далеко не настолько надежен, как мог бы.
Спасибо!