Available Languages?:

Пример использования OSA: 3LEDS_PIC10F

Проект

Данный пример демонстрирует использование OSA для написания программы под 12-разрядные контроллеры. Файл 3leds.rar нужно распаковать в папку "C:\TEST\3LEDS". В папке проект для PIC10F222 (его можно пересобрать также для F202 и F206).

Программа управляет 7-цветным светодиодом с помощью ШИМ. В ходе работы плавно создаются разные комбинации яркости всех трех светодиодов. Есть 4 режима скорости (от очень медленного до очень быстрого).

Принципиальная схема

Ниже приведена схема включения ПИКа. ПИК управляет 3-мя транзисторами, в коллекторе каждого из которых стоит светодиод. Следует обратить внимание, что к ножкам управления транзисторами также подключены кнопки.

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 скорости). После обработки кнопок все ножки обратно устанавливаются на выход и задача становится в режим ожидания отпускания кнопок.

Фото

Качество фото не очень, но примерно видно, что должно получиться.

color2.jpgcolor5.jpgcolor7.jpgcolor8.jpg

color9.jpgcolor10.jpgcolor11.jpgcolor12.jpg

 
osa/ref/appendix/3leds_pic10f.txt · Последние изменения: 17.01.2011 18:44 От osa_chief
 
Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki