Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 4 из 4«1234
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с прерываниями
Работа с прерываниями
xvovanx Дата: Сб, 16.04.2016, 22:52  |                                                                                                                Сообщение # 46
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 281
Репутация: 12   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 16.04.2016
Anatoliy1000 Дата: Вс, 17.04.2016, 07:52  |                                                                                                                Сообщение # 47
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 39
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

dimvadxvovanx, возможно предел 1024, но выдает значение именно  32704 (прикрепил скрины со значением больше 1024). Позже конечно пославлю диапазон от-до, это временно, что бы понять принцип работы и минимизировать программу (при отладке как-то удобней с маленьким кодом работать.
1.Про мигание диода наверное в другой ветке надо вопрос задавать?
2.Я думал (где-то читал), что прерывание можно повесить плюсом на другую ногу (желательно G3, так как у нее только вход), что бы там проверяло ту же 1. Не получается.
Прикрепления: 9719111.jpg(109Kb) · 8770085.jpg(19Kb) · 7468594.jpg(14Kb)


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал Anatoliy1000 - Вс, 17.04.2016, 08:01
dimvad Дата: Вс, 17.04.2016, 10:42  |                                                                                                                Сообщение # 48
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Просто Ваш АЦП настроен в режиме левого выравнивания и, соответственно результат лежит в диапазоне 0 - 65535 с шагом 64.
Прикрепления: ADC.rar(43Kb)
gurus Дата: Ср, 30.11.2016, 10:48  |                                                                                                                Сообщение # 49
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 551
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Не самое лучшее решение для организации цикла. И прерывания желательно запретить на время обработки уже произошедшего.

Код
If Temp!=3 Then Goto L1
dimvad Дата: Ср, 30.11.2016, 12:48  |                                                                                                                Сообщение # 51
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Никогда в обработчике прерываний не обращайтесь к подпрограммам. Иногда это проходит, а иногда нет.
gurus Дата: Ср, 30.11.2016, 13:58  |                                                                                                                Сообщение # 52
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 14.08.2011

Статус: Offline

anatol,.И прерывания желательно запретить на время обработки уже произошедшего.
При переходе на п.п обработки  прерываний бит GIE аппаратно сбрасывается в "0", или этого не достаточно?
   Не самое лучшее решение для организации цикла.
Прошу разъяснить что здесь не хорошо и как должно быть.

Добавлено (30.11.2016, 13:58)
---------------------------------------------
dimvad,  Никогда в обработчике прерываний не обращайтесь к подпрограммам. Иногда это проходит, а иногда нет.

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

dimvad Дата: Ср, 30.11.2016, 15:34  |                                                                                                                Сообщение # 53
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Цитата
Чем вызвано это категоричное заявление?
Если Вы используйте версию больше чем 3.5.2.7, то компилятор выдаст соответствующее предупреждение. Ну и из личного опыта.
gurus Дата: Ср, 30.11.2016, 16:50  |                                                                                                                Сообщение # 54
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 14.08.2011

Статус: Offline

dimvad,  У меня версия 3.5.2.6, видимо поэтому молчит.  Спасибо за помощь. Вынес обращение к пп за пределы обработчика- всё заработало. Получается, что это особенность компилятора?  Всё время писал на ассемблере и таких проблем не было. Но, всё же в MPLAB  всё красиво. Хотелось бы понять, почему?
xvovanx Дата: Ср, 23.08.2017, 14:19  |                                                                                                                Сообщение # 55
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 281
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Добрый день Форумчане!

Появился "заскок" вопрос, хотелось бы уточнить до стадии "железа": итак, 18 Пик, работаем c двумя прерываниями по внешним входам INT0 и INT2. При появлении сигнала на первом входе прога переходит на железное прерывание и обработку сигнала. Что будет, если в этот момент (обработки железного прерывания от первого входа) появится внешний сигнал на втором входе? Сигнал будет пропущен или все равно INT2 флаг в регистр запишется и потом обработается после выхода из перого обработчика? Приоритетность в данном случае ничего не решит, очередность появления сигналов может быть и обратной.
ivan_fd Дата: Ср, 23.08.2017, 15:09  |                                                                                                                Сообщение # 56
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Флаг установится и после обработки первого прерывания будет обрабатывать второе.

Меня все время преследуют умные мысли...но я быстрее!!!
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с прерываниями
Страница 4 из 4«1234
Поиск: