Evgeniy 285 Report post Posted May 31, 2016 При написании программ, не забываем про конфигурирование микроконтроллера, его внутренней периферии! Простой проект на pic12f675. При нажатии на кнопку начинают по очереди моргать 2 светодиода, при повторном нажатии светодиоды отключаются. В архиве проект протеуса, прошивка и исходный код. '****************************************************************@ device pic12F675, CPD_OFF, PROTECT_ON, MCLR_OFF, PWRT_ON, WDT_Off, INTRC_OSC_NOCLKOUT'****************************************************************'****************************************************************trisio = %11111100CMCON = %00000111 ' Отключаем встроенный компараторANSEL = %00000000 ' Set AN0 analogadcon0 = %00000000 'АЦПOPTION_REG.7 = 0WPU = %00010000 ' Подтягивающие резисторы (автоматически выключаются при установке порта на вывод)'****************************************************************'****************************************************************key var gpio.4stat var bitbuf var byte'****************************************************************stat = 0gpio = 0'****************************************************************'****************************************************************main:button key,0,255,255,buf,1,ledmodif stat = 0 then mainGPIO = %000000001pause 500GPIO = %000000010pause 500goto main'****************************************************************'****************************************************************LedMod:if stat = 0 thenstat = 1elsestat = 0gpio = 0endifpause 200goto main'**************************************************************** lesson_2.zip Share this post Link to post Share on other sites
VitalForce 67 Report post Posted June 13, 2016 Если я правильно понял вопрос, то можно. При нажатии на кнопку начинает выполняться другая программа. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted June 14, 2016 Добавь в твой код: 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
Evgeniy 285 Report post Posted June 14, 2016 У тебя длинные паузы, поэтому с командами типа 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
insomnium 0 Report post Posted January 12, 2017 Здравствуйте. Не подскажете, как реализовать алгоритм, при котором возможно будет менять скорость переключения светодиодов с помощью 2-х кнопок (больше-меньше)?. Я так понял, вместо паузы (pause) нужно вставить переменную и реализовывать в ней. Не подскажете что нужно добавить в эту переменную, какой код? Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted January 13, 2017 Типа такого: 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
insomnium 0 Report post Posted January 13, 2017 Типа такого: 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
Evgeniy 285 Report post Posted January 13, 2017 Попробуй программу из архива. Там же проект в протеусе! Там же ответ, как добавить кнопку для уменьшения паузы. led.rar Share this post Link to post Share on other sites
insomnium 0 Report post Posted January 13, 2017 Попробуй программу из архива. Там же проект в протеусе! Там же ответ, как добавить кнопку для уменьшения паузы. Спасибо большое! Share this post Link to post Share on other sites
max_online87 0 Report post Posted January 26, 2017 Какой используется Протеус? У меня 7.10 Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted January 27, 2017 Под уроками ссылки на исходники и протеус. Share this post Link to post Share on other sites
Palxta 0 Report post Posted January 7, 2022 Сделал подобну прошивку как в 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
insomnium 0 Report post Posted March 4, 2022 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
Evgeniy 285 Report post Posted March 4, 2022 В принципе, эту строчку можно просто удалить. И скомпилировать без битов конфигурации. А при прошивке в программе выбрать настройку тактового генератора, включить нужные биты и прошить микроконтроллер. Есть сайты с онлайн расчетом слова конфигурации для pic контроллеров. Например в pickit биты не выставить, но конфигурационное слово вписать можно. Для образца конфигурации контроллера лучше в папке pbp поискать файлы, их названия соответствуют марками pic контроллеров, и они легко ищутся поисковиком. Открываются просты блокнотом. Конфигурация в pbp3 немного отличается от pbp2.6 отличия незначительные. Share this post Link to post Share on other sites
insomnium 0 Report post Posted April 25, 2022 В 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
Evgeniy 285 Report post Posted April 25, 2022 Если программа компилируется без ошибок, значит в ней ошибок нет. Конфигурации микроконтроллера в самом начале программы не видно? config ??? Регистры TRIS правильно настроены? Строчки Device = 16Fххх ? Попробуй перед main добавить: ALL_DIGITAL true Для того, что бы все выводы портов стали цифровыми. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted April 25, 2022 Попробуй сначала помогать всеми выводами 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
insomnium 0 Report post Posted April 26, 2022 Я думаю, все регистры сконфигурированы правильно. Моргания светодиодами работают норм. На данный момент сделал программу на контроллер 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
Evgeniy 285 Report post Posted April 26, 2022 Попробуй вот так: 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