====== Пример использования OSA: 3LEDS_PIC10F ====== ===== Проект ===== Данный пример демонстрирует использование OSA для написания программы под 12-разрядные контроллеры. Файл {{osa:3leds.rar|3leds.rar}} нужно распаковать в папку "C:\TEST\3LEDS". В папке проект для **PIC10F222** (его можно пересобрать также для **F202** и **F206**). Программа управляет 7-цветным светодиодом с помощью ШИМ. В ходе работы плавно создаются разные комбинации яркости всех трех светодиодов. Есть 4 режима скорости (от очень медленного до очень быстрого). ===== Принципиальная схема ===== Ниже приведена схема включения ПИКа. ПИК управляет 3-мя транзисторами, в коллекторе каждого из которых стоит светодиод. Следует обратить внимание, что к ножкам управления транзисторами также подключены кнопки. {{osa:ref:appendix:3leds_pic10f.jpg}} Кнопка ##S1## делает активным красный цвет.\\ Кнопка ##S2## делает активным зеленый цвет.\\ Кнопка ##S3## делает активным синий цвет.\\ Кнопка ##S4## изменяет скорость работы (4 скорости).\\ **Примечание.** Значение сопротивлений токозадающих резисторов **R11**, **R12** и **R13** подбираются под конкретные светодиоды. ===== Описание работы ===== Программа состоит из 3-х задач: * ##Task_Leds## - формирует импульсы управления светодиодами нужной длительности. * ##Task_Work## - формирует значения интенсивностей для всех светодиодов * ##Task_Buttons## - обрабатывает кнопки ---- ==== Task_Leds ==== Большую часть времени программа находится в задаче ##Task_Leds##. Эта задача ждет, когда таймер TMR0 переполнится, и в этот момент подает "1" на все светодиоды. Далее в цикле отмеряются правильные длительности импульсов. Для этого в программе есть 3 переменные (по одной для каждого цвета), в которых содержится информация о текущей интенсивности. Как только таймер TMR0 становится больше значения интенсивности, соответствующий светодиод гаснет. Когда погаснут все 3 светодиода, управление передается остальным задачам. Две другие задачи: ##Task_Work## и ##Task_Buttons## - находятся в ожидании установки битов **//bRunTaskWork//** и **//bRunTaskButtons//**, соответственно. Эти биты устанавливает задача ##Task_Leds## после того, как обработает 1 период управления светодиодами. ==== Task_Work ==== При получении управления ##Task_Work## проверяет, пора ли изменять интенсивность светодиодов. Для этого есть переменная **//Work//**, которая увеличивается каждый раз при попадании в задачу. Скорость увеличения (фактически - скорость изменения интенсивности) определяется 2-мя старшими битами переменной. Как только младшие 5 бит переменной **//Work//** переполняются, задача вызывает функцию ##ChangeIntensity()##, которая делает один шаг изменения интенсивности в соответсвие со значениями переменных **//Red//**, **//Green//** и //**Blue**.// В данной программе применен простой способ: интенсивности всех светодиодов изменяются с одинаковой скоростью. Но каждый может сам под себя переписать функцию ##ChangeIntensity()##. ==== Task_Button ==== Эта задача, так же как и ##Task_Work##, запускается один раз в период, т.е. в 16 мс. При получени управления все ножки устанавливаются на вход, после чего проверяется, нет ли "1" на каком-либо входе. Если есть, то нажатая кнопка обрабатывается. Кнопки ##SW1##, ##SW2## и ##SW3## устанавливают яркость соответствующего светодиода максимальной (остальные гасятся) и устанавливает переменную Mode.cState в режим, соответствующий цвету. Кнопка ##SW4## изменяет скорость работы (всего 4 скорости). После обработки кнопок все ножки обратно устанавливаются на выход и задача становится в режим ожидания отпускания кнопок. ===== Фото ===== Качество фото не очень, но примерно видно, что должно получиться. {{osa:ref:appendix:color2.jpg}}{{osa:ref:appendix:color5.jpg}}{{osa:ref:appendix:color7.jpg}}{{osa:ref:appendix:color8.jpg}} {{osa:ref:appendix:color9.jpg}}{{osa:ref:appendix:color10.jpg}}{{osa:ref:appendix:color11.jpg}}{{osa:ref:appendix:color12.jpg}}