Помогите с прерываниями
|
|
Hund |
Дата: Пн, 17.12.2012, 18:19 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
Здравствуйте всем. написал программку по учебнику ну и немного от себя -pic 16f876 бегущий огонь 4 светодиода,скорость управляется переменником,4 программы,переключается кнопочкой..Захотелось добавить еще два светодиода дабы плавно перемигивались.Скоростью переключения управляю как - pause (значение считанное ацп с переменника). Для плавного переключения еще двух каналов использую прерывание от таймера0 и встроенный шим. вот так : intcon = %10100000 option_reg =%00000110 ..... loop .... on interrupt GOto inter ..... delay (значение) ..... go to loop
disable inter light=light+way if light>=250 then way = -1 if light<=1 then way = 1 Hpwm 1,light,50 Hpwm 2,256-light,50
resume enable
с одной стороны работает,но есть большое но - частота перелива дополнительных диодов зависит от выставленной переменником задержки переключения основного бегущего огня.Такое ощущение чот при выполнении delay прерывания тоже не происходит. - не может мне кто нибудь что нибудь подсказать.Спасибо
Сообщение отредактировал
Hund - Пн, 17.12.2012, 18:23
|
|
|
|
shaman |
Дата: Пн, 17.12.2012, 19:15 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Добрый вечер,с прерываниями почитайте как их правильно строить,на нашем сайте все есть ,единственное они на Proton,и скидывайте пожалуйста весь проект,так Вам мало кто поможет с Вашим вопросом. Добавлено (17.12.2012, 19:12) --------------------------------------------- http://www.picbasic.ru/publ/preryvanie_po_ljubomu_portu_mk/2-1-0-74 http://www.picbasic.ru/publ....1-0-111 http://www.picbasic.ru/publ....1-0-112 Добавлено (17.12.2012, 19:15) --------------------------------------------- И в самой Вашей проге ошибки,прочтите по ссылкам что я Вам скинул попробуйте написать правильно,если не палучиться ,то поможем чем сможем
|
|
|
|
Hund |
Дата: Пн, 17.12.2012, 19:30 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
Спасибо.Разобрался благодаря учебнику по Протону (супер вещь!!!) всего то надо было вместо скажем Pause 8000 использовать конструкцию типа For VAR1 = 0 To 8000 PAUSE 1 Next так как прерывание все таки ждет выполнения текущей команды и в первом случает будет ждать пока пауза отработает все 8000 .
|
|
|
|
shaman |
Дата: Пн, 17.12.2012, 19:33 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
А как понять это way = -1 ????
|
|
|
|
Hund |
Дата: Пн, 17.12.2012, 19:37 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
Это вообще моя первая программа на Basicpro .Пожалуйста укажите на ошибки - мне это важно.
define ADC_BITS 8 define ADC_CLOCK 3 define ADC_SAMPLES 50 adval var byte delay1 var word pin var byte LED1 var byte LED2 var byte LED3 var byte LED4 var byte LED5 var byte LED6 var byte LED7 var byte knob var byte w var word VAR1 var word light var byte way var byte
PortB = %00000000 'порт В все выходы TrisB = %00000001 ' порт B.0 - вход PortC = %00000000 ' порт С все выходы TrisC = %00000000
intcon = %10100000 ' разрешить прерывание по таймеру 0 option_reg =%00000110 ' предделитель 128
TrisA = %11111111 'порт А весь входы Adcon1 = %00000000 light=1 'начальнон значение скважности для ШИМ way=1 'направление приращения скважности для ШИМ
main:
led5=0 led6=0 led7=1 knob=0
loop: 'Основной цикл
ADCIN 2,adval ' Считываем положение переменника
delay1=adval*2 'задержка = значение преобразования*2
if portb.0=0 then 'если нажата кнопка knob=knob+1 if knob = 1 then goto sec1 'выбрать порядок горения св.диодов if knob = 2 then goto sec2 if knob = 3 then goto sec3 if knob = 4 then goto sec4 if knob = 5 then ' если кнопка =5 зациклить значение кнопки knob=0 ' и вернуться к началу goto loop goto fire ' перейти к зажиганию диодов endif endif fire: on interrupt GOto inter 'по препыванию сменитьзаполнение ШИМ
portb.0[4] = led1 ' зажечь диоды в выбранном порядке portb.0[5] = led2 portb.0[6] = led3 portb.0[7] = led4
'* portb.0[3] = led6 '* portb.0[2] = led7 '* portb.0[1] = led7
; pause delay1 ' пауза
For VAR1 = 0 To DELAY1 PAUSE 1 Next
led5=led1 'сдвинуть в цикле зажженые св.диоды led1=led2 led2=led3 led3=led4 led4=led5 led5=led6 led6=led7 led7=led5
goto loop 'вернуться в начало
sec1: led1=1 led2=0 led3=0 led4=0 goto fire:
sec2: led1=1 led2=1 led3=0 led4=0 goto fire:
sec3: led1=1 led2=1 led3=1 led4=0 goto fire:
sec4: led1=1 led2=0 led3=1 led4=0 goto fire:
end disable inter light=light+way if light>=250 then way = -1 if light<=1 then way = 1 Hpwm 1,light,50 Hpwm 2,256-light,50
resume enableДобавлено (17.12.2012, 19:37) --------------------------------------------- мде понял . А какой тип переменных может быть отрицательным ?
Сообщение отредактировал
Hund - Пн, 17.12.2012, 19:35
|
|
|
|
shaman |
Дата: Пн, 17.12.2012, 19:40 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
А зачем,я просто Вас не могу понять
|
|
|
|
retas |
Дата: Пн, 17.12.2012, 19:41 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Hund!Пожалуй ты правильно заметил - при выполнении delay прерывания не происходит (во всяком случае в Протоне - с PicBasicPro я дел не имел). Обойти такое можно создав отдельный счетчик пополняющийся через допустимо малые промежутки времени и проверяя не достиг ли он нужной величины.
|
|
|
|
Hund |
Дата: Пн, 17.12.2012, 19:41 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
мне надо как то просто в цикле увеличивать а затем уменьшать скважность сигнала ШИМ Тем более странно - но на макетной плате работает - светодиоды плавно загораются и гаснут поочередно ..
Сообщение отредактировал
Hund - Пн, 17.12.2012, 19:42
|
|
|
|
shaman |
Дата: Пн, 17.12.2012, 19:42 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
может быть Step - 1
|
|
|
|
Hund |
Дата: Пн, 17.12.2012, 19:46 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
видимо да - перепишу и отпишусь завтра если это не будет считаться засорением эфира оффтопом ). Спасибо.
|
|
|
|
shaman |
Дата: Пн, 17.12.2012, 19:57 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Так производите INC или DEC,увеличивайте или уменьшайте переменную скважности Добавлено (17.12.2012, 19:47) --------------------------------------------- http://terrarus.ucoz.ru/proton_plus_ide/proton/comands/dec/dec.html http://terrarus.ucoz.ru/proton_plus_ide/proton/comands/inc/inc.html Добавлено (17.12.2012, 19:49) --------------------------------------------- Ок, просто все внимательно изучите и напишите заново,если не палучится , скините полностью проект,и Вам помогут. Добавлено (17.12.2012, 19:57) --------------------------------------------- http://terrarus.ucoz.ru/proton_plus_ide/proton/comands/pwm/pwm.html
|
|
|
|
Hund |
Дата: Вт, 18.12.2012, 19:41 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
вроде все работает , теперь надо подумать как нелинейно менять яркость светодиодов,хочется чтобы гас чуть подольше и до полного выключения,линейное изменение глаз воспринимает видимо не совсем линейно ). пока вот так : define ADC_BITS 8 define ADC_CLOCK 3 define ADC_SAMPLES 50 adval var byte 'adval2 var byte delay1 var word pin var byte LED1 var byte LED2 var byte LED3 var byte LED4 var byte LED5 var byte LED6 var byte LED7 var byte knob var byte w var word VAR1 var word light var byte way var byte
PortB = %00000000 'порт В все выходы TrisB = %00000001 ' порт B.0 - вход PortC = %00000000 ' порт С все выходы TrisC = %00000000 intcon = %10100000 ' разрешить прерывание по таймеру 0 option_reg =%00000111 ' предделитель 256 TrisA = %11111111 'порт А весь входы Adcon1 = %00000000 light=1 'начальнон значение скважности для ШИМ way=1 'направление приращения скважности для ШИМ main:
led5=0 led6=0 led7=1 knob=0 en=0 loop: 'Основной цикл ADCIN 2,adval ' Считываем положение переменника delay1=adval*2 'задержка = значение преобразования*2
if portb.0=0 then 'если нажата кнопка knob=knob+1 if knob = 1 then goto sec1 'выбрать порядок горения св.диодов if knob = 2 then goto sec2 if knob = 3 then goto sec3 if knob = 4 then goto sec4 if knob = 5 then ' если кнопка =5 зациклить значение кнопки knob=0 ' и вернуться к началу goto loop goto fire ' перейти к зажиганию диодов endif endif fire: on interrupt GOto inter 'по препыванию сменитьзаполнение ШИМ portb.0[4] = led1 ' зажечь диоды в выбранном порядке portb.0[5] = led2 portb.0[6] = led3 portb.0[7] = led4 ; pause delay1 ' пауза For VAR1 = 0 To DELAY1 PAUSE 1 Next led5=led1 'сдвинуть в цикле зажженые св.диоды led1=led2 led2=led3 led3=led4 led4=led5 led5=led6 led6=led7 led7=led5
goto loop 'вернуться в начало sec1: led1=1 led2=0 led3=0 led4=0 goto fire: sec2: led1=1 led2=1 led3=0 led4=0 goto fire: sec3: led1=1 led2=1 led3=1 led4=0 goto fire: sec4: led1=1 led2=0 led3=1 led4=0 goto fire: end disable inter: if way=1 then light=light+1 else light=light-1 endif if light>=244 then way = 2 if light<=1 then way = 1 Hpwm 1,light,500 Hpwm 2,256-light,500 resume enable
|
|
|
|
shaman |
Дата: Ср, 19.12.2012, 20:19 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
Добрый вечер, скиньте проект в протеусе и переходите на Proton практически не отличается от PicBasic
|
|
|
|
shaman |
Дата: Чт, 20.12.2012, 11:13 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
День добрый,Hund скидываю Вам проект по прерываниям,он на PicBasic ,в проекте RGB св. диоды управляются кнопками,командой PWM ,посмотрите его ,и переделайте под свои нужды, и переходите на Proton, по ссылкам что я Вам скинул выше в постах,есть готовые примеры прерываний , просто нужно дописать код под себя и все будет работать. Добавлено (20.12.2012, 11:13) --------------------------------------------- Приношу извинения,там не PWM,а просто построено на прерываниях,и увеличении или уменьшении скважности тобеж INC или DEC
|
|
|
|
Hund |
Дата: Пт, 28.12.2012, 19:07 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
в принципе работает и так как я написал,столкнулся с аппаратной видимо проблемой.В положении самого медленного мигания (переменного резистора) не гаснут до конца управляемые диоды.Чуть быстрее - и все путем ,никак не могу понять отчего это.Пытался ограничить напряжение на затворе стабилитроном - не помогает. На отдельном светодиоде,напрямую к ноге через токограничительное сопротивление такого не наблюдается.. Схема:
Добавлено (28.12.2012, 19:07) --------------------------------------------- Извиняюсь торопился - в схеме значения r3,r4 - 390 om, rv1-100Kom
Прикрепления:
rs.bmp
(790.9 Kb)
Сообщение отредактировал
Hund - Пт, 28.12.2012, 19:36
|
|
|
|