Перейти к содержанию

Обработка 4 Инкрементальных Энкодерво.


pryanic

Рекомендуемые сообщения

Доброго времени суток. Появилась необходимость использовать 4 инкрементальных энкодера. Вопрос встал в обработке всего этого дела. При 1 или 2 все делается довольно просто на внешних прерываниях.

Но вот с четыремя сложновато. Была мысль сделать все на прерываниях по изменению состояния выводов (PCINT), но чувствуется будет это все нестабильно работать.

Может спецы подскажут способ? Скорее всего придется делать сканирование по прерыванию таймера и сравнивать состояния.

Желательно на АСМе)))

Изменено пользователем pryanic

Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Если, понравилось на прерываниях, то и делай! Количество внешних прерываний, можно увеличить внешним контроллером прерываний, или расширителем портов с функцией прерывания.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Опрашиваем все энкодеры каждые 10мс и по состоянию делаем выводы (в смысле принимаем решение). Сколько бы их (энкодеров) ни было, все опросятся и зарегистрируются.

PS. В очередь, сукины дети, в очередь! (с)

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Простой опрос будет занимать много времени.

Нашел пример на СИ на easyelectronics, но как бы все это на ассемблер перевести.

Изменено пользователем pryanic

Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Ссылка на комментарий
Поделиться на другие сайты

Простой опрос будет занимать много времени.

Я вас умоляю.

Для чистоты эксперимента сканирование энкодера будем помещать в обработчик прерывания, например, от таймера — там будет сразу видно сколько регистров надо сохранять. Сами функции сканирования энкодера будем делать встраиваемыми, что их тело помещалось непосредственно в обработчик прерывания.

Найдите хотя бы одно отличие от моего предложения.

как бы все это на ассемблер перевести.

Компилируете и ищете в папке ассемблерный файл.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

А вообще, давно уже есть контроллеры с аппаратным энкодером...

Например?

Если имеется в виду регуляторы громкости с возможностью прямого подключения энкодера, то такие приборы обладают обычно весьма посредственными параметрами (Max 5440 и т.д.).

Изменено пользователем pryanic

Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Ссылка на комментарий
Поделиться на другие сайты

Попробовал скомпилить и дизассемблить код с easyelectronics. Получилась конечно лютая жесть.

+00000000: 940C002A JMP 0x0000002A Jump
+00000002: 940C003C JMP 0x0000003C Jump
+00000004: 940C003C JMP 0x0000003C Jump
+00000006: 940C003C JMP 0x0000003C Jump
+00000008: 940C003C JMP 0x0000003C Jump
+0000000A: 940C003C JMP 0x0000003C Jump
+0000000C: 940C0077 JMP 0x00000077 Jump
+0000000E: 940C003C JMP 0x0000003C Jump
+00000010: 940C003C JMP 0x0000003C Jump
+00000012: 940C003E JMP 0x0000003E Jump
+00000014: 940C003C JMP 0x0000003C Jump
+00000016: 940C003C JMP 0x0000003C Jump
+00000018: 940C003C JMP 0x0000003C Jump
+0000001A: 940C003C JMP 0x0000003C Jump
+0000001C: 940C003C JMP 0x0000003C Jump
+0000001E: 940C003C JMP 0x0000003C Jump
+00000020: 940C003C JMP 0x0000003C Jump
+00000022: 940C003C JMP 0x0000003C Jump
+00000024: 940C003C JMP 0x0000003C Jump
+00000026: 940C003C JMP 0x0000003C Jump
+00000028: 940C003C JMP 0x0000003C Jump
+0000002A: 2411 CLR R1 Clear Register
+0000002B: BE1F OUT 0x3F,R1 Out to I/O location
+0000002C: E5CF LDI R28,0x5F Load immediate
+0000002D: E0D4 LDI R29,0x04 Load immediate
+0000002E: BFDE OUT 0x3E,R29 Out to I/O location
+0000002F: BFCD OUT 0x3D,R28 Out to I/O location
+00000030: E010 LDI R17,0x00 Load immediate
+00000031: E6A0 LDI R26,0x60 Load immediate
+00000032: E0B0 LDI R27,0x00 Load immediate
+00000033: C001 RJMP PC+0x0002 Relative jump
+00000034: 921D ST X+,R1 Store indirect and postincrement
+00000035: 37A5 CPI R26,0x75 Compare with immediate
+00000036: 07B1 CPC R27,R17 Compare with carry
+00000037: F7E1 BRNE PC-0x03 Branch if not equal
+00000038: 940E00BD CALL 0x000000BD Call subroutine
+0000003A: 940C00C0 JMP 0x000000C0 Jump
+0000003C: 940C0000 JMP 0x00000000 Jump
+0000003E: 921F PUSH R1 Push register on stack
+0000003F: 920F PUSH R0 Push register on stack
+00000040: B60F IN R0,0x3F In from I/O location
+00000041: 920F PUSH R0 Push register on stack
+00000042: 2411 CLR R1 Clear Register
+00000043: 932F PUSH R18 Push register on stack
+00000044: 938F PUSH R24 Push register on stack
+00000045: 939F PUSH R25 Push register on stack
+00000046: B323 IN R18,0x13 In from I/O location
+00000047: 7023 ANDI R18,0x03 Logical AND with immediate
+00000048: 91800072 LDS R24,0x0072 Load direct from data space
+0000004A: 0F88 LSL R24 Logical Shift Left
+0000004B: 0F88 LSL R24 Logical Shift Left
+0000004C: 2B82 OR R24,R18 Logical OR
+0000004D: 3089 CPI R24,0x09 Compare with immediate
+0000004E: F448 BRCC PC+0x0A Branch if carry cleared
+0000004F: 3087 CPI R24,0x07 Compare with immediate
+00000050: F498 BRCC PC+0x14 Branch if carry cleared
+00000051: 3082 CPI R24,0x02 Compare with immediate
+00000052: F059 BREQ PC+0x0C Branch if equal
+00000053: 3084 CPI R24,0x04 Compare with immediate
+00000054: F049 BREQ PC+0x0A Branch if equal
+00000055: 3081 CPI R24,0x01 Compare with immediate
+00000056: F4B1 BRNE PC+0x17 Branch if not equal
+00000057: C00C RJMP PC+0x000D Relative jump
+00000058: 308D CPI R24,0x0D Compare with immediate
+00000059: F021 BREQ PC+0x05 Branch if equal
+0000005A: 308E CPI R24,0x0E Compare with immediate
+0000005B: F041 BREQ PC+0x09 Branch if equal
+0000005C: 308B CPI R24,0x0B Compare with immediate
+0000005D: F479 BRNE PC+0x10 Branch if not equal
+0000005E: 91800073 LDS R24,0x0073 Load direct from data space
+00000060: 91900074 LDS R25,0x0074 Load direct from data space
+00000062: 9601 ADIW R24,0x01 Add immediate to word
+00000063: C005 RJMP PC+0x0006 Relative jump
+00000064: 91800073 LDS R24,0x0073 Load direct from data space
+00000066: 91900074 LDS R25,0x0074 Load direct from data space
+00000068: 9701 SBIW R24,0x01 Subtract immediate from word
+00000069: 93900074 STS 0x0074,R25 Store direct to data space
+0000006B: 93800073 STS 0x0073,R24 Store direct to data space
+0000006D: 93200072 STS 0x0072,R18 Store direct to data space
+0000006F: 919F POP R25 Pop register from stack
+00000070: 918F POP R24 Pop register from stack
+00000071: 912F POP R18 Pop register from stack
+00000072: 900F POP R0 Pop register from stack
+00000073: BE0F OUT 0x3F,R0 Out to I/O location
+00000074: 900F POP R0 Pop register from stack
+00000075: 901F POP R1 Pop register from stack
+00000076: 9518 RETI Interrupt return
+00000077: 921F PUSH R1 Push register on stack
+00000078: 920F PUSH R0 Push register on stack
+00000079: B60F IN R0,0x3F In from I/O location
+0000007A: 920F PUSH R0 Push register on stack
+0000007B: 2411 CLR R1 Clear Register
+0000007C: 932F PUSH R18 Push register on stack
+0000007D: 933F PUSH R19 Push register on stack
+0000007E: 934F PUSH R20 Push register on stack
+0000007F: 935F PUSH R21 Push register on stack
+00000080: 938F PUSH R24 Push register on stack
+00000081: 939F PUSH R25 Push register on stack
+00000082: 93EF PUSH R30 Push register on stack
+00000083: 93FF PUSH R31 Push register on stack
+00000084: B323 IN R18,0x13 In from I/O location
+00000085: B390 IN R25,0x10 In from I/O location
+00000086: 91400061 LDS R20,0x0061 Load direct from data space
+00000088: 2742 EOR R20,R18 Exclusive OR
+00000089: 91800060 LDS R24,0x0060 Load direct from data space
+0000008B: 2789 EOR R24,R25 Exclusive OR
+0000008C: 2F58 MOV R21,R24 Copy register
+0000008D: 9550 COM R21 One's complement
+0000008E: 2354 AND R21,R20 Logical AND
+0000008F: 9540 COM R20 One's complement
+00000090: 2348 AND R20,R24 Logical AND
+00000091: 93200060 STS 0x0060,R18 Store direct to data space
+00000093: 93900061 STS 0x0061,R25 Store direct to data space
+00000095: E080 LDI R24,0x00 Load immediate
+00000096: E090 LDI R25,0x00 Load immediate
+00000097: 01FC MOVW R30,R24 Copy register pair
+00000098: 59EE SUBI R30,0x9E Subtract immediate
+00000099: 4FFF SBCI R31,0xFF Subtract immediate with carry
+0000009A: FF50 SBRS R21,0 Skip if bit in register set
+0000009B: C005 RJMP PC+0x0006 Relative jump
+0000009C: 8120 LDD R18,Z+0 Load indirect with displacement
+0000009D: 8131 LDD R19,Z+1 Load indirect with displacement
+0000009E: 5F2F SUBI R18,0xFF Subtract immediate
+0000009F: 4F3F SBCI R19,0xFF Subtract immediate with carry
+000000A0: C006 RJMP PC+0x0007 Relative jump
+000000A1: FF40 SBRS R20,0 Skip if bit in register set
+000000A2: C006 RJMP PC+0x0007 Relative jump
+000000A3: 8120 LDD R18,Z+0 Load indirect with displacement
+000000A4: 8131 LDD R19,Z+1 Load indirect with displacement
+000000A5: 5021 SUBI R18,0x01 Subtract immediate
+000000A6: 4030 SBCI R19,0x00 Subtract immediate with carry
+000000A7: 8331 STD Z+1,R19 Store indirect with displacement
+000000A8: 8320 STD Z+0,R18 Store indirect with displacement
+000000A9: 9602 ADIW R24,0x02 Add immediate to word
+000000AA: 3180 CPI R24,0x10 Compare with immediate
+000000AB: 0591 CPC R25,R1 Compare with carry
+000000AC: F019 BREQ PC+0x04 Branch if equal
+000000AD: 9556 LSR R21 Logical shift right
+000000AE: 9546 LSR R20 Logical shift right
+000000AF: CFE7 RJMP PC-0x0018 Relative jump
+000000B0: 91FF POP R31 Pop register from stack
+000000B1: 91EF POP R30 Pop register from stack
+000000B2: 919F POP R25 Pop register from stack
+000000B3: 918F POP R24 Pop register from stack
+000000B4: 915F POP R21 Pop register from stack
+000000B5: 914F POP R20 Pop register from stack
+000000B6: 913F POP R19 Pop register from stack
+000000B7: 912F POP R18 Pop register from stack
+000000B8: 900F POP R0 Pop register from stack
+000000B9: BE0F OUT 0x3F,R0 Out to I/O location
+000000BA: 900F POP R0 Pop register from stack
+000000BB: 901F POP R1 Pop register from stack
+000000BC: 9518 RETI Interrupt return
+000000BD: 940E0077 CALL 0x00000077 Call subroutine
+000000BF: CFFF RJMP PC-0x0000 Relative jump
+000000C0: 94F8 CLI Global Interrupt Disable
+000000C1: CFFF RJMP PC-0x0000 Relative jump
+000000C2: FFFF ??? Data or unknown opcode
+000000C3: FFFF ??? Data or unknown opcode

Попробую вкурить.

Антон. Блог

HTPC -> foobar2000 -> SMSL M8A -> Nataly 2012 -> Focal JMLab Tantal 515

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...