Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 4«1234»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с прерываниями
Работа с прерываниями
anatol Дата: Чт, 23.10.2014, 21:21  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 551
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

xvovanx, "темный лес" эти прерывания. По хорошему, во время прерывания (подпрограммы) прерывания запрещают и поэтому пофиг какие "фляги" висят. А восстанавливают прерывания в теле основной программы. А сколько будет будет работать обработчик прерывания и какие подпрограммы будет использовать - на вашей совести. Только забудьте про нормированные интервалы  времени...
Флаги являются указателями на то какое прерывание произошло, а точка входа в подпрограмму обработчик прерывания, в малых пиках, одна.
ЯНДЕКС Дата: 23.10.2014
Володимир Дата: Пт, 28.08.2015, 15:08  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Помогите с прерываниями, при возникновении прерывания програма после выполнения подпрограммы обработчика прирывания, не идет возврат в точку где возникло прерывание.

Когда порт rss232=0 идет включение порта USART, в этот момент возникает прерывание и уже основной цыкл программы не работает.

Моделирую в протэусе, но толи протэус глючит, толи я, пробовал пример с этой http://www.terrarus.ucoz.ru/proton_....pt.html страницы, то в протеусе работает.

Device 18F4620
Xtal 20

On_Interrupt GoTo StartInterrupt

....................

INTCON =  %11000000
INTCON2 = %00000000
INTCON3 = %00000000
PIE1 = %00110000
PIE2 = %00000000
PIR1 = %00000000
PIR2 = %00000000
IPR1 = %00000000
IPR2 = %00000000

'USART
SPBRGH = $02 '9600
SPBRG  = $08 '9600

TXSTA.6 = 0 '8-розрядная передача
TXSTA.5 = 1 'разрешение передачи
TXSTA.4 = 0 'режим роботи асинхронный
TXSTA.3 = 0 '
TXSTA.2 = 1 'високоскоростной режим

RCSTA.7 = 0 'разреение работы порта (не разрешено)
RCSTA.6 = 0 '8-розрядный прийом
RCSTA.4 = 1 'прийом разрешено

BAUDCON = 0;         // регистр управления скорости передачи
BAUDCON.3=1 'BRG16 = 1

Symbol rss232=PORTD.1
Symbol Led=PORTD.0   'Светодиод

T1CON.7=1
T1CON.6=1
T1CON.5=0 'T1CKPS1 Выбор коэффициента деления предделителя TMR1 (1:1)
T1CON.4=0 'T1CKPS0 Выбор коэффициента деления предделителя TMR1 (1:1)
T1CON.3=0 'T1OSCEN: Включение тактового генератора TMR1
T1CON.2=0 'T1SYNC: Синхронизация внешнего тактового сигнала
T1CON.1=0 'TMR1CS: Выбор источника тактового сигнала (Fosc/4)
CCP2CON=0
CCP2CON.3=1
CCP2CON.2=0
CCP2CON.1=1
CCP2CON.0=1
CCPR2H=$01 'Период 0,1 мс
CCPR2L=$F4 'Период 0,1 мс
T1CON.0=1 'TMR1ON: Включение модуля TMR1

START: ' Начало основой программы

Led = rss232 ' Индикатор сигнала порта

If rss232=0 Then 'Если подключился комп
   RCSTA.7 = 1 'Включаем модуль USART
   CREN=1   'разрешить прийом
   PIE1.4=1 'Разрешить прерывания по передаче данных
   PIE1.5=1 'Разрешить преривания по прийому данных
   EndIf

GOTO Start

StartInterrupt: 'Підпрограма обработки прерываний
    RCIF=0
    TXIF=0
Context Restore
dimvad Дата: Пт, 28.08.2015, 17:24  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Первое ,что бросается в глаза, это то, что вы в обработчике не сохраняете контекст(Context Save).Поэтому Вы улетаете неизвестно куда. Поздние версии протона кажется даже ругаются, когда нет этой директивы.
ivan_fd Дата: Пт, 28.08.2015, 23:04  |                                                                                                                Сообщение # 19
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

В ранних версиях Context Save можно было не ставить, он и так сохранял.

Володимир, перенесите прерывание в самый верх программы.


Меня все время преследуют умные мысли...но я быстрее!!!
Володимир Дата: Ср, 30.09.2015, 17:29  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Цитата dimvad ()
Первое ,что бросается в глаза, это то, что вы в обработчике не сохраняете контекст(Context Save).Поэтому Вы улетаете неизвестно куда. Поздние версии протона кажется даже ругаются, когда нет этой директивы.
Эсли я правильно понял перевод из мурзилки то Declare FSR_Context_Save = On, Context Save нужно включать если в обработчике прерываний используются те же переменные что и основном цыкле программы.

С этими командами не работает.

Цитата ivan_fd ()
Володимир, перенесите прерывание в самый верх программы.
Перенес, заработало. Тото я думаю зачем в примерах Анатолия Медведева обработчик стоит в начале кода и через него идет переход с помощю комадны GOTO.

Всем спасибо за помощь.

Добавлено (29.09.2015, 16:53)
---------------------------------------------
Продолжу про приколы с прерываниями. Регистры PIE1 и PIE2 обнулены, но если включить модуль USATRT командой RCSTA.7 = 1, то пик сразу виснет, тоесть таймер TMR1 останавливается, шим на выходе CCP2 пропадает, на входные сигналы пик не реагирует. Если команда RCSTA.7 = 1 стоит в начале проэкта, то пик не работает сразу, если подать команду в обработчик по сигналу на входе, то пик входит в ступор сразу после исполнения команды. Если заремовать команду On_Interrupt GoTo StartInterrup то пик работает.

Device 18F4620
Xtal 20

Declare FSR_Context_Save = On

On_Interrupt GoTo StartInterrupt

....................

INTCON =  %11000000
INTCON2 = %00000000
INTCON3 = %00000000
PIE1 = %00110000
PIE2 = %00000000
PIR1 = %00000000
PIR2 = %00000000
IPR1 = %00000000
IPR2 = %00000000

'USART
SPBRGH = $02 '9600
SPBRG  = $08 '9600

TXSTA.6 = 0 '8-розрядная передача
TXSTA.5 = 1 'разрешение передачи
TXSTA.4 = 0 'режим роботи асинхронный
TXSTA.3 = 0 '
TXSTA.2 = 1 'високоскоростной режим

RCSTA.7 = 0 'разреение работы порта (не разрешено)
RCSTA.6 = 0 '8-розрядный прийом
RCSTA.4 = 1 'прийом разрешено

BAUDCON = 0;         // регистр управления скорости передачи
BAUDCON.3=1 'BRG16 = 1

Symbol rss232=PORTD.1
Symbol Led=PORTD.0   'Светодиод

T1CON.7=1
T1CON.6=1
T1CON.5=0 'T1CKPS1 Выбор коэффициента деления предделителя TMR1 (1:1)
T1CON.4=0 'T1CKPS0 Выбор коэффициента деления предделителя TMR1 (1:1)
T1CON.3=0 'T1OSCEN: Включение тактового генератора TMR1
T1CON.2=0 'T1SYNC: Синхронизация внешнего тактового сигнала
T1CON.1=0 'TMR1CS: Выбор источника тактового сигнала (Fosc/4)
CCP2CON=0
CCP2CON.3=1
CCP2CON.2=0
CCP2CON.1=1
CCP2CON.0=1
CCPR2H=$01 'Период 0,1 мс
CCPR2L=$F4 'Период 0,1 мс
T1CON.0=1 'TMR1ON: Включение модуля TMR1

goto START

StartInterrupt: 'Підпрограма обработки прерываний
Context Save
RCIF=0
TXIF=0
Context Restore

START: ' Начало основой программы

Led = rss232 ' Индикатор сигнала порта

If rss232=0 Then 'Если подключился комп
RCSTA.7 = 1 'Включаем модуль USART
EndIf

GOTO Start

end

Добавлено (30.09.2015, 09:17)
---------------------------------------------
Подправил немоного код, хочу отметить, что прерывания отключены и не включаються во время работы устройства.

Добавлено (30.09.2015, 17:29)
---------------------------------------------
В ходе долгих манипуляций вилез на ружу есче один прикол, нельзя одновременно включать перерывания RCIE TXIE, иначе выполнение программы останавливается.

Сообщение отредактировал Володимир - Ср, 30.09.2015, 09:16
anatol Дата: Пт, 02.10.2015, 14:54  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 551
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Смешались в кучу кони, люди...
Покуда не разберетесь:- 1). с настройками для вашего пика по умолчанию (папка C:\Program Files (x86)\ProtonIDE\PDS\Includes или C:\Program Files\ProtonIDE\PDS\Includes),  2). с прерываниями в 18 серии и вообще (в том числе обработкой), 3). тактированием USART, 4). работой CCP - дивного много будет.
Этот кусок кремния телепатией не страдает, более того работает в жестко описанных рамках применения. Читать документацию на контроллер обязательно. Я понимаю что 412 страниц - многовато, да еще на вражеском...
Володимир Дата: Пт, 02.10.2015, 16:07  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Цитата anatol ()
Я понимаю что 412 страниц - многовато, да еще на вражеском...
В том то и дело что на вржажеском, ГуглПереводчик дает перевод что можно понять картину в общих чертах.

Пока разобрался, в Протеусе работает как положено.
vladh Дата: Сб, 03.10.2015, 09:32  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 247
Репутация: 7   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата Володимир ()
В ходе долгих манипуляций вилез на ружу есче один прикол, нельзя одновременно включать перерывания RCIE TXIE, иначе выполнение программы останавливается.

Если установлен асинхронный режим то наверное Вы правы, а если синхронный то скорее всего этотВаш вывод не верен.
Кстати, Володимир зашли бы в параллельный топик, в котором я разбирался с работой по 485 интерфейсу http://www.picbasic.ru/forum/5-1731-3
там в самом конце выложен работающий пример. Может это Вам поможет. Сейчас я добился того, что у меня общаются два пика по этому интерфейсу.
Володимир Дата: Чт, 19.11.2015, 11:55  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Цитата vladh ()
Если установлен асинхронный режим то наверное Вы правы, а если синхронный то скорее всего этотВаш вывод не верен.
Режим асинхнонный.
Цитата vladh ()
Кстати, Володимир зашли бы в параллельный топик, в котором я разбирался с работой по 485 интерфейсу http://www.picbasic.ru/forum/5-1731-3там в самом конце выложен работающий пример. Может это Вам поможет. Сейчас я добился того, что у меня общаются два пика по этому интерфейсу.
Спасибо, но пока все работает как надо.

Добавлено (19.11.2015, 11:55)
---------------------------------------------
Обрабатываю приревания (см.приблезительный код ниже), на даном этапе все работает, но я хочу добавить немного кода в обработчик по прерыванию CCP2IF, и тогда будет опасность, что у меня при получении данных через USART будет переполнятся буфер. Подскажите, если я код обработчика прерывания по CCP2IF, ADIF перенесу в раздел On_Low_Interrupt, то при возникновении преривания On_Interrupt бутет ли оно обрабатыватся когда идет обработка прирываний по On_Low_Interrupt (тоесть будет ли приостановлена обработка кода по On_Low_Interrupt для обработки кода по On_Interrupt), или сначала должна закончится обработка кода начатого прерывания по On_Low_Interrupt ?

On_Interrupt GoTo StartInterrupt

StartInterrupt:
Context Save

If CCP2IF=1 Then
   .........................................  
   CCP2IF=0
EndIf

If ADIF=1 Then
   .......................
   ADIF=0
EndIf
      
      
If RCIF=1 Then
   ...........................
   RCIF=0
EndIf

If TXIF=1 Then
    ....................
EndIf
Context Restore 'Вийти з програми опрацювання переривань

Anatoliy1000 Дата: Ср, 13.04.2016, 14:35  |                                                                                                                Сообщение # 25
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 39
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Какая-то засада с этими прерываниями. Вроде все сделал правильно, а нифига не работает. Прошу помощи зала.
Задача: нажал на кнопку - сработало прерывание. Проверка: по таймеру или по кнопке и соответствующие выводы...
Прикрепления: 7700698.rar(101Kb)


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
xvovanx Дата: Ср, 13.04.2016, 16:47  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 280
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Anatoliy1000 ()
Вроде все сделал правильно, а нифига не работает

Пробуй добавить общее разрешение всех прерываний (INTCON.7=1). В обработчике прерываний не ставь паузу, выноси ее в тело основной программы . В обработчике (и не только) условия всегда закрывай IF--EndIf, а то по логика работы нарушается. И в проге есть странные места
Прикрепления: 4417009.jpg(156Kb)
dimvad Дата: Ср, 13.04.2016, 20:08  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

У Вас 1)Portb.0 сконфигурирован на выход. 2)Включены подтягивающие резисторы 3)Включены прерывания по заднему фронту.4)На кнопке, судя по картинке, отсутствует подтягивающий на землю резистор.
Anatoliy1000 Дата: Чт, 14.04.2016, 08:58  |                                                                                                                Сообщение # 28
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 39
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

ХЭЛП МИ

xvovanx

- цикл 2 раза (вкл-выкл) от 0 до 1 - это я для того что бы переменная меньше места заняла.
- добавил INTCON.7=1, а в ответ тишина.
- паузу в обработчике убрал,
- думал, что закрывать IF--EndIf нужно только когда условие переношу на следующую строку (я не прав)?
dimvad
все условия выполнил, а в ответ тишина. Все кроме резистроа, он почему-то автоматом порт делает "красным" на постоянку.

отправляю переделанный вариант
Прикрепления: 1831123.rar(108Kb)


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал Anatoliy1000 - Чт, 14.04.2016, 08:59
Володимир Дата: Чт, 14.04.2016, 09:48  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

А почему не используеш аппаратные прерывания?

По проэкту, я думаю что эта строчка INTCON.7=1 лишняя, так как используеш програмные прерывания, а почемуто включил аппаратные.

На этой http://www.terrarus.ucoz.ru/proton_....pt.html странице тоже не включают этот бит.
dimvad Дата: Чт, 14.04.2016, 10:02  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 10   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

У меня все работает.
Прикрепления: 7490906.rar(121Kb)
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с прерываниями
Страница 2 из 4«1234»
Поиск: