Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/58: Рейтинг темы: голосов - 58, средняя оценка - 4.71
pryomys
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 11
1

обработка инкрементального энкодера на прерываниях (asm)

03.12.2012, 01:08. Просмотров 10899. Ответов 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 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 01:08
Ответы с готовыми решениями:

Обработка энкодера
Имеется трёх импульсный энкодер (если это правильное название), т.е. датчик который имеет три линии...

Обработка строк [asm+pas]
Дан текст не более 255 символов. Составить словарь уникальных символов. Программа состоит из двух...

Непонятное поведение bacula при создании инкрементального бэкапа
Здравствуйте, я всего несколько дней как взялся настраивать bacula и появилась проблема описание...

USART на прерываниях
Добрый день. Я делаю терморегулятор на 18В20 и АтТини2313. Терморегулятор принимает через усарт...

Запутался в прерываниях
В общем стоит такая задача: Через мультиплексор на вход контроллера последовательно подаются 4...

25
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
06.12.2012, 02:54 21
http://code.google.com/p/demotomk/source/browse/TankDimo/NCod.asm

Не на прерываниях, но общий ход вещей может прояснить.
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
06.12.2012, 19:15 22
ShodS, спасибо!

Цитата Сообщение от pryomys
Спасибо, но Си не вариант.
Это не мне, а ShodS, спасибо.
Тык если есть готовый алгоритм на СИ переложите на asm и на прерывания...

зы
хотя я сильно сомневаюсь, что серьезно можно ужать то, что выдает компилятор после СИ, тут всего то 66 слов...
0
Yurkom
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
06.12.2012, 20:51 23
Цитата Сообщение от YTYOUT
Обычно, флаг сначала очищают , а потом разрешают прерывание
Естественно!
pryomys, поменяй местами эти куски
Код
 ldi      temp,   0b01000000
out      GICR,   temp         ;разрешаем INT0
Код
ser      temp
out      GIFR,   temp         ;очищаем регистр флагов внешных прерываний
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
06.12.2012, 21:03 24
Он расплодил сию тему по нескольким форумам , так, что я даже перестал понимать на каком этапе он сейчас находится
0
06.12.2012, 21:03
Yurkom
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
06.12.2012, 22:52 25
pryomys, попробуй так:

Допустим, прерывание INT0 настроено по спаду.
Обработчик INT0
1. Запрещаем прерывания от INT0
2. Запускаем T0
3. Проверяем уровень на пине INT0, если не ноль, то выходим из обработчика.
4. Щупаем второй канал, делаем +1/-1
5. Выходим

Обработчик T0
1. останавливаем T0
2. сбрасываем флаг INT0
3. разрешаем INT0
4. выходим

У мня по такому принципу (ну почти) это нормально работает с механическим дребезжащим энкодером.
0
pryomys
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 11
07.12.2012, 00:57 26
YurkoM, а Т0 - вложенное прерывание или нет?

Надо было подумать сначала. А почему тогда запускаем таймер в начале обработчика, а не перед самым выходом?
Попробовал по Вашему алгоритму... не помогло к сожалению. Листинг http://iosyitistromyss.ru/repository.php?act=view&id=100
0
07.12.2012, 00:57
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 00:57

Запутался в прерываниях
В общем стоит такая задача: Через мультиплексор на вход контроллера последовательно подаются 4...

Создание проекта с участием c++ и asm модулей. Ошибка asm модуля
Доброго времени суток! Подскажите, пожалуйста, как исправить данную ошибку (А2008)?

Delphi и ASM - не работает вызов функции Invoke через asm
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.