Как написать программу для pic контроллера. Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Общие замечания по стратегии "въезда"

Недавно решил собрать устройство на микроконтроллере фирмы PIC, но по не известным причинам у меня отказал программатор Extra-PIC . Скорее всего, сгорела микросхема МАХ232 , такое уже было один раз. Недолго думая, нашел в Интернете простенькую схему программатора, заточенного под IC-Prog и работающую через СОМ порт.
Плату необходимо отзеркалить при печати. Иначе панельки придется паять со стороны дорожек.


Далее просверлил отверстия и начал паять детали. Самой большой проблемой были стабилитроны. Стабилитроны стал искать на плате от ЭЛТ-монитора. Подписаны на плате они как 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 ".


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

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

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

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


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

Недавно решил собрать устройство на микроконтроллере фирмы PIC, но по не известным причинам у меня отказал программатор Extra-PIC . Скорее всего, сгорела микросхема МАХ232 , такое уже было один раз. Недолго думая, нашел в Интернете простенькую схему программатора, заточенного под IC-Prog и работающую через СОМ порт.
Плату необходимо отзеркалить при печати. Иначе панельки придется паять со стороны дорожек.


Далее просверлил отверстия и начал паять детали. Самой большой проблемой были стабилитроны. Стабилитроны стал искать на плате от ЭЛТ-монитора. Подписаны на плате они как 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 ".


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

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

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

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


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

Обсудить статью ПРОГРАММИРОВАНИЕ PIC КОНТРОЛЛЕРОВ

Итак, пришло время изучать микроконтроллеры, а потом и их программировать, а так же хотелось собирать устройства на них, схем которых сейчас в интернете ну просто море. Ну нашли схему, купили контроллер, скачали прошивку….а прошивать то чем??? И тут перед радиолюбителем, начинающим осваивать микроконтроллеры, встает вопрос – выбор программатора! Хотелось бы найти оптимальный вариант, по показателю универсальность - простота схемы - надёжность. «Фирменные» программаторы и их аналоги были сразу исключены в связи с довольно сложной схемой, включающей в себя те же микроконтроллеры, которые необходимо программировать. То есть получается «замкнутый круг»: что бы изготовить программатор, необходим программатор. Вот и начались поиски и эксперименты! В начале выбор пал на PIC JDM. Работает данный программатор от com порта и питается от туда же. Был опробован данный вариант, уверенно запрограммировал 4 из 10 контроллеров, при питании отдельном ситуация улучшилась, но не на много, на некоторых компьютерах он вообще отказался что либо делать да и защиты от «дурака» в нем не предусмотрено. Далее был изучен программатор Pony-Prog. В принципе, почти тоже самое что и JDM.Программатор «Pony-prog», представляет очень простую схему, с питанием от ком-порта компьютера, в связи с чем, на форумах, в Интернете, очень часто появляются вопросы по сбоям при программировании того, или иного микроконтроллера. В результате, выбор был остановлен на модели «Extra-PIC». Посмотрел схему – очень просто, грамотно! На входе стоит MAX 232 преобразующая сигналы последовательного порта RS-232 в сигналы, пригодные для использования в цифровых схемах с уровнями ТТЛ или КМОП, не перегружает по току COM-порт компьютера, так как использует стандарт эксплуатации RS232, не представляет опасности для COM-порта.Вот первый плюс!
Работоспособен с любыми COM-портами, как стандартными (±12v; ±10v) так и с нестандартными COM-портами некоторых моделей современных ноутбуков, имеющих пониженные напряжения сигнальных линий, вплоть до ±5v – еще плюс! Поддерживается распространёнными программами IC-PROG, PonyProg, WinPic 800 (WinPic800) и другими – третий плюс!
И питается это все от своего собственного источника питания!
Было решено – надо собирать! Так в журнале Радио 2007 №8 был найден доработанный вариант этого программатора. Он позволял программировать микроконтроллеры в двух режимах.
Известны два способа перевода микроконтроллеров PICmicro в режим программирования:
1.При включённом напряжении питания Vcc поднять напряжение Vpp (на выводе -MCLR) от нуля до 12В
2.При выключенном напряжении Vcc поднять напряжение Vpp от нуля до 12В, затем включить напряжение Vcc
Первый режим - в основном для приборов ранних разработок, он накладывает ограничения на конфигурацию вывода -MCLR, который в этом случае может служить только входом сигнала начальной установки, а во многих микроконтроллерах предусмотрена возможность превратить этот вывод в обычную линию одного из портов. Это еще один плюс данного программатора. Схема его приведена ниже:

Крупнее
Все было собрано на макетке и опробовано. Все прекрасно и устойчиво работает, глюков замечено небыло!
Была отрисована печатка для этого программатора.
depositfiles.com/files/mk49uejin
все было собрано в открытый корпус, фото которого ниже.




Соединительный кабель был изготовлен самостоятельно из отрезка восьмижильного кабеля и стандартных комовских разьемах, никакие нуль модемные тут не прокатят, предупреждаю сразу! К сборке кабеля следует отнестись внимательно, сразу избавитесь от головной боли в дальнейшем. Длина кабеля должна быть не более полутора метров.
Фото кабеля


Итак, программатор собран, кабель тоже, наступил черед проверки всего этого хозяйства на предмет работоспособности, поиск глюков и ошибок.
Сперва наперво устанавливаем программу IC-prog, которую можно скачать на сайте разработчика www.ic-prog.com, Распакуйте программу в отдельный каталог. В образовавшемся каталое должны находиться три файла:
icprog.exe - файл оболочки программатора.
icprog.sys - драйвер, необходимый для работы под Windows NT, 2000, XP. Этот файл всегда должен находиться в каталоге программы.
icprog.chm - файл помощи (Help file).
Установили, теперь надо бы ее настроить.
Для этого:
1.(Только для Windows XP): Правой кнопкой щёлкните на файле icprog.exe. «Свойства» >> вкладка «Совместимость» >> Установите «галочку» на «Запустить программу в режиме совместимости с:» >>выберите «Windows 2000».
2.Запустите файл icprog.exe. Выберите «Settings» >> «Options» >> вкладку «Language» >> установите язык «Russian» и нажмите «Ok».
Согласитесь с утверждением «You need to restart IC-Prog now» (нажмите «Ok»). Оболочка программатора перезапустится.
Настройки" >> «Программатор

1.Проверьте установки, выберите используемый вами COM-порт, нажмите „Ok“.
2.Далее, „Настройки“ >> „Опции“ >> выберите вкладку „Общие“ >> установите „галочку“ на пункте „Вкл. NT/2000/XP драйвер“ >> Нажмите „Ok“ >> если драйвер до этого не был устновлен на вашей системе, в появившемся окне „Confirm“ нажмите „Ok“. Драйвер установится, и оболочка программатора перезапустится.
Примечание:
Для очень „быстрых“ компьютеров возможно потребуется увеличить параметр „Задержка Ввода/Вывода“. Увеличение этого параметра увеличивает надёжность программирования, однако, увеличивается и время, затрачиваемое на программирование микросхемы.
3.»Настройки" >> «Опции» >> выберите вкладку «I2C» >> установите «галочки» на пунктах: «Включить MCLR как VCC» и «Включить запись блоками». Нажмите «Ok».
4.«Настройки» >> «Опции» >> выберите вкладку «Программирование» >> снимите «галочку» с пункта: «Проверка после программирования» и установите «галочку» на пункте «Проверка при программировании». Нажмите «Ok».
Вот и настроили!
Теперь бы нам протестировать программатор в месте с IC-prog. И тут все просто:
Далее, в программе IC-PROG, в меню, запустите: Настройки >> Тест Программатора

Перед выполнением каждого пункта методики тестирвания, не забывайте устанавливать все «поля» в исходное положение (все «галочки» сняты), как показано на рисунке выше.
1.Установите «галочку» в поле «Вкл. Выход Данных», при этом, в поле «Вход Данных» должна появляться «галочка», а на контакте (DATA) разъёма X2, должен установиться уровень лог. «1» (не менее +3,0 вольт). Теперь, замкните между собой контакт (DATA) и контакт (GND) разъёма X2, при этом, отметка в поле «Вход Данных» должна пропадать, пока контакты замкнуты.
2.При установке «галочки» в поле «Вкл. Тактирования», на контакте (CLOCK) разъёма X2, должен устанавливаться уровень лог. «1». (не менее +3,0 вольт).
3.При установке «галочки» в поле «Вкл. Сброс (MCLR)», на контакте (VPP) разъёма X3, должен устанавливаться уровень +13,0… +14,0 вольт, и светиться светодиод D4 (обычно красного цвета).Если переключатель режимов поставить в положение 1 то будет светится светодиод HL3
Если при тестировании, какой-либо сигнал не проходит, следует тщательно проверить весь путь прохождения этого сигнала, включая кабель соединения с COM-портом компьютера.
Тестирование канала данных программатора EXTRAPIC:
1. 13 вывод микросхемы DA1: напряжение от -5 до -12 вольт. При установке «галочки»: от +5 до +12 вольт.
2. 12 вывод микросхемы Da1: напряжение +5 вольт. При установке «галочки»: 0 вольт.
3. 6 вывод микросхемы DD1: напряжение 0 вольт. При установке «галочки»: +5 вольт.
3. 1 и 2 вывод микросхемы DD1: напряжение 0 вольт. При установке «галочки»: +5 вольт.
4. 3 вывод микросхемы DD1: напряжение +5 вольт. При установке «галочки»: 0 вольт.
5. 14 вывод микросхемы DA1: напряжение от -5 до -12 вольт. При установке «галочки»: от +5 до +12 вольт.
Если все тестирование прошло успешно, то программатор готов к эксплуатации.
Для подключения микроконтроллера к программатору можно использовать подходящие панельки или же сделать адаптер на основе ZIF панельки (с нулевым усилием прижатия), например как здесь radiokot.ru/circuit/digital/pcmod/18/.
Теперь несколько слов про ICSP - Внутрисхемное программирование
PIC-контроллеров.
При использовании ICSP на плате устройства следует предусмотреть возможность подключения программатора. При программировании с использованием ICSP к программатору должны быть подключены 5 сигнальных линий:
1. GND (VSS) - общий провод.
2. VDD (VCC) - плюс напряжение питания
3. MCLR" (VPP)- вход сброса микроконтроллера / вход напряжения программирования
4. RB7 (DATA) - двунаправленная шина данных в режиме программирования
5. RB6 (CLOCK) Вход синхронизации в режиме программирования
Остальные выводы микроконтроллера не используются в режиме внутрисхемного программирования.
Вариант подключения ICSP к микроконтроллеру PIC16F84 в корпусе DIP18:

1.Линия MCLR" развязывается от схемы устройства перемычкой J2, которая в режиме внутрисхемного программирования (ICSP) размыкается, передавая вывод MCLR в монопольное управление программатору.
2.Линия VDD в режиме программирования ICSP отключается от схемы устройства перемычкой J1. Это необходимо для исключения потребления тока от линии VDD схемой устройства.
3.Линия RB7 (двунаправленная шина данных в режиме программирования) изолируется по току от схемы устройства резистором R1 номиналом не менее 1 кОм. В связи с этим максимальный втекающий/стекающий ток, обеспечиваемый этой линией будет ограничен резистором R1. При необходимости обеспечить максимальный ток, резистор R1 необходимо заменить (как в случае c VDD) перемычкой.
4.Линия RB6 (Вход синхронизации PIC в режиме программирования) так же как и RB7 изолируется по току от схемы устройства резистором R2, номиналом не менее 1 кОм. В связи с этим максимальный втекающий/стекающий ток, обеспечиваемый этой линией будет ограничен резистором R2. При необходимости обеспечить максимальный ток, резистор R2 необходимо заменить (как в случае с VDD) перемычкой.
Расположение выводов ICSP у PIC-контроллеров:


Эта схема только для справки, выводы программирования лучше уточнить из даташита на микроконтроллер.
Теперь рассмотрим прошивку микроконтроллера в программе IC-prog. Будем рассматривать на примере конструкции вот от сюда rgb73.mylivepage.ru/wiki/1952/579
Вот схема устройства


вот прошивка
Прошиваем контроллер PIC12F629. Данный микроконтроллер для своей работы использует константу osccal - представляет собой 16-ти ричное значение калибровки внутреннего генератора МК, с помощью которого МК отчитывает время при выполнении своих программ, которая записана в последней ячейке данных пика. Подключаем данный микроконтроллер к программатору.
Ниже на сриншоте красными цифрами показана последовательность действий в программе IC-prog.


1. Выбрать тип микроконтроллера
2. Нажать кнопку «Читать микросхему»
В окне «Программный код» в самой последней ячейке будет наша константа для данного контроллера. Для каждого контроллера константа своя! Не сотрите ее, запишите на бумажку и наклейте ее на микросхему!
Идем далее


3. Нажимаем кнопку «Открыть файл...», выбираем нашу прошивку. В окне программного кода появится код прошивки.
4. Спускаемся к концу кода, на последней ячейке жмем правой клавишей мыши и выбираем в меню «править область», в поле «Шестнадцатеричные» вводим значение константы, которую записали, нажимаем «ОК».
5. Нажимаем «программировать микросхему».
Пойдет процесс программирования, если все прошло успешно, то программа выведет соответствующее уведомление.
Вытаскиваем микросхему из программатора и вставляем в собранный макет. Включаем питание. Нажимаем кнопку пуск.Ура работает! Вот видео работы мигалки
video.mail.ru/mail/vanek_rabota/_myvideo/1.html
С этим разобрались. А вот что делать если у нас есть файл исходного кода на ассемблере asm, а нам нужен файл прошивки hex? Тут необходим компилятор. и он есть - это Mplab, в этой программе можно как писать прошивки так и компилировать. Вот окно компилятора


Устанавливаем Mplab
Находим в установленной Mplab программу MPASMWIN.exe, обычно находится в папке - Microchip - MPASM Suite - MPASMWIN.exe
Запускаем ее. В окне (4) Browse находим наш исходник (1) .asm, в окне (5) Processor выбираем наш микроконтроллер, нажимаем Assemble и в той же папке где вы указали исходник появится ваша прошивка.HEX Вот и все готово!
Надеюсь эта статья поможет начинающим в освоении PIC контроллеров! Удачи!



  • тактовая частота - 20 МГц
  • 4 полноценных 8-ми битных порта ввода/вывода
  • последовательный и паралельный порт
  • шина I2C
  • несколько таймеров
  • модули сравнения, компараторы
  • модуль широтно-импульсной модуляции (ШИМ)
  • 10-ти разрядный АЦП

МК этот широко распространенный и в розничной продаже встречается часто. Если Вы в г.Москве, то Вам дорога в "Чип и Дип" - там его можно приобрести примерно за 350 руб. Настоятельно рекомендую покупать его в DIP корпусе (широком), благо такой есть. Для начальных опытов и проверок это самый лучший вариант. Если Вы вдруг приобретете его в корпусе PLCC, то будет целая куча проблем с его использованием - шаг плоских выводов в 1.27 мм не самый удобный вариант.

Итак, с МК определились. В файлах к этой статье можно найти полный справочник по этому МК. Что покупать теперь понятно, но пока дайвайте все же напишем программу, что бы было понятно что с ней дальше делать и как ее "зашить" в этот МК.

Запускаем программу MPLAB (которую установили в прошлых статьях). Выбираем пункт меню Project -> Project Wizard . В открывшемся окне нажимаем Далее .

В выпавшем списке доступных МК выбираем PIC16F877. Нажимаем Далее .

Здесь надо выбрать компилятор, который будет обрабатывать код нашей программы. Обязательно надо выбрать пункт HI-TECH PICC Toolsuite в выпадающем списке Active Toolsuite . Это тот самый компилятор языка Си, который мы установили в прошлой стаье. Нажимаем Далее .

Задайте имя проекта, например, TestPIC и укажите директорию проекта. Тут есть две хитрости. Первое, MPLAB не создают сам отдельную папку для проекта и разместит все файлы прямо в той директории которую Вы указали. Второе и пожалуй, самое главное - MPLAB не понимает русских букв в названии пути. Проект то он создаст, но во время работы программы, особенно при сохранении и открытии файлов, возникнут такие "глюки" что долго будете голову ломать в чем дело. Поэтому, в пути к папке проекта не должны попадаться русские названия. Нажимаем Далее .

Здесь можно добавить к проекту какие-либо готовые файлы, но нам пока такая возможность не нужна. Жмем Далее .

Тут я думаю все понятно. Нажимаем Готово .

Заготовку проекта сделали, но он пока пустой. Нажимаем File -> New . Появится новое окно с заголовком Untitled . Далее выбираем File -> Save As... . Укажите имя файла, например, TestPIC.c и перейдите в папку проекта. Обязательно поставьте галочку Add File to Project .

Теперь помещаем ниже следующий код в открытое окно файла проекта TestPIC.c (весь проект целиком можно найти в файлах к этой статье).

#include CONFIG(0x03F72); int i=0; void main(void ) { T0IE=0; GIE=0; TRISB=0; PORTB=0; while (1==1) { PORTB++; for (i=0; i

Наверное Вам интересно, что будет результатом работы этого кода. Будет происходить следующее: к МК подключаются 8 светодиодов. При включении питания, светодиоды начнут мигать в виде "волны" (это лучше видеть, благо осталось нет так уж и много). Рассмотрим поподробнее сам код.

Вначале идет думаю всем знакомый оператор include, который подключает заголовочный файл со всеми неоходимыми макроопределениями. Далее идет еще одна директива препроцессора __CONFIG, в которую предается 16-ти ричное число, характерезующие набор специальных опций и свойств, характерезующих работу МК. Мы еще в ходе этой статьи вернемся к этому моменту. Переходим сразу к началу функции main() - точки входа в собственно сам исполняемый код программы. Далее следует операция с каким-то T0IE. Конктерно эта строчка означает, что необходимо запретить прерывания от таймера при работе МК. TOIE - это определенный с помощью #define в файле pic.h адрес специального регистра, отвечающего за эту операцию (и вообще, если видете в коде странные до этого в коде не определенные переменные записанные в верхнем регистре, то это наверняка символические имена регистров МК). Строчка GIE=0; - запрещает обработку любых прерываний глобально во всем МК. Прерывания для нашего простого примера мы использовать не будем, т.к. они нам просто не нужны.

TRISB=0; - означает, что порт ввода/вывода B МК PIC16F877 будет работать на выход, т.е. к нему можно теперь подключать нагрузку, на которой можно подвать из МК 0 или +5В (этой нагрузкой будут светодиоды). В следующей строке мы помещаем в порт B число 0 - т.е. на всех выводах этого порта, настроенного на выход, будет нулевое напряжение. Далее идет конструкция из оператора while, причем с таким параметром, что некоторые программисты, привыкшие писать на Си для ПК будут слегка удивлены - так ведь это, мол, бесконечный цикл, программа зависнет. Но нам именно этого и надо. МК не может ни чего не делать, он должен постоянно что-то выпонять. Поэтому, для МК работа программы в бесконечном цикле это жизненная необходимость. Затем идет оператор увелечения на 1 числа находящегося в порту B. Немного поясним. Если написать PORTB=0xFF; - то на всех выводах порта будет 1. Если PORTB=0x0; - на всех 0. (я думаю, это должно быть понятно). Конструкция из оператора цикла for, как видно, не делает какой-либо "умной" работы не делает и нужна только для организации временной задержки. Если этот участок кода убрать, то мы просто не будем замечать как меняется напряжение на светодиодах (будет очень быстро).

Что они означают? Давайте по порядку.

  • Oscillator - HS (означает, что в качестве тактового генератора будет использовавытся высокочастотный кварцевый резонатор)
  • WatchDog Timer - Off (спец опция, если она включена, то микроконтроллер будет переодически сбрасываться [переходить на начало main()] во избежание каких-либо зависаний в МК. Нам такая возможность не нужна.)
  • Power Up Timer - On (если On, то МК будет находится в состоянии сброса, пока напряжение питания не достигнет необходимого порогового уровня)
  • Brown Out Detect - On (сбрасывает МК, если произошло падение питающего напряжения ниже определенного уровня)
  • Low Voltage Program - Disabled (в этом случае запрещаем использовать низковольтное внутрисхемное прогрпаммирование МК, т.к. будем пользоваться обычным программаторм [см. следующие статьи])
  • Flash Program Write - Enabled (допускаем возможность записи во Flash память программ)
  • Data EE Read Protect - Off (разрешаем чтение данных и EEPROM памяти МК)
  • Code Protect - Off (отключаем защиту кода в МК. Если On то невозможно будет считать программу из МК. Нужно если Вы хотите защитить свою программу от попыток взлома. Нам пока такая возможность не нужна.)

Пора откомпилировать код. Запустите Project -> Build All . При этом начнется компиляция проекта и появится вот такое окно с чудной записью в конце BUILD SUCCEEDED.

Теперь, если Вы посмотрите в папку нашего проекта, то должны увидеть там файл TestPIC.hex - итог всех наших трудов. В нем содержится специальный код, сформированный из наших писаний на Си, для загрузки в память МК. Чтобы двигаться дальше нам нужен программатор, с помощью которого мы запишем в МК нашу программу. Пора перейти к следующей статье, где как раз и рассматривается вопрос изготовления собственного программатора.

© Иванов Дмитрий
Апрель 2007

Часть 1 Оглавление

Введение

1 . Готовим инструменты

2 . Что такое микроконтроллер и как он работает

3 . Система команд PIC16F84A

4 . Что такое программа и правила ее составления. Пример создания

программы автоколебательного мультивибратора. Директивы.

5 . Интегрированная среда проектирования MPLAB IDE и работа в ней

7 . Пример создания программы (начало)

8 . Пример создания программы (продолжение)

9 . Работа в симуляторе. Отладка программы

10 . Как отследить выполнение программы

11 . Прерывания. Стек. Пример разработки программы с уходом в прерывания

12 . Организация вычисляемого перехода. Работа с EEPROM памятью данных

13 . Флаги. Работа с флагами. Как работает цифровой компаратор. Перенос и заем

14 . Пример задействования флага С в трехбайтном суммирующем устройстве.

Циклический сдвиг. Операция умножения

15 . Введение в принцип построения подпрограммы динамической индикации.

Косвенная адресация

16 . Преобразование двоичных чисел в двоично-десятичные. Окончательное

формирование текста подпрограммы динамической индикации

17 . Принцип счета. Работа с таймером TMR0.

Принцип установки групп команд счета в текст программы

…………………………………………………………………

…………………………………………………………………

Введение

Эпиграф : программист, работающий в ассемблере, должен быть " властелином колец" . И еще : банальность это уставшая истина.

(поймете позднее)

В микропроцессорную технику люди приходят по-разному. Лично я, до поры, до времени, не ощущал особой потребности в необходимости заниматься этим, пока, в один прекрасный момент, не понял, что начинаю не соответствовать времени. То, что я наработал "до того", оказалось безнадежно устаревшим, а также "смешно смотрящимся" и на "фоне" современной элементной базы, и на "фоне" тех знаний, которые нужно иметь для того, чтобы работать с ней.

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

Нужно было выбрать: либо "сложить лапки" и перейти в категорию постепенно "вымирающих" (дисквалифицирующихся),

либо заняться этими "страшными и ужасными" микроконтроллерами, которые все более напоминали "в каждой бочке затычку".

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

Информационный "бардак" в этом "секторе" оказался настолько впечатляющим, что "волосы встали дыбом".

А куда деваться? "Отступать-то некуда, позади Москва".

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

Чего я натерпелся, знает только один Господь Бог: помощи никакой и пришлось рассчитывать только на свои силы.

После всех этих "мытарств", возник закономерный вопрос: "Это что же такое получается? Неужели каждый, кто вознамерится "посягнуть" на эти "железяки", должен обязательно "разбивать свой нос в кровь", водя им по "батарее"?

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

Прикинул...

А ведь, ей Богу, можно!

Правда, придется "вспахать поле не паханное", но по совокупности причин, смысл в этом есть.

То, что Вы прочитаете в "Самоучителе...", есть итог указанного выше болезненного процесса, преподнесенный "на блюдечке с голубой каемочкой".

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

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

Такого рода желание, конечно же, похвально, но при отсутствии плановости, четко выраженных приоритетов и способности, на первых порах, сознательно ограничивать объем воспринимаемой информации только самой действительно необходимой, оно играет с человеком злую шутку.

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

Я вовсе не говорю, что это просто. Поработать придется, но и пугаться совсем не стоит, так

как "не так страшен черт, как его малюют".

Еще одна беда - недооценка огромного значения знания и умения применения на практике стратегии и тактики "мозгового штурма".

Хотя и любой "мозговой штурм" полезен, но "мозговой штурм" программиста, имеющего хотя бы элементарное представление о его стратегии и тактике, гораздо эффективнее и действеннее, чем "судорожные действия" программиста, который этих представлений не имеет. А ведь работа программиста это "сплошной мозговой штурм"!!!

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

В своей работе я исхожу из того, что мозги являются не только логической "машиной", но и "вместилищем личности".

Последнее либо явно недооценивается, либо вообще не берется в рассчет авторами подобных моему "творений", что есть огромнейший их просчет, сводящий на нет большую часть усилий.

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

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

Для того чтобы понять огромный вред такого подхода к обучению, вспомните про Афганистан или Чечню и про участь тех необстрелянных и психологически неподготовленных ребят, которых "бросили в эту мясорубку".

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

Не судите меня строго, так как я работаю "с нуля" и "психологическим спецом" не являюсь. Надеюсь на то, что другие авторы продолжат эту исключительно важную и "преступно" игнорируемую "психологическую тему". Хочется верить, что при чтении "Самоучителя...", Вы почувствуете, что такое доброжелательное и уважительное отношение к Вашему совсем не легкому труду (по себе знаю), а Ваше подсознание не будет выдавать сигналов SOS об "изуверском изнасиловании мозгов".

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

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

В программировании, агрессивность есть достоинство, а не недостаток.

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

Итак, информация будет предоставляться в определенной последовательности и по принципу "от простого к сложному".

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

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

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

1. Готовим инструменты

Микроконтроллеры (и вообще все процессоры) изначально понимают только машинные коды, то есть некую совокупность нулей и единиц.

Те, кто представляет себе работу счетчиков, регистров, триггеров и т.д., сразу же поймет природу машинного кода.

Так как, среди электронщиков, таких людей большинство, то на мой взгляд, все они согласятся с такой аксиомой: машинные коды полезны в "малых дозах".

А вот когда начинаются "большие дозы" (сложные устройства с десятками корпусов м/схем), то "мозги начинают дымиться" даже у классных электронщиков, имеющих недюжинные способности.

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

И в самом деле, сил и средств вкладывается "море", а получается нечто не очень надежное, габаритное, сложное в изготовлении, энергоемкое и дорогое.

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

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

Естественно, всем этим "хозяйством" нужно как-то "рулить". Эта "рулежка" и есть то, что называется программированием.

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

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

Все эти "удобоваримые приятности", по окончании составления текста программы, переводятся в машинные коды одним "легким движением руки" (мозги программиста не задействуются).

Чтобы это "легкое движение руки" имело место быть, "яйцеголовые" придумали так называемую "интегрированную среду разработки".

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

Что, первым делом, нужно сделать, например, русскому, который попал в Англию и собирается там жить?

Выучить английский язык.

При "въезде" в программирование, нужно сделать то же самое (задача даже существенно проще).

"Проматерь" всех языков программирования - ассемблер .

Хотя он и считается самым простым, но слово "простой" относится прежде всего к набору его команд: количество их - минимально необходимое, и тем не менее, вполне достаточное для решения самых сложных задач, но не к комфортному восприятию их человеком.

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

Минимальный "джентльменский" набор ассемблера для ПИКов составляет 35 команд. Реально же, наиболее часто, используются от 10 до 20 команд.

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

А выучить ассемблер очень даже стоит по причине того, что он, может быть, и не очень

"удобоварим", но именно на этом языке пишутся самые компактные по объему, быстрые и надежные программы, и по этой причине, серьезные программисты, работают

преимущественно в ассемблере.

Предупреждение: на этом этапе в ассемблер не лезть! Всему свое время. Пока достаточно общего представления (пусть "в мозгах уляжется").

Программы для ПИКов составляются преимущественно в ассемблере.

Даже если программа для них и составлена на языке более высокого уровня, то в конечном итоге, интегрированная среда разработки переведёт все в ассемблер.

Об интегрированной среде разработки (проектирования): Она выполняет целый комплекс задач.

В ее специализированном текстовом редакторе, составляется текст программы.

Текст программы нельзя записывать в ПИК, так как он "понимает" только машинные коды. Следовательно, нужно преобразовать текст программы, с языка ассемблер, в машинные коды.

То есть, необходимо так называемое ассемблирование (компилирование) исходного текста программы, которое производится все в той же интегрированной среде разработки.

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

С помощью этой программы, машинные коды программы записываются в ПИК. Приведенное выше словосочетание, используемое сплошь и рядом, безусловно, не является удачным.

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

Ее возможности ими далеко не исчерпываются.

Интегрированная среда разработки для ПИКов называется MPLAB .

Эта программа (вернее набор программ) создана производителем ПИКов, то есть фирмой

Microchip Technology Inc.

В России, представителем этой фирмы является ООО "Микро-Чип" , которое имеет в Интернете свой сайт технической поддержки на русском языке http://www.microchip.ru (кстати, на этом сайте, в разделе "Начинающим", есть ссылка на мой сайт).

Лично я пользуюсь версией MPLAB 5.70.40 , что и Вам советую.

Это "старый, добрый конь, который борозды не испортит" и возможностей у него "выше крыши".

Главный недостаток этой версии - медленно работает (считает), но для начинающих, "реактивной" скорости и не нужно.

Главное ее преимущество - надежность работы.

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

В дальнейшем , я буду ориентироваться на версию 5.70.40 .

Примечание: дистрибутив MPLAB версии 5.70.40 (и еще 2 версии) имеется на компактдиске. Закачивать дистрибутив MPLAB нужно в папку с английским названием (папка мои документы или рабочий стол не подойдут), иначе будете иметь проблемы.

Лучше всего организовать ее в папке Program Files диска С .

Программа MPLAB является интегрированной средой разработки для ПИКов и содержит все необходимое как для написания и редактирования программы, так и для создания HEX-файлов, а также и для отладки программы.

Таким образом, необходимость в наличии отдельного текстового редактора для написания программы, отдельной программы - ассемблера для создания HEX-файла и отдельного отладчика программы (симулятора) отпадает, так как в MPLAB все это есть (и даже более того).

Установите MPLAB на свой компьютер, убедитесь, что она встала не "криво" и на время про нее забудьте, так как для того чтобы с ней работать, необходимо основательно подготовиться, чем в дальнейшем мы и будем заниматься.

Следующий шаг - сборка программатора , так как HEX-файл программы, созданный в MPLAB , необходимо "превратить" в машинные коды, которые и будут записываться в ПИК (так называемая "прошивка").

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

Информацию по сборке программатора PonyProg Вы найдете в " Приложении № 1" .

Следует учесть, что программатор PonyProg лучше всего работает на относительно "медленных" компьютерах старых выпусков, так как, в свое время, программа PonyProg создавалась под них.

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

Это вовсе не есть факт, но такое может быть.

Самое лучшее решение - применение для этих целей компьютера с тактовой частотой до 500мГц и операционной системы Windows95/98 .

Лично я сделал так: купил практически "за так" "древнюю старушку", обманул BIOS, пристегнув к родному винчестеру, "помощником", дополнительный винчестер на 8Гб, поставил Windows98 и включил "форсаж".

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

В моей "старушке" стоит почти на 2Гб подобного рода программ, в том числе и довольно-таки "навороченных", и ничего, прекрасно работает.

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

HEX - калькулятор: файл CALC32.rar прилагается (папка " Программы " ). Конвертер систем исчисления: файл BCONV32 прилагается (папка " Программы " ).

Они настолько просты, что Вы без труда разберетесь, зачем они нужны. Чаще всего требуется конвертер систем исчисления.

Один из активных участников работы, Петр Высочанский , разработал программу конвертера систем исчисления, которая наиболее адаптирована к практическим нуждам:

Конвертер систем исчисления Петра Высочанского: файл Hex-Dec_Bin.exe прилагается

(папка " Программы" )

При открытии, программа конвертера устанавливает английскую раскладку клавиатуры (то, что нужно).

Итак, все что необходимо для занятия программированием PIC контроллеров имеется. Пока, это не более чем красивые и интригующие "штучки" не вполне понятного предназначения.

Можно их на досуге рассмотреть, на что-нибудь понажимать, только, во избежание дальнейших недоразумений, не трогайте настроек по умолчанию.

Переходите к следующему разделу.

" Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: [email protected]

2. Что такое микроконтроллер, и как он работает

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

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

Иногда даже диву даешься: эта маленькая "штучка" заменяет целую "груду старого железа" (К555 и т.д.).

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

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

Проще всего его представить в виде банального калькулятора, кнопками которого управляет программа, написанная на языке ассемблер (то есть, программист).

Если вдуматься, то ничего особо сложного, в механизме управления такого рода калькулятором, нет.

И в самом деле, если нужно, например, сложить числа А и В , то в тексте программы сначала задаются константы А и В , а затем дается команда "сложить".

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

Если Вы туда "полезете", то "с ума сойдете", а микроконтроллер, по своей сути, есть тот же самый компьютер, но только простой.

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

Микроконтроллер можно представить себе как некий универсальный "набор" многофункциональных модулей (блоков), "рычаги управления" которыми находятся в руках программиста.

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

Вот здесь-то уже нужно знать, как "отче наше", каждую деталь и не жалеть на это "узнавание" времени.

Только таким образом пустую "болванку" (незапрограммированый ПИК) можно "заставить" выполнять какие-то "осмысленные" действия, результат большей части которых можно проверить в симуляторе MPLAB (об этом - позднее), даже не записывая программу в ПИК. Итак, необходим переход к "модульному" мышлению.

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

Давайте с ними разберемся и "разложим все по полочкам".

В качестве примера я буду использовать один из самых распространенных PIC контроллеров

PIC16F84A.

Он является как бы "проматерью" более сложных ПИКов, содержит минимальный "набор" модулей и как нельзя лучше подходит для первичного "въезда в м/контроллеры".

Энергонезависимая память.

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

То " место" энергонезависимой памяти, куда записывается программа, называется памятью программ .

Объем памяти программ может быть различен. Для PIC16F84A , он составляет 1024 слова . Это означает, что он предназначен для работы с программами, объем которых не превышает