Периодичность опроса энкодера?
- Войдите на сайт для отправки комментариев
Сб, 16/04/2016 - 17:25
Доброго времени суток.
Есть такая проблема
/* Функция декодирования кода Грея, взятая с Википедии. Принимает число в коде Грея, возвращает обычное его представление. */ unsigned graydecode(unsigned gray) // { unsigned bin; for (bin = 0; gray; gray >>= 1) bin ^= gray; return bin; } //конец декодирования кода Грея unsigned graydecode1(unsigned gray1) // { unsigned bin1; for (bin1 = 0; gray1; gray1 >>= 1) bin1 ^= gray1; return bin1; } //конец декодирования кода Грея void loop() { ///////////////////////////////////////////////////////////////////////////////////////////// // энкодер // ///////////////////////////////////////////////////////////////////////////////////////////// static uint8_t previous_code = 0; // предыдущий считанный код энкодера static uint8_t previous_code1 = 0; // предыдущий считанный код энкодера /* gray_code - считанное с энкодера значение code - декодированное значение */ uint8_t gray_code = digitalRead(A0) | (digitalRead(A1) << 1), code = graydecode(gray_code); /* Если считался нуль, значит был произведён щелчок ручкой энкодера */ if (code == 0) { switch (previous_code) { case 1: x += 3; fl0 = 1; ms1 = ms; if (x > 320) x = 0; break; case 3: x -= 3; fl0 = 1; ms1 = ms; if (x < 1) x = 320; break; } } uint8_t gray_code1 = digitalRead(2) | (digitalRead(3) << 1), code1 = graydecode1(gray_code1); // Если считался нуль, значит был произведён щелчок ручкой энкодера if (code1 == 0) { switch (previous_code1) { case 1: y += 3; fl0 = 1; ms1 = ms; if (y > 240) y = 0; break; case 3: y -= 3; fl0 = 1; ms1 = ms; if (y < 1) y = 240; break; } } previous_code1 = code1; previous_code = code; //как то связано с энкодером, не трогать! /* Если переход к нулю был из состояния 3 - ручка вращалась * по часовой стрелке, если из 1 - против. */ ///////////////////////////////////////////////////////////////////////////////////////////// // курсор // ///////////////////////////////////////////////////////////////////////////////////////////// if (fl0 == 1) { myGLCD.setColor(155, 155, 255); myGLCD.drawCircle(x, y, 12); } ///////////////////////////////////////////////////////////////////////////////////////////// // обновление экрана после перемещения курсора // ///////////////////////////////////////////////////////////////////////////////////////////// ms = millis(); if (fl0 == 1 && ms - ms1 > 1000) { ms1 = ms; fl0 = 0; myGLCD.clrScr(); myFiles.loadBitmap(0, 0, 320, 240, files[0]); myGLCD.setColor(155, 155, 255); myGLCD.drawCircle(x, y, 12); }
При вращении ручки энкодера курсор перемещается примерно раз в секунду, в то же время если вставить функцию курсора в блок энкодера в switch (previous_code), то курсор перемещается мгновенно, по повороту энкодера, с чем связана задержка смещения?
у тебя обновление экрана 1 раз в секунду, сделай его не по времени а при изменении данных, тогда будет мгновенно...
у тебя обновление экрана 1 раз в секунду, сделай его не по времени а при изменении данных, тогда будет мгновенно...
обновление экрана обновляет картинку, убирая след, в блоке Курсор рисование происходит мгновенно же?