Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » 12f629 множественные прерывания
12f629 множественные прерывания
sa137 Дата: Вс, 21.08.2011, 22:44  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

опять затык у меня с прерываниями..

по входу gp1 - вообще не реагирует, gp2 - бессистемно мигает некоторое к-во раз.

'****************************************************************
' прерывание по спаду напряжени на ноге GPIO2/INT
' сбрасываем счетчик и мигаем 1 раз
' прерывание по спаду на GPIO1
' увеличиваем счетчик на 1 (до 5) и мигаем соответсвующее число раз

'pin1 +V power
'..
'pin5 GPIO2 - вход кнопки сброса
'pin6 GPIO1 - вход кнопки увеличения счетчика
'pin7 GPIO0 output LED
'pin8 GND

@ DEVICE WDT_OFF, MCLR_OFF, INTRC_OSC_NOCLKOUT, INTRC_OSC, BOD_OFF

' Define clock options
DEFINE OSC 4
Define OSCCAL_1K 1 ' Set OSCCAL for 1K device

' setup trig & pin
CMCON =%00000111 ' DISABLE COMPARATOR
TRISIO =%00000110 ' GPIO1, GPIO2 input, other pin output

OPTION_REG.7 = 0 ' Enable Pullup Port Latches
OPTION_REG.6 = 0 ' прерывание по спаду INT

INTCON =%00011000 'Отключение глобальных прерываний,
' прерывание по INT.
' прерывание по изменению сигнала на входе GPIO1

WPU =%00000110 ' GPIO1, GPIO2 pull-up resistor enable

'alias
LED var GPIO.0
PLUS Var GPIO.1
RESET var GPIO.2
i var byte
k var byte

On Interrupt GoTo display

i=1:k=1

high led ' мигнем для проверки
pause 500
toggle led
pause 500

main:
goto main

led_blink:
toggle LED
pause 200
Toggle LED
pause 200
return

disable
display: ' разбираем источник прерывания
If (INTCON.1 =1) then ' прерывание по входу INT
' INTCON.1 = %00000010 ' Сбросим флаг прерывания по входу INT
INTCON.1 = 0
gosub led_blink
i=1
endif

If (INTCON.0 =1) then ' прерывание по перепаду GPIO
' INTCON.0 = %00000001 ' Сбросим флаг прерывания по входу GPIO
INTCON.0 = 0
if i=5 then ' ограничиваем счетчик 5
i=1
else
i=i+1
endif
for k=1 to i
gosub led_blink
next k
endif
resume
enable
ЯНДЕКС Дата: 21.08.2011
ivan_fd Дата: Пн, 22.08.2011, 09:39  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Первое, что бросается в глаза - это
Quote (sa137)
INTCON =%00011000 'Отключение глобальных прерываний,
' прерывание по INT.
' прерывание по изменению сигнала на входе GPIO1


Прерывание по измененению сигнала Вы включили, а глобальные и перерефирийные, кто будет включать?

И второе, из прерывания вызивать другую подпрограмму (gosub) не есть хорошо!!!


Меня все время преследуют умные мысли...но я быстрее!!!
DAlexV Дата: Пн, 22.08.2011, 10:21  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ivan_fd)
из прерывания вызивать другую подпрограмму (gosub) не есть хорошо!!!
Правильно, и pause 200 в обработчике прерываний использовать ни есть ГУД.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ivan_fd Дата: Пн, 22.08.2011, 14:03  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (DAlexV)
Правильно, и pause 200 в обработчике прерываний использовать ни есть ГУД.


Да , все верно. Но у него нету PAUSE в обработчике прерываний.


Меня все время преследуют умные мысли...но я быстрее!!!
DAlexV Дата: Пн, 22.08.2011, 17:15  |                                                                                                                Сообщение # 5
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ivan_fd)
Да , все верно. Но у него нету PAUSE в обработчике прерываний.

Зато оно есть аж 2 раза в подпрограмме led_blink: (переход из обработчика) (предупредил так сказать заранее biggrin )


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
sa137 Дата: Пн, 22.08.2011, 21:09  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

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

а в будущем я хочу сделать контроллер шагового двигателя на 16F630+LB1845/LB1847.. черновик кода уже есть, но пока не хватает знаний собрать все воедино.

теперь к представленному коду.

сделал так:

INTCON =%10011000 'Включены глобальных прерываний,
' прерывание по INT.
' прерывание по изменению сигнала на входе GPIO1

нужны еще какие нибудь изменения ?

стало хуже. на gp1 как и раньше не реагирует.
похоже пик после нескольких (обычно 2-3) событий подвисает.. (иногда с включенным светодиодом, иногда с выключенным)
ivan_fd Дата: Пн, 22.08.2011, 23:53  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Нужно еще периферийные прерывания включить. И убрать из обработчика прерываний вызов процедуры. Сделать по другому!

Меня все время преследуют умные мысли...но я быстрее!!!
sa137 Дата: Вт, 23.08.2011, 00:31  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

Quote (ivan_fd)
Нужно еще периферийные прерывания включить.

надо сделать так ?

INTCON.7=1
INTCON.6=1
INTCON.4=1
INTCON.3=1

Quote (ivan_fd)
И убрать из обработчика прерываний вызов процедуры.

а это принципиально ?

просто более простой вариант у меня безошибочно работает
----------------------
' прерывание по перепаду напряжени на ноге GPIO2
' моргаем светодиодом

'pin1 +V power
'..
'pin5 GPIO2 - вход кнопки
'..
'pin7 GPIO0 output LED
'pin8 GND

@ DEVICE WDT_OFF, MCLR_OFF, INTRC_OSC_NOCLKOUT, INTRC_OSC, BOD_OFF

' Define clock options
DEFINE OSC 4
Define OSCCAL_1K 1 ' Set OSCCAL for 1K device

' setup trig & pin
CMCON =%00000111 ' DISABLE COMPARATOR
TRISIO =%00000100 ' GPIO2 input, other pin output

OPTION_REG.7 = 0 ' Enable Pullup Port Latches
OPTION_REG.6 = 0 ' прерывание по спаду
INTCON =%00010000 'Отключение глобальных прерываний, прерывание по INT.

WPU =%00000100 ' GPIO2 pull-up resistor enable

'alias
LED var GPIO.0
OUT Var GPIO.1
IN var GPIO.2

On Interrupt GoTo display

high led ' мигнем для проверки
pause 500
toggle led

main:
goto main

disable
display:
toggle out
toggle LED
pause 500
INTCON.1 = %00000010 ' Сбросим флаг прерывания по входу INT
resume
enable
----------------------

что удивляет, что я здесь не пользовался ни глобальными, ни периферийными прерываниями...
правда процедуры здесь не лепил...

а как сделать красиво и коротко без процедуры ? не писать же одинаковый кусок кода 5 раз!
MasterPic Дата: Вт, 23.08.2011, 04:02  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Создай флаг, устанавливай в прерывании, а по выходу из прерывания, при условии установленного флага, выполняй то, что тебе нужно
sa137 Дата: Ср, 24.08.2011, 15:56  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

продолжаем изучение. решил упростить задачу - не использовать процедуры

------------------------
' прерывание по спаду напряжени на ноге GPIO2/INT мигаем 1 раз
' прерывание по спаду на GPIO1 мигаем 2 раза

'pin1 +V power
'..
'pin5 GPIO2 - вход кнопки мигания 1 раз
'pin6 GPIO1 - вход кнопки мигания 2 раза
'pin7 GPIO0 output LED
'pin8 GND

@ DEVICE WDT_OFF, MCLR_OFF, INTRC_OSC_NOCLKOUT, INTRC_OSC, BOD_OFF

' Define clock options
DEFINE OSC 4
Define OSCCAL_1K 1 ' Set OSCCAL for 1K device

' setup trig & pin
CMCON =%00000111 ' DISABLE COMPARATOR
TRISIO =%00000110 ' GPIO1, GPIO2 input, other pin output

OPTION_REG.7 = 0 ' Enable Pullup Port Latches
OPTION_REG.6 = 0 ' прерывание по спаду INT

'INTCON =%00011000
INTCON =%11011000 ' включение глобальных прерываний,
' включение прерываний от переферии
' прерывание по INT.
' прерывание по изменению сигнала на входе GPIO1

WPU =%00000110 ' GPIO1, GPIO2 pull-up resistor enable

'alias
LED var GPIO.0
PLUS Var GPIO.1
RESET var GPIO.2

On Interrupt GoTo display

high led ' мигнем для проверки
pause 500
toggle led
pause 500

main:
goto main

disable
display: ' разбираем источник прерывания
If (INTCON.1 =1) then ' прерывание по входу INT
' INTCON.1 = %00000010 ' Сбросим флаг прерывания по входу INT
INTCON.1 = 0
toggle LED
pause 200
Toggle LED
pause 200
endif

If (INTCON.0 =1) then ' прерывание по перепаду GPIO
' INTCON.0 = %00000001 ' Сбросим флаг прерывания по входу GPIO
INTCON.0 = 0
toggle LED
pause 200
Toggle LED
pause 200
toggle LED
pause 200
Toggle LED
pause 200
endif
resume
enable
------------------------

что имею сейчас - реагирование по входу GP2(INT)! по входу GP1 реакции нет.
самое странное что мигает два раза, как будто выполняется кусок кода для простого перепада на входах GP5-GP0.

почитав доку на процы нашел интересный факт :

Depending on the model used, different PIC microcontrollers may have different number of interrupt
sources. For example, PIC16F84 microcontroller has the following four sources of interrupts:
● External interrupt from INT (RB0) pin
● External interrupt when the state of RB4, RB5, RB6, or RB7 pins change

для 629
прерывание по изменению сигнала на входах GP5:GP0, но дело в том, что INT это есть GP2.

может это хардварное ограничение - и он просто не может разобрать источник?
хотя почему он тогда не реагирует на GP1 ...
ivan_fd Дата: Ср, 24.08.2011, 22:12  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (sa137)
решил упростить задачу - не использовать процедуры


Вам никто не говорил не использовать процедуры, Вам говорили не вызывать их с прерывания.
И еще ------
Quote (DAlexV)
и pause 200 в обработчике прерываний использовать ни есть ГУД.


А вы взяли и так и сделали.

Специально для Вас написал, правда на протоне, но оно почти то же.

Смотрите код внимательно, и найдете где Вы допустили ошибку. Еще советую почитать Мануал на контроллер, а именно страница 22

"Прерывания по изменению уровня сигнала на входах"


Удачи!
Прикрепления: 12f629Interrupt.rar(35Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
sa137 Дата: Ср, 31.08.2011, 20:54  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 33
Репутация: 0   ±
Замечания:   ±
На сайте с 04.07.2011

Статус: Offline

Quote (ivan_fd)
Специально для Вас написал, правда на протоне, но оно почти то же.


поизучал..

из разительных отличий нашел 2 куска кода

IOCB.1 = 1
IOCB.2 = 0 (об этом вообще не знал)

и использование миганий вне процедуры обработки прерываний..

спасибо за помощь!
возьму пока паузу - дождусь приезда USB программатора. о результатах отпишусь.

Добавлено (31.08.2011, 20.54.24)
---------------------------------------------
приехал USB PICkit 3 с платкой расширения с ZIF панельками.
скоро доработаю для программирования мелковыводных пиков и продолжим.

p.s.
наверное он ни с какой другой оболочкой кроме MPLAB-а не совместим? имеется ввиду в которой можно на бейсике программировать.

Форум Picbasic.ru » Программирование МК » PicBasicPro » 12f629 множественные прерывания
Страница 1 из 11
Поиск: