Контроль 15-ти контактов одним входом pic-микроконтроллера

Микроконтроллеры PIC для начинающих

На современном рынке есть ряд семейств и серий микроконтроллеров от разных производителей, среди них можно выделить AVR, STM32 и PIC. Каждое из семейств нашло свою сферу применения. В этой статье я расскажу начинающим о микроконтроллерах PIC, а именно, что это такое и что нужно знать для начала работы с ними.

Что такое PIC

PIC – это название серии микроконтроллеров, которые производятся компанией Microchip Technology Inc (США). Название PIC происходит от Peripheral Interface Controller.

Микроконтроллеры PIC имеют RISC-архитектуру. RISC – сокращённый набор команд, используется также в процессорах для мобильных устройств. Есть целый ряд примеров её использования: ARM, Atmel AVR и другие.

Компания Microchip в 2016 году купила Atmel – производителя контроллеров AVR. Поэтому на официальном сайте представлены микроконтроллеры семейства и PIC и AVR.

Семейства

Среди 8-битных микроконтроллеров PIC она состоит из 3-х семейств, которые отличаются архитектурой (разрядностью и набором команд).

Baseline (PIC10F2xx, PIC12F5xx, PIC16F5x, PIC16F5xx) ;

Mid-range (PIC10F3xx, PIC12F6xx, PIC12F7xx, PIC16F6xx, PIC16F7xx, PIC16F8xx, PIC16F9xx) ;

Enhanced Mid-range (PIC12F1xxx, PIC16F1xxx) ;

High-end или PIC18 (18Fxxxx, 18FxxJxx and 18FxxKxx).

Характеристики, которых приведены в таблице ниже.

Кроме 8 битных микроконтроллеров компания Microchip производит 16-битные:

DsPIC30/33F для обработки сигналов.

Представители 16-битного семейства работают со скоростью от 16 до 100 MIPS (выполнено миллионов инструкций в секунду). Стоит отметить и особенности:

машинный цикл – 2 такта;

разрядность АЦП – 16 бит;

поддерживают ряд протоколов связи (UART, IrDA, SPI, I2S™, I2C, USB, CAN, LIN and SENT), ШИМ и прочее.

Также есть семейство 32 битных микроконтроллеров – PIC32MX, основные особенности:

работают на частоте до 120 мГц;

выполняют до 150 MIPS;

АЦП: 10-бит, 1 Msps (скорость квантования), до 48 каналов.

С какого PIC начать?

Новичкам стоит начать осваивать микроконтроллеры PIC с 8-битной линейки. Вообще, производитель заявляет о том, что особенностью всего семейства является лёгкая переносимость программ с одного семейства на другое и совпадения цоколевки ряда моделей.

Одним из популярнейших в среде радиолюбителей микроконтроллеров является PIC16f628A. Его технические характеристики такие:

Есть встроенный тактовый генератор. Вы можете настроить для работы с частотой 4 или 8 МГц;

18 пинов, из них 16 – ввод/вывод, а 2 – питание;

Для работы на частотах до 20 МГц можно подключить кварцевый резонатор, но в этом случае на ввод/вывод останется не 16, а 14 ног;

В маркировке есть буква F, это значит, что используется FLASH-память, объёмом в 2048 слов;

14-битные инструкции, 35 штук;

4 аналоговых входа;

На входах PORTB есть подтягивающие резисторы;

Два 8-битных таймера и один 16-битный;

Машинный цикл – 4 такта кварцевого резонатора или внутреннего генератора);

128 байт EEPROM;

USART – последовательный порт;

внутренний источник опорного напряжения;

питается от 3.3 до 5 В.

Причинами популярности является низкая цена и возможность тактирования от внутреннего генератора.

Какая цоколевка у 16f628 изображено ниже:

Блочная внутренняя схема этого микроконтроллера изображена ниже.

На что следует обратить внимание на схеме в первую очередь?

У этого микроконтроллера есть два порта PORTA и PORTB. Каждый пин, каждого из них может использоваться как вход и выход, а также для подключения периферии или задействования других модулей микроконтроллера.

Рассмотрим эту часть схемы крупно.

Например, порты RB0-RB3 – могут выступать в роли аналоговых. К RA6, RA7 в случае необходимости подключается источник тактирования (кварцевый резонатор). Сами же выводы микроконтроллера настраиваются в режим входа/выхода с помощью регистра TRIS.

Для этого есть команды типа:

TRISA = 0; // Все выводы порта А устанавливаются как выходы
TRISB = 0xff; // Все выводы порта B назначаются как входы
TRISA0 = 1; // Так назначается отдельный пин как вход (1) или выход (0)
TRISA5 = 1 ; // здесь 5 вывод порта А – назначен входом

Вообще режимы работы, включение WDT (сторожевого таймера) выбор источника тактирования микроконтроллера и прочее настраивается с помощью регистров специального назначения — SFR, а память и данные хранятся в GFR – простыми словами это статическое ОЗУ.

В официальном Datasheet, на страницах 18-21 вы найдете 4 банка памяти регистров специального назначения SFR и регистров общего назначения GFR. Знание регистров важно, поэтому распечатайте и выучите указанные страницы из Datasheet .

Для удобства ниже приведены эти таблицы в виде картинок (нумерация регистров, как и всё в цифровой электронике начинается с 0, поэтому номер четвертого – 3).

Как подключить и на каком языке программировать?

Чтобы запустить этот микроконтроллер достаточно подать плюс на Vdd и минус на Vss. Если нужен кварцевый резонатор, то он подключается к выводам 16 и 15 (OSC1 и OSC2) микроконтроллера PIC16f628, для других контроллеров с большим или меньшим числом выводов – смотрите в datasheet. Но этот момент нужно указывать при программировании и прошивке.

Кстати о переносимости и совпадении цоколевки – на 16f84A – она аналогична, и на многих других.

Фрагмент схемы с подключенным к pic16f628a внешним резонатором:

Есть два основных языка для программирования микроконтроллеров PIC – это assembler и C, есть и другие, например PICBasic и т.д. Еще можно выделить упрощенный язык программирования JAL (just another language).

Для примера ниже приведена программа для «мигания светодиодом» — своего рода «Hello World» для микроконтроллера PIC на языке C.

В 1 строке подключается библиотека микроконтроллеров PIC, далее подключается библиотека программы задержки.

В функции main(void) в начале устанавливаются начальные параметры, подобно тому как мы это делали в функции Void setup () – в статьях об ардуино. Далее в строках 11-16 объявляется бесконечный цикл while(1), в ходе которого и выполняется программа «мигания светодиодом».

В примере состояние порта постоянно инвертируется, т.е. если он был в «0», то перейдет в «1» и наоборот. На C для PIC есть следующие команды управления команды:

PORTA = 0; // переводит все пины порта А в низкий уровень (лог. 0)
PORTB = 0xff; // переводит все пины порта B в высокий уровень (лог. 1)
RB5 = 1; // На пятом выводе порта B высокий уровень

А так выглядит та же программа, но уже на языке JAL, я перевел на русский язык комментарии от разработчиков встроенных примеров в JALedit (среда разработки).

Возникает соблазн выбрать JAL, и вам он может показаться проще. Безусловно на нём можно реализовать любые проекты, но с точки зрения пользы для вас как для специалиста – это бесполезный язык. Значительно больших результатов вы добьетесь, изучая синтаксис и принципы программирования на языке C (большая часть популярных сейчас языков C-подобны) или на Assembler – это низкоуровневый язык, который заставит вас понимать принцип работы устройства и что происходит в программе в каждый конкретный момент времени.

В чем работать

Если сказать совсем обобщенно для работы с любыми микроконтроллерами нужно:

1. Текстовый редактор.

3. Программа для загрузки прошивки в микроконтроллер.

И я даже читал старые учебники, где автор, работая из-под DOS писал код, компилировал и прошивал его разными средствами. Сейчас же под все популярные операционные системы есть среды для разработки, как узкоспециализированные (для конкретного семейства микроконтроллеров или семейств от одного производителя) так и универсальные (либо содержат все необходимые инструменты, либо они подключаются в виде плагинов).

Например, в цикле статей об Arduino мы рассматривали среду Arduino IDE в ней же мы и код писали и с её помощью «заливали» прошивку в «камень». Для микроконтроллеров PIC есть такие программы, как:

MPASM — используется для разработки на языке Assembler от фирмы Microchip ;

MPLAB — также IDE от Microchip для PIC-контроллеров. Состоит из множества блоков для тестирования, проверки, работы с кодом и компиляции программ и загрузки в микроконтроллер. Также есть версия MPLAB X IDE – отличается большим функционалом и построена на базе платформы NetBeans ;

MikroC — универсальная среда (не только для ПИКов) для разработки. Как видно из названия «заточена» под программирование на C, а также есть такие программы как MikroBasic и MikroPascal, для соответствующих языков ;

JALedit — подходит для языка JAL, о котором мы упоминали выше ;

И ряд других менее известных.

Как прошивать микроконтроллер?

Для PIC-микронотроллеров есть ряд программаторов. Официальным считается PICkit. Их 4 версии. Но можно прошивать и универсальными, например, TL866 (он поддерживает почти всё, что может понадобится начинающему радиолюбителю, при этом очень дешевый).

Также в сети есть ряд различных схем программаторов для ПИКов, как для работы через COM-порт:

Так и через USB (на самом деле тоже com, только через преобразователь на ИМС MAX232).

Заключение

Микроконтроллеры PIC16 подходят для простых проектов, типа простой автоматики, вольтметров, термометров и прочих мелочей. Но это не значит, что нельзя делать на этом семействе сложные и большие проекты, я привел пример того для чего чаще всего их используют. Для общего представления рекомендую посмотреть несколько видео:

Читайте также  Как найти скрытую проводку в квартире?

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

Катцен С. — PIC-микроконтроллеры. Все что вам необходимо знать;

Кёниг А. — Полное руководство по PIC микроконтроллерам;

Шпак Ю.А. — Программирование на языке С для AVR и PIC микроконтроллеров;

Магда Ю.С. — Микроконтроллеры PIC: архитектура и программирование;

Яценков В.С. — Микроконтроллеры Microchip. Практическое руководство.

Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!

Записывайтесь в онлайн-университет от GeekBrains:

Изучить C, механизмы отладки и программирования микроконтроллеров;

Получить опыт работы с реальными проектами, в команде и самостоятельно;

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

Starter box для первых экспериментов в подарок!

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

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

Контроль состояния 15 кнопок, подключенных к одному выводу микроконтроллера

Microchip PIC12F683

На страницах портала РадиоЛоцман неоднократно публиковались материалы, в которых подробно рассматривались различные методы подключения к микроконтроллеру множества кнопок при минимальном использовании его линий ввода/вывода [1-4]. В одних схемах использовались RC-цепочки, и для определения нажатия одной из кнопок требовалось измерение длительности импульсов, в других использовался аналого-цифровой преобразователь и схема резистивного делителя напряжения для каждой кнопки.

В статье мы рассмотрим еще один простой способ, позволяющий контролировать до 15 кнопок, подключенных лишь к одному выводу микроконтроллера. Единственным требованием для реализации этого метода является наличие в микроконтроллере внутреннего аналогового компаратора с функцией настройки значения опорного напряжения (VREF). Большинство 8-разрядных микроконтроллеров PIC компании Microchip имеют один или два таких компаратора.

В качестве простого и практичного примера в изображенной на Рисунке 1 схеме используется микроконтроллер PIC12F683 и 4 светодиода, в двоичном формате индицирующие номер нажатой кнопки. Кнопки подключены к выводу GP1 микроконтроллера (вход CIN— аналогового компаратора). Для тактирования микроконтроллера используется внутренний генератор.

Рисунок 1. Подключение 15 кнопок к одному выводу микроконтроллера.

Контроль состояния кнопок выполняется в обработчике прерываний от аналогового компаратора, который вызывается при нажатии любой кнопки. В обработчике прерываний выполняется пошаговое изменение значения опорного напряжения компаратора до тех пор, пока на выходе компаратора СOUT не появится «лог. 1».

В краткой форме алгоритм можно описать следующим образом.

  1. Исходное состояние: режим пониженного энергопотребления (Idle). Опорное напряжение компаратора VREF устанавливается на уровне VREF = (1/24)Vdd, напряжение VCIN— на входе компаратора CIN— равно 0 – меньше значения опорного напряжения, на выходе компаратора COUT «лог. 1».
  2. В случае нажатия любой кнопки напряжение VCIN— становится больше опорного напряжения и на выходе компаратора появляется «лог. 0», что вызывает прерывание.
  3. В обработчике прерывания выполняется пошаговое изменение опорного напряжения согласно выражению VREF = (i/24)Vdd, где i принимает значения от 2 до 15. Изменение опорного напряжения выполняется одновременно с проверкой условия VREF > VCIN-, и как только оно выполняется, на выходе компаратора COUT появится «лог. 1», указывающая на то, что нажата кнопка с индексом Btn(i-1). Если же опорное напряжение остается меньше входного VCIN— при значении i = 16, значит, нажата кнопка Btn15.
  4. Четыре светодиода отображают двоичный номер (индекс) нажатой кнопки.

Исходный код программы микроконтроллера на ассемблере с подробными комментариями занимает менее 100 слов. Он легок для понимания и может использоваться на других микроконтроллерах.

Загрузки

Исходный код программы микроконтроллера (ассемблер) — скачать

Дополнительные материалы

  1. «Многокнопочная клавиатура с интерфейсом 1-Wire»
  2. «Чтение состояния 10 и более кнопок с помощью двух выводов микроконтроллера». РадиоЛоцман, 2013, май, стр. 50.
  3. «Измерение состояния двух резистивных датчиков или нескольких переключателей с помощью одного триггера Шмитта». РадиоЛоцман, 2013, ноябрь, стр. 59.
  4. «Некоторые подходы аппаратной оптимизации для микроконтроллеров PICmicro» (англ., pdf)

Перевод: Vadim по заказу РадиоЛоцман

PIC Урок 4. Кнопка

Сегодня мы расширим свой кругозор по изучению работы портов микроконтроллера и изучим второе назначение порта — работу на вход. И для изучения работы на вход мы применим обычную тактовую кнопку.

Ну и давайте также как и в случаях с другими контроллерами в целях экономии времени на создание нового проекта в будущем, когда дело будет касаться одного и того же контроллера, попробуем проект для нашего сегодняшнего урока создать из проекта прошлого занятия.

Для этого мы в той же папке, где лежит папка с проектом BLINK01.X создадим ещё одну папку с именем таким, которое мы хотим присвоить новому проекту, в нашем случае будет BUTTON01.X.

И в эту папку из папки BLINK01.X мы перепишем папку nbproject и файлы Makefile и main.c.

Зайдём в папку nbproject в папке нового проекта и удалим там всё кроме файлов project.xml и configurations.xml.

Затем откроем файл project.xml и исправим в нём имя старого проекта на имя нового: в нашем случае BLINK01 на BUTTON01.

Оказалось, что сгенерировать проект из старого легче чем в случае с AVR и STM.

А, ну заодно и файл проекта для протеуса тоже перепишем в новую папку, переименовав его тоже в свете требований имени нового проекта – в BUTTON01.X.pdsprj.

Запустим среду программирования MPLAB X IDE и просто откроем там наш новый проект из меню File -> Open Project либо с соответствующей кнопки тулбара.

Сделаем наш проект главным, чтобы из меню и тулбара всё управление шло именно к данному проекту, с помощью контекстного меню, вызвав его правой кнопкой мыши на имени проекта в дереве проектов по пункту Set as Main Project

Откроем файл main.c в новом проекте и попробуем проект собрать. Проект уже спокойно должен будет собраться, о чём будет свидетельствовать надпись в окне вывода информации, в котором также будет присутствовать и путь к файлу новой прошивки

Откроем теперь файл протеуса и исправим там в свойствах микроконтроллера путь к прошивке, так как он скорей всего остался к файлу старого проекта.

Запустим наш проект и проверим его работоспособность. Светодиоды должны будут поочерёдно зажигаться.

Теперь добавим кнопку, подключив её одним выводом к общему проводу, а другим к выводу RA2 контроллера

Также, чтобы в момент, когда кнопка не будет нажата, чтобы не получилось у нас неизвестное состояние у ножки порта, подтянем нашу ножку к выводу питания с помощью резистора, на 10 килоом, я думаю будет нормально

Вернёмся в наш проект в MPLAB и будем немного его совершенствовать. Думаю, нормально будет, если огни теперь при запуске сразу не побегут, а побегут они тогда, когда мы нажмём кнопку. Для этого мы сначала настроим ножку порта RA2 на вход соответствующим образом в функции main()

TRISA |= 0x04; //Включим ножку RA2 на вход

Теперь над функцией main() давайте напишем функцию обнаружения нажатой кнопки, чтобы не загромождать функцию main

unsigned char CheckButton( void )

unsigned char result=0;

unsigned int butcount=0;

while (!RA2)

if (butcount

butcount++;

else

result = 1;

break ;

return result;

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

Мы добавим две локальные беззнаковые целочисленные переменные, одну разрядностью в 8 бит, а другую в 16. Затем мы проверим наличие единицы в бите RA2, если такое имеет место, то попадём в тело цикла, в котором мы будем наращивать счётчик butcount в каждом прохождении по циклу при условии, что бит у нас будет оставаться в единице, то есть кнопка будет всё ещё нажата. Если мы в таком состоянии достигнем отметки в 10000, что будет соответствовать сколько-то милисекунд (подбирается на практике либо можно измерить с помощью инструмента отладки StopWatch, который мы испробовали на прошлом занятии), то мы уже не попадём в тело условия, что счётчик у нас меньше 10000, он же будет больше и мы тогда попадём в тело обратного (или противного) условия, где установим переменную результата в 1 и выйдем из цикла по команде break, а затем и из функции также с положительным результатом. А если мы так и не досчитаем до нашей цифры (которую вы можете для себя подобрать другую), то мы тогда и так выйдем из цикла while, и выйдем из функции, но уже с результатом 0, что будет свидетельствовать о том. что кнопка у нас не нажата. Таким образом мы не только отследим «нажатость» кнопки, но ещё и проведём борьбу с дребезгом, так как кнопки по качеству иногда отличаются.

Читайте также  Фазовый детектор 400 гц с гальванической развязкой

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

Контроль 15-ти контактов одним входом pic-микроконтроллера

Эта статья я думаю, будет немного поинтереснее. Здесь мы сделаем АЦП на основе МК PIC16F877. АЦП этот будет 10-ти разрыдным, что очень неплохо ибо позволяет получать хорошую точность преобразования. При диапозоне входных напряжений АЦП 0-5 В получаем шаг квантования 5/(2 10 ) = 0.00488 В

Начнем, пожалуй со схемы, чтоб был более понятным код. В МК PIC16F877 есть аж целых 8 линий, на котроые, при соответствующих программных настройках, можно подавать аналоговое напряжение на вход АЦП. В этом примере я использую линию RA0/AN0 (вывод 2). Диапозон рабочих АЦП этого МК составляет 0 — 5 В . Не превышайте этот порог — можно МК сжечь. Еще одним схемным изменением стало появление еще двух светодиодов — нам же надо как-то показать результат работы АЦП. Т.к. 10-ти разрыдный, то нам и нужны 10 светодиодов для отображения результата преобразования.

Для упрощения этого примера, я решил не использовать еще один источник напряжения для входа АЦП, а запитал его через переменый резистор от общей шины питания схемы. Теперь изменяя положение движка резистора можно будет изменять подаваемое на вход АЦП напряжение — от 0 до 5 В.

Теперь рассотрим код для МК, который позволяет использовать АЦП и отображает результат его работы на светодиодах. Готовый проект приложения MPLAB можно найти в файлах к этой статье. Здесь я решил показать помимо работы с модулем АЦП еще и обработку прерываний в МК. Схема функционирования программы следующая: сначала проводим инициализацию АЦП и настраиваем т.н. таймер. После этого входим в бесконечный цикл. Таймер срабатывает с определенной частотой и при каждом его срабатывании управление в МК переходит на нашу специализированную функцию, в которой мы проводим обработку результатов работы АЦП. После того как функция-обработчик прерывания от таймера завершит свою работу, управление передается обратно на тот участок, откуда мы перешли на функцию обработчик. Потом снова сработает таймер и т.д.

Рассмотрим что здесь происходит. Начнем с функции main, ведь имено с нее начнется выполнение программы. Сначала мы присваиваем значение счетчику таймера равным 0 (TMR0=0). Это нужно для того, чтобы таймер не успел сработать, пока мы проводим начальную инициализацию (до входа в бесконечный цикл). Тут необходимо сказать пару слов об этом самом таймере. Это обычный 8-ми разрядный регистр, значение которго при каждом машинном такте увеличивается на еденицу. Как только значение в нем будет равно 256, он сбрасывается и в определенном регистре устанавливается флаг, говорящий о том что произошло переполнение таймера. (вот тут то управление и перейдет на нашу функцию обработчик прерывания). Перодом срабатывания таймера можно управлять, указав через сколько прошедших машинных тактов значение регистра таймера увеличивается на 1. Ругилировать можно в пределах 1:2, 1:4, 1:8, 1:16, 1:32, . 1:256. Т.е. в последнем случае, чтобы регистр увеличился на еденицу должно пройти 256 машинных тактов. Тогда для срабатывания таймера потребуется 256*256 = 65536 машинных тактов. Зная длительность машинного такта можно однозначно опрделеить период срабатывания таймера в секудах. Для МК PIC один машинный такт = 4 тактам кварца. Тогда, если у нас стоит кварц на 20 МГц, длительность одного машинного такта будет равна 1/(5 МГц) = 0.2 * 10 -6 сек = 0.2 мкс.

Слующей строчкой в коде мы как раз и настраиваем работу таймера. Для этого служит спецальный регистр, каждый бит в котором предназначен для определенной настройки какого-либо свойства. Полное описание этого регистра советую прочитать в описании к этому МК, которое можно было найти в 3-тьей статье этого раздела.

То числовое значение которое загружается в него (регистр) в это примере означает что таймер будет работать с предделителем 1:2 (увеличение счетчика таймера происходит после двух машинных тактов). Далее устанавливая спец. бит настройки T0IE в еденицу мы разрешаем прерывания от таймера. GIE=1 — разрешает обработку прерываний в МК глобально. Потом настраиваем порт B и D для работы на выход и помещаем в них 0 (светодиоды подключенные к ним будут погашены).

Далее проводим настройку работы АЦП. Для его настроек предназначенны два регистра ADCON1 и ADCON0. Более подробно про их содержимое расписано в описаниии МК.

На что хотел обратить Ваше внимание, так это на т.н. выравнивание результата преобразования. Результат то 10-ти разрядный, а регистры в МК PIC 8-ми разрядные. Значит нужны два регистра. Размещением в них этого результата (с какой сторны они выровнены, т.е. откуда начинаются) можно устанавливать самомтоянтельно. В этом примере я указал правое выравнивание. Это значит что 8 младших бит результата будут находиться в одном регистре а оставшиеся 2 будут находится в двух младших битах другогог регистра.

После того как все настройки сделаны, запускаем бесконечный цикл и ждем кагда сработает таймер. Как только это происходит, управление переходит на специальнцю функцию с ключевым словом interrupt. В ней мы проверяем бит T0IF, в которм указывается что произошло прерывание таймера. Если это так, то мы его сбрасываем в ноль (чтоб таймер дальше мог работать) и запускаем процесс преобразования входного аналогового напряжения в цифровой код установкой бита управления АЦП ADGO. Как только преобразование АЦП будет сделано, этот бит станет равным 0. Поэтому с помощью while мы ждем этого события. Теперь нам нужно прочесть результат преобразования. Он храниться в двух регистрах с именами ADRESL и ADRESH. В первом из них храняться 8 младших бит результата и мы сразу же их отсылаем в порт B (красные светодиоды). В ADRESH находятся 2 старших бита результата. Т.к. на схеме я хотел чтобы эти два бита отображались на выводах 2,3 порта D (чтоб все светодиды были по одну сторону от МК) то нужно содержимое этого регистра сдвинуть на два разряда влево. После этого то что сдвинули записываем в порт D.

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

ПРОГРАММИРОВАНИЕ PIC КОНТРОЛЛЕРОВ

Плату необходимо отзеркалить при печати. Иначе панельки придется паять со стороны дорожек.

Далее просверлил отверстия и начал паять детали. Самой большой проблемой были стабилитроны. Стабилитроны стал искать на плате от ЭЛТ-монитора. Подписаны на плате они как ZD (Zener Diode). Естественно маркировка у них непонятная и неизвестно где и как искать. Чтобы определить, на сколько вольт стабилитрон можно собрать простую схемку.

Вольтметр достаточно точно покажет, на сколько вольт стабилитрон. Таким нехитрым способом нашел приблизительные по номиналу стабилитроны. Вместо 5,6В установил 6,2В, вместо 12,6В поставил 2 стабилитрона последовательно 6,2+6,2=12,4В.

Транзистор можно поставить КТ315. У себя поставил С945. Диоды тоже любые, я выпаял все 3 шт. из диодного моста той-же платы от монитора. Номинал конденсаторов также не критичен, но их поставил по номиналу.

Немного про красные пятачкИ у панелек. Эти ноги вообще не паяются у панелек. Полностью готовый девайс выглядит так:

Панельки решил не все паять, т.к. мне нужно было прошить только PIC16F628А. После того как спаял нужно настроить программу. Прошивать мы будем IC-Prog. Скачиваем программу, распаковываем из архива, все файлы должны быть обязательно в одной папке!

1) Если вы пользуетесь Windows NT, 2000 или XP, то правой кнопкой щёлкните на файле icprog.exe. «Свойства» >> вкладка «Совместимость» >> Установите «галочку» на «Запустить программу в режиме совместимости с:» >>
выберите «Windows 2000».

2) Запускаем программу. Если она уже на русском — ничего не нужно, переходите к шагу 3 .

Если программа на английском, то жмите «Settings» >> «Options» >> вкладку «Language» >> установите язык «Russian» и нажмите «Ok».
Согласитесь с утверждением «You need to restart IC-Prog now» (нажмите «Ok«). Оболочка программатора перезапустится.

3) Теперь нужно настроить программатор. Кликайте «Настройки» >> «Программатор«. Проверьте установки, выберите используемый вами COM-порт, нажмите «Ok«.

Для очень «быстрых» компьютеров возможно потребуется увеличить параметр «Задержка Ввода/Вывода». Увеличение этого параметра увеличивает надёжность программирования, однако, увеличивается и время, затрачиваемое на программирование микросхемы.

Читайте также  Контроль положения контактов 3-х позиционного переключателя с помощью ардуино

4) Только для пользователей Windows NT, 2000 или XP. Нажмите «Настройки» >> «Опции» >> выберите вкладку «Общие» >> установите «галочку» на пункте «Вкл. NT/2000/XP драйвер» >> Нажмите «Ok» >> если драйвер до этого не был устновлен на вашей системе, в появившемся окне «Confirm» нажмите «Ok» . Драйвер установится, и оболочка программатора перезапустится.

5) Нажмите снова «Настройки» >> «Опции» >> выберите вкладку «I2C» >> установите «галочки» на пунктах: «Включить MCLR как VCC» и «Включить запись блоками«. Нажмите «Ok«.

6) «Настройки» >> «Опции» >> выберите вкладку «Программирование» >> снимите «галочку» с пункта: «Проверка после программирования» и установите «галочку» на пункте «Проверка при программировании«. Нажмите «Ok«.

Готово, теперь программа полностью готова к работе с программатором. Подключаем наш программатор к СОМ порту, выбираем наш микроконтроллер в программе, открываем прошивку и программируем любые МК серии PIC. Удачи всем в работе с программатором и контроллерами! Автор: [)еНиС

Форум по обсуждению материала ПРОГРАММИРОВАНИЕ PIC КОНТРОЛЛЕРОВ

Умный аварийный резервный светодиодный источник света — простая схема автоматически включающейся LED подсветки.

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

Сборник из 10 конструкций и схем приставок к цифровым мультиметрам, расширяющих функционал измерительных приборов.

Программирование микроконтроллеров семейства PIC начинающим

Главная страница » Программирование микроконтроллеров семейства PIC начинающим

Первые микроконтроллеры появились в 60-х годах. Автоматизированные системы до этого времени обычно строились на основе реле. Теперь программируемые логические контроллеры распространены повсеместно. Однако программирование микроконтроллеров — процесс нередко сложно воспринимаемый. Поэтому рассмотрим, как программировать контроллер на примере широко известной серии ПЛК (PLC — Peripheral Interface Controller) — продукта компании Microchip Technology Inc.

Общий взгляд на устройства ПЛК

Системы на базе микропроцессора (микроконтроллеры) выступают в качестве программируемых электронных устройств, для которых специально разработаны языки программирования.

Благодаря таким языкам программирования, существенно облегчается процесс программирования контроллеров. Язык высокого уровня, созданный для ПЛК, обеспечивает простоту, эффективность и дружелюбную среду для пользователя.

Микропроцессор фактически можно рассматривать электронной схемой, поддерживающей обработку команд, хранящихся в системной памяти. Эта же схема работает с инструкциями — арифметическими и логическими, использует внешние устройства:

  • память,
  • входные порты,
  • выходные порты.

В свою очередь, микроконтроллер представляет собой интегральную схему, в составе которой присутствуют:

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

Макрос языка высокого уровня — это инструкция, которая является сокращённой строкой, содержащей несколько инструкций. Запись программы с повторяющимися действиями (схожестью инструкций) при использовании макросов значительно сокращается.

Микроконтроллеры используются в составе современной электроники повсеместно. Умение выполнять программирование микроконтроллеров открывает широкие горизонты

Эффективность программы на основе макросов столь же эффективна, как и запись программы на языке «C». Компилятор отвечает за создание соответствующих подстановок для генерации кода, который передаётся в память программы микропроцессора или микроконтроллера.

Программирование микроконтроллеров PIC 12 / PIC 16

Программирование микроконтроллеров PIC выполняется с использованием проприетарного последовательного протокола. Поэтому конечному пользователю недостаточно просто взять и подключить микросхему контроллера PIC напрямую к любому «стандартному» интерфейсу.

Однако технические требования относительно программирования по времени достаточно слабы. Этот фактор даёт возможность использовать некоторые выводы параллельного или последовательного порта компьютера для генерации программной последовательности с помощью программного обеспечения.

Помимо рабочего напряжения, микроконтроллерам требуется ещё три сигнала:

  1. Программируемое напряжение (около 13В).
  2. Таймер программирования (ICSPCLK).
  3. Данные (ICSPDAT).

Поскольку большинство выпускаемых экземпляров PIC допускают программируемое напряжение несколько ниже значения, указанного спецификацией, открывается возможность использования уровней сигналов ± 12В, присутствующих на интерфейсе последовательного порта настольного ПК.

Таким образом, «записать» PIC вполне допустимо без необходимости подключения дополнительного источника питания. Преобразование уровней допускается выполнять при помощи нескольких компонентов. Однако представленная ниже упрощённая схема, обладает некоторыми ограничениями.

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

Схема принципиальная упрощённого программатора микроконтроллеров серии PIC и обозначенные линии подключения интерфейсов RS232 / ISSP

Внутрисхемное программирование микроконтроллеров PIC

Разъём внутрисхемного программирования (ICSP) предоставляет возможность запрограммировать микроконтроллер непосредственно в рамках прикладной схемы.

Этот вариант видится особенно полезным в домашних условиях или в другой не специальной среде. Например там, где по каким-либо причинам требуется повторное изменение — программирование микроконтроллеров PIC и тестирование схемы.

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

Вот такой вариант ICSP соединителя вполне подойдёт для подключения линий связи на случай выполнения программирования микроконтроллера серии PIC12/PIC16

Следует внимательно использовать интерфейс и кабель ICSP, принимая во внимание, что схема не должна нарушать ход сигналов программирования. Другими словами – точное соответствие месту назначения сигналов необходимо выполнять безукоризненно.

Основные условия программирования:

  • время переключения напряжения программирования «0 – 13В» составляет несколько микросекунд;
  • полный размах напряжения сигналов таймера и данных достигается в течение одной микросекунды;
  • вывод сигнала PGM остаётся низким всё время программирования.

Некоторые микроконтроллеры PIC требуют применения напряжения программирования до подачи рабочего напряжения. В этом случае напряжением программирования управляют через модуль программатора. Самый простой способ выполнить первые два условия — не использовать корреспондирующие выводы в цепях схемы. Если необходимо, следует использовать отладчик.

Рекомендации относительно процедуры программирования

Не рекомендуется подключать активные цепи к линии внешнего (основного) сброса (MCLR – Microcontroller Line Reset). Если сигнал MCLR используется для сброса PIC, следует устанавливать резистор номинальным сопротивлением более 56 кОм между выводами MCLR и подачи напряжения питания.

Рекомендуется в цепь резистора включать конденсатор небольшой ёмкости — менее 100 пФ со смещением на землю (вывод GND).

Сигнальные выводы программирования должны исключать наличие индуктивной или ёмкостной нагрузки. Когда рабочее напряжение питания берётся от модуля программатора, требуется изолировать вывод питания PIC от остальной части прикладной схемы в процессе программирования.

Схемные доработки программатора микроконтроллера, рекомендуемые с целью обеспечения более качественного процесса программирования устройства

Этот вариант может иметь место, если схема содержит собственный стабилизатор напряжения питания и оснащается развязывающим конденсатором большой ёмкости. Модуль программатора, предназначенный под напряжение питания 3,3В, не в состоянии заряжать конденсатор достаточно быстро, а для программирования PIC требуется не менее 4,5В.

Между тем вариант изолирования можно исключить, если в схеме используется диод Шоттки. Чтобы удерживать вывод перевода микроконтроллера в режим программирования (PGM) на низком уровне, рекомендуется подключать этот вывод к земле через резистор номиналом от 2,2 кОм до 10 кОм.

Всегда рекомендуется таймер включения питания вносить в «слово» конфигурации. Задержка таймера более 40 мс даёт достаточно времени для стабилизации напряжения питания перед началом любой операции. Такой шаг позволяет избежать непреднамеренного выполнения программы до входа в режим программирования.

Во время программирования остальные контакты порта остаются в режиме ввода — имеют высокий импеданс. Используемой схемой необходимо обрабатывать такое состояние по возможности неактивным способом. Чтобы избежать нежелательных «побочных эффектов», следует рассмотреть возможность дополнения подтягивающими резисторами.

Для обеспечения повторного программирования микроконтроллера PIC в условиях напряжения питания ниже 4,5В, область памяти необходимо отключить от защиты. Это обусловлено применением «Chip Erase», единственного способа удаления кода или защиты данных, которого требуют практически все микроконтроллеры PIC с напряжением питания выше 4,5В.

Сигналы ICSP соответствующие контактам PIC 12Fxxx / 16Fxxx

Число ниже аббревиатуры сигнала соответствует выходу разъема ICSP модуля программатора. Для использования модуля с тестовыми платами сторонних производителей требуется адаптер.

Следует обратить внимание: разъём ICSP этого модуля программатора имеет различный порядок сигналов по сравнению с другими программаторами микроконтроллеров PIC

Следующие схемы показывают, как подключать сигналы программирования к микроконтроллерам PIC 12Fxxx / 16Fxxx:

Схемы, определяющие порядок подключения сигнальных проводников, участвующих в процедуре чтения/записи данных микроконтроллеров разной конфигурации

Программирование микроконтроллеров + фирменные средства

Существует солидная группа фирменных программаторов для микроконтроллеров семейства PIC. Наиболее известные аппаратные средства:

  • REAL ICE
  • Pickit 1-2-3
  • IC PROG
  • ICD 2-3-4

Характерные отличия отмеченных программаторов – устройства обладают не просто классическими функциями чтения/записи. Фирменным программаторам присущ целый ряд расширенных функций, включая полный контроль содержимого памяти и стёка.

На основе информации: Uolsinectis

КРАТКИЙ БРИФИНГ

Zetsila — публикации материалов, интересных и полезных для социума. Новости технологий, исследований, экспериментов мирового масштаба. Социальная мультитематическая информация — СМИ .