12f629 множественные прерывания
|
|
sa137 |
Дата: Вс, 21.08.2011, 22:44 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
33
Замечания:
±
На сайте с 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
|
|
|
|
ivan_fd |
Дата: Пн, 22.08.2011, 09:39 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Первое, что бросается в глаза - это Quote (sa137) INTCON =%00011000 'Отключение глобальных прерываний, ' прерывание по INT. ' прерывание по изменению сигнала на входе GPIO1
Прерывание по измененению сигнала Вы включили, а глобальные и перерефирийные, кто будет включать?
И второе, из прерывания вызивать другую подпрограмму (gosub) не есть хорошо!!!
|
|
|
|
DAlexV |
Дата: Пн, 22.08.2011, 10:21 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (ivan_fd) из прерывания вызивать другую подпрограмму (gosub) не есть хорошо!!! Правильно, и pause 200 в обработчике прерываний использовать ни есть ГУД.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
ivan_fd |
Дата: Пн, 22.08.2011, 14:03 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (DAlexV) Правильно, и pause 200 в обработчике прерываний использовать ни есть ГУД.
Да , все верно. Но у него нету PAUSE в обработчике прерываний.
|
|
|
|
DAlexV |
Дата: Пн, 22.08.2011, 17:15 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (ivan_fd) Да , все верно. Но у него нету PAUSE в обработчике прерываний. Зато оно есть аж 2 раза в подпрограмме led_blink: (переход из обработчика) (предупредил так сказать заранее )
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
sa137 |
Дата: Пн, 22.08.2011, 21:09 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
33
Замечания:
±
На сайте с 04.07.2011
Статус:
Offline
|
хочу уточнить, что этот проект носит строго образовательный характер. я просто разбираюсь с нюансами. и задача - разобраться, сделать очень наглядно и повторимо в будущем..
а в будущем я хочу сделать контроллер шагового двигателя на 16F630+LB1845/LB1847.. черновик кода уже есть, но пока не хватает знаний собрать все воедино.
теперь к представленному коду.
сделал так:
INTCON =%10011000 'Включены глобальных прерываний, ' прерывание по INT. ' прерывание по изменению сигнала на входе GPIO1
нужны еще какие нибудь изменения ?
стало хуже. на gp1 как и раньше не реагирует. похоже пик после нескольких (обычно 2-3) событий подвисает.. (иногда с включенным светодиодом, иногда с выключенным)
|
|
|
|
ivan_fd |
Дата: Пн, 22.08.2011, 23:53 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Нужно еще периферийные прерывания включить. И убрать из обработчика прерываний вызов процедуры. Сделать по другому!
|
|
|
|
sa137 |
Дата: Вт, 23.08.2011, 00:31 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
33
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Создай флаг, устанавливай в прерывании, а по выходу из прерывания, при условии установленного флага, выполняй то, что тебе нужно
|
|
|
|
sa137 |
Дата: Ср, 24.08.2011, 15:56 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
33
Замечания:
±
На сайте с 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 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (sa137) решил упростить задачу - не использовать процедуры
Вам никто не говорил не использовать процедуры, Вам говорили не вызывать их с прерывания. И еще ------ Quote (DAlexV) и pause 200 в обработчике прерываний использовать ни есть ГУД.
А вы взяли и так и сделали.
Специально для Вас написал, правда на протоне, но оно почти то же.
Смотрите код внимательно, и найдете где Вы допустили ошибку. Еще советую почитать Мануал на контроллер, а именно страница 22 "Прерывания по изменению уровня сигнала на входах"
Удачи!
|
|
|
|
sa137 |
Дата: Ср, 31.08.2011, 20:54 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
33
Замечания:
±
На сайте с 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-а не совместим? имеется ввиду в которой можно на бейсике программировать.
|
|
|
|