Аппаратные прерывания - не могу понять - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Аппаратные прерывания - не могу понять
Аппаратные прерывания - не могу понять
ivan_fd Дата: Вс, 15.11.2009, 20:14  |                                                                                                                Сообщение # 1
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Привет всем!
Такая ситуация, есть работающий проект, часы, термометр... (доработанный, тот что обсуждался в этой теме http://www.picbasic.ru/forum/5-252-1 ).
Файл прилагаю. Все работало как надо, только я что то напутал с включением и отключением нагрузки, дописал в код еще пару IF.....ENDIF,
скомпилировал (размер файла до исправления был ~14кб, после ~16кб). Часы работают как работали, а когда начинает показывать температуру, процессор идет в сброс. ( Это все в протеусе, в железе не проверял). Я взял и весь блок проверки ( он в прикрепленном файле закоментирован в процедуре mainloop) вынес в конец программы и все начало работать. Сброс происходил на строчке Context restore. Может кто в курсе, в чем дело.
Спасибо!!!


Меня все время преследуют умные мысли...но я быстрее!!!
Сообщение отредактировал ivan_fd - Пн, 16.11.2009, 22:46
ЯНДЕКС Дата: 15.11.2009
Dmitry Дата: Чт, 19.11.2009, 22:19  |                                                                                                                Сообщение # 2
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

а где файл-то?
ivan_fd Дата: Пт, 20.11.2009, 00:31  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Нечаянно удалил. biggrin
Прикрепления: Tymchasova.zip(135Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
Dmitry Дата: Пт, 20.11.2009, 22:53  |                                                                                                                Сообщение # 4
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Аппаратное прерывание нельзя на бейсике писать, я так понял:

"Because a hardware interrupt may occur at any time, It cannot be fully guaranteed that a SYSTEM variable will not be disturbed while inside the interrupt handler, therefore, the safest way to use a HARDWARE interrupt is to write the code in assembler, or to implement a managed interrupt"

Поскольку прерывание происходит в любой момент, то бейсик-кодом внутри прерывания можно легко перезаписать значеия системных переменных компилятора и при возврате в основную программу процессор очень огорчится smile
Если же лень переписывать прерывание на асме, то попробуй в начале и конце прерывания поставить директивы компилятора, по которым проц будет сохранять/восстанавливать системные переменные:

INT_SUB_START - эту перед прерыванием

INT_SUB_END - а эту после контекст ресторе

ivan_fd Дата: Пт, 20.11.2009, 23:29  |                                                                                                                Сообщение # 5
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Спасибо. Это я читал. Просто интересно почему если комментирую пару строчек, то все нормально. Почему же он раньше не ругался? wacko


Меня все время преследуют умные мысли...но я быстрее!!!
Dmitry Дата: Сб, 21.11.2009, 21:06  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Ну например, эта пара строчек начинает задействовать системные переменные, которые портит прерывание. Лотерея...
Сообщение отредактировал Dmitry - Сб, 21.11.2009, 21:07
Python Дата: Пн, 15.03.2010, 23:39  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 51
Репутация: 0   ±
Замечания:   ±
На сайте с 11.02.2010

Статус: Offline

Подскажите как можно организовать обработчик прерывания на ножке rb0?
пробовал как в РВР:

TRISB=%00000001
INTCON=%11010000 'РАЗРЕШАЕМ ПРЕРЫВАНИЯ RB0
cnt=1

ON INTERRUPT GOTO PULSE

DISABLE
PULSE:
CNT=CNT+1
INTCON.1=0
RESUME
ENABLE

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

slavauk Дата: Вт, 16.03.2010, 09:13  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 68
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Quote (Python)
неполучается...
После выполнения подпрограммы прерывания контроллер сбрасывается...

Прерывания можна вызвать только из основной программы.У Вас ее нет,поэтому сбрасывается.
Допишите хотя-бы так

Code
cnt var byte
TRISB=%00000001  
INTCON=%11010000 'ÐÀÇÐÅØÀÅÌ ÏÐÅÐÛÂÀÍÈß RB0  
cnt=1  
ON INTERRUPT GOTO PULSE  
lo:
pause 1
goto lo

DISABLE  
PULSE:  
CNT=CNT+1  
INTCON.1=0  
RESUME  
ENABLE

Python Дата: Ср, 24.03.2010, 00:30  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 51
Репутация: 0   ±
Замечания:   ±
На сайте с 11.02.2010

Статус: Offline

Как можно организовать подсчет импульсов на ноге RB0 с помощью прерывания на Протон-Бейсике, на РВР получалось а вот на Протоне траблы сплошные...
ivan_fd Дата: Ср, 24.03.2010, 11:26  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Напишите что именно у вас не получается, какой код...?

Меня все время преследуют умные мысли...но я быстрее!!!
Python Дата: Ср, 24.03.2010, 20:46  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 51
Репутация: 0   ±
Замечания:   ±
На сайте с 11.02.2010

Статус: Offline

Вот код:

Device = 16F628A ;Используеlый микроконтроллер
XTAL = 20 ;Частота осциллятора 20 МГц
Config WDT_OFF, BODEN_ON, INTRC_OSC_NOCLKOUT, LVP_OFF, CP_OFF, PWRTE_ON, MCLRE_OFF
Declare ALL_DIGITAL = On ' Установить все порты цифровыми входами/выходами
PORTB_PULLUPS = On ' Включить подтягивающие резисторы на PORTB

Declare LCD_TYPE ALPHA ' Тип ЖКИ - буквенно -цифровой
Declare LCD_DTPIN PORTA.0 ' Порт данных ЖКИ
Declare LCD_ENPIN PORTA.7 ' Цепь управления E
Declare LCD_RSPIN PORTA.6 ' Цепь управления RS
Declare LCD_INTERFACE 4 ' Разрядность шины данных
Declare LCD_COMMANDUS 200 ' Задержка перед посылкой команды
Declare LCD_DATAUS 50 ' Задержка перед посылкой данных
Declare LCD_LINES 2 ' Количество строк ЖКИ

INTCON=%11010000 'РАЗРЕШАЕМ ПРЕРЫВАНИЯ RB0

'---------------------------------Объявление переменных----------------------------------

cnt var word
oldcnt var word
buffer var byte
cnt=0
oldcnt=0
'-----------------------------------Главная программа------------------------------------
on_hardware_interrupt GoTo PULSE

PORTB=0
TRISB=%00000111

_start:
Cls
start:
If cnt<>oldcnt Then
Print At 1,1, Dec cnt
oldcnt=cnt
endif
GoSub receive
If buffer="3" Then PORTB.3=1
If buffer="4" Then PORTB.4=1
If buffer="5" Then PORTB.5=1
If buffer="6" Then PORTB.6=1
If buffer<>"3" And buffer<>"4" And buffer<>"5" And buffer<>"6" Then GoTo all_stop
GoTo start

all_stop:
PORTB=0
GoTo start

receive:
HSerIn [buffer]
Return

PULSE:
Context SAVE
CNT=CNT+1
INTCON.1 = 0
Context Restore

End

brown Дата: Ср, 24.03.2010, 22:35  |                                                                                                                Сообщение # 12
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Quote (Python)
PULSE:
Context SAVE
CNT=CNT+1
INTCON.1 = 0
Context Restore

Лично я в начале подпроги прерывания ставлю INTCON = %00000000 , а конце INTCON = %10010000


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ivan_fd Дата: Чт, 25.03.2010, 15:25  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

И какие у вас здесь траблы?
Для хардварного прерывания, прерывание желательно писать на АСМ.


Меня все время преследуют умные мысли...но я быстрее!!!
Сообщение отредактировал ivan_fd - Чт, 25.03.2010, 17:47
Python Дата: Чт, 25.03.2010, 21:54  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 51
Репутация: 0   ±
Замечания:   ±
На сайте с 11.02.2010

Статус: Offline

Quote (ivan_fd)
И какие у вас здесь траблы?

траблы в том что нет реакции на изменение уровня...
Quote (ivan_fd)
Для хардварного прерывания, прерывание желательно писать на АСМ.

Зачем тогда учиться программировать на Протон_бейсике, тем более есть такая инструкция в компиляторе.
slavauk Дата: Пт, 26.03.2010, 00:45  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 68
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Quote (Python)
траблы в том что нет реакции на изменение уровня...

Не правильно использован оператор
Code
HSerIn [buffer]

Замените на
Code
HSerIn 0,,[buffer]
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Аппаратные прерывания - не могу понять
Страница 1 из 212»
Поиск: