Работа с прерываниями
|
xvovanx |
Дата: Сб, 16.04.2016, 22:52 | Сообщение # 46 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
446
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Anatoliy1000, я так понимаю, что вы хотите чтобы прерывания срабатывали при нажатии любой из кнопок на одном аналоговом входе? Так не выйдет. Входу INT нужна явная единица для срабатывания (2/3U-U), аналоговый вход видит даже 1/1024U. И еще, вот ваша строка проги: If ADIn 2 = 32704 Then '1-32704,2-21824,3-16384,4-13120,5-10880 тоже не корректна. Значение по входу АЦП может быть (0-1023). Ну допустим как у вас с каким то множителем может быть и 32703 и 32705 из-за окисленных контактов кнопки, разброса параметров резисторов делителя и т.д. И ваше условие не сработает. Нужно использовать диапозоны, скажем так If ADIn 2 > 26000 And ADIn 2 < 35000 Then ...' кнопка 1 If ADIn 2 > 18000 And ADIn 2 < 26000 Then ...' кнопка 2 так, чтобы ваше расчетное значение делителя было по середине диапазона
Сообщение отредактировал
xvovanx - Сб, 16.04.2016, 22:58
|
|
|
|
|
Anatoliy1000 |
Дата: Вс, 17.04.2016, 07:52 | Сообщение # 47 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
182
Замечания:
±
На сайте с 02.03.2016
Статус:
Offline
|
dimvad, xvovanx, возможно предел 1024, но выдает значение именно 32704 (прикрепил скрины со значением больше 1024). Позже конечно пославлю диапазон от-до, это временно, что бы понять принцип работы и минимизировать программу (при отладке как-то удобней с маленьким кодом работать. 1.Про мигание диода наверное в другой ветке надо вопрос задавать? 2.Я думал (где-то читал), что прерывание можно повесить плюсом на другую ногу (желательно G3, так как у нее только вход), что бы там проверяло ту же 1. Не получается.
Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал
Anatoliy1000 - Вс, 17.04.2016, 08:01
|
|
|
|
|
dimvad |
Дата: Вс, 17.04.2016, 10:42 | Сообщение # 48 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
99
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Просто Ваш АЦП настроен в режиме левого выравнивания и, соответственно результат лежит в диапазоне 0 - 65535 с шагом 64.
|
|
|
|
|
gurus |
Дата: Ср, 30.11.2016, 10:48 | Сообщение # 49 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 14.08.2011
Статус:
Offline
|
Здравствуйте. Не открываю новую тему, а пишу здесь т.к. вопрос касается прерываний. Возникла проблема с аппаратными прерываниями у Pic16F887. Для проверки набросал простенькую программку.
Device = 16F88x @CONFIG_REQ @__CONFIG _CONFIG1, INTOSCIO & WDT_OFF & DEBUG_OFF & LVP_OFF & FCMEN_OFF & IESO_OFF & BOR_OFF & CPD_ON & CP_ON & MCLRE_ON & PWRTE_ON @__CONFIG _CONFIG2, WRT_OFF & BOR21V Xtal = 4 Declare FSR_Context_Save = On
' ------------------------[Описание и назначение портов]------------------------------------------------------- Symbol Led=PORTD.0 Symbol Ledi=PORTD.1
' ------------------------[Переменные]------------------------------------------------------- Dim TEMP As Byte ' Региcтр временного хранения Dim X As Word
' ---------------------[Процедура инициализации]------------------------------------------ TRISB=%00000001 PORTB=0 TRISD=%00000000 PORTD=0 ANSEL = 0 ANSELH = 0
' ---------------------[Настройка прерываний]----------------------------------------------- INTCON.4 = 1 'Разрешаем внешние прерывания INTCON.7 = 1 'Разрешаем глобальные прерывания On_Interrupt Goto Int_ 'Задаём адрес обработчика прерываний
' ---------------------[Основная программа]----------------------------------------------- Main: Led=1 Gosub Delay_ Led=0 Gosub Delay_ GoTo Main
Int_: ‘ Вход в обработчик прерывания Context Save Temp=0 Led=0 L1: Ledi=1 Gosub Delay_ Ledi=0 Gosub Delay_ Temp=Temp+1 If Temp!=3 Then Goto L1 INTCON.1=0 Context Restore Resume ‘ Выход из обработчика прерывания
Delay_: For X=0 To 500 DelayMS 1 Next Return
End
Контроллер Pic16F887. Кнопка на RB0, один светодиод на RD0, другой на RD1. При запуске программы светодиод на RD0 моргает. При нажатии на кнопку программа прерывается, светодиод на RD0 тухнет, а на RD1 моргает три раза и контроллер выходит из подпрограммы прерываний, возвращается в основную программу и процесс повторяется.. При отладке в MPLAB всё происходит именно так. А вот при запуске программы в реальном контроллере или в Протеусе, контроллер после выхода из пп прерывания куда-то «улетает» и только через где-то минуту возвращается в main и продолжает моргать светодиодом. Пробовал всевозможные выходы из прерывания, но та же история. Наличие или отсутствие команды Resume, ситуацию не меняет. Прошу помощи, что не так.Добавлено (30.11.2016, 10:48) --------------------------------------------- Здравствуйте. Не открываю новую тему, а пишу здесь т.к. вопрос касается прерываний. Возникла проблема с аппаратными прерываниями у Pic16F887. Для проверки набросал простенькую программку.
Device = 16F88x @CONFIG_REQ @__CONFIG _CONFIG1, INTOSCIO & WDT_OFF & DEBUG_OFF & LVP_OFF & FCMEN_OFF & IESO_OFF & BOR_OFF & CPD_ON & CP_ON & MCLRE_ON & PWRTE_ON @__CONFIG _CONFIG2, WRT_OFF & BOR21V Xtal = 4 Declare FSR_Context_Save = On
' ------------------------[Описание и назначение портов]------------------------------------------------------- Symbol Led=PORTD.0 Symbol Ledi=PORTD.1
' ------------------------[Переменные]------------------------------------------------------- Dim TEMP As Byte ' Региcтр временного хранения Dim X As Word
' ---------------------[Процедура инициализации]------------------------------------------ TRISB=%00000001 PORTB=0 TRISD=%00000000 PORTD=0 ANSEL = 0 ANSELH = 0
' ---------------------[Настройка прерываний]----------------------------------------------- INTCON.4 = 1 'Разрешаем внешние прерывания INTCON.7 = 1 'Разрешаем глобальные прерывания On_Interrupt Goto Int_ 'Задаём адрес обработчика прерываний
' ---------------------[Основная программа]----------------------------------------------- Main: Led=1 Gosub Delay_ Led=0 Gosub Delay_ GoTo Main
Int_: ‘ Вход в обработчик прерывания Context Save Temp=0 Led=0 L1: Ledi=1 Gosub Delay_ Ledi=0 Gosub Delay_ Temp=Temp+1 If Temp!=3 Then Goto L1 INTCON.1=0 Context Restore Resume ‘ Выход из обработчика прерывания
Delay_: For X=0 To 500 DelayMS 1 Next Return
End
Контроллер Pic16F887. Кнопка на RB0, один светодиод на RD0, другой на RD1. При запуске программы светодиод на RD0 моргает. При нажатии на кнопку программа прерывается, светодиод на RD0 тухнет, а на RD1 моргает три раза и контроллер выходит из подпрограммы прерываний, возвращается в основную программу и процесс повторяется.. При отладке в MPLAB всё происходит именно так. А вот при запуске программы в реальном контроллере или в Протеусе, контроллер после выхода из пп прерывания куда-то «улетает» и только через где-то минуту возвращается в main и продолжает моргать светодиодом. Пробовал всевозможные выходы из прерывания, но та же история. Наличие или отсутствие команды Resume, ситуацию не меняет. Прошу помощи, что не так.
|
|
|
|
|
anatol |
Дата: Ср, 30.11.2016, 11:37 | Сообщение # 50 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
625
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Не самое лучшее решение для организации цикла. И прерывания желательно запретить на время обработки уже произошедшего. Код If Temp!=3 Then Goto L1
|
|
|
|
|
dimvad |
Дата: Ср, 30.11.2016, 12:48 | Сообщение # 51 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
99
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Никогда в обработчике прерываний не обращайтесь к подпрограммам. Иногда это проходит, а иногда нет.
|
|
|
|
|
gurus |
Дата: Ср, 30.11.2016, 13:58 | Сообщение # 52 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 14.08.2011
Статус:
Offline
|
anatol,.И прерывания желательно запретить на время обработки уже произошедшего. При переходе на п.п обработки прерываний бит GIE аппаратно сбрасывается в "0", или этого не достаточно? Не самое лучшее решение для организации цикла. Прошу разъяснить что здесь не хорошо и как должно быть.Добавлено (30.11.2016, 13:58) --------------------------------------------- dimvad, Никогда в обработчике прерываний не обращайтесь к подпрограммам. Иногда это проходит, а иногда нет.
Чем вызвано это категоричное заявление? Ведь при переходе в подпрограмму, прерывания остаются запрещёнными и при завершении её мы вернёмся в абработчик прерываний в то место откуда ушли. Вроде ничего страшного не должно произойти.
|
|
|
|
|
dimvad |
Дата: Ср, 30.11.2016, 15:34 | Сообщение # 53 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
99
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Цитата Чем вызвано это категоричное заявление? Если Вы используйте версию больше чем 3.5.2.7, то компилятор выдаст соответствующее предупреждение. Ну и из личного опыта.
|
|
|
|
|
gurus |
Дата: Ср, 30.11.2016, 16:50 | Сообщение # 54 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 14.08.2011
Статус:
Offline
|
dimvad, У меня версия 3.5.2.6, видимо поэтому молчит. Спасибо за помощь. Вынес обращение к пп за пределы обработчика- всё заработало. Получается, что это особенность компилятора? Всё время писал на ассемблере и таких проблем не было. Но, всё же в MPLAB всё красиво. Хотелось бы понять, почему?
|
|
|
|
|
xvovanx |
Дата: Ср, 23.08.2017, 14:19 | Сообщение # 55 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
446
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Добрый день Форумчане!
Появился "заскок" вопрос, хотелось бы уточнить до стадии "железа": итак, 18 Пик, работаем c двумя прерываниями по внешним входам INT0 и INT2. При появлении сигнала на первом входе прога переходит на железное прерывание и обработку сигнала. Что будет, если в этот момент (обработки железного прерывания от первого входа) появится внешний сигнал на втором входе? Сигнал будет пропущен или все равно INT2 флаг в регистр запишется и потом обработается после выхода из перого обработчика? Приоритетность в данном случае ничего не решит, очередность появления сигналов может быть и обратной.
|
|
|
|
|
ivan_fd |
Дата: Ср, 23.08.2017, 15:09 | Сообщение # 56 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
1145
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Флаг установится и после обработки первого прерывания будет обрабатывать второе.
Меня все время преследуют умные мысли...но я быстрее!!!
|
|
|
|