- •Микропроцессорные системы
- •Введение
- •Проектирование микропроцессорных систем
- •Понятие системы
- •Цикл проектирования системы
- •Задание на курсовой проект
- •Содержание и оформление курсового проекта
- •Защита курсовых проектов
- •Требования пользователей и функциональная спецификация
- •Проектирование системы
- •Проектирование аппаратных средств микропроцессорного устройства
- •Типовая структура мпу
- •Система питания мпу
- •Питание от аккумуляторов
- •Комбинированный источник питания
- •Расчет потребляемой мощности
- •Модуль сброса и синхронизации
- •Расчет схемы сброса и синхронизации
- •Организация памяти микроэвм
- •Блок связи с оператором (пульт управления)
- •Подключение клавиатуры
- •Подключение индикатора
- •Расчет пульта оператора
- •Организация ввода данных
- •Ввод аналоговой информации
- •Расчет входных схем
- •Ввод цифровой и дискретной информации
- •Организация вывода данных
- •Цифровые выходы
- •Аналоговые выходы
- •Управление силовыми цепями
- •Стандартные последовательные интерфейсы
- •Гальваническая развязка
- •Выбор микроконтроллера
- •Проектирование программных средств микропроцессорных устройств
- •Технология разработки программного обеспечения
- •Технология задачи/состояния
- •Взаимодействие между задачами
- •Программная реализация типовых модулей мпу
- •Сопряжение с клавиатурой
- •Сопряжение с жки-модулем
- •Сопряжение с памятью по интерфейсу i2c
- •Сопряжение с последовательным асинхронным интерфейсом
- •Сопряжение с датчиком температуры
- •Пример проектирования микропроцессорного устройства
- •Требования пользователя и построение функциональной спецификации
- •Проектирование системы
- •Проектирование аппаратной части устройства
- •Проектирование программной части
- •Void init(void) // инициализация контроллера
- •Варианты заданий
- •Приложение а
- •1. Основание для разработки
- •2. Назначение разработки
- •3. Требования к разработке
- •3.1Требования к функциональным характеристикам
- •3.2Требования к надежности
- •3.3 Требования к условиям эксплуатации
- •3.4 Требования к составу и параметрам технических средств
- •3.5. Требования к программной и информационной совместимости
- •Приложение в
- •Приложение г
- •Библиографический список
Сопряжение с жки-модулем
Наиболее распространенными являются ЖКИ-модули на базе контроллера HD44780. Модуль может принимать команды, управляющие режимами его работы, а также принимать коды выводимых на экран символов в стандартной кодировке ASCII. В свою очередь, ЖКИ может выдавать информацию о своем состоянии и данные из своих внутренних блоков памяти по запросу от управляющего устройства.
Рис. 5.13. Запись данных в ЖКИ
Назначение выводов ЖКИ-модуля:
VDD– питание +5B;VSS– земля (0B);
V0– напряжение смещения, управляющее контрастностью;
RS – вход, высокий уровень - данные; низкий –команды;
R/W – вход, высокий - чтение, низкий –запись;
E – вход, строб, сопровождающий сигналы на шине "команды/данные";
DB0…DB7 - шина "команды/данные".
На рис.5.13 изображены временные диаграммы сигналов RS, R/W, E при записи команд/данных в контроллер ЖКИ.
При помощи сигнала на линии RS микропроцессор сообщает контроллеру индикатора о том, что именно передается по шине: команда или данные. Сигнал на линии Е является стробом, сопровождающим сигналы на шине "команды/данные". Запись информации в ЖКИ происходит по спаду этого сигнала. Потенциал на управляющем выводе R/W задает направление передачи данных: запись в RAM индикатора (R/W=0) или считывание оттуда (R/W=1).
Контроллеру ЖКИ после приема байта команды или байта данных требуется некоторое время для обработки полученной информации, в течение которого управляющее устройство не должно выполнять новых передач. Для того чтобы определить, когда контроллер ЖКИ закончит свои внутренние операции, управляющее устройство может опрашивать флаг индикатора – BUSY (команда "чтение busy-флага"), который сбросится только тогда, когда контроллер ЖКИ освободится. Второй, более простой способ заключается в том, что управляющее устройство, зная, сколько времени требуется ЖКИ на обработку той или иной команды, просто выполняет временную задержку после каждой передачи информации. Если во время цикла записи управляющее устройство передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если управляющее устройство передает в контроллер ЖКИ данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек. Для однострочного индикатора адреса ячеек от 0 до 3Fh, для двухстрочного – от 0 до 27h(40 ячеек первой строки) и от 40hдо 67h(40 ячеек второй строки) (рис.5.14). При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор.
Система команд ЖКИ-модуля:
К1 - очистить дисплей и установить курсор в нулевую позицию (адрес 0);
К2 - установить курсор в нулевую позицию (адрес 0). Установить окно дисплея относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется;
К3 - установить направление сдвига курсора вправо (I/D=1) или влево (I/D=0) при записи/чтении очередного кода в DDRAM. Разрешить (S=1) сдвиг окна дисплея (сдвиг вместе со сдвигом курсора;
К4 – включить (D=1) или выключить (D=0) дисплей. Зажечь (C=1) или погасить (C=0) курсор. Изображение курсора сделать мигающим (B=1);
К5 - переместить курсор (S/C=0) или сдвинуть окно дисплея (S/C=1) вправо (R/L=1) или влево(R/L=0);
К6 - Установить разрядность шины данных 4 бита (DL=0) или 8 бит (DL=1), количество строк дисплея - одна (N=0) или две (N=1), шрифт - 5х7 точек (F=0) или 5х10 точек (F=1);
К7 - установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM;
К8 - установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM;
К9 - чтение состояния busy-флага (BF) и счетчика адреса;
К10 - запись данных в DDRAM или CGRAM;
К11 - чтение данных из DDRAM или CGRAM.
Рис. 5.14. Отображение на дисплее символов, ASCII-коды которых записаны в DDRAM:
а - однострочный ЖКИ (80 ячеек в кольцевом буфере, адреса ячеек с 0 по 3Fh),
б - двухстрочный ЖКИ (два кольцевых буфера по 40 ячеек, адреса соотвественно с 0 по 27h и с 40h по 67h)
В табл.5.1 приведено состояние сигналов, подаваемых на индикатор для задания соответствующей команды.
Таблица 5.1
Код |
Описание команды | |||||||||
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 | |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
К1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
К2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
К3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
К4 |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
К5 |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
К6 |
0 |
0 |
0 |
1 |
ACG |
К7 | |||||
0 |
0 |
1 |
ADD |
К8 | ||||||
0 |
1 |
BF |
AC |
К9 | ||||||
1 |
0 |
Данные |
.К10 | |||||||
1 |
1 |
Данные |
К11 |
Примечание.
DDRAM- Display data RAM - ОЗУ ASCII-кодов, отображаемых символов;
CGRAM-Сharacter generator RAM - ОЗУ знакогенератора;
* - безразлично.
Буфер данных имеет больше ячеек, чем число знакомест дисплея. Смещая окно индикатора относительно буфера данных (см. систему команд), можно отображать на дисплее различные области буфера. У двухстрочных индикаторов первые 40 ячеек буфера данных обычно отображаются на верхней строке дисплея, а вторые 40 ячеек - на нижней строке. Сдвиг окна дисплея относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда на отображение курсора). Кроме DDRAM, контроллер ЖКИ содержит еще один блок памяти - знакогенератор. Его "прошивка", то есть соответствие ASCII-кодов начертанию символов, обычно имеется в описании индикатора. Знакогенератор состоит из двух частей. Основная его часть представляет собой ПЗУ (CGROM) и ее, следовательно, нельзя изменить. Вторая часть, в которой задаются начертания символов для первых 16-ти кодов таблицы знакогенератора, представляет собой перепрограммируемое ОЗУ (CGRAM). Имеется возможность задать начертание 8 символов.
Рассмотрим сопряжение ЖКИ-модуля, построенного на базе контроллера HD44780, с микроконтроллером MCS-51.
ЖКИ-модуль может быть подключен как блок внешней памяти данных, при этом обращение к нему будет осуществляться командами чтения-записи данных во внешнюю память, а сигналы управления модулем должны формироваться из сигналов WR/ (черта означает инверсию) и RD/ микроконтроллера.
Другой вариант подключения модуля – управление им через порты ввода/вывода микроконтроллера. В этом случае схемотехника подключения упрощается, зато программа управления модулем становиться более сложной (надо формировать все сигналы программно).
На рис.5.15 приведен вариант подключения модуля в качестве внешней памяти данных через 16-контактный разъем ХР1. Напряжение смещения, управляющее контрастностью дисплея, регулируется резистором R1 через вывод 4 разъема. Стробирующий сигнал Е формируется из сигналов RW/ и RD/ микроконтроллера. Так как сигнал Е является инверсным по отношению к сигналам RW/ и RD/, то для его формирования использован инвертор.
Сигнал Е вырабатывается всякий раз при обращении к внешней памяти данных, при этом управляющий сигнал RS (команда/данные) соответствует разряду адреса А8 внешней памяти (снимается с порта Р20 MCS-51), а сигнал R/W (на схеме обозначен R_W) – разряду адреса А9 (снимается с порта Р21).
Таким образом, запись команды в ЖКИ-модуль будет осуществляться каждый раз при записи микроконтроллером данных во внешнюю память по адресу 0000h, запись данных в ЖКИ – при записи по адресу 0100h, чтение регистра состояния ЖКИ – при чтении данных по адресу 0200h, чтение регистра данных модуля – при чтении данных микроконтроллером по адресу 0300h. Шина "команды/данные"DB0…DB7 формируется шиной данных микроконтроллера D0…D7 (порт Р0).
Рассмотрим только процедуры работы с индикатором без привязки к структуре задач/состояний.
Список процедур обслуживания индикатора может быть следующим:
– инициализация индикатора;
– посылка команды управления индикатору;
Рис.5.15. Включение ЖКИ как блока внешней памяти
– вывод символа на индикатор;
– вывод строки символов на индикатор.
Процедура инициализации определяет последовательность включения индикатора в соответствии с ТУ на него, а также режим работы индикатора: количество строк, вид маркера и т.д.
Процедура посылки команды управления индикатору позволяет изменять режим его работы, коды команд приведены в таб.5.1.
Процедуры вывода символа и строки символов на индикатор отображают на нем соответствующую информацию. Символы пересылаются индикатору в соответствии с требуемой кодировкой.
Ниже приведены следующие процедуры обслуживания индикатора:
DISPInit() – инициализация в соответствии с ТУ на индикатор и задание его характеристик.
WriteData(Dat) – вывод символа на дисплей, Dat – символ в альтернативной кодировке ASCII.
WriteComm(Cmd) – посылка команды индикатору, Cmd – код команды в соответствии с таб.5.1.
В данном модуле не приведены процедура задержки Write(int N) и процедура вывода строки символов. Процедура задержки может быть реализована, например, при помощи цикла. Параметр цикла N будет определять величину задержки. Минимальная задержка в приведенном примере равна 100мкс. Вывод строки можно осуществить путем циклического вызова процедуры WriteData(Dat).
Процедура инициализации может быть построена более гибкой, чем в приведенном примере, а именно – с передачей параметров, устанавливающих начальный режим работы индикатора.
/*** Модуль обслуживания индикатора 2х16 (две строки по 16 символов) DATA IMAGE в области внешней памяти ***/
#include <io51.h>
#define DispBASE 0x010000 /* 1 - указание компилятору на расположение
индикатора во внешней памяти данных,
DispBASE его базовый адрес =0000 */
#define ReadStateAddr (*(char *) (DispBASE+0x800)) /*адрес регистра состояния=0200h*/
#define WriteCommAddr (*(char *) (DispBASE+0x000)) /* адрес регистра команд =0000h*/
#define ReadDataAddr (*(char *) (DispBASE+0xC00)) /* адрес регистра данных по
чтению =0300h*/
#define WriteDataAddr (*(char *) (DispBASE+0x400)) /* адрес регистра данных по
записи =0100h*/
char DispPos; /* переменная - текущая позиция маркера*/
/* Ожидание готовности дисплея */
void WaitReady(void)
{
while (ReadStateAddr & 0x80); /* Ожидать сброса бита занятости */
}
/* Запись команды в дисплей */
void WriteComm(char Cmd)
{
WaitReady();
WriteCommAddr = Cmd; /* Запись команды */
}
/* Запись данных */
void WriteData(char Dat) /* Dat - выводимый символ в коде ASCII */
{
if (Dat>0x7F) /* Вторая половина ASCII таблицы ? */
Dat = Table[Dat & 0x7F]; /* Перекодировать через таблицу */
WaitReady(); /* Ожидать готовности */
WriteDataAddr = Dat; /* Вывести символ на экран */
DispPos++; DispPos &= 0x1F; /* Коррекция положения курсора –
диапазон его значений 0…31, т.е. переход из 31 позиции в 0
0…15 – первая строка, 16…31 – вторая строка */
WriteComm(((DispPos & 0x10)<<2)|0x80); /* Команда перевода курсора в другую
строку, если его позиция 16 */
}
/* инициализация дисплея */
void DISPInit(void)
{
Write(160); /* Ожидание более 16мс – в соответствии с ТУ на индик.*/
WriteCommAddr = 0x30; /* Сброс – в соответст. с ТУ на индикатор */
Write(40); /* Ожидание более 4мс – в соответст. с ТУ на индикатор*/
WriteCommAddr = 0x30; /* Сброс – в соответствии с ТУ на индикатор */
Write(1); /* Ожидание более 100мкс – в соответст. с ТУ на индик.*/
WriteCommAddr = 0x30; /* Сброс – в соответствии с ТУ на индикатор */
WriteComm(0x38); /*Инициализация на 2 строки и 8 бит данных*/
WriteComm(0x08); /* Спрятать курсор */
WriteComm(0x01); /* Очистить дисплей */
WriteComm(0x06); /*Инкремент положения курсора, без сдвига*/
WriteComm(0x0C); /* Включить дисплей */
WriteComm(0x01); /* Очистить дисплей */
}
/*Таблица перекодировки выводимых символов из второй половины таблицы (код>0x7F) ASCII в кодировку дисплея, позволяет выводить русские символы*/
code const char Table[128] =
(0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4, /* код 80h, для букв А, Б, В, …,Ж*/
0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB, /* 90 */
0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1,
0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7, /* A0 */
0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0x6E,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, /* B0 */
0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, /* C0 */
0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, /* D0 */
0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0, /* E0 */
0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
0xA2,0xB5,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, /* F0 */
0xEA,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF);