Энкодер и PIC16f877 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Энкодер и PIC16f877 (Зависает программа в обработчике прерываний по входу RB0)
Энкодер и PIC16f877
Gysmi Дата: Вт, 18.08.2015, 16:08  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

Энкодер подключён к RB.0 и RB.1
Простая программа -увеличиваем или уменьшаем переменную С.
Разрешены прерывания по входу int RB0
ON INTERRUPT GOTO ENCODER
ENCODER:
if PORTB.1=1 then c=c+1
if PORTB.1=0 then c=c-1
INTCON.1=0
RESUME
ENABLE
end
Как только крутану энкодер на 1 щелчок сразу программа зависает.
Переменную вывожу на лсд индикатор 0-255.
Осваиваю энкодер(при вращении энкодера должна изменяться переменная визуально )
Программу смотрю в отладке  тоже.

Сообщение отредактировал Gysmi - Вт, 18.08.2015, 16:10
ЯНДЕКС Дата: 18.08.2015
dimvad Дата: Вт, 18.08.2015, 17:25  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 60
Репутация: 9   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Вообще-то, энкодер лучше в аппаратных прерываниях обрабатывать.
Gysmi Дата: Вт, 18.08.2015, 17:58  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

Где у меня ошибка?
dimvad Дата: Вт, 18.08.2015, 18:20  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 60
Репутация: 9   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Вы используете программное прерывание, которое происходит не сразу, а с задержкой, в зависимости от того, что делает основная программа. Поэтому энкодер в таком оформлении будет глючить, лагать. Это во-первых. Во-вторых, надо выводить печать переменной в самом прерывании, и использовать аппаратное прерывание ON_INTERRUPT.

Добавлено (18.08.2015, 18:20)
---------------------------------------------
Сейчас поищу в компе. Была у меня тренировачная моделька.

dimvad Дата: Вт, 18.08.2015, 18:26  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 60
Репутация: 9   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Во, нашел.
Прикрепления: encoder.rar(34Kb)
Gysmi Дата: Вт, 18.08.2015, 18:39  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

ОК
Спасибо,dimvad!
ivan_fd Дата: Вт, 18.08.2015, 23:01  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

1. Человек пишет не на Протоне, а Вы даете ему команды Протона.
2. В PicBasicPro, что бы сделать нормальное прерывание, его нужно делать на ассемблере.
Посмотрите в примерах, там есть.

Удачи.


Меня все время преследуют умные мысли...но я быстрее!!!
Gysmi Дата: Ср, 19.08.2015, 18:31  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

Немного разобрался-инкремент заработал(правда иногда пропуски есть).Но вычитать никак не хочет(что вправо,что влево кручу,всё прибавляет) Куда декремент делся?
if PORTB.1=1 then c=c+1
if PORTB.1=0 then c=c -1
Это ведь должно работать?

Сообщение отредактировал Gysmi - Ср, 19.08.2015, 18:33
ivan_fd Дата: Чт, 20.08.2015, 11:53  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 881
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Gysmi,  почитайте ЭТУ статью, может поможет Вам.

Меня все время преследуют умные мысли...но я быстрее!!!
xvovanx Дата: Пт, 21.08.2015, 00:12  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 247
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Gysmi ()
Немного разобрался-инкремент заработал(правда иногда пропуски есть).Но вычитать никак не хочет(что вправо,что влево кручу,всё прибавляет) Куда декремент делся? if PORTB.1=1 then c=c+1 if PORTB.1=0 then c=c -1 Это ведь должно работать?

Нет не будет работать. 1 в порту В.1 будет появляться всегда -вот и прибавляет. Почитайте принцип сдвига сигналов для увеличения и уменьшения при работе энкодера, как советовал ivan_fd
ADMIN Дата: Вт, 25.08.2015, 09:30  |                                                                                                                Сообщение # 11
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вот пример работы с энкодером
holyuser Дата: Вт, 25.08.2015, 11:51  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 233
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Пример работы с механическим энкодером типа ED1112.
Кручением меняется цвет свечения светодиода, а нажатием кнопки энкодера светодиод выключается/включается.
Заодно, на ЖКИ выводится переменная, изменяемая энкодером.
Прикрепления: ED1112.pbp.txt(5Kb)

Сообщение отредактировал holyuser - Вт, 25.08.2015, 11:53
Форум Picbasic.ru » Программирование МК » PicBasicPro » Энкодер и PIC16f877 (Зависает программа в обработчике прерываний по входу RB0)
Страница 1 из 11
Поиск: