| Прерывания в РВР | 
|  | 
| 
 
 
 
 | brown | Дата: Вт, 02.10.2007, 03:28  |                                                                                                                Сообщение # 1 |  
 |   
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 331
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | Напишите тип процессора. Разберусь, выложу обратно.Ждите
 А вообще, disable пишется один раз, при входе в прерывание, также, как и enable при выходе.
 
 Сообщение отредактировал 
 
 basicpic - Ср, 03.10.2007, 16:43
 
  |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Ср, 03.10.2007, 17:30  |                                                                                                                Сообщение # 6 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 331
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 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 |  
 | ![Yrok]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Продвинутый
 
  
 Сообщений: 
 
 
 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 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 655
 
 
 Замечания: ± На сайте с 13.05.2008
 
 
 Статус: 
 Offline
 
 | Эд, а почему это Вы решили что прерывание 3 раза происходит ??? Скачал файл из 12 поста. Все нормально работает. Кратковременное нажатие на кнопки + или - 1 на индикаторе. Долго держишь - пошел перебор. Глюков нет. Скорее Протеус тормозит. Если выдает горчичник типа "No Real Time Simulation", то такие глюки возможны. Что бы точно узнать что внутри проца происходит нужно ему как минимум BAS или ASM файл подсовывать. Тогда уже можно и точки останова выставлять, и время работы мерить и за состояниями регистров следить.Quote (Эд) Удивляет почему три раза всё таки прерывания срабатывают?
 Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
 |  
 |  |  |  |