
- •Основные понятия и определения микропроцессорной техники: микропроцессор, микропроцессорная система, микроконтроллер. Принципы построения микропроцессорных систем.
- •Архитектура микропроцессора: архитектура со сложной системой команд (cisc-процессоры), архитектура с упрощенной системой команд (risc-процессоры). Принстонская и гарвардская архитектуры.
- •3. Структура микропроцессорной системы и основные режимы ее работы – выполнение основной программы, обслуживание прерываний, прямой доступ к памяти.
- •4. Модуль процессора микропроцессорной системы. Состав модуля – операционный блок, блок управления, интерфейсный блок. Выполняемые функции.
- •5. Модуль памяти мпс. Выполняемые функции. Основные характеристики. Типы микросхем, применяемых для построения постоянной и оперативной памяти микропроцессорных систем.
- •6. Реализация обмена данными между внешними устройствами и микропроцессорной системой (мпс). Модуль ввода/вывода мпс, выполняемые функции, функциональная схема устройства ввода/вывода.
- •7. Понятие о системе команд микропроцессоров. Основные группы команд. Способы адресации операндов в микропроцессорах.
- •Форматы команд
- •Способы адресации операндов и команд
- •Адресация операндов
- •Адресация команд
- •Группы команд микропроцессора
- •8. Классификация и структура микроконтроллеров (мк). Процессорное ядро мк, его основные характеристики.
- •9. Типы памяти микроконтроллеров: память программ, память данных, регистры, внешняя память.
- •Память программ
- •Память данных
- •Регистры мк
- •Внешняя память
- •10. Порты ввода/вывода: назначение, основные типы. Таймеры микроконтроллеров: назначение, внутренняя структура.
- •Таймеры микроконтроллеров
- •12. Интерфейсы микропроцессорных систем, классификация и принципы построения
- •14. Последовательные асинхронные интерфейсы: rs-232, rs-422, rs-485, ирпс (интерфейс радиальный последовательный). Назначение, форматы передачи данных, основные технические характеристики.
- •15. Последовательные синхронные интерфейсы: spi (Synhronous Peripheral Interface), i2c (Inter Integrated Circuit). Назначение, форматы передачи данных, основные технические характеристики.
- •Интерфейсная шина i2c
- •16. Однокристальные микроконтроллеры семейства mcs-51: состав и общая характеристика. Структурная организация: регистры, память данных и программ.
- •17. Однокристальные микроконтроллеры семейства mcs-51: порты ввода/вывода, таймеры/счетчики, последовательный порт, система прерываний. Назначение, основные особенности.
- •18. Работа микроконтроллеров семейства mcs-51 в автономном режиме, способы подключения внешней памяти программ и данных.
- •21. Микроконтроллеры подсемейства pic18: общая характеристика, особенности архитектуры и системы команд.
- •Организация памяти
- •Система прерывания
- •Порты ввода/вывода
- •Генератор тактовых импульсов
- •Система команд pic18
- •Основные этапы разработки микроконтроллерных систем
- •Разработка и автономная отладка аппаратных средств мкс
- •Разработка и отладка программного обеспечения
- •23. Язык Ассемблер для микроконтроллеров семейства mcs-51: назначение, структура полей предложений на языке Ассемблер, директивы Ассемблера.
- •Поля предложения на языке Ассемблер
- •Примеры
- •Директивы Ассемблера
- •Метка Операция Операнды Комментарий
- •Метка Операция Операнды Комментарий
- •Опрос двоичного датчика
- •Ожидание события
- •Формирование временной задержки
- •Формирование управляющих сигналов из мк
- •Защита от дребезга контактов
- •25. Методы ввода информации с клавиатуры для микроконтроллеров семейства mcs-51: виды клавиатур, схема подключения контактов клавиатур к микроконтроллеру, методы опроса клавиатуры.
- •Описание микроконтроллерного устройства
- •Создание исходного файла базовой программы
- •Включение и выключение светодиода. Чтобы подать логическую единицу на вывод rb0 (для включения светодиода) необходимо в нулевой бит регистра portb записать 1:
- •Опрос переключателя. Ниже приведен текст программы, которая по нажатию клавиши sa1 включает светодиод vd1, а при ее отпускании светодиод гаснет.
- •Представление информации в языке Си
- •Операции и выражения в Си
- •Операторы управления вычислительным процессом
- •Функции
Включение и выключение светодиода. Чтобы подать логическую единицу на вывод 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.
Формирование временных задержек
Сформировать временную задержку можно двумя способами:
программная задержка;
с помощью внутреннего аппаратного таймера.
Недостатком первого способа является невозможность выполнения основного цикла программы, пока не будет закончена процедура задержки. При использовании второго варианта необходимо задействовать один из внутренних аппаратных таймеров.
Процедура программного формирования временной задержки использует метод программных циклов. При этом в некоторый регистр общего назначения, например, 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.
На заре возникновения микропроцессоров, а затем и микроконтроллеров разработка программного обеспечения происходила исключительно на том или ином языке Ассемблер, ориентированного на конкретный тип МП или МК. По сути, такие языки представляют собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполняется транслятором. Главный недостаток языков Ассемблера является то, что каждый из них привязан к конкретному типу МК и логике его работы. Кроме того, Ассемблер сложен в освоении, что требует достаточно больших усилий в его изучении. Однако они оказываются потраченными впустую, если впоследствии потребуется перейти на использование микроконтроллеров других производителей.
Язык Си, являясь языком высокого уровня, лишен подобных недостатков и может использоваться для программирования любого МК, для которого есть компилятор с языка Си.
Язык Си - это универсальный язык программирования, который обеспечивает эффективность программного кода, имеет элементы структурного программирования и богатый набор операторов. Использование языка Си имеет следующие преимущества над программированием на Ассемблере.
Глубокого знания системы команд не требуется. Элементарное знание архитектуры конкретного МК желательно.
Лучшая читаемость программы. Используются слова и выражения, которые более свойственны человеческой мысли.
Библиотечные файлы содержат много стандартных подпрограмм, которые могут быть включены в основную программу.
Изучив язык Си, можно легко переходить от одного семейства МК к другому, тратя гораздо меньше времени на разработку программ.
В настоящее время документация языка Си закреплена в международном стандарте 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 )
{ // начало функции
…….. // тело функции
} // конец функции