Прерывание в pic basic - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывание в pic basic
Прерывание в pic basic
198022alex Дата: Пн, 24.02.2014, 23:21  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 03.02.2014

Статус: Offline

Люди добрые,помогите с прерыванием в PICBASICе.Не могу разобраться как оно работает. sad Если не затруднит выложите примерчик,только не сложный.
ЯНДЕКС Дата: 24.02.2014
ADMIN Дата: Вт, 25.02.2014, 03:24  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

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

RBIF = INTCON.0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7
INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT)
T0IF = INTCON.2 ' Флаг переполнения TMR0
RBIE = INTCON.3 ' Бит разрешения прерывания по PORTB.4-PORTB.7
INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) 
T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0
PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств
GIE = INTCON.7  ' Бит глобального разрешения прерываний
                                                                   
Таким образом, устанавливая биты, разрешающие прерывание и при условии выполнения прерывания, программа переходит на вектор обработки прерывания. В подпрограмме обработки прерывания проверяются флаги, вызвавшие прерывание и выполняются какие-то действия.                                                                  

GIE = 1    ' Разрешение глобального прерывания
INTE = 1 ' Разрешение прерывания по изменению на входе INT0
                                                                   
ON INTERRUPT goto  Int_Label 'Здесь мы указываем программе, по какому адресу располагается обработчик прерывания.
Goto  MainProgram

Int_Label:  'Обработчик прерывания
If INTF = 0 then  'Проверка флага
    INTF = 1   'Сброс флага обязателен
ENDIF

Retfie

MainProgram:  'Основная программа

Goto MainProgram
HCT Дата: Пт, 17.10.2014, 21:54  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 05.10.2014

Статус: Offline

Здоровья всем! Меня тоже интересуют прерывания. В частности, прерывания по переполнению TMR0. Начал недавно осваивать PicBasicPro, хочу "изобрести" программу секундомера, таймера или чего-то в этом роде. С динамической индикацией разобрался (надеюсь), "изобрел" программки увеличения и уменьшения по опросу кнопки (могу выложить для критики). Осталось разобраться с прерываниями. Ни у Хелибайка, ни у Хилинского примеров нет, в даташите на 62х (у меня 628а) прерывания на ассемблере.
Уважаемый ADMIN, у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять? Если можно, то подробней, пожалуйста.
И еще. Можно вместо
GIE = 1               'Разрешение глобального прерывания
T0IE = 1              'Разрешение прерывания по переполнению таймера TMR0
сделать так
INTCON = %10100000       'Разрешить глобаные прерывания и прерывания по                                    'переполнению таймера TMR0
С уважением, НСТ.

Сообщение отредактировал HCT - Пт, 17.10.2014, 22:37
MiXaS Дата: Вс, 19.10.2014, 11:22  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата HCT ()
у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять?
Дело в том, что причин прерывания может быть несколько, как уже говорилось выше, это таймера, усарт, мssp, portb ....
если вы используете только одно прерывание, то проверять нет смысла, а если 2 и более, то нужно знать, какое событие привело в подпрограмму, так как подпрограмма одна, а причин может быть несколько.Для этого и проверяются флаги.Если флаг таймера, значит прибавить к переменной значение, если усарт, значит читать входной буфер и записывать в массив, если портб.0 значит еще что–то. 

Чтобы все работало, нужно понять принцип работы. Я уже описывал в подобной ветке достаточно подробно как работает прерывание.

Добавлено (19.10.2014, 11:22)
---------------------------------------------
Господа, Админ написал 2 замечательные статьи по поводу прерываний. Я Вам их даже нашел, изучаем...
http://www.picbasic.ru/publ....1-0-111
http://www.picbasic.ru/publ....1-0-112

ADMIN Дата: Пн, 20.10.2014, 04:15  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Цитата HCT ()
Уважаемый ADMIN, у Вас проверка флага (If INTF = 0 then) в обработчике прерываний. Но если прерывание произошло, значит флаг поднят? зачем его проверять? Если можно, то подробней, пожалуйста.
Здесь, во-первых, я ошибся. Должно быть наоборот:
Int_Label:  'Обработчик прерывания 
If INTF = 1 then  'Проверка флага 
    INTF = 0   'Сброс флага обязателен 
ENDIF 
Retfie
По поводу вопроса - я считаю, что лучше его проверять в любом случае, так как, я уже по-моему, писал об этом, прерывание может быть вызвано другим источником. И лучше уточнить этот момент при входе в обработчик прерывания.
По второму вопросу - разумеется можно и так. Мне проще так - наглядней, где какой бит устанавливается и где сбрасывается, так как из ряда нулей и единиц сложнее выдернуть визуально какой точно бит установлен, а какой сброшен.
Partisan Дата: Чт, 28.05.2015, 09:33  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.02.2015

Статус: Offline

Приветствую, Господа.
Прошу помощи.
Подскажите, как сделать, чтобы при попадании на ногу единички(5 вольт)  с другой ноги пропадала единичка, после нажатия кнопки ресет устройство снова взводилось.
Matrix252005 Дата: Чт, 28.05.2015, 09:53  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Цитата Partisan ()
Прошу помощи.
....
Ну например так:

Если "нога" = 1 значит
         другая нога = 0
конец если

А по другому:

If portX.x = 1 then
    portX.x = 0
End If

Насчет "ресета" не понял...


THE TRUTH IS OUT THERE.

С уважением, Николай.
terrarus Дата: Чт, 28.05.2015, 10:35  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Matrix252005, мне кажется, что Partizan всех нас пытается тролить, он описывает логику работы простого RS триггера.

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Matrix252005 Дата: Чт, 28.05.2015, 10:44  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Возможно...

Человек попросил помощи, "мы" ему не отказали как на других форумах, а вот что он именно хотел сказать своим постом, тут либо пусть конкретно опишет что он имел ввиду, либо....


THE TRUTH IS OUT THERE.

С уважением, Николай.
MiXaS Дата: Чт, 28.05.2015, 11:29  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата Matrix252005 ()
If portX.x = 1 then     portX.x = 0
End If
Можно так, а можно Нога_1 = ~ Нога_2

Добавлено (28.05.2015, 11:29)
---------------------------------------------

Цитата MiXaS ()
Можно так, а можно Нога_1 = ~ Нога_2
Блин, не отображает символ "переменный ток" или буква Ё на английском.
Partisan Дата: Чт, 28.05.2015, 12:11  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.02.2015

Статус: Offline

Уважаемые, просто только начал изучать пикбейсик, прошу прощения за банальщину, многое еще не понятно, не изза того чт оне умею читать инструкции, а не знаю как тот или иной способ называется, не кому направить в нужное русло.
варганю на кухню приборчик для пенсионера бабушки, она постоянно забывает газ выключать. да бы не лучилось беды,решил сделать датчик утечки газа, благо есть доступ к калибровочным воздушным смесям, чтобы откалибровать датчик метана.
ТЗ такое.
Имеем клапан электро, нормально закрытый.
схема, клапан постоянно под напряжением, т.е. открыт, управляется ногой пика N
имеем датчик газа., реагирует на утечку газа.
он выдает какой то диапазон напряжений t при достижении величны x   мне нужно, чтобы на ноге N  напряжение стало = 0. т.е .лог ноль.
if t=x then т=x.
Но мне нужна кнопка, чтобы можно было сбросить алгоритм, думаю банального ресета хватит.или просто можно прерывать питание.
Matrix252005 Дата: Чт, 28.05.2015, 12:22  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 675
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Partisan, во-первых, если Вы только начинаете изучать, то лучше сразу начните с PROTON IDE, уже не однократно писалось на нашем форуме, что РВР это уже даже не вчерашний день!!!
Во-вторых, если Вы начинаете изучать МК, то не проще изучать с нуля, а не пытаться браться за то, что Вы еще не знаете, проще говоря (не примите за оскорбление!!!), если Вы не умеете ползать, то как Вы начнете летать???

Научитесь для начала мигать светиком, потом управлять кнопками, экраном и т.д...

Если хотите помощи в написании программы, то хотя бы выложите какой то проект (схему, наброски кода (не тупой набор команд, а что то похожее на программу)). Мы Вам укажем на ошибки и направим на верный путь.

Если хотите, чтобы мы разработали схему, программу, то тут на форуме есть отдельная ветка, называется: "Заказы".


THE TRUTH IS OUT THERE.

С уважением, Николай.
Gysmi Дата: Вт, 02.06.2015, 19:35  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 47
Репутация: 0   ±
Замечания:   ±
На сайте с 23.12.2011

Статус: Offline

Только могу добавить по техзаданию-делай искробезопасно,никаких реле не используй.
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывание в pic basic
Страница 1 из 11
Поиск: