Прерывания в РВР - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывания в РВР
Прерывания в РВР
brown Дата: Вт, 02.10.2007, 03:28  |                                                                                                                Сообщение # 1
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Прежде привет Yrok! По мере свободного времени и желания крутил-вертел
вашу процедуру измерения tи -положительного результата не добился :-(.
...Пробывал пару процедур с использованием прерывания прямо на железе-
получаеться както тупо-медленно. Может это субъективные ощушения, или
плохие навыки программирования? У кого есть опыт в прерываниях?


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ЯНДЕКС Дата: 02.10.2007
bobinventor Дата: Вт, 02.10.2007, 07:36  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2007

Статус: Offline

Кстати о прерываниях...
Команды ENABLE и DISABLE не работают, приходится вручную в INTCON прописывать запрет или разрешение... Может кто покажет пример работающей программы или я что-то не так понимаю... dry
ADMIN Дата: Вт, 02.10.2007, 17:15  |                                                                                                                Сообщение # 3
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Приведи код, схему можно более объективно судить о твоей проблеме.
bobinventor Дата: Ср, 03.10.2007, 10:46  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2007

Статус: Offline

Вот вообщем-то рабочий код программы:
Code

i var byte
color var byte
brait var byte
Plus var portb.7
Minus var portb.6
BackC var portb.5
NextC var portb.4
red var porta.0
green var porta.1
blue var porta.2
p var byte
m var byte
bc var byte
nc var byte
Output porta.0
Output porta.1
Output porta.2
Input portb.7
Input portb.6
Input portb.5
Input portb.4
read $00, color
if color > $7 then write $00, $1
if color < $1 then write $00,$7

brait = brait + 1 max 255
brait = brait - 1 min 0
color = color + 1 max 7
color = color - 1 min 1

'Загружаем значения из EEPROM
read $00, color
read $01, brait

on interrupt goto Detect_Key
intcon = %10001000
enable interrupt

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

while color = 1 'Красный
PWM red, brait,1
PWM green, 0,1
PWM blue, 0,1
wend

while color = 2 'Желтый
PWM red, brait,1
PWM green, brait,1
PWM blue, 0,1
wend

while color = 3 'Зеленый
PWM red, 0,1
PWM green, brait,1
PWM blue, 0,1
wend

while color = 4 'Голубой
PWM red, 0,1
PWM green, brait,1
PWM blue, brait,1
wend

while color = 5 'Синий
PWM red, 0,1
PWM green, 0,1
PWM blue, brait,1
wend

while color = 6 'Фиолетовый
PWM red, brait,1
PWM green, 0,1
PWM blue, brait,1
wend

while color = 7 'Белый
PWM red, brait,1
PWM green, brait,1
PWM blue, brait,1
wend

disable
Detect_Key
[color=red]intcon = %00000000[/color]
p = 0
button plus,0,255,0,p,1,Brait_Plus
goto main
Brait_Plus

Brait = brait + 10
write $01,brait
[color=red]intcon = %10001000[/color]
resume
disable interrupt

Brait_Minus

Brait = brait - 10
write $01,brait
[color=red]intcon = %10001000[/color]
resume
disable interrupt

Back_Color

color = color - 1
write $00,color
[color=red]intcon = %10001000[/color]
resume
disable interrupt

Next_Color

color = color + 1
write $00,color
[color=red]intcon = %10001000[/color]
resume
disable interrupt

end

Она имитирует ШИМ RGB светодиода который подключен, соответственно к трем портам микроконтроллера (МК). С помощью этой программы можно получить все цвета радуги и регулировать яркость.
В подпрограммах увеличения или уменьшения переменных цвета (Back_Color и Next_Color) и увеличения и уменьшения яркости (Brait_Plus и Brait_Minus) а также опроса клавиатуры (Detect_Key) есть команды запрета/разрешения прерываний (они выделены красным цветом). Если эти команды убрать, программа будет работать не совсем правильно, будет зависание в одной из подпрограмм! например в красном цвете.
Может я что-то не правильно понимаю...
Подскажите...

Сообщение отредактировал basicpic - Чт, 11.10.2007, 17:21
ADMIN Дата: Ср, 03.10.2007, 16:32  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Напишите тип процессора.
Разберусь, выложу обратно.Ждите
А вообще, disable пишется один раз, при входе в прерывание, также, как и enable при выходе.

Сообщение отредактировал basicpic - Ср, 03.10.2007, 16:43
ADMIN Дата: Ср, 03.10.2007, 17:30  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вот исправленный, работающий код. Сделал для 84 пика. Сравните со своим по количеству использованной памяти и по общему тексту программы
Code


   color var byte  
   brait var byte
   Plus var portb.7  
   Minus var portb.6  
   BackC var portb.5  
   NextC var portb.4  
   red var porta.0  
   green var porta.1  
   blue var porta.2  
trisa=%00000000  
trisb=%11110000
portb=%11110000
option_reg.7=0
on interrupt goto Detect_Key' Здесь мы просто говорим компилятору, куда переходить в случае прерывания( То есть - директива ORG)  
'Загружаем значения из EEPROM
read $00, color  
read $01,brait    
if color > $7 or color<1 then  
color=1
write $00, $1  
endif   
intcon = %10001000  ' Включаем прерывания!!!!

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

while color = 1 'Красный  
PWM red, brait,1  
PWM green, 0,1  
PWM blue, 0,1  
wend  

while color = 2 'Желтый  
PWM red, brait,1  
PWM green, brait,1  
PWM blue, 0,1  
wend  

while color = 3 'Зеленый  
PWM red, 0,1  
PWM green, brait,1  
PWM blue, 0,1  
wend  

while color = 4 'Голубой  
PWM red, 0,1  
PWM green, brait,1  
PWM blue, brait,1  
wend  

while color = 5 'Синий  
PWM red, 0,1  
PWM green, 0,1  
PWM blue, brait,1  
wend  

while color = 6 'Фиолетовый  
PWM red, brait,1  
PWM green, 0,1  
PWM blue, brait,1  
wend  

while color = 7 'Белый  
PWM red, brait,1  
PWM green, brait,1  
PWM blue, brait,1  
wend  
goto main

disable                    ' Так положено
Detect_Key:  
intcon = %00000000  'Отключаем прерывания

if  plus=0 then    
Brait = brait + 10  
write $01,brait   
endif
if minus=0 then
Brait = brait - 10  
write $01,brait   
endif
   
if BackC=0 then
color = color - 1
if color<1 then color=7  
write $00,color   
endif

if nextc=0 then  
color = color + 1  
if color=8 then color=1
write $00,color
endif

   
intcon = %10001000  'И опять же влючаем и
resume                     'уходим в основное кольцо Main
enable  

end  
  

Отмечу! Обратите внимание все, пожалуйста! Код, приведенный здесь, занимает 465 program words в PicBasicPro.
А тот же самый код, но адаптированный под протон, в протоне занимает 408 program words. То есть экономия программного пространства налицо.
Помимо этого, в протеус можно загнать непосредственно файл .BAS, программы, написанной в протоне и отследить, на какой Basic-инструкции программа глючит. Это констатация фактов.
Теперь вопросы, обсуждения. Спрашивайте.

Сообщение отредактировал basicpic - Ср, 03.10.2007, 18:19
ADMIN Дата: Ср, 03.10.2007, 18:21  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Это то же самое, но для протона. Изучайте. Пишите вопросы, будем разбираться.
Code

device 16f84

dim color as byte  
dim brait as byte
dim Plus as portb.7  
dim Minus as portb.6  
dim BackC as portb.5  
dim NextC as portb.4  
dim red as porta.0  
dim green as porta.1  
dim blue as porta.2  
trisa=%00000000  
trisb=%11110000
portb=%11110000
option_reg.7=0
on interrupt goto Detect_Key
'Загружаем значения из EEPROM
color=eread $00   
brait=eread $01    
if color > $7 or color<1 then  
color=1
ewrite $00,[ $1 ]
endif   
intcon = %10001000  

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

while color = 1 'Красный  
PWM red, brait,1  
PWM green, 0,1  
PWM blue, 0,1  
wend  

while color = 2 'Желтый  
PWM red, brait,1  
PWM green, brait,1  
PWM blue, 0,1  
wend  

while color = 3 'Зеленый  
PWM red, 0,1  
PWM green, brait,1  
PWM blue, 0,1  
wend  

while color = 4 'Голубой  
PWM red, 0,1  
PWM green, brait,1  
PWM blue, brait,1  
wend  

while color = 5 'Синий  
PWM red, 0,1  
PWM green, 0,1  
PWM blue, brait,1  
wend  

while color = 6 'Фиолетовый  
PWM red, brait,1  
PWM green, 0,1  
PWM blue, brait,1  
wend  

while color = 7 'Белый  
PWM red, brait,1  
PWM green, brait,1  
PWM blue, brait,1  
wend  
goto main

disable  
Detect_Key:  
intcon = %00000000  

if  plus=0 then    
Brait = brait + 10  
ewrite $01,[brait]   

elseif minus=0 then
Brait = brait - 10  
ewrite $01,[brait]   

elseif BackC=0 then
color = color - 1
if color<1 then color=7  
ewrite $00,[color]   

elseif nextc=0 then  
color = color + 1  
if color=8 then color=1
ewrite $00,[color]

endif
   
intcon = %10001000  
resume  
enable  

end  

Вот и сравните заодно.

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

Статус: Offline

По поводу использования DISABLE, ENABLE. Насколько я понял применяя
эти операторы-указатели можно сделать так, чтобы прерывания обрабатывались
только в нужных местах программы и при этом экономиться программная
память МК т.к. не вставляется проверка флага прерывания после каждого
оператора Бейсика. Поправьте, если я не прав.
Пример:

'Начало программы
.................
/
.................
'Обработчик прерывания
DISABLE
intRB0:
INTCON = %10000000 'Запрет прерываний битами
.................
/
.................
INTCON = %10010000 'Разрешение внешнего прерывания и сброс флага
resume main 'Возврат из прерывания в начало блока
'Блок подпрограмм
..................
/ 'запрет прерываний
..................
'Основная часть программы
.................
On Interrupt Goto intRB0
enable
main:
.................
/ 'Участок программы где нужно прерывание
.................
DISABLE
.................
/ 'запрет прерываний
.................
end


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ADMIN Дата: Вт, 09.10.2007, 12:43  |                                                                                                                Сообщение # 9
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

В мануале написано, что команды disable, resume и enable не фактические команды в прямом смысле слова, а внутренние флаги компилятора, они не генерируют никакого кода. По поводу On Interrupt написано, что disable запрещает в обработчике прерывания вставку запроса на прерывание перед каждой командой, enable разрешает. Так же написано, что если выключить бит GIE после входа в прерывание, то прерывание зацикливается. Так что давайте переводить мануалы и разбираться детально. У меня работает так как в примере выше.
Сообщение отредактировал basicpic - Вт, 09.10.2007, 17:13
ADMIN Дата: Чт, 11.10.2007, 12:56  |                                                                                                                Сообщение # 10
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вообще, лучше писать так:
Code

ON_INTERRUPT GOTO LABEL 'обратите внимание на написание "_"

Main:
.................
................
...............
GOTO Main

LABEL:
обработка прерывания
сброс флага, вызвавшего прерывания
RETFIE

Сообщение отредактировал basicpic - Чт, 11.10.2007, 17:20
Yrok Дата: Чт, 06.12.2007, 15:06  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

to brown

Quote
Прежде привет Yrok! По мере свободного времени и желания крутил-вертел
вашу процедуру измерения tи -положительного результата не добился :-(.
...Пробывал пару процедур с использованием прерывания прямо на железе-
получаеться както тупо-медленно. Может это субъективные ощушения, или
плохие навыки программирования? У кого есть опыт в прерываниях?

Извени несразу заметил что было обращение ко мне
--несовсем понял какую процедуру ты имел ввиду--если все еще интересует сообщи что за процедура и чего вообще хотелось бы добиться--обещаю помочь)))

Эд Дата: Вс, 15.05.2011, 16:50  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 30.08.2009

Статус: Offline

Помогите с прерываниями прога простая по нажатию кнопки плюс 1 с выводом на индикацию от 1 до 15 по нажатию минус в другую сторону, по прерыванию от переполнения таймера0, переменная индикации увеличивается на 3, почему то прерывания срабатывают 3 раза и всё глухо.
Прикрепления: UZ_gen_prer.rar(41Kb)
MasterPic Дата: Вс, 15.05.2011, 17:23  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

в PBP вообще с прерываниями проблема. Я пытался на нем сделать прерывания для твоей программы, да так и бросил - хотел ассеблером написать - не идет, выдает ошибки. Считаю, что эту программку на протоне написать - 1 час хватит за глаза. Там с прерываниями проблемы, по крайней мере у меня, обычно не возникают
Эд Дата: Вс, 15.05.2011, 21:55  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 30.08.2009

Статус: Offline

Советуете переходить на Протон? Удивляет почему три раза всё таки прерывания срабатывают?

.

Сообщение отредактировал Эд - Пн, 16.05.2011, 00:42
DAlexV Дата: Пн, 16.05.2011, 23:17  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Эд)
Удивляет почему три раза всё таки прерывания срабатывают?
Эд, а почему это Вы решили что прерывание 3 раза происходит ??? Скачал файл из 12 поста. Все нормально работает. Кратковременное нажатие на кнопки + или - 1 на индикаторе. Долго держишь - пошел перебор. Глюков нет. Скорее Протеус тормозит. Если выдает горчичник типа "No Real Time Simulation", то такие глюки возможны. Что бы точно узнать что внутри проца происходит нужно ему как минимум BAS или ASM файл подсовывать. Тогда уже можно и точки останова выставлять, и время работы мерить и за состояниями регистров следить.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
Форум Picbasic.ru » Программирование МК » PicBasicPro » Прерывания в РВР
Страница 1 из 212»
Поиск: