.4 Жидкокристаллический индикатор
WH1602B-NGK-CP
ЖКИ в контроллере SDK-1.1
подключен не напрямую к микроконтроллеру ADuC812, а через расширитель портов
ввода-вывода, выполненный на базе ПЛИС. В ЖКИ есть специальный контроллер,
формирующий необходимые напряжения на входах матрицы и осуществляющий
динамическую индикацию. Для работы с этим контроллером реализован простейший
интерфейс, описанный на рисунке 10.
Рисунок 10. Схема электрическая принципиальная ЖКИ
ЖКИ работает в текстовом режиме (2 строки по 16 символов), имеет подсветку (цвет желто-зеленый). Основные характеристики:
• Габариты: 80x36x13.2 мм.
• Активная область 56.21x11.5 мм.
• Размеры точки 0.56x0.66 мм; размеры символа 2.96x5.56 мм.
• Встроенный набор 256 символов (ASCII + кириллица).
• Генератор символов с
энергозависимой памятью на 8 пользовательских символов.
Рисунок 11 - Схема подключения контроллера ЖКИ к
МК ADuC812
Таблица 5.
|
Обозначение |
Описание |
|
RS |
Переключение между регистрами команд и данных: 1 - данные, 0 - команды |
|
R/W |
1- чтение (из контроллера ЖКИ), 0 - запись (в контроллер ЖКИ) |
|
E |
Разрешающий сигнал (1 - активный уровень). Если сигнал E = 0, то контроллер ЖКИ игнорирует все остальные сигналы |
|
DB0 |
Бит данных 0 |
|
DB1 |
Бит данных 1 |
|
DB2 |
Бит данных 2 |
|
DB3 |
Бит данных 3 |
|
DB4 |
Бит данных 4 |
|
DB5 |
Бит данных 5 |
|
DB6 |
Бит данных 6 |
|
DB7 |
Бит данных 7 |
4.5 Часы реального времени PCF8583P
- часы/календарь с памятью объемом 256 байт,
работающие от кварцевого резонатора с частотой 32.768 кГц. Питание
осуществляется ионистором (0.1 ф). Из 256 байт памяти собственно часами
используются только первые 16 (8 постоянно обновляемых регистров-защелок на
установку/чтение даты/времени и 8 на будильник), остальные 240 байт доступны
для хранения данных пользователя. Точность измерения времени - до сотых долей
секунды. Взаимодействие с процессором осуществляется через интерфейс I2C.
Рисунок 12. Схема электрическая принципиальная PCF8583P
.6 ПЛИС PM3064ATC100
ПЛИС - программируемая логическая интегральная схема. Некоторые устройства стенда подключены к микроконтроллеру через периферийный расширитель портов ввода-вывода, реализованный на базе ПЛИС небольшой емкости, перепрограммируемой через имеемый в SDK-1.1 JTAG-порт, что дает возможность изменять механизмы работы с этими устройствами.
К ПЛИС подключены: клавиатура, ЖКИ, линейка светодиодов, звуковой излучатель, 16 дискретных портов ввода-вывода.
Рисунок 13. ПЛИС PM3064ATC100
ПЛИС имеет в своем составе 8
регистров.
Таблица 6. Перечень регистров ПЛИС
|
Адрес |
Регистр |
Доступ |
Назначение |
|
080000H |
KB |
R/W |
Регистр клавиатуры. |
|
080001H |
DATA_IND |
R/W |
Регистр шины данных ЖКИ. |
|
080002H |
EXT_LO |
R/W |
Регистр данных параллельного порта (разряды 0..7). |
|
080003H |
EXT_HI |
R/W |
Регистр данных параллельного порта (разряды 8..15). |
|
080004H |
ENA |
Регистр управления портами ввода-вывода, звуком, сигналом INT0 и прерыванием от клавиатуры. |
|
|
080006H |
C_IND |
W |
Регистр управления ЖКИ. |
|
080007H |
SV |
W |
Регистр управления светодиодами. |
ПЛИС выбирается при выставлении сигнала #CS RAM/EPM (на второй защелке в схеме интерфейса памяти) - то есть при выборе восьмой страницы памяти. Регистры ПЛИС можно читать или писать через подсоединенную шину адреса/данных - видна на левой средней половине микросхемы на рисунке. Через эту же шину выставляется адрес используемого регистра ПЛИС. Выводы ПЛИС в принципе соответствуют регистрам, которые расположены в ней - то что мы подаем на соответствующие вывода ПЛИС, отображается в соответствующих регистрах и наоборот.
Определенные выводы микросхемы подключены к внешнему разъему и к DIP-переключателям. Когда эти переключатели отключены, высокий уровень напряжения с +5V поступает на соответствующие выводы ПЛИС и в регистрах устанавливаются соответствующие значения. Когда же переключатели включены, высокий уровень напряжения с +5V идет на землю, и на выводах ПЛИС мы получаем низкий уровень напряжения - логический ноль.
.7 Интерфейс RS232
(COM
порт)
Эта схема, в принципе, типична - присутствует оптическая развязка (KPC357), DC/DC-преобразователь (VA-0505S1) и основной элемент - драйвер RS-232 (ST202CD). Эта микросхема обеспечивает обмен последовательными данными с другим устройством через протокол RS-232 (в случае ПК используется COM порт). Данные преобразуются из параллельной формы в последовательную при помощи встроенного в ADuC812 UART-контроллера, драйвер же лишь преобразует сигнал, выдаваемый UART так, чтобы он соответствовал требования стандарта.
На схеме стенда можно заметить элементы (рядом с микроконтроллером) внешней EEPROM и часов реального времени - AT24C02A и PCF8583P соответственно. С микроконтроллером они общаются при помощи I2C
Рисунок 14. Схема электрическая принципиальная RS232
.8 Интерфейс процессора с памятью
В силу того, что в SDK1.1 используется общая шина адреса-данных, мы вынуждены использовать защелки для передаваемого адреса ячейки - пара маленьких прямоугольных элементов посередине схемы. Вначале, мы используем шину, как шину адреса - передаем по ней адрес ячейки. Этот адрес мы запоминаем в защелках - специальных запоминающих элементах, по сигналу ALE с микроконтроллера. На следующем такте работы микроконтроллера мы используем шину, уже как шину данных - посылаем, или передаем по ней информацию. При этом, адрес, выставленный на адресных входах микросхемы остается неизменным - ведь на этом такте мы считываем его с защелок, а не с шины адреса/данных.
Стоит заметить, что в силу использования в стенде Гарвардской архитектуры, процессы чтения/записи из памяти команд и данных различаются. В случае чтения команд мы используем сигнал PSEN для сигнализации процесса начала чтения. Для адресации используется лишь два байта - мы используем просто 2 защелки.
Для сигнализации начала чтения данных используется сигнал RD. Для адресации используются уже три байта. Младший байт адреса передается через порт P0 - запоминается в верхней по схеме защелке. Старший байт запоминается в нижней по схеме защелке (через порт P2). Средний же байт передается через порт P2 уже после того, как два остальных байта "запомнились" в защелках.
Для записи информации в память
данных используется сигнал WR; в память же команд писать нельзя.
Рисунок 15 - Микросхема памяти K6X4008C1F
Рисунок 16. Интерфейс процессора с памятью
Подробнее структура распределения памяти стенда
приведена в анализе технического задания.
5.
Разработка схемы электрической принципиальной системы и ее описание
Схема электрическая принципиальная строится на основании структурной схемы. Схема и перечень элементов, входящих в систему накопления данных, представлены в Приложении 1.
Работа схемы электрической принципиальной разрабатываемой
системы происходит по тем же принципам, что и работа структурной схемы.
Описание работы системы изложено в разделе «Разработка структурной схемы
системы и ее описание» (раздел 3).
6. Разработка программного обеспечения.
.1 Разработка программы для микроконтроллера
Основные этапы разработки ПО и его загрузки в стенд SDK-1.1, исключая разработку алгоритмов решения задачи, таковы (см. Рисунок 2)
· создание файлов с исходным текстом программы на выбранном языке программирования;
· трансляция исходного кода в объектный код, сборка в один объектный файл;
· приведение исполняемого кода к виду, пригодному для передачи в стенд SDK-1.1;
· загрузка его в память стенда по инструментальному каналу и передача управления на начало прикладной программы.
Написание программы для стенда производилось в среде Keil Visio. В основе данной среды лежит язык C 51.
В состав инструментальных средств для процессоров с ядром АРМ7 входит:
. Интегрированная среда разработки uVision;
. Компилятор языка C;
. Ассемблер;
. Симулятор - отладчик;
. Линкер;
. Библиотекарь;
. Комплект компиляторов с лицензией GNU.
Рассмотрим подробнее процесс работы в среде uVision;
Рисунок 18. Схема средств разработки, входящих в состав пакета Keil Software
.1.1 Создание нового проекта
После создания программного проекта в интегрированной среде программирования keil-c конечным файлом трансляции является абсолютный файл. Для загрузки в микросхему обычно используется HEX файл. Для создания этого файла необходимо включить соответствующую опцию в свойствах программного проекта.
При написании программ для лабораторного стенда SDK-11 нужно учитывать такую особенность разработки программы, что программа должна находиться во внешней памяти программ. Поэтому начальный адрес памяти программ необходимо установить за пределами внутренней памяти программ, т.е. 0x2000. Начальный адрес внешней памяти данных можно установить, начиная с половины страницы, т.е. с адреса 0x8000.
6.1.2 Резидентный загрузчик НЕХ202
Резидентный загрузчик НЕХ202 располагается во Flash-памяти ADuC812. Он обеспечивает начальную инициализацию системы, загрузку программ в hex-формате в память SDK-l.l и передачу им управления.
При включении питания происходит инициализация всех регистров специального назначения их значениями по умолчанию и на ЖКИ выводится надпись «SDK-1.1, 2001 ©LMT Ltd». Одновременно на звуковой излучатель выдается короткий сигнал.
После процедуры инициализации системы последовательный канал настраивается в режим 9600 бит/сек, 8 бит данных, 1 стоп-бит, нет контроля четности и в него выдается строчка «НЕХ202-ХХ», где XX - номер версии загрузчика. Далее с интервалом примерно в 200мс выдается символ ‘.’ и ожидается ответ программы-загрузчика, запускаемой на компьютере. После успешной загрузки программы управление передаётся этой программе.
Все передаваемые из лабораторного стенда символы можно наблюдать в терминальном режиме загрузчика T167.exe.
.1.3 Загрузка программ в лабораторный стенд SDK-1.1
Для облегчения работы с загрузчиком в директории проекта создан пакетный файл RUN_T167.BAT. Этот файл выполняет все необходимые действия по загрузке исполняемого модуля во внутреннюю память лабораторного стенда SDK-1.1.
При выполнении этого командного файла в конец загрузочного файла, который обязательно должен быть в hex-формате, дописывается строка, обеспечивающая запуск программы с адреса 2100h. Затем открывается последовательный порт компьютера и настраивается для работы в 8-ми битном режиме работы на скорости обмена 9600 бит/с и загружается полученный в предыдущем пункте загрузочный файл во внешнюю память лабораторного стенда. Последнее, что выполняет командный файл RUN_T167.BAT - это переводит программу T167.exe в терминальный режим, в котором отображает на экране компьютера всю информацию, получаемую от лабораторного стенда по последовательному порту.
Для выхода из терминального режима загрузчика нужно нажать на кнопку клавиатуры компьютера ‘Esc’.
6.1.4 Описание основной части кода программы для микроконтроллера
Минимальная программа, не выполняющая никаких действий, для микроконтроллера выглядит следующим образом:
#include <ADuC812.h>
void main(void)
{
}
Возьмем данный код за основу нашего приложения и добавим в него необходимые функции.
Инициализация АЦП, таймеров и UART будет выполнена один раз, поэтому она не будет входить в основной цикл программы, а будет расположена сразу перед ним:
//-------Инициализация UART-----------= 0xFD; // Скорость 9600 бит/с= 0x20;// Таймер 1 в режиме autoreload= 0x40;// Запуск таймера 1= 0x50;// 8 bit UART, разрешение приема&= 0x7F;// Отключение удвоения скорости= 1; // Флаги UART
RI = 1; // Transmit & Recive=0x0;// UART interrupts only
// Настроить A/D to sequentially convert each input channel.
ADCCON1 = 0x7C; // 0111 1100
Так как микроконтроллер не имеет своей операционной системы, возникает необходимость реализовать цикл бесперебойной работы микроконтроллера от момента запуска оператором до момента остановки, опять же, оператором. Для этого создадим бесконечный цикл, в котором и будет происходить обработка всех поддерживаемых действий (например - оцифровка, смена номера канала и т.д.). На языке Си это будет выглядеть следующим образом:
do
{
…// здесь будет расположена большая часть кода
}
While(1)
В основном цикле программы будут выполняться следующие действия:
1. чтение состояния клавиатуры;
2. проверка нажатия цифровой клавиши;
. проверка ошибки выбора канала;
. задание номера канала для оцифровки;
. запуск АЦП и ожидание от него данных;
. запись данных в память;
. передача данных и номера канала на ПК;
. изменение состояния светодиодов в соответствии с оцифрованным каналом.
Это минимально необходимые действия для нормального функционирования системы:
unsigned int conv_val = 0;char channel = 0;char c=0; (ScanKBOnce(&c))=chrtoint(c);(NumChanel>8)// каналы больше 8го не обрабатываем=255;(NumChanel!=255)// 255 - ошибка выбора канала
{
// начать преобразование и дождаться завершения
ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;
SCONV = 1;(ADCCON3 & 0x80);
// Чтение A/D данных= ADCDATAH >> 4;_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
// вывод на терминал(NumChanel==8)
{ = (675-conv_val*0.61)/3;("ADC Channel %d = %f C\n", NumChanel,value2);
}else
{ ("ADC Channel %d = 0x%X\n", NumChanel,conv_val);
}
}else
{("Error selection channel\n");
}
// выведем оцифрованное значение
/*
зажигаем светодиот соответствующий номеру канала
который в данный момент оцифровываем
*/
svet=convert(NumChanel,0);
WriteMax(0x7,svet);//вывод на светодиды(pause=0;pause<=64000;pause++);// задержка
Полный листинг программы, а также доработанная версия с использованием таймера/счетчика (с подробными комментариями описания каждого участка программы) приведены в приложении А.
.2 Разработка программы для ПК
Компьютерная программа должна выполнять следующие функции:
1. Чтение данных с COM порта;