В предыдущем уроке мы освоили работу с AVR-микроконтроллером ATmega8. Этот урок посвящен любителям PIC-микроконтроллеров, если вы работаете с AVR, то можете пропустить этот урок.
На этом уроке мы начнём осваивать работу с МК PIC16F876A. Номера выводов определим согласно даташиту. Номера выводов определим согласно даташиту. Будем подключать МК к программатору согласно этому рисунку
Для прошивки к микроконтроллеру подключают 5 линий:
- Vpp – напряжения программирования;
- Vdd – напряжение питания +5 вольт;
- Vss – общая линия (минус питания);
- PGD – линия данных;
- PGC – линия тактирования.
Подпаиваем провода к панельке для проверки. Получается как-то так…
Ну а теперь эти страшные фьюзы… В нашем МК их нет! А вместо них директива __CONFIG.
- FOSC – тактовый генератор;
- WDTE – сторожевой таймер;
- PWRTE – таймер включения питания;
- CP – защита кода программы;
- BOREN – сброс по снижению напряжения питания;
- LVP – низкоуровневое программирование;
- CPD – защита данных EEPROM;
- WRT – защита от записи памяти программ.
Первая программа
Программу для нашего МК мы будем писать в MPLAB X IDE v1.95. Запускаем MPLAB X IDE. Создаём новый проект File->New Project…
Выбираем тип процессора, язык программирования, жмём далее. В результате мастер создания проектов, выдаёт шаблон кода:
#include < stdio.h >
#include < stdlib.h >
int main(int argc, char** argv)
{
return (EXIT_SUCCESS);
}
Для проверки работоспособности МК напишем программу, которая будет изменять состояние седьмой линии порта PORTB каждые две секунды.
Указываем программе, с какой частотой работает тактовый генератор…
#define F_CPU 20000000UL // Указываем тактовую частоту процессора
Выбираем порт PORTB, используем линию PB7 которая соединена с 28-ым выводом микросхемы.
Первым делом настроим эту линию на вывод. Для настройки направления данных используется регистр TRISx, где х – это имя порта. В нашем случае регистр будет называться TRISB.
PORTBbits.RB7 = 1; // Устанавливаем линию порта в высокое состояние
Собираем всё вместе.
#define _XTAL_FREQ 20000000 //Указываем тактовую частоту процессора
#include < htc.h > //Содержит в себе макроопределения, в частности __CONFIG
//#include < stdio.h >
//#include < stdlib.h >
#include < pic16f876a.h > //Файл определения имён регистров, портов…
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF);
int main(void) //Основная процедура программы…
{
TRISBbits.TRISB7 = 0; //Настраиваем линию порта PORTB7 на вывод!
while(1) //Бесконечный цикл
{
PORTBbits.RB7 = 1; //Устанавливаем линию порта в высокое состояние
__delay_ms(2000); //Ждём 2-е секунды
PORTBbits.RB7 = 0; //Устанавливаем линию порта в низкое состояние
__delay_ms(2000); //Ждём 2-е секунды
}
//return (EXIT_SUCCESS);
}
Чтобы установить вывод порта PB7 в низкое состояние, нам необходимо в бит PB7 порта PORTB записать ноль. Для этого применяют следующую конструкцию:
PORTBbits.RB7 = 0; //Устанавливаем линию порта в низкое состояние
Остаётся скомпилировать проект и прошить контроллер файлом с расширением .hex, который лежит по адресу диск:<имя проекта>distdefaultproduction.
Работоспособность программы проверяется вольтметром, подключённым к линии PB7 порта PORTB. Наблюдают изменение потенциала линии PB7 раз в две секунды.
Кто хочет идти «в ногу» с автором курса — создавайте свои дневники на форуме и выкладывайте что у вас получается и какие вопросы возникают при этом.