В двух предыдущих статьях на нашем сайте мы рассмотрели начало работы с микроконтроллером PIC и мигание светодиодом с его помощью в симуляторе Proteus. Программу для него мы разрабатывали в среде MPLABX. В этой же статье мы рассмотрим уже аппаратную реализацию проекта мигания светодиодом с помощью микроконтроллера PIC, собранную на перфорированной плате.
Мы загрузим программу в микроконтроллер PIC и проверим ее работу. Для программирования микроконтроллера PIC мы будем использовать MPLAB IPE.
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Программатор PicKit 3 (купить на AliExpress).
- Держатель микросхем на 40 контактов (купить на AliExpress).
- Кварцевый генератор на 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ – 2 шт. (купить на AliExpress).
- Конденсаторы 100 мкФ и 10 мкФ (купить на AliExpress).
- Резисторы 680 Ом, 10 кОм и 560 Ом (купить на AliExpress).
- Светодиод любого цвета (купить на AliExpress).
- Микросхема регулятора напряжения 7805 (купить на AliExpress).
- Набор для пайки.
- Перфорированная плата (Perf board) и соединительные провода.
- Адаптер питания на 12V.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что происходит при записи программы в микроконтроллер
Запись программ в современные микроконтроллеры и проверка их работы является обычным делом в мире современной электроники. Но что на самом деле происходит когда несколько строк программы на языке C записываются внутрь кремниевого чипа и начинают в нем выполняться?
Для понимания этих процессов вначале посмотрим на нашу программу.
Как видим, она написана на языке C и в таком виде она не может исполняться нашим микроконтроллером. Для того, чтобы наш микроконтроллер начал "понимать" эту программу, компилятор преобразует ее в формат, который могут "понимать" микроконтроллеры. Этот формат называется HEX кодом и файл с этим кодом будет сохраняться в наших проектах в каталоге:
1 |
**Your location**\Blink\Blink.X\dist\default\production\Blink.X.production.hex |
Если вам интересно что содержится в этом HEX файле откройте его с помощью notepad или любого другого аналогичного текстового редактора. Для нашей программы мигания светодиодом HEX файл будет содержать следующие строки:
1 2 3 4 5 6 7 8 9 |
:060000000A128A11FC2F18 :100FAA008316031386018312031386018312031324 :100FBA0086150D30F200AF30F100C130F000F00BB1 :100FCA00E42FF10BE42FF20BE42F0000831203133A :100FDA0086110D30F200AF30F100C130F000F00B95 :100FEA00F42FF10BF42FF20BF42F0000DB2F830107 :060FFA000A128A11D52F36 :02400E007A3FF7 :00000001FF |
Существует несколько путей анализа информации, содержащейся в HEX файле. Одним из них является обратное дизассемблирование, но данные вопросы уже находятся за пределами нашей статьи. Здесь вам необходимо запомнить тот факт, что HEX файл является "финальным" (выходным) кодом для нашего микроконтроллера и именно он используется MPLAB IPE для "прожига" микроконтроллера.
Флэш память
HEX код хранится в микроконтроллере в месте, называемом флэш памятью (Flash memory) и из нее он и исполняется. После компиляции нашей программы в MPLABX мы получим следующую информацию о типе памяти в выходном окне программы:
Поскольку мы имеем дело с простой программой мигания светодиодом, то, как видно из рисунка, мы заняли всего 0.5% доступной памяти программ и 1.4% доступной памяти данных.
У микроконтроллера PIC16F877 есть три типа памяти:
Память программ (Program Memory): в этой памяти хранятся программы когда мы записали их в микроконтроллер. Поскольку наша программа мигания светодиодом очень маленькая, то мы заняли всего 0.5% от общего объема этой памяти. Данные в этом типе памяти хранятся даже после отключения питания микроконтроллера.
Память данных (Data Memory): этот тип памяти называется оперативным запоминающим устройством (ОЗУ, RAM) и он содержит регистры специальных функций (Special Function Register, SFR) и регистры общего назначения (General Purpose Register, GPR), которые включают TRIS, PORT и т.д. Переменные, которые мы храним в памяти данных, стираются когда мы выключаем питание микроконтроллера. Любая переменная, которую мы объявляем в программе, будет храниться в памяти данных.
Энергонезависимая память EEPROM (Electrically Erasable Programmable Read-Only Memory): позволяет хранить значения переменных, которые мы используем в программе, даже после выключения питания микроконтроллера.
Внутрисхемное программирование ICSP
Мы будем программировать наш микроконтроллер PIC16F877A с помощью опции внутрисхемного программирования ICSP (In Circuit Serial Programming), доступного в нем. ICSP позволяет производить программирование микроконтроллера после того как он помещен на плату проекта и для этого не будет нужно специальной платы программирования – нам необходимо будет сделать всего 6 соединений с нашим программатором PicKit3, которые приведены в следующей таблице.
1 | VPP (or MCLRn) | вход в режим программирования |
2 | Vcc | Power: Pin 11 или 32 |
3 | GND | Ground: PIN 12 или 31 |
4 | PGD - Data | RB7. PIN40 |
5 | PGC - Clock | RB6. PIN 39 |
6 | PGM - LVP enable | RB3/RB4. Не обязателен |
Интерфейс ICSP доступен во всех микроконтроллерах PIC. Для его использования необходимо соединить 5 контактов (6-й контакт PGM не является обязательным) микроконтроллера с программатором Pickit3 как показано на следующих рисунках.
Схема проекта
Теперь, когда у нас готов HEX файл и мы знаем как подключить PicKit 3 к нашему микроконтроллеру PIC через разъем ICSP, можно приступать к сборке схемы нашего проекта. Схема проекта мигания светодиодом с помощью микроконтроллера PIC представлена на следующем рисунке.
В представленной схеме мы использовали регулятор напряжения 7805 для подачи стабилизированного напряжения питания на наш микроконтроллер PIC. На регулятор напряжения 7805 мы подаем питание с адаптера питания 12V. Горящий светодиод красного цвета будет свидетельствовать о том, что на микроконтроллер PIC подано питание. Коннектор J1 будет использоваться для внутрисистемного программирования ICSP.
На первый контакт микроконтроллера (MCLR) подается уровень high с помощью резистора 10 кОм – это будет предотвращать микроконтроллер от сброса. Для сброса микроконтроллера на контакт MCLR необходимо подать уровень Low – это можно сделать, добавив в схему переключатель.
Светодиод подключен к микроконтроллеру через токоограничивающий резистор 560 Ом. При правильно собранной схеме после загрузки программы в микроконтроллер светодиод должен начать мигать. Внешний вид собранной на перфорированной плате конструкции нашего проекта приведен в начале нашей статьи.
Загрузка кода программы в микроконтроллер PIC с помощью MPLAB IPE
Для этого выполните следующую последовательность шагов:
- Запустите MPLAB IPE.
- Подключите программатор PicKit 3 к вашему компьютеру и к контактам ICSP вашего микроконтроллера.
- В программе MPLAB IPE соединитесь с вашим микроконтроллером PIC нажав на кнопку connect.
- Откройте HEX файл программы мигания светодиодом и нажмите на Program.
Если все идет нормально, то в окне MPLAB IPE вы должны увидеть сообщение об успешной загрузке программы в микроконтроллер. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
// 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #define _XTAL_FREQ 20000000 //Specify the XTAL crystall FREQ void main() //The main function { TRISB=0X00; //Instruct the MCU that the PORTB pins are used as Output. PORTB=0X00; //Make all output of RB3 LOW while(1) //Get into the Infinie While loop { RB3=1; //LED ON __delay_ms(100); //Wait RB3=0; //LED OFF __delay_ms(100); //Wait //Repeat. } } |