.
Вот мы и подошли к написанию программы. Сейчас не нужно вникать в тонкости и пытаться разобраться во всем. Просто принять как должное. Мы не раз будем в процессе написания программ возвращаться к той и иной части пройденного материала, в том числе и с добавлением новой информации, при этом более "глубже" ее рассматривая. По мнению многих программистов, такой способ падания материала лучше запоминается и усваивается.
Открываем проект созданный нами в предыдущей главе. И вот вам первая, пусть и не значительная тонкость .... не нужно пытаться открывать Fail->Open или закладкой "Open fail" в этом случае откроете файл редактора, а нужно открыть проект. Открыть его нужно закладкой Project->Open ->наш файл проекта, как показано ниже на рисунке.
Окно текстового редактора у нас пустое. Копируем в него текст программы предоставленный ниже.
list p=18F252 ; Используется микроконтроллер PIC18F252. #include p18F252.inc ; Подключение INC-файла PIC18F252. ;************************************************************************************* ; Конфигурирование. ;*************************************************************************************** CONFIG OSC=XT ; кварц.резонатор CONFIG BOR=OFF ; Сброс по снижению питания выключен CONFIG WDT=OFF ; WDT выключен. CONFIG LVP=OFF ; Режим низковольтного программирования выкл. ;************************************ ; Присвоение ;************************************ #define led_1 LATB,1 ; ;************************************ ; Регистры общ. назначения ;************************************ cblock 20h ; Reg_1 ; Reg_2 ; Reg_3 ; endc ; ;******************************************************************* org 0 ; goto START ; ;************************************ ; инициализация ;************************************ START movlw b'00000000'; movwf TRISB ; Конфигурирование порта ;=================================================================== ; Начало программы. ;=================================================================== Povtor bsf led_1 ; включаем светодиод call Pause_1 ; ждем одну секунду bcf led_1 ; выключаем светодиод call Pause_1 ; ждем одну секунду goto Povtor ; зацикливаем программу. ;************************************ ; Пауза 1 секунда ;************************************ Pause_1 movlw .173 movwf Reg_1 movlw .19 movwf Reg_2 movlw .6 movwf Reg_3 decfsz Reg_1 bra $-2 decfsz Reg_2 bra $-6 decfsz Reg_3 bra $-.10 return ;************************************* end
Как Вы наверно и догадались, написание программ в МПЛАБе, подразумевает под собой определенный порядок написания программ или можно сказать правила. В чем они заключаются ? Давайте разберем на примере нашей программы.
list p=18F252 ; Используется микроконтроллер PIC18F252.
То что написано после «;» это комментарии, которые нужно нам для понятия алгоритма программы. К ним нужно относится серьезно, т.к. на ассемблере программа может быть большой и по прошествии даже небольшого времени можно забыть для чего та или иная команда и подпрограмма нужна. Хотя сами комментарии, в конечном итоге, ни на что не влияют. Вернемся к разбору программы.
– это директива, с помощью которой в данной программе мы объявляем о том, что в программе будет использоваться микроконтроллер PIC18F252.
#include p18F252.inc ; Подключение INC-файла PIC18F252.
– это то же директива , с помощью которой загружаются внешние файлы и во время ассемблирования программы транслируются в нее. Если открыть папку, в которой установлен MPLAB IDI (если программу устанавливали по умалчиванию, то это C:\Program Files\Microchip\MPASM Suite ) в папке MPASM Suite можно посмотреть наш *INC файлы различных микроконтроллеров, в том числе и наш p18F252.inc файл. Таким способом можно разбивать программу на подподграммы (ПП) и подключать их в виде *INC файлов, тем самым добиваясь читаемости и удобства работы при ее написании . Позже мы рассмотрим как это сделать.
CONFIG OSC=XT ; кварц.резонатор
- еще одна директива препроцессора, позволяющая настраивать набор специальных опций и свойств, характеризующих работу микроконтроллера. К примеру выше указанная директива настраивает кварцевый резонатор на работу микроконтроллера в режиме XT. В различных МК они могут быть разные. Очень удобно открыть файл .INC определенного микроконтроллера и посмотреть его конфиги .
#define led_1 LATB,1 ;
- Здесь все просто, присваиваем определенной строке (Led_1) другое определение (LATB,1) . Это очень удобно, т.к. не надо переписывать во всей программе, а достаточно переопределить с помощью данной директивы.
cblock 20h ; Reg_1 ; Reg_2 ; Reg_3 ; endc ;
- данная директива позволяет для нескольких переменных (группы) присвоить адреса в области оперативной памяти программ. 20h - это адрес первой переменной. Заканчивается блок переменных ENDC. В данном случае переменные Reg_1, Reg_2, Reg_3 будут присвоены адреса 20h,21h,22h соответственно.
org 0 ;
- директива, определяющая в какую область памяти программ (помните мы с Вами изучали структуру памяти типичного микроконтроллера?) ,будет записано следующее слово программного кода, в нашем случае запись начнется с адреса 00h памяти программ.
;************************************
; инициализация
;************************************
START movlw b'00000000';
movwf TRISB ; Конфигурирование порта
Практически это начало программы. Под инициализацией понимается настройка портов, таймеров и различных встроенных модулей и т.д... Здесь, в этой программе, мы настраиваем только работу порта "В", ведь как Вы помните, порты у микроконтроллера могут работать как на вход, так и на выход. Нам, в этой программе, для работы светодиода (а программа управляет светодиодом , подключенным к порту "В" "1") необходимо настроить только этот порт, остальные порты нам здесь пока не нужны и соответственно рассматривать их пока не будем. Порт можно настроить частично на вход и выход, т.е. каждый «пин» (бит порта) при записи в него «1» работает на вход, при «0» на выход. И так мы записываем число "0" в специальный регистр TRISB (в двоичной системе число пишется так b’xxxxxxxx’, что удобно при настройке портов.) , тем самым настраиваем "В" на выход.
movlw, movwf это команды ассемблера микроконтроллера. О них чуть позже.
;===================================================================
; Начало программы.
;===================================================================
Povtor bsf led_1 ; включаем светодиод
call Pause_1 ; ждем одну секунду
bcf led_1 ; выключаем светодиод
call Pause_1 ; ждем одну секунду
goto Povtor ; зацикливаем программу.
И наконец, мы подошли к самой программе. Программа исполняется по заданному алгоритму, придуманному программистом, т.е. Вами. Что Вы напишете ей делать то она и будет исполнять. Алгоритм нашей программы следующий:
Как Вы поняли, программа будет "моргать" светодиодом, подключенный к порту "В" бит "1", с периодом 1 секунда. Микроконтроллер ни когда не останавливается, он "вкалывает" без остановки. Соответственно для того, что бы создать паузу (как здесь в примере) необходимо "заставить" микроконтроллер делать какие то действия, не связанные с непосредственной задачей. На время, необходимое нам для задержки.
Разобравшись со структурой программы попробуем ее ассемблировать (компилировать), т.е. попробуем написанную нами программу на языке ассемблер "преобразовать" в программу на машинном языке. Или по-простому создадим "прошивку" для микроконтроллера (HEX-файл).
Опять же, пока не будем вникать в детали, а просто нажимаем кнопку "Make".
Или выбираем в закладке Project -> Make.
Если в процессе написания программы ошибок не было, то в окне "Output", в последней строке, увидим сообщение безошибочного компилирования "BUILD SUCCEEDED".
Если в программе будет обнаружены ошибки(а), то в окне "Output" будут выведен список ошибок(и) , с сообщением в последней строке "BUILD FAILED".
Для примера я закомментировал строку (поставил ";")
;Reg_1 ;
Если щелкнуть (двойной щелчок мышкой ) на ошибку в сообщении нам откроется место в программе с указанием этой ошибки. При чем хотя ( как в данном случае) ошибка в программе может быть одна, тем не менее в сообщении может быть несколько ошибок, верней столько -сколько раз она повторяется в программе.
Урок № 2 по теме...
Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2021 © ChipMK.ru
![]() |
|