Jump to content

Evgeniy

Программирование на PicBasic Pro Урок №2

Recommended Posts

При написании программ, не забываем про конфигурирование микроконтроллера, его внутренней периферии!

Простой проект на pic12f675. При нажатии на кнопку начинают по очереди моргать 2 светодиода, при повторном нажатии светодиоды отключаются.

В архиве проект протеуса, прошивка и исходный код.

 

 

 

'****************************************************************
@ device pic12F675, CPD_OFF, PROTECT_ON, MCLR_OFF, PWRT_ON, WDT_Off, INTRC_OSC_NOCLKOUT
'****************************************************************

'****************************************************************
trisio = %11111100
CMCON = %00000111 ' Отключаем встроенный компаратор
ANSEL = %00000000 ' Set AN0 analog
adcon0 = %00000000 'АЦП
OPTION_REG.7 = 0
WPU = %00010000 ' Подтягивающие резисторы (автоматически выключаются при установке порта на вывод)
'****************************************************************


'****************************************************************
key var gpio.4
stat var bit
buf var byte
'****************************************************************
stat = 0
gpio = 0
'****************************************************************

'****************************************************************
main:
button key,0,255,255,buf,1,ledmod
if stat = 0 then main
GPIO = %000000001
pause 500
GPIO = %000000010
pause 500
goto main
'****************************************************************


'****************************************************************
LedMod:
if stat = 0 then
stat = 1
else
stat = 0
gpio = 0
endif
pause 200
goto main
'****************************************************************

 

 

lesson_2.zip

Share this post


Link to post
Share on other sites
 

Если я правильно понял вопрос, то можно. При нажатии на кнопку начинает выполняться другая программа.

Share this post


Link to post
Share on other sites
 

Добавь в твой код: button portA.0,  0,255,255,buf,1,programma2

 

В начале программы: buf var byte

portA.0 - куда кнопка прицеплена. Не забываем про подтягивающий резистор на +5В.

programma2 - метка с другой подпрограммой

 

Если требуется вернуться, во вторую подпрограмму вставляем такую же строчку: button portA.0,  0,255,255,buf1,1,programma1

Только буфер другой (buf1), естественно, его тоже объявить надо в начале программы. Если кнопка будет другая, то пишем соответствующий порт.

 

Если дребезг контактов нестрашен, то можно просто условие вставить: IF portA.0 = 0 THEN programma2

При нажатии на кнопку, нить выполнения программы выполнив условие перейдёт на метку programma2. В данном случае для перехода обратно лучше использовать другую кнопку.

Share this post


Link to post
Share on other sites
 

У тебя длинные паузы, поэтому с командами типа button придётся кнопку долго держать, пока выполнение программы не дойдёт до опроса кнопки. 

Для решения этой проблемы можно пойти двумя способами:

1. Использовать прерывания.

2. Взамен длинной паузы создать подпрограмму типа:

pauses:

for i = 0 to 100

button portA.0,  0,255,255,buf,1,programma2

pause 10

next i

return

 

там где необходима пауза, вставляем gosub pauses, можно несколько раз, для увеличения времени задержки. Во время такой паузы будет производиться опрос кнопки.

Share this post


Link to post
Share on other sites
 

Здравствуйте. Не подскажете, как реализовать алгоритм, при котором возможно будет менять скорость переключения светодиодов с помощью 2-х кнопок (больше-меньше)?. Я так понял, вместо паузы (pause) нужно вставить переменную и реализовывать в  ней. Не подскажете что нужно добавить в эту переменную, какой код?

Share this post


Link to post
Share on other sites
 

Типа такого:

For i=0 to timepause

Pause 100

Gosub опрос кнопок

Next i

 

 

Меняя значение timepause, мы будем менять длительность паузы кратно 100мс.

 

Можно тупо в передних операторе pause вместо числа установить переменную:

Pause timepause

Но в таком варианте периодичность опроса кнопок будет меняться вместе со значением паузы.

Share this post


Link to post
Share on other sites
 

Типа такого:

For i=0 to timepause

Pause 100

Gosub опрос кнопок

Next i

 

 

Меняя значение timepause, мы будем менять длительность паузы кратно 100мс.

 

Можно тупо в передних операторе pause вместо числа установить переменную:

Pause timepause

Но в таком варианте периодичность опроса кнопок будет меняться вместе со значением паузы.

Если вас не затруднит, объясните начинающему что я сделал не так. Пишу программу второй раз в жизни. Буду очень благодарен. У меня должен моргать один светодиод, с управлением скорости по одной кнопке (пока). В протеусе светодиод моргает с задержкой по умолчанию и скорость с кнопки не меняется. 

 

'pic16f84a
 
 
 TrisA = %00000001
 TrisB = %00000000
 
 Led  Var PortB.0
 But  var PortA.0
 timepause var word
 i var byte
 
 
 Knopki:
 PortB = 0
 Button but,0,255,255,timepause,1,speed  'изменение значения паузы кнопкой
 gosub main
 
 main:   'программа мигания одного светодиода
 led = 1
 pause timepause + 300 'пауза по умолчанию 300 м.с.
 Led = 0
 pause timepause + 300 'пауза по умолчанию 300 м.с.
 goto main
 
 speed:
 For i = 0 to timepause
 Pause 100
 Gosub Knopki
 Next i

Share this post


Link to post
Share on other sites
 

Попробуй программу из архива. Там же проект в протеусе! Там же ответ, как добавить кнопку для уменьшения паузы.

led.rar

Share this post


Link to post
Share on other sites
 

Попробуй программу из архива. Там же проект в протеусе! Там же ответ, как добавить кнопку для уменьшения паузы.

Спасибо большое!

Share this post


Link to post
Share on other sites
 
 
 

Сделал подобну прошивку как в 3 м видео, но при компиляции ругается на первую строчку

@ device pic12F675, CPD_OFF, PROTECT_OFF, MCLR_OFF, PWRT_ON, WDT_ON, INTRC_OSC_NOCLKOUT

Illegal opcode (pic12f675)

почему так?

Share this post


Link to post
Share on other sites
 
On 1/7/2022 at 12:55 PM, Palxta said:

Сделал подобну прошивку как в 3 м видео, но при компиляции ругается на первую строчку

@ device pic12F675, CPD_OFF, PROTECT_OFF, MCLR_OFF, PWRT_ON, WDT_ON, INTRC_OSC_NOCLKOUT

Illegal opcode (pic12f675)

почему так?

Потому что данный способ конфигурации битов используется лишь для определённых версий компилятора. В вашем варианте, вероятно, стоит написать так: 

#CONFIG

__config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF & _PWRT_ON

#ENDCONFIG

Подробнее о конфигурационных битах можно ознакомиться в корневой папке, где расположен ваш компилятор: C:\Program Files (x86)\PBP3   Папки "DEVICE" и "DEVICE_REFERENCE". Там представлен полный список поддерживаемых микроконтроллеров и способов их конфигурации.

Share this post


Link to post
Share on other sites
 

В принципе, эту строчку можно просто удалить. И скомпилировать без битов конфигурации. А при прошивке в программе выбрать настройку тактового генератора, включить нужные биты и прошить микроконтроллер.

Есть сайты с онлайн расчетом слова конфигурации для pic контроллеров. 

Например в pickit биты не выставить, но конфигурационное слово вписать можно.

Для образца конфигурации контроллера лучше в папке pbp поискать файлы, их названия соответствуют марками pic контроллеров, и они легко ищутся поисковиком. Открываются просты блокнотом.  

Конфигурация в pbp3 немного отличается от pbp2.6 отличия незначительные.

Share this post


Link to post
Share on other sites
 
В 13.01.2017 в 13:34, Evgeniy сказал:

Попробуй программу из архива. Там же проект в протеусе! Там же ответ, как добавить кнопку для уменьшения паузы.

led.rar 33 \u043a\u0411 · 8 загрузок

Осваиваю Proton. Попытался перевести в него эту программу. Всё компилится, но ни в протеусе, ни в железе не работает. Нажимаешь любую кнопку и всё зависает. Данные в переменную не записываются. Хотя MicroCode Studio (Picbasic Pro) всё чётко работает. Полагаю, что в Протоне как-то иначе нужно задавать цикл, хотя в мануале описано всё то же самое, что и в PicBasic Pro. Не могли бы вы подсказать куда копать?

 

Вот код в Protone:

Symbol Led  =  PortB.0
Symbol But1 = PortA.0
Symbol But2 = PortA.1

Dim TimePause as word
Dim i                as byte
Dim buf1         as byte
Dim buf2        as byte

main:
gosub opros
for i = 0 to TimePause
delayms 200
gosub opros
next i
toggle led
goto main

Opros:
Button but1,0,255,255,buf1,1,speedDw
Button but2,0,255,255,buf2,1,speedUp
return
            
SpeedDw:
timepause = TimePause + 1
if TimePause > 10 then TimePause = 10
return

SpeedUp:
timepause = TimePause - 1
if TimePause > 10 then TimePause = 0
return

 

Share this post


Link to post
Share on other sites
 

Если программа компилируется без ошибок, значит в ней ошибок нет.

Конфигурации микроконтроллера в самом начале программы не видно? config ???

Регистры TRIS правильно настроены?

Строчки Device = 16Fххх ?

Попробуй перед main добавить: ALL_DIGITAL true

Для того, что бы все выводы портов стали цифровыми.

 

Share this post


Link to post
Share on other sites
 

Попробуй сначала помогать всеми выводами

 

TRISA=%00000000

TRISB=%00000000

ALL_DIGITAL true

main:

PortA=255

PortB=255

Delayms 200

PortA=0

PortB=0

Delayms 200

Goto main

Если все выводы моргают, значит они настроены как цифровые. Потом меняй регистры: TRISA=%11111111 TRISB=%11111110 и вставляй свой код.

Share this post


Link to post
Share on other sites
 

Я думаю, все регистры сконфигурированы правильно. Моргания светодиодами работают норм. На данный момент сделал программу на контроллер pic12f509. Всё также, в Picbasic Pro работает, а после Proton виснет. Пробовал делать отладку через Proteus, виснет в районе цикла For...to. Как-то по-другому его надо делать, видимо.

 

Device = 12F509
declare Xtal  4
Config IntRC_OSC, WDT_OFF, MCLRE_OFF, CP_OFF

OPTION_REG = %11000000
TRISIO     = %00011000
GPIO       = %00000000

ALL_DIGITAL true

Symbol BUT1   = GPIO.3
Symbol BUT2  = GPIO.4
Symbol LED  = GPIO.5

Share this post


Link to post
Share on other sites
 

Попробуй вот так:

TimePause=0

i=0

 

main:

for i = 0 to TimePause

Button but1,0,255,255,buf1,1,speedDw

Button but2,0,255,255,buf2,1,SpeedUp

delayms 200

next i

toggle led

goto main

            

SpeedDw:

timepause = TimePause + 1

if TimePause > 10 then TimePause = 10

i=0

gomo main

 

SpeedUp:

timepause = TimePause - 1

if TimePause > 10 then TimePause = 0

i=0

gomo main

 

В твоей программе при нажатии кнопки происходит переход на указанную метку (команда buttun так устроена). В данном случае на метку SpeedUp или SpeedDw. Эти подпрограммы должны заканчиваться безусловным переходом, а конкретно командой goto. Но у тебя они заканчиваются командой возврата (return). Но так как в эту подпрограмму после нажатия кнопок попадаем по goto, return не знает кто вызвал подпрограмму и естественно не знает куда надо вернуться! Поэтому и зависает. Протеус должен кучу ошибок сыпать.

 

Цепочка gosub -> goto -> return не должна работать, она и не работает.

 

 

Share this post


Link to post
Share on other sites
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
  • Create New...