Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите с прерываниями
Помогите с прерываниями
Hund Дата: Пн, 17.12.2012, 18:19  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 17.12.2012
shaman Дата: Пн, 17.12.2012, 19:15  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 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)
---------------------------------------------
И в самой Вашей проге ошибки,прочтите по ссылкам что я Вам скинул попробуйте написать правильно,если не палучиться ,то поможем чем сможем biggrin

Hund Дата: Пн, 17.12.2012, 19:30  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 03.12.2012

Статус: Offline

Спасибо.Разобрался благодаря учебнику по Протону (супер вещь!!!)
всего то надо было вместо скажем Pause 8000
использовать конструкцию типа
For VAR1 = 0 To 8000
PAUSE 1
Next
так как прерывание все таки ждет выполнения текущей команды и в первом случает будет ждать пока пауза отработает все 8000 .
shaman Дата: Пн, 17.12.2012, 19:33  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

А как понять это way = -1 ????
Hund Дата: Пн, 17.12.2012, 19:37  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

А зачем,я просто Вас не могу понять
retas Дата: Пн, 17.12.2012, 19:41  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Hund!Пожалуй ты правильно заметил - при выполнении delay прерывания не происходит (во всяком случае в Протоне - с PicBasicPro
я дел не имел). Обойти такое можно создав отдельный счетчик пополняющийся через допустимо малые промежутки времени и проверяя
не достиг ли он нужной величины.
Hund Дата: Пн, 17.12.2012, 19:41  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 03.12.2012

Статус: Offline

мне надо как то просто в цикле увеличивать а затем уменьшать скважность сигнала ШИМ
Тем более странно - но на макетной плате работает - светодиоды плавно загораются и гаснут поочередно ..

Сообщение отредактировал Hund - Пн, 17.12.2012, 19:42
shaman Дата: Пн, 17.12.2012, 19:42  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

может быть Step - 1
Hund Дата: Пн, 17.12.2012, 19:46  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 03.12.2012

Статус: Offline

видимо да - перепишу и отпишусь завтра если это не будет считаться засорением эфира оффтопом ).
Спасибо.
shaman Дата: Пн, 17.12.2012, 19:57  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 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

ЯНДЕКС Дата: 17.12.2012
Hund Дата: Вт, 18.12.2012, 19:41  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

Добрый вечер, скиньте проект в протеусе и переходите на Proton практически не отличается от PicBasic
shaman Дата: Чт, 20.12.2012, 11:13  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 178
Репутация: 5   ±
Замечания:   ±
На сайте с 07.11.2011

Статус: Offline

День добрый,Hund скидываю Вам проект по прерываниям,он на PicBasic ,в проекте RGB св. диоды управляются кнопками,командой PWM ,посмотрите его ,и переделайте под свои нужды, и переходите на Proton, по ссылкам что я Вам скинул выше в постах,есть готовые примеры прерываний , просто нужно дописать код под себя и все будет работать.

Добавлено (20.12.2012, 11:13)
---------------------------------------------
Приношу извинения,там не PWM,а просто построено на прерываниях,и увеличении или уменьшении скважности тобеж INC или DEC

Прикрепления: 9244920.7z (12.6 Kb)
Hund Дата: Пт, 28.12.2012, 19:07  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите с прерываниями
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: