Вконтакте Facebook Twitter Лента RSS

Светофор на PIC12F629 с "неправильной" программой

Когда сын клеил для школы из бумаги муляж светофора, пришла мысль: "А почему не собрать для него действующую модель светофора на микроконтроллере". На просторах Интернет есть много схем и программок к ним, реализующих принцип простейшего светофора. Но они или слишком сложны для игрушки (DC-DC преобразователь, сдвиговые регистры и т.д.) или представлены лишь как пример простейшей программы на ассемблере. Я хочу представить на обозрение схему и программу на ассемблере законченной конструкции игрушечного светофора с некоторыми дополнительными функциями. Причем собрана она на “копеечном “ микроконтроллере по простейшей схеме, что немаловажно для начинающих. Надеюсь, эта простая схема станет для многих, начинающих изучать программирование микроконтроллеров PIC, первой реально собранной на PIC конструкцией. Простая, но при этом содержащая основные приемы и атрибуты программирования, программа позволит легко ее понять и экспериментировать с ней.

Каждому, кто имеет дело с программированием микроконтроллеров, известны основные принципы написания обработчиков прерываний: как можно короткое время выполнения и короткий код, отсутствие циклов и вызовов из обработчика других подпрограмм и т.д. В данном же случае разрешены прерывания только по изменению уровня (пропустить другие прерывания мы никак не можем, так как их попросту нет) и я, для упрощения программы и ее восприятия, счел возможным отойти от этих принципов. Здесь в обработчике прерывания есть и циклы, и вызов другой подпрограммы, и (о ужас!) даже переход в режим SLEEP. Поэтому, в заголовке программа названа «неправильной». В данном случае, обработчик прерываний используется как обычная подпрограмма, однако, в других случаях вышеназванные принципы, разумеется, остаются в силе.

Краткие характеристики устройства:

Устройство представляет собой модель уличного светофора с достоверной симуляцией его работы (переключение цветов, моргание зеленого) и имеет дополнительные функции: изменение частоты переключения по нажатию кнопки, режим моргающего желтого, переход в спящий режим в ручном и автоматическом режиме с последующим включением по нажатию кнопки. Данное устройство может быть использовано как детская игрушка, а также как наглядное пособие в детских дошкольных учреждениях при обучении детей поведению на дорогах.

Итак, перейдем к описанию и рассмотрению схемы:

Схема собрана на недорогом микроконтроллере . Непосредственно для управления светодиодами используются выводы GP0-GP2, GP4,GP5 (ножки 7, б, 5, 3, 2), запрограммированные как выходы. Светодиоды по каждому направлению объединены в последовательные группы, что позволяет минимизировать потребляемый ток. Резисторы R3-R8 ограничивают токи светодиодов. В случае сильной разницы в отдаче светодиодов разных цветов, придется подбирать соответствующие резисторы. У меня, например, две группы желтого цвета соединены параллельно и подключены к одному резистору, причем того же номинала, что и остальные и светят даже чуть ярче остальных (отдача больше).

В этой схеме на светодиоды подается на 1.5 В больше чем на микроконтроллер с дополнительного элемента (в данном случае, при отключенном выходе ток не проходит на вывод микросхемы, так как для открытия переходов двух светодиодов требуется гораздо большее напряжение, чем 1.5 В (не менее 2.5 В). И даже при пробитых обоих светодиодах (что маловероятно), ток через внутренний защитный диод на плюс питания составит около 7.5 мА, что гораздо меньше допустимого. Потребление тока светодиодами намного выше, чем потребление МК, поэтому, разностью разрядки элементов (через один не течет ток потребления МК) можно пренебречь. Экспериментально установлено, что, несмотря на уменьшение тока через светодиоды при разрядке батареи, яркость их свечения остается на приемлемом уровне во всем диапазоне напряжения батареи. Схема при этом предельно упрощается, и нет стабилизатора напряжения, потребляющего дополнительный ток, что позволило отказаться от выключателя питания (ток потребления в спящем режиме - 1-3 мкА).

Кнопка управления режимами работы устройства подключена к выводу GP3 (ножка 4), который в битах конфигурации объявлен как цифровой вход. При нажатии кнопки происходит прерывание, в обработчике которого происходит следующее. При длительном нажатии (более 4 с) устройство переходит в спящий режим. При более коротких нажатиях, происходит последовательное переключение скорости работы светофора по кругу с индикацией текущей скорости согласно рисунку:

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

Заряда элементов АА в режиме sleep хватит не менее чем на год, именно поэтому, в устройстве не предусмотрен выключатель питания. Устройство переходит в спящий режим также по истечении 0.5 - 1 часа (зависит от скорости переключения цветов) работы без воздействия на кнопку. Из режима SLEEP выход происходит при любом нажатии кнопки. Питание на микроконтроллер подается по выводам 1 и 8. Для экономии выводов и упрощения конструкции, нем включен режим внутреннего генератора без внешних элементов.

Небольшие пояснения к программе, которая приведена во вложении:

Обработка нажатий кнопки производится в подпрограммах: wait_butt__- ожидание нажатия и регистрация 6сек. без нажатия, push_butt__- регистрация длительности нажатия, wait_nobutt__- ожидание не нажатой кнопки. В моменты изменения состояния светофора (желтый и моргание зеленого) значения на выходной порт считываются из таблицы в подпрограмме tact__ (младший или старший полубайты). Аналогично, индикация состояния при нажатии кнопки - из подпрограммы ind__. Для перехода в спящий режим по истечении времени работы, происходит принудительный переход в подпрограмму обработки прерываний путем программной установки флага прерывания. Изменением констант CONST_MIN, CONST_REG, CONST_SL можно изменить соответственно период моргания зеленого, начальный режим при подсоединении батареи, время работы без воздействия до перехода в режим SLEEP.

Печатная плата изготовлена из односторонне-фольгированного стеклотекстолита и имеет размеры 22х87 мм. Крайние светодиоды установлены параллельно плате в разные стороны. Средние устанавливаются один со стороны установки деталей, а другой - со стороны дорожек с продеванием выводов в отверстия платы и фиксацией их со стороны деталей каплей припоя, а со стороны дорожек припаиванием к соответствующим дорожкам.

Все резисторы мощностью 0.125 Вт. Светодиоды можно взять любые отечественные или импортные желательно одного типа с прямым падением напряжения при токе 10 мА около 2 Вольт. Кнопка - любая без фиксации. Микроконтроллер установлен на колодку.

Слово конфигурации заносится в память автоматически при загрузке прошивки (в IC-Prog установлена “птичка” только в пункте “PWRT”, остальные пункты “сброшены”, в графе “осциллятор” установлено “intOSC GP4”). Предварительно необходимо считать прошивку с чистой микросхемы и записать значение слова в конце памяти программ по адресу 03FF, которое требуется для настройки частоты внутреннего генератора конкретного экземпляра микросхемы. После загрузки в программу HEX-файла, по адресу 03FF необходимо вручную прописать это значение. В данном устройстве отклонение частоты не критично, но все же следует знать, что для данной микросхемы требуется такая процедура. В крайнем случае, если заводское значение потеряно, можно ничего не делать - в программе приняты меры для корректной работы и в этом случае.

Устройство помещается в подходящую пластмассовую коробку. Под светодиоды в коробке и крышке проделываются соответствующие отверстия. В моем варианте сам светофор и основание с кнопкой и батареей питания соединяются через отрезок пластиковой водопроводной трубы, диаметром 20 мм.

Цель работы. Целью лабораторной работы является отладка прикладных программ на языке Си для микроконтроллера AVR с помощью компилятора CVAVR и симулятора VMLAB.

Программа работы

1. Установите в директорию C:\CVAVR свободную версию компилятора CodeVisionAVR . В директории C:\CVAVR создайте папку z1 (задача 1) для файлов первого проекта.

Запустите компилятор. Для создания файла проекта нажимайте: Файл -> новый -> проект -> ОК -> No - перейдите в созданную для проекта папку z1 и введите в поле "имя файла": z1 - нажмите "сохранить" - откроется окно конфигурации проекта

Перейдите на закладку "С compiler"

Выберите MK (Chip) ATmega16

Установите частоту тактирования МК (Clock) 4.0 МГц

Нажмите ОК .

Перед вами появится открытый текстовый файл Project Notes - z1.prj , в котором вы можете записывать свои замечания и мысли по проекту.

Теперь нужно создать главный для нас текстовый файл для набора исходного текста на Си - его расширение.с

Нажимайте: Файл -> New -> Source -> ОК

появился файл untitled.c - нажимайте: Файл - Сохранить как - введите в поле "имя файла": z1.c и нажмите Сохранить .

Нужно добавить созданный файл z1.c в список файлов проекта - откройте меню конфигурирования проекта: Project -> Configure .

В открывшемся диалоге, нужно выбрать ярлык "Files" и нажать кнопку "Add ". В новом диалоге выберите файл "z1.c " и нажмите "Открыть ". Теперь файл включен в проект.

Нажимайте: ОК

Максимизируйте (разверните) окно файла - z1.c

Теперь все готово к собственно программированию, т.е. к созданию текста программы на языке Си. Ниже в таблице подготовлен текст программы к задаче 1, реализующей следующее техническое задание: Разработать устройство на микроконтроллере ATmega16, которое будет отображать в двоичном виде горящими светодиодами 8-ми битное число, начиная с 0 и с постоянным увеличением на 1. Устройство питается постоянным стабилизированным напряжением от 4 до 5.5 вольт. Тактирование МК осуществляется от кварцевого резонатора с частотой 4 МГц. Всего подключено 8 светодиодов от ножек порта A через токоограничительные резисторы к питанию МК. Переключение светодиодов должно производиться с паузами в 65 мс.

#include /* Вставить вместо этой строки текст файла mega16.h, содержащий описание регистров МК */

#define PA_OUT DDRA = 0xFF /* Заменить везде в тексте программы

PA_OUT на DDRA = 0xFF */

// ++++ функция инициализации МК ++++ void initialization(void){ PA_OUT;// сделать весь PORTA выходом TCCR0 = 0x05; /* таймер включить считать, делая один отсчет каждые 1024 колебания на ножке XTAL1 */ }

Char per =0;

// ++++ Главная функция ++++ void main (void){ initialization(); /* Вызвать функцию инициализации МК - т.е. настройки нужных нам устройств МК в соответствии с поставленной задачей */

//Бесконечный цикл while (1){ //Делать всегда

PORTA=~(per ++);

while (!(TIFR&0x01)); // ждем установки флага переполнения timer0 TIFR = 0x01; // очистить флаг переполнения timer0 }; //цикл закончен

} //скобка для main()

Запишите (без комментариев) программу в окно исходного текста программы. Сохраните изменения: файл -> Save All .

Для компиляции программы нажмите кнопочку "Make the project ".

Загляните в папку нашего проекта - z1. В результате компиляции там появилось много новых файлов. Главные для нас:

z1.hex - файл-прошивка для "загрузки" в МК;

z1__.с - копия файла z1.c для симуляторов;

z1.cof - информация, связывающая содержимое файлов z1__.с и z1.hex. Эта информация позволяет при симуляции в VMLAB наблюдать движение программы прямо по коду на языке Си. Указанные файлы будем использовать в симуляторе VMLAB. Необходимым для реального МК является лишь файл прошивки.

Следующие четыре файла содержат нашу программу, написанную на стандартном ассемблере для AVR с привязкой к тексту на Си: z1.asm, z1.lst, z1.vec, z1.inc. Остальные файлы практически не интересны.

2. Запустите VMLAB и откройте созданный проект: Project -> Open Project File

Перейдите в папку задачи 1 C:\CVAVR\z1\ и наберите имя файла z1_vm.prj проекта для VMLAB. После появления фразы, что такой файл не существует, VMLAB предложит создать его, с чем вы соглашайтесь. В появившемся окне запишите без комментариев приведенный ниже в таблице текстовый файл.

; Файл-проект z1_vm.prj для симуляции по задаче 1.

; Комментарии пишутся в VMLAB только в одну строчку

; после точки с запятой; МК как бы "прошит" файлом - z1.hex. После включения МК

; горящие светодиоды показывают в двоичном виде числа от 0

.MICRO "ATmega16" ; симулируемый МК .TOOLCHAIN "GENERIC" .TARGET "z1.hex" ; что "прошито" в МК .COFF "z1.cof"

.SOURCE "z1__.c" .POWER VDD=5 VSS=0 ; Питание +5 вольт; VSS это GND МК - "общий" провод схемы; Относительно него измеряются напряжения .CLOCK 4meg ; частота кварца 4 МГц; Точнее это частота тактирования МК

; Ввод схемы устройства по задаче 1 ; 8 светодиодов подключаются катодами через резисторы

: номиналом 560 Ом к ножкам МК с 33 до 40

; резистор R1 подключить к узлу D1_NODE и к выводу PA0 МК; анод светодиода к цепи +5 В. Остальные 7 светодиодов

; подключаются аналогично

D1 VDD D1_NODE R1 D1_NODE PA0 560 D2 VDD D2_NODE R2 D2_NODE PA1 560 D3 VDD D3_NODE R3 D3_NODE PA2 560 D4 VDD D4_NODE R4 D4_NODE PA3 560 D5 VDD D5_NODE R5 D5_NODE PA4 560 D6 VDD D6_NODE R6 D6_NODE PA5 560 D7 VDD D7_NODE R7 D7_NODE PA6 560 D8 VDD D8_NODE R8 D8_NODE PA7 560

; Сигналы на ножках PA0 PA1 PA2 ; будем наблюдать в окне виртуального осциллографа - "Scope" .PLOT V(PA0) V(PA1) V(PA2) ; Рисовать графики напряжения в перечисленных узлах схемы

В меню Project запустите Re-Build all ...

Через меню View откройте два компонента: SCOPE – это виртуальный запоминающий осциллограф симулятора и Control Panel – это панель, на которой содержатся нужные нам светодиоды и многое другое, пока нам не нужное.

Через меню Window откройте (обычно оно открывается сразу при открытии проекта) окно Code – в этом окне вы увидите текст симулируемой программы.

Обратите внимание на окно Messages – в нем появляются служебные сообщения симулятора по ходу работы. В окне Messages должно появиться сообщение об успехе и что все готово к запуску (Success! All ready to run). Кроме того, на панели инструментов загорится зеленый светофор – это кнопка, которой можно запускать симуляцию.

Нажатие зеленого светофора эквивалентно подаче "1" на вывод RESET МК при включенном питании, но еще не выполнявшем программу.

В окне Scope появились три графика для сигналов, которые мы будем наблюдать. Установите масштаб по вертикали 2 вольта на деление, а по горизонтали 50 мс.

В окне Сode появилось серое поле слева и зеленые квадратики напротив исполняемых строк кода программы на Си – кликнув по такому квадратику мы можем поставить точку останова программы.

Разместите три окна и Control Panel на экране компьютера так, чтобы видеть их все.

Нажмите "светофор" для запуска симуляции программы. Программа запустится и остановится – в окне Messages появится сообщение. Опять нажимаем на "светофор". Симулятор опять останавливается и сообщает, что произошел сброс от "сторожевого таймера МК" - мы не указали симулятору, что не используем его. Опять нажимаем на "светофор" – теперь программа будет работать непрерывно, пока мы ее не остановим.

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

Понаблюдайте за окнами SCOPE и Code и за светодиодами. В окне Code при симуляции возникают и растут желтые полосы, подсвечивающие строки исполняемой программы. Длины этих подсветок пропорциональны времени, в течение которого программа выполняет код этих строк.

Какой ток потребляется микроконтроллером от источника питания? Остановите симуляцию, нажав красный восьмиугольник «Стоп» и измерьте длительность периода импульсов на ножке РА2 МК. Насколько соответствует она расчетной величине? Для измерения временного промежутка в окне SCOPE симулятора VMLAB нужно установить вертикальные курсоры 1 и 2 на границах измеряемого интервала и в поле Cursor delta time появится значение времени между двумя курсорами.

При измерении коротких повторяющихся интервалов можно мерить время сразу нескольких, а результат поделить затем на число таких интервалов между измерительными курсорами.

Перезапустите МК, кликнув по кнопке с круговой темно-синей стрелкой . Вы как бы отключаете и затем снова подаете питание на МК, но создаете "0" на ножке RESET МК – вследствие чего программа не стартует!

Какую функцию выполняет команда PORTA =~(per ++); ?

Приведите в отчете схему подключения светодиодов к МК.

3. Модифицируйте программу. Переключите светодиоды к порту С. Время паузы между переключениями светодиодов уменьшить в 2 раза.

Для изменения Си кода программы просто запустите компилятор CodeVisionAVR (VMLAB выключать не нужно!) и внесите нужные изменения, затем откомпилируйте проект. Далее перейдите в VMLAB, сделайте глубокий рестарт и затем Re- b uid all. Все! Изменения внесены и все опять готово к симуляции. Таким образом, компилятор и симулятор работают одновременно в одной папке проекта и не мешают, а помогают друг другу. В отчет включите файлы z1.c и z1_vm.prj модифицированного проекта.

4. В следующем проекте будем выводить данные на символьный LCD дисплей (жидко-кристаллический индикатор). Схема его подключения к порту А микроконтроллера приведена на рис. 9.1 (там же указан источник информации, в котором вы можете более подробно ознакомиться с решаемой задачей).

Запустите компилятор CodeVisionAVR , затем генератор начального кода " CodeWizardAVR " - кликнув серую шестеренку слева от красного жучка... Выберите ATmega16 и частоту кварца 4 МГц. Перейдите к закладке LCD и укажите PORTA и 16 символов.

Выполнив Файл -> Generate , Save and Exit , создайте в директории C:\CVAVR папку z2 (задача 2) для файлов нового проекта. Сохраните, нажимая три раза z2, файлы z2.c, z2.prj и z2.cwp. Посмотрите сгенерированный мастером файл начального кода программы z 2. c . Какими командами проводится инициализация LCD дисплея? Можно ли удалить из программы команды, реализующие инициализацию периферийных устройств, не используемых в данной задаче?

Рис. 9.1 –Типовая схема включенияLCDдисплея

После команды

lcd _ init (16); // LCD 16 символов на строку

добавьте две строчки:

lcd _ gotoxy (5,0); // вывод символов с 6-й позиции в первой строке lcd _ putsf (" Hello ! "); //счет строк и символов начинается с нуля!

Сохраните (File -> Save All) и откомпилируйте программу.

Не закрывая компилятор, откройте VMLAB . В окне Open Project File впишите имя файла z2_vm и откройте файл проекта для симулятора z 2_ vm . prj . Впишите в него приведенный ниже в рамке текст и запустите Re - build all ... Загоревшийся светофор говорит о том, что программа готова к симуляции. Откройте окно Control Panel и, трижды нажав светофор, добейтесь непрерывной симуляции. Долгожданная надпись на экране LCD появится не сразу (процесс инициализации LCD продолжается достаточно долго). Почему через некоторое время загорается светофор?

Не закрывая VMLAB вернитесь в компилятор CVAVR .После команды #include добавьте команду

#include // функции организации задержек

После команды lcd _ putsf (" Hello ! "); добавьте команды:

delay _ ms (200);

lcd _ clear (); // очистка экрана LCD

delay_ms(200);

lcd_gotoxy(5,1);

lcd_putsf("FINISH!");

В последнем цикле программы перед комментарием // Place your code here добавьте команду # asm (" wdr ") и перекомпилируйте проект.

Вернитесь в VMLAB. Сделайте глубокий рестарт и запустите Re - build all ... Как теперь выводится информация на табло дисплея? Почему не загорается светофор после запуска непрерывной симуляции?

5. Проведите исследование работы АЦП. В папке C:\CVAVR \z3 с помощью компилятора создайте файлы проекта задачи 3 на базе программы z 3. c , текст которой приведен ниже в рамке (он подробно прокомментирован в разделе 7).

Затем с помощью симулятора запишите файл Z3_vm.prj.

; файл Z 3_ vm . prj

. MICRO " ATmega 16"

. TOOLCHAIN " GENERIC "

. TARGET " z 3. hex " ; эмулируемая прошивка МК

. COFF " z 3. cof " ; файл содержит привязку

; содержимого [.hex] к коду в [__.c]

. SOURCE " z 3__. c " ; исходник на Си, на который сориентирован файл [.cof].

; это CodeVision добавляет "__" при компиляции

. TRACE ; выводить отладочную информацию в окне

; SCOPE - розовым (см. HELP эмулятора)

. CLOCK 4 meg ; частота используемого кварца

; Обозначения точек МК, к которым можно

;"подключить" эмулятор: RESET, AREF, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF

; Для использования АЦП МК нужно подать опорное напряжение на вывод AREF - мы подадим 5 вольт питания МК. Но в VMLAB

; нельзя соединить два узла напрямую. Берем резистор на 1 Ом.

R 1 VDD AREF 1 ; резистор R1 подключен к

; узлам VDD и AREF через сопротивление 1 Ом

; опорное напряжение Vref у нас 5 вольт -

; значит при подаче 5 вольт на вход АЦП

; мы получим результат: 1111111111 (АЦП 10-ти разрядный)

; Вход0 АЦП (это вывод PA0 МК) мы подключим к

; подвижному контакту переменного резистора

; (Slider 1 в окне "Control Panel") -

; чтобы при эмуляции менять напряжение на входе АЦП.

V1 PA0 VSS SLIDER_1(0 5)

; на концах переменного резистора 0 и 5 вольт

; Эмулятор имеет 8 светодиодов -

; подключаем их к выводам порта B

D1 VDD PB0

D2 VDD PB1

D3 VDD PB2

D4 VDD PB3

D5 VDD PB4

D6 VDD PB5

D7 VDD PB6

D8 VDD PB7

; Эмулятор допускает прямое подключение светодиодов к

; плюсу питания и выводам МК - в действительности необходим

; токоограничительный резистор 430-910 Ом

; последовательно с каждым светодиодом!

.PLOT V(PA0) ; на экран осциллографа (окно "SCOPE")

; выведем напряжение на движке потенциометра

Запустив проект на симуляцию, понаблюдайте за светодиодами и осциллографом, изменяя положение движка потенциометра. Какое напряжение соответствует единице младшего разряда АЦП? Раскройте окно Peripherals и понаблюдайте за регистрами АЦП при изменении положения движка потенциометра S1. Сравните показания светодиодов и содержимое регистров ADCH и ADCL.

Просмотрите содержимое памяти программ и текст программы на ассемблере. Сколько ячеек занимает программа? По какому адресу расположен вектор прерывания по завершению процесса аналого-цифрового преобразования?

6. Запустите на симуляцию проект, подготовленный в папке z 4 (задача 4). Проект реализован на МК ATmega16.

В окне SCOPE (это виртуальный осциллограф) можно увидеть изменения напряжений на ножках МК, указанных в файле проекта - vmlab.prj . Верхняя осциллограмма – это сигнал на ножке TXD (PD 1) последовательного порта USART , по которой МК передает данные на COM порт ПК через интерфейс RS232- что передает МК мы видим в виртуальном терминале TTY панели Control Panel . Там выводится значение ШИМ (PWM ) сигнала, создаваемого на ножке PD5. Сам сигнал виден в окне SCOPE – посмотрите, как он меняется в соответствии с сообщаемыми числовыми значениями. На ножкеPD 4 формируются импульсы той же частоты с неизменной длительностью.

В файле проекта vmlab.prj к ножке PD 5 подключен простейший фильтр нижних частот (ФНЧ) из резистора и конденсатора – он преобразует ШИМ-сигнал в постоянное напряжение, которое можно увидеть в окне SCOPE (сигнал DAC ).

Формат передачи данных в примере – 8N1 (это формат по умолчанию для ПК). В таком формате передача байта начинается со "старт-бита" – это лог. "0" на ножке TXD для USART МК и +5...+15 В для COM порта ПК. Затем на ножку TXD выводятся все 8 бит передаваемого байта, начиная с нулевого. За время передачи бита приемник должен определить и запомнить этот уровень. Далее идет "стоп-бит" – это лог. "1" на ножке TXD для USART МК и -5...-15 В для COM порта ПК. Для согласования уровней между МК и ПК включают адаптер MAX232.

7 . Протестируйте работу программы, текст которой приведен ниже. Разработайте программу, реализующую световой эффект бегущего огонька без использования ассемблерных вставок.

#include

#include

void main(void){

#asm ("ldi r20,1")

#asm ("lsl r20")

#asm ("out 0x18,r20")

#asm ("ldi r20,1")}; Контрольные вопросы

    Назовите нагрузочную способность линий портов AVR.

    Какими ассемблерными вставками можно разрешать и запрещать глобально прерывания в программе для AVR на языке Си?

    Запишите результат выполнения арифметических операций: 245/37 и 245%37.

    Какими командами можно организовать задержку в одну секунду в программе для AVR на языке Си?

    Дать комментарий к команде PORTA=~(per++);

    Объявите переменную mnogo, если она может принимать значения от нуля до миллиона.

    Прокомментировать результат выполнения команды ADCSRA|=0x40;

Когда сын клеил для школы из бумаги муляж светофора, пришла мысль: "А почему не собрать для него действующую модель светофора на микроконтроллере". На просторах Интернет есть много схем и программок к ним, реализующих принцип простейшего светофора. Но они или слишком сложны для игрушки (DC-DC преобразователь, сдвиговые регистры и т.д.) или представлены лишь как пример простейшей программы на ассемблере. Я хочу представить на обозрение схему и программу на ассемблере законченной конструкции игрушечного светофора с некоторыми дополнительными функциями. Причем собрана она на “копеечном “ микроконтроллере по простейшей схеме, что немаловажно для начинающих. Надеюсь, эта простая схема станет для многих, начинающих изучать программирование микроконтроллеров PIC, первой реально собранной на PIC конструкцией. Простая, но при этом содержащая основные приемы и атрибуты программирования, программа позволит легко ее понять и экспериментировать с ней.

Каждому, кто имеет дело с программированием микроконтроллеров, известны основные принципы написания обработчиков прерываний: как можно короткое время выполнения и короткий код, отсутствие циклов и вызовов из обработчика других подпрограмм и т.д. В данном же случае разрешены прерывания только по изменению уровня (пропустить другие прерывания мы никак не можем, так как их попросту нет) и я, для упрощения программы и ее восприятия, счел возможным отойти от этих принципов. Здесь в обработчике прерывания есть и циклы, и вызов другой подпрограммы, и (о ужас!) даже переход в режим SLEEP. Поэтому, в заголовке программа названа «неправильной». В данном случае, обработчик прерываний используется как обычная подпрограмма, однако, в других случаях вышеназванные принципы, разумеется, остаются в силе.

Краткие характеристики устройства:

Устройство представляет собой модель уличного светофора с достоверной симуляцией его работы (переключение цветов, моргание зеленого) и имеет дополнительные функции: изменение частоты переключения по нажатию кнопки, режим моргающего желтого, переход в спящий режим в ручном и автоматическом режиме с последующим включением по нажатию кнопки. Данное устройство может быть использовано как детская игрушка, а также как наглядное пособие в детских дошкольных учреждениях при обучении детей поведению на дорогах.

Итак, перейдем к описанию и рассмотрению схемы.

Схема собрана на недорогом микроконтроллере PIC12F629. Непосредственно для управления светодиодами используются выводы GP0-GP2, GP4,GP5 (ножки 7, б, 5, 3, 2), запрограммированные как выходы. Светодиоды по каждому направлению объединены в последовательные группы, что позволяет минимизировать потребляемый ток. Резисторы R3-R8 ограничивают токи светодиодов. В случае сильной разницы в отдаче светодиодов разных цветов, придется подбирать соответствующие резисторы. У меня, например, две группы желтого цвета соединены параллельно и подключены к одному резистору, причем того же номинала, что и остальные и светят даже чуть ярче остальных (отдача больше).

В этой схеме на светодиоды подается на 1.5 В больше чем на микроконтроллер с дополнительного элемента (в данном случае, при отключенном выходе ток не проходит на вывод микросхемы, так как для открытия переходов двух светодиодов требуется гораздо большее напряжение, чем 1.5 В (не менее 2.5 В). И даже при пробитых обоих светодиодах (что маловероятно), ток через внутренний защитный диод на плюс питания составит около 7.5 мА, что гораздо меньше допустимого. Потребление тока светодиодами намного выше, чем потребление МК, поэтому, разностью разрядки элементов (через один не течет ток потребления МК) можно пренебречь. Экспериментально установлено, что, несмотря на уменьшение тока через светодиоды при разрядке батареи, яркость их свечения остается на приемлемом уровне во всем диапазоне напряжения батареи. Схема при этом предельно упрощается, и нет стабилизатора напряжения, потребляющего дополнительный ток, что позволило отказаться от выключателя питания (ток потребления в спящем режиме – 1-3 мкА).

Кнопка управления режимами работы устройства подключена к выводу GP3 (ножка 4), который в битах конфигурации объявлен как цифровой вход. При нажатии кнопки происходит прерывание, в обработчике которого происходит следующее. При длительном нажатии (более 4 с) устройство переходит в спящий режим. При более коротких нажатиях, происходит последовательное переключение скорости работы светофора по кругу с индикацией текущей скорости согласно рисунку.

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

Заряда элементов АА в режиме sleep хватит не менее чем на год, именно поэтому, в устройстве не предусмотрен выключатель питания. Устройство переходит в спящий режим также по истечении 0.5 – 1 часа (зависит от скорости переключения цветов) работы без воздействия на кнопку. Из режима SLEEP выход происходит при любом нажатии кнопки. Питание на микроконтроллер подается по выводам 1 и 8. Для экономии выводов и упрощения конструкции, нем включен режим внутреннего генератора без внешних элементов.

Небольшие пояснения к программе, которая приведена во вложении.

Обработка нажатий кнопки производится в подпрограммах: wait_butt__- ожидание нажатия и регистрация 6сек. без нажатия, push_butt__- регистрация длительности нажатия, wait_nobutt__- ожидание не нажатой кнопки. В моменты изменения состояния светофора (желтый и моргание зеленого) значения на выходной порт считываются из таблицы в подпрограмме tact__ (младший или старший полубайты). Аналогично, индикация состояния при нажатии кнопки – из подпрограммы ind__. Для перехода в спящий режим по истечении времени работы, происходит принудительный переход в подпрограмму обработки прерываний путем программной установки флага прерывания. Изменением констант CONST_MIN, CONST_REG, CONST_SL можно изменить соответственно период моргания зеленого, начальный режим при подсоединении батареи, время работы без воздействия до перехода в режим SLEEP.

Печатная плата изготовлена из односторонне-фольгированного стеклотекстолита и имеет размеры 22х87 мм. Крайние светодиоды установлены параллельно плате в разные стороны. Средние устанавливаются один со стороны установки деталей, а другой – со стороны дорожек с продеванием выводов в отверстия платы и фиксацией их со стороны деталей каплей припоя, а со стороны дорожек припаиванием к соответствующим дорожкам.

Все резисторы мощностью 0.125 Вт. Светодиоды можно взять любые отечественные или импортные желательно одного типа с прямым падением напряжения при токе 10 мА около 2 Вольт. Кнопка – любая без фиксации. Микроконтроллер установлен на колодку.

Слово конфигурации заносится в память автоматически при загрузке прошивки (в установлена “птичка” только в пункте “PWRT”, остальные пункты “сброшены”, в графе “осциллятор” установлено “intOSC GP4”). Предварительно необходимо считать прошивку с чистой микросхемы и записать значение слова в конце памяти программ по адресу 03FF, которое требуется для настройки частоты внутреннего генератора конкретного экземпляра микросхемы. После загрузки в программу HEX-файла, по адресу 03FF необходимо вручную прописать это значение. В данном устройстве отклонение частоты не критично, но все же следует знать, что для данной микросхемы требуется такая процедура. В крайнем случае, если заводское значение потеряно, можно ничего не делать – в программе приняты меры для корректной работы и в этом случае.

Устройство помещается в подходящую пластмассовую коробку. Под светодиоды в коробке и крышке проделываются соответствующие отверстия. В моем варианте сам светофор и основание с кнопкой и батареей питания соединяются через отрезок пластиковой водопроводной трубы, диаметром 20 мм.

В приложении имеются: модель, печатная плата в формате LAY, программа на Ассемблере MPASM, файл прошивки HEX.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК PIC 8-бит

PIC12F629

1 DIP В блокнот
R1 Резистор

3 кОм

1 0.125 Вт В блокнот
R2 Резистор

100 Ом

1 0.125 Вт В блокнот
R3-R8 Резистор

200 Ом

6 0.125 Вт В блокнот
HL1,HL2,HL9,HL10 Светодиод

АЛ307А

4 RED В блокнот
HL3,HL4,HL11,HL12 Светодиод

Здравствуйте!
Я хочу показать, как пишется программа для управления технологическим оборудованием на ПЛК.
Чаще всего я имел дело с ПЛК производства Schneider Electric. Выбранный мной для данной задачи Quantum является самым мощным и дорогим ПЛК данного производителя. Он может управлять оборудованием с тысячами сигналов, для светофора в реальной жизни его никто, естественно, использовать не будет.

Автоматизацией светофоров я никогда не занимался, поэтому алгоритм придумал сам. Вот он:
1. Светофор для регулируемого пешеходного перехода. Т.е. светофор для машин, светофор для пешеходов и кнопка для пешеходов, нажав которую, пешеход уведомляет о желании перейти дорогу.
2. После старта программы загорается зеленый для машин и красный для пешеходов.
3. После нажатия кнопки пешеходом начинает мигать зеленый для машин, затем загорается желтый, затем красный. После этого загорается зеленый для пешеходов, через заданное время он начинает мигать, загорается красный для пешеходов, после этого для машин загорается желтый и красный, затем зеленый.
4. В течение заданного промежутка времени после зеленого на пешеходном светофоре нажатие кнопки пешеходом не запускает алгоритм перехода. Алгоритм перехода запускается в таком случае только по истечению заданного времени.
Программирование ПЛК ведется в среде программирования Unity на языках стандарта МЭК 61131-3. В данный стандарт входят 5 языков. Для примера я выбрал язык функциональных блоков – FBD.
Вот браузер проекта в Unity:

Конфигурируем ПЛК:


ПЛК состоит из монтажной панели, блока питания (1), контроллера (2), модуля дискретного ввода на 32 сигнала 24В постоянного тока (4), модуля дискретного ввода на 32 сигнала 24В постоянного тока (5). В реальном проекте монтажных панелей, подключенных к одному контроллеру по различным сетям, могут быть десятки, а модулей ввода-вывода – сотни.
Создаем переменные необходимых типов в редакторе переменных:


Переменные, привязанные к каналам модулей ввода-вывода имеют адрес, показывающий, к какой корзине, модулю и каналу привязан сигнал.
Программа состоит из секций, выполняемых каждый цикл сканирования контроллера по порядку.
Упрощенно цикл сканирования контроллера выглядит так:
1. Чтение входных сигналов из модуля ввода в переменные с адресам.
2. Выполнение секций.
3. Запись значений из переменных с адресами в выходные сигналы модулей вывода.
4. Переход на п.1.
Создаем секцию Clock с генератором импульса периодом 0,5 секунды. Блок TP при изменении входного сигнала из 0 в 1 на выходе выдает импульс заданной длительности.


Здесь и ниже скриншоты секций приведены в режиме анимации, а не режиме редактирования. На них отображены значения переменных в текущий момент времени при подключении к ПЛК с загруженной программой (числа для числовых переменных, цвет зеленый (1)-красный (0) для булевских).
Секция Main обрабатывает основную логику.
Блок SR устанавливает выход в 1 при S1=1 и сбрасывает выход в 0 при R=1.
Блок R_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 0 в 1 (детектор переднего фронта).
Блок F_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 1 в 0 (детектор заднего фронта).
Переменная inButton, привязанная к каналу кнопки, заменена в секции на inButtonForTest для того, чтобы можно было изменить ее значение на симуляторе контроллера без реального оборудования.


Секция Outputs формирует выходные сигналы для управления лампами светофоров.


Загружаем проект в симулятор контроллера:


Значение любых переменных можно посмотреть в анимационной таблице:


Но для удобства отладки можно сделать экран оператора с простой графикой, анимация которой привязана к переменным:

Пробуем перейти дорогу:

Не ожидал, что для управления такого простого объекта, как светофор, потребуется 30 блоков.
В следующей статье покажу, как написать данную программу, используя все языки стандарта МЭК 61131-3 одновременно.

UPD. Исправил ошибку в названии стандарта.

© 2024 Windows. Программы. Железо. Интернет. Полезно знать