Пишем первую программу.

Автор: Super User Просмотров: 3602

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

Открываем проект созданный нами в предыдущей главе. И вот вам первая, пусть и не значительная тонкость .... не нужно пытаться открывать Fail->Open или закладкой "Open fail" в этом случае откроете файл редактора, а нужно открыть проект. Открыть его нужно закладкой Project->Open ->наш файл проекта, как показано ниже на рисунке.

 

alt

 

Окно текстового редактора у нас пустое. Копируем в него текст программы предоставленный ниже.

 

alt

 
            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 секунду.
  • переходим на начало программы .(вечный цикл) .

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

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

Опять же, пока не будем вникать в детали, а просто нажимаем кнопку "Make".

 

alt

 

Или выбираем в закладке Project -> Make.

 

alt

 

Если в процессе написания программы ошибок не было, то в окне  "Output", в последней строке,  увидим сообщение безошибочного компилирования "BUILD SUCCEEDED".

 

alt

 

Если в программе будет обнаружены ошибки(а), то  в окне  "Output" будут выведен список ошибок(и) , с сообщением в последней строке  "BUILD FAILED".

Для примера я закомментировал  строку (поставил ";")

;Reg_1                  ; 

alt

 

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

 

alt

 

Урок № 2 по теме...

 


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru