Прерывания в РВР
|
|
brown |
Дата: Вт, 02.10.2007, 03:28 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Прежде привет Yrok! По мере свободного времени и желания крутил-вертел вашу процедуру измерения tи -положительного результата не добился :-(. ...Пробывал пару процедур с использованием прерывания прямо на железе- получаеться както тупо-медленно. Может это субъективные ощушения, или плохие навыки программирования? У кого есть опыт в прерываниях?
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
bobinventor |
Дата: Вт, 02.10.2007, 07:36 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
3
Замечания:
±
На сайте с 14.09.2007
Статус:
Offline
|
Кстати о прерываниях... Команды ENABLE и DISABLE не работают, приходится вручную в INTCON прописывать запрет или разрешение... Может кто покажет пример работающей программы или я что-то не так понимаю...
|
|
|
|
ADMIN |
Дата: Вт, 02.10.2007, 17:15 | Сообщение # 3 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Приведи код, схему можно более объективно судить о твоей проблеме.
|
|
|
|
bobinventor |
Дата: Ср, 03.10.2007, 10:46 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
3
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Напишите тип процессора. Разберусь, выложу обратно.Ждите А вообще, disable пишется один раз, при входе в прерывание, также, как и enable при выходе.
Сообщение отредактировал
basicpic - Ср, 03.10.2007, 16:43
|
|
|
|
ADMIN |
Дата: Ср, 03.10.2007, 17:30 | Сообщение # 6 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
to brown Quote Прежде привет Yrok! По мере свободного времени и желания крутил-вертел вашу процедуру измерения tи -положительного результата не добился :-(. ...Пробывал пару процедур с использованием прерывания прямо на железе- получаеться както тупо-медленно. Может это субъективные ощушения, или плохие навыки программирования? У кого есть опыт в прерываниях? Извени несразу заметил что было обращение ко мне --несовсем понял какую процедуру ты имел ввиду--если все еще интересует сообщи что за процедура и чего вообще хотелось бы добиться--обещаю помочь)))
|
|
|
|
Эд |
Дата: Вс, 15.05.2011, 16:50 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 30.08.2009
Статус:
Offline
|
Помогите с прерываниями прога простая по нажатию кнопки плюс 1 с выводом на индикацию от 1 до 15 по нажатию минус в другую сторону, по прерыванию от переполнения таймера0, переменная индикации увеличивается на 3, почему то прерывания срабатывают 3 раза и всё глухо.
|
|
|
|
MasterPic |
Дата: Вс, 15.05.2011, 17:23 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
в PBP вообще с прерываниями проблема. Я пытался на нем сделать прерывания для твоей программы, да так и бросил - хотел ассеблером написать - не идет, выдает ошибки. Считаю, что эту программку на протоне написать - 1 час хватит за глаза. Там с прерываниями проблемы, по крайней мере у меня, обычно не возникают
|
|
|
|
Эд |
Дата: Вс, 15.05.2011, 21:55 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 30.08.2009
Статус:
Offline
|
Советуете переходить на Протон? Удивляет почему три раза всё таки прерывания срабатывают? .
Сообщение отредактировал
Эд - Пн, 16.05.2011, 00:42
|
|
|
|
DAlexV |
Дата: Пн, 16.05.2011, 23:17 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (Эд) Удивляет почему три раза всё таки прерывания срабатывают? Эд, а почему это Вы решили что прерывание 3 раза происходит ??? Скачал файл из 12 поста. Все нормально работает. Кратковременное нажатие на кнопки + или - 1 на индикаторе. Долго держишь - пошел перебор. Глюков нет. Скорее Протеус тормозит. Если выдает горчичник типа "No Real Time Simulation", то такие глюки возможны. Что бы точно узнать что внутри проца происходит нужно ему как минимум BAS или ASM файл подсовывать. Тогда уже можно и точки останова выставлять, и время работы мерить и за состояниями регистров следить.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|