|
pryomys
|
|
обработка инкрементального энкодера на прерываниях (asm)03.12.2012, 01:08. Показов 13425. Ответов 25
Метки нет (Все метки)
Приветствую сообщество.
Пытаюсь нарулить на ассемблере код обработки энкодера, оно вроде функционирует, но с большими глюками. Вкратце: энкодер подключен к D1, D2. 4 светодиода подключены к PC0-PC3 (первые 2 подключены к -, вторые - к плюсу; так сделано на отладочной плате), поэтому в регистре перед выводом в порт инвертируются 2 последних бита с помощью. EOR. Задача программы: при повороте вправо увеличиваем счетчик (если насчитываем 15, то ничего не делаем) и выводим в PortC. При движении влево уменьшаем счетчик (при достижении 0 ничего не делаем). Задержка по переполнению Таймера0 (с делителем 256 получается 16 мс при 4 МГц). Дело не в дребезге, посмотрел осциллографом - фронты почти идеальные. Пробовал уменьшать/увеличивать величину задержки - не помогает. При быстром вращении глючит (моргают ненужные светодиоды), при вращении назад ситуация такая же плюс вообще начинает инкременировать счетчик если быстро крутить. Алгоритм с некоторыми изменениями взял из статьи про энкодер. Зашли в обработчик INT0 Запретили локально INT0 Пощупали второй канал +1 или -1 (если 1, то проверяем счетчик на равенство 0b00001111, если равно, то выходим из прерывания, если нет, то увеличиваем счетчик; если 0, то проверяем счетчик на 0b00000000, если равно, то выходим, если нет, то уменьшаем на 1) Запускаем Т0 с предделителем 256 Вышли из обработчика вошли в обработчик прерывания Т0. останавливаем таймер разрешаем INT0 выходим из прерывания Прерывание запрещаем сразу после входа в процедуру обработки прерывания. В аттаче проект студии. [7.27 Кб] |
|
| 03.12.2012, 01:08 | |
|
Ответы с готовыми решениями:
25
Обработка энкодера Обработка сигналов энкодера Обработка строк [asm+pas] |
|
SWK
|
||
| 03.12.2012, 02:18 | ||
|
||
|
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 191
|
|
| 03.12.2012, 08:35 | |
|
Я сталкивался с подобынами глюками тоже. Причем первый раз пробовал работать с энкодером, который выдрал со старого моника. Программу написал с использованием внешнего прерывания по одной ноге. После прерывания опрашивал другую и делал вывод куда крутим. После этого я положил все это в долгий ящик. А тут приспичило энкодер в одно место поставить. Купил такой же в нигазине, запустил с этой программой и начались глюки. Что я только не делал с программой, ничего не выходило. По осциллографу все фронты были четкие, без дребезга.
Решил проблему отказавшись от внешнего прерывания. Измерил осциллографом минимальную длительность импульса при самом быстром вращении энкодера, которое можно осуществить рукой. Написал функцию опроса энкодера. В ней проверяю текущее состояние линий А и В и предыдущее. По этим данным делаю вывод куда крутим. Функцию вызываю не реже длительности измерянного импульса. Все очень даже не плохо работает.
0
|
|
|
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 461
|
|
| 03.12.2012, 14:20 | |
|
..маленький советик: обратите внимание на тип энкодера, есть как минимум два основных типа, первый - оба выходных контакта между щелчками висят в воздухе, второй - между щелчками один из выходов замкнут с общим и так они попеременно остаются замкнутыми через щелчёк. Если алгоритм этого обстоятельства не учитывает, то и будут наблюдаться всякого рода глюки, потому как, если код был написан для одного типа, совсем необязательно, что он будет нормально работать с другим типом энкодера
0
|
|
|
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
|
||
| 03.12.2012, 19:04 | ||
вошли в обработчик прерывания Т0. останавливаем таймер сбрасываем флаг прерывания INT0 (записью единицы!) разрешаем INT0 выходим из прерывания .....
0
|
||
|
pryomys
|
||
| 04.12.2012, 15:05 | ||
Попробовал сбросить флаги внешних прерываний в обработчике INT0 - не помогло. Осциллограммы энкодера: |
||
|
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
|
|||||||
| 04.12.2012, 19:30 | |||||||
0
|
|||||||
|
pryomys
|
||
| 04.12.2012, 20:32 | ||
|
||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
| 04.12.2012, 21:11 | |
|
А на С совсем не вариант?..... Просто есть рабочий код от Л.И.
0
|
|
|
pryomys
|
|
| 04.12.2012, 21:27 | |
|
Спасибо, но Си не вариант.
|
|
|
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
|
||
| 04.12.2012, 21:30 | ||
0
|
||
|
pryomys
|
||
| 04.12.2012, 22:28 | ||
|
||
|
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
|
||
| 04.12.2012, 23:50 | ||
0
|
||
|
pryomys
|
|
| 05.12.2012, 00:35 | |
|
Подождите...
Ведь в момент срабатывания прерывания у нас на второй ноге энкодера уровни уже установились, фронтов сигнала нет. Дребезга соответственно тоже нет. Или я опять что-то не понимаю. |
|
|
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
|
||
| 05.12.2012, 10:03 | ||
|
[QUOTE="pryomys"][QUOTE="Цитата:[/QUOTE]
0
|
||
|
dork
|
||
| 05.12.2012, 17:20 | ||
буду благодарен... |
||
|
pryomys
|
|||||||
| 05.12.2012, 22:13 | |||||||
|
|||||||
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
| 06.12.2012, 01:53 | |
|
Обычно, флаг сначала очищают , а потом разрешают прерывание
0
|
|
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|||||||
| 06.12.2012, 02:24 | |||||||
буду благодарен...
0
|
|||||||
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|||
| 06.12.2012, 02:39 | |||
|
:))))
0
|
|||
| 06.12.2012, 02:39 | |
|
Помогаю со студенческими работами здесь
20
Сделать методом инкрементального программирования с использованием вектора Непонятное поведение bacula при создании инкрементального бэкапа Создание проекта с участием c++ и asm модулей. Ошибка asm модуля Delphi и ASM - не работает вызов функции Invoke через asm Баги в прерываниях Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|