Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_i_otvety_MPT.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.94 Mб
Скачать

Включение и выключение светодиода. Чтобы подать логическую единицу на вывод rb0 (для включения светодиода) необходимо в нулевой бит регистра portb записать 1:

bsf PORTB, 0 ;подать лог. 1 на вывод RB0

Для выключения – в нулевой бит записать 0:

bcf PORTB, 0 ;подать лог. 0 на вывод RB0

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

movlw 0x0F ;записать константу 0x0F в регистр W

movwf PORTB ;записать содержимое W в регистр PORTB

Таким образом, на выводах RB0-RB3 будет логическая единица, а на RB4-RB7 – логический ноль.

Опрос переключателя. Ниже приведен текст программы, которая по нажатию клавиши sa1 включает светодиод vd1, а при ее отпускании светодиод гаснет.

begin

btfss PORTA, 0 ;опрос состояния вывода RA0

goto vd1_on ;переход на включение светодиода

bcf PORTB, 0 ;выключить светодиод

goto BEGIN ;переход к началу опроса

vd1_on

bsf PORTB, 0 ;включить светодиод

goto begin ;переход к началу опроса

В программе команда btfss PORTA,0 производит опрос вывода RA0 и, если логическое состояние равно 1, переходит к команде выключения светодиода bcf PORTA, 0. Далее происходит возврат к опросу вывода. Когда логическое состояние поменяется на 0, произойдет переход на метку vd1_on. Команда bsf PORTB, 0 включит светодиод, а затем программа снова вернется к опросу вывода RA0.

Формирование временных задержек

Сформировать временную задержку можно двумя способами:

  1. программная задержка;

  2. с помощью внутреннего аппаратного таймера.

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

Процедура программного формирования временной задержки использует метод программных циклов. При этом в некоторый регистр общего назначения, например, Count1 загружается число (константа) L, которое в каждом проходе цикла уменьшается на 1. Процедура временной задержки обычно оформляется в виде подпрограммы, например, с именем delay (задержка), которая вызывается по мере надобности из основной программы командой call delay. Текст подпрограммы задержки:

delay

movlw .L ; загрузить константу L в рабочий регистр W

movwf Count1 ; переслать содержимое W в регистр-счетчик Count1

loop

decfsz Count1,F ; декремент регистра Count1, пропустить следующую команду,

; если (Count1) = 0

goto loop ; повторение цикла L раз

return

Определим время задержки. Для этого надо подсчитать, за сколько машинных циклов (МЦ) выполняется подпрограмма. Для исполнения каждого внутреннего программного цикла loop требуется 3 МЦ ( 1 МЦ на выполнение команды decfsz при ненулевом результате и 2 цикла на каждую команду goto). Выход из подпрограммы delay потребует 4-х МЦ (2 МЦ на исполнение команды decfsz при нулевом результате и 2 МЦ на команду return). По одному МЦ требуют команды movlw и movwf. И, наконец, 2 МЦ необходимы для выполнения команды call delay. Таким образом, общее количество машинных циклов

NМЦ = 2 + 1 + 1 + 3 (L – 1) + 4 = 5 + 3 L.

При тактовой частоте FOSC = 4 МГц частота машинного цикла FМЦ = FOSC/4 =1 МГц, а длительность машинного цикла равна ТМЦ = 1 мкс. Максимальная величина задержки при L = 255 будет tЗД.MAX = 770 мкс = 0,77 мс.

Для формирования больших задержек времени, лежащих в диапазоне долей и единиц секунд, используются вложенные циклы. Рассмотрим организацию подпрограммы задержки delay2 с двумя вложенными циклами. Для счета числа повторений циклов будем использовать два регистра-счетчика Count1 и Count2. Текст подпрограммы задержки:

delay2

movlw .L ; загрузка константы L в регистр W

movwf Count2 ; пересылка L в регистр-счетчик Count2 внешнего цикла

clrf Count1 ; сброс регистра-счетчика Count1 внутреннего цикла

loopd

decfsz Count1,F ; декремент Count1

goto loopd ; повторение цикла 256 раз

decfsz Count2,F ; декремент Count2

goto loopd ; повторение цикла L раз

return

Общее количество машинных циклов, включая вызов подпрограммы, равно

NМЦ = 5 + (3 256 + 4) L.

Максимальная задержка при FOSC = 4 МГц и L = 255 оставит около 200 мс.

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

Допустим, мы имеем подпрограмму с именем del20ms, обеспечивающей задержку на 20 мс, которая находится в файле del20ms.asm. Требуется получить задержку на время 500 мс. Очевидно, что нужно 25 раз вызывать подпрограмму del20ms, в качестве счетчика используем регистр Count3. Текст подпрограммы задержки на 500 мс:

del500ms

movlw .25

movwf Count3 ; загрузить в регистр Count3 число 25

cycle

call del20ms

decfsz Count3,F

goto cycle ; повторение цикла 25 раз

return

#include”del20ms.asm” ; подключить файл del20ms.asm

Рассмотрим программу, которая заставляет мигать светодиод VD1 при нажатии на клавишу SA1. Предположим, что после включения питания МК (его сброса) светодиод не горит. При нажатии на клавишу SB1(замыкании ее контакта) светодиод начинает мигать с частотой 1 Гц (период 1 с). При отжатии клавиши (размыкании ее контакта) светодиод гаснет. Для упрощения программы будем предполагать, что даже при кратковременном замыкании контакта клавиши светодиод будет гореть в течение 0,5 с. Текст программы МКУ может иметь следующий вид:

wait

btfsc PORTA,0 ; пропустить команду, если RA0 = 0

goto wait ; цикл ожидания нажатия клавиши

bsf PORTB,0 ; включить светодиод

call del500ms ; задержка на 0,5 с

bcf PORTB,0 ; выключить светодиод

call del500ms ; задержка на 0,5 с

goto wait ; зацикливание программы

#include”del500ms.asm” ; подключить файл del500ms.asm

29. Применение языка Си для разработки устройств на базе PIC-микроконтроллеров: структура программы, типы данных, переменные и константы, директивы препроцессора, операторы, функции и их прототипы, библиотечные функции языка C18 для PIC-контроллеров подсемейства PIC18.

На заре возникновения микропроцессоров, а затем и микроконтроллеров разработка программного обеспечения происходила исключительно на том или ином языке Ассемблер, ориентированного на конкретный тип МП или МК. По сути, такие языки представляют собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполняется транслятором. Главный недостаток языков Ассемблера является то, что каждый из них привязан к конкретному типу МК и логике его работы. Кроме того, Ассемблер сложен в освоении, что требует достаточно больших усилий в его изучении. Однако они оказываются потраченными впустую, если впоследствии потребуется перейти на использование микроконтроллеров других производителей.

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

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

  1. Глубокого знания системы команд не требуется. Элементарное знание архитектуры конкретного МК желательно.

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

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

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

В настоящее время документация языка Си закреплена в международном стандарте ANSI C. Фирма Microchip создала свой компилятор для языка Си для микроконтроллеров семейства PIC18, который получил название С18. Он является составляющей интегрированной среды разработки MPLAB IDE. Компилятор С18 поддерживает основные положения стандарта ANSI C, однако имеются некоторые различия, связанные с архитектурой PIC18.

Рассмотрим основные особенности программы на языке Си с использованием компилятора MPLAB C18. В качестве микроконтроллера выберем PIC18F242 с тремя портами ввода/вывода: PORTA, PORTB, PORTC. Программа будет просто увеличивать число на 1 и выводить его в порт В.

/*******************************************

primer1.c – пример программы на Си для PIC18.

****************************************************/

#include<p18f242.h>

#pragma config WDT = OFF, OSC = HS

unsigned char counter; // переменная counter – беззнаковое однобайтное целое число

void main(void) // здесь начинается главная программа

{

PORTB = 0; // очистить регистр данных порта В

TRISB = 0; // настроить все линии порта В на вывод

counter = 1; // инициализировать counter значением 1

while( 1 )

{

PORTB = counter; // поместить значение counter в порт В

counter = counter + 1; // увеличить counter

}

}

Рассмотрим основные составляющие программы на языке Си.

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

  • многострочные (начинаются с комбинации символов /* и заканчиваются символами */ );

  • однострочные (начинаются с комбинации символов // до конца строки).

Препроцессор. При транслировании программ на языке Си текст сначала обрабатывает специальная программа – препроцессор. Затем измененный препроцессором текст обрабатывается компилятором. Препроцессор обрабатывает так называемые директивы препроцессора, заменяя их текстом. Любая директива начинается со знака #. Первой директивой в рассмотренной программе является #include<p18f242.h>, которая вставляет содержимое заголовочного файла с именем p18f242.h. В нем содержатся определения и расположение всех регистров специальных функций микроконтроллера PIC18F242. В общем случае файлы с расширением *.h являются заголовочными файлами стандартных библиотек языка Си. Вторая директива в программе #pragma config определяет биты конфигурации МК. В данном случае она отключает сторожевой таймер, чтобы он не влиял на работу программы (WDT = OFF), и устанавливает тип генератора МК - высокочастотный кварцевый (OSC = HS).

Объявления переменных. Строка программы unsigned char counter; объявляет переменную counter как однобайтное целое число без знака. Компилятор по этой информации выделит для переменной counter одну ячейку в памяти данных (один регистр из области РОН).

Функция main. Программы на Си оформляются как функции. Каждая программа должна содержать, по крайней мере, одну функцию, называемую главной (по-английски main). Выполнение программы всегда начинается с главной функции, и программа находится внутри нее. В общем случае в функцию могут передаваться аргументы (параметры), функция может возвращать результат. Главной особенностью компилятора С18 является то, что в главную функцию main не передается никаких параметров и она не возвращает результата. Это обстоятельство указывается специальным словом void (пустой). Таким образом, формат главной функции всегда такой

void main( void )

{ // начало функции

…….. // тело функции

} // конец функции

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]