Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Содержание.
Введение
В настоящее время жизнь современного человека уже трудно представить без электронных устройств. Они используются во всех сферах жизни и деятельности людей. В современной технике все чаще используются встраиваемые компьютерные системы, основанные на микропроцессорах и однокристальных микроконтроллерах.
Микропроцессорная система это функционально законченное изделие, состоящее из одного или нескольких устройств.
Микроконтроллер помимо центрального процессора содержит память и многочисленные устройства ввода/вывода: последовательные и параллельные каналы передачи информации, аналого-цифровые преобразователи, таймеры реального времени и т.д.
Микроконтроллеры в основном применяются в системах автоматического управления, встраиваемые в различные устройства: сотовые телефоны, фотоаппараты, телевизоры, стиральные машины, микроволновые печи и т.д.
На сегодняшний день производители микропроцессоров все больше и больше сближают их с однокристальными микроконтроллерами, сочетая в одном кристалле вычислительную мощь и возможность реализации функций контроля и управления.
Использование микроконтроллеров в оборудовании позволяет повысить производительность, качество работы, помогает снизить затраты некоторых ресурсов. Даёт возможность решать сложные проблемы программного регулирования, существенно улучшает технические и экономические характеристики автоматизированного оборудования.
1 Обзор литературы.
Большинство современных устройств в своем составе имеют хотя бы один микроконтроллер.
Информационно измерительные и управляющие цифровые и микропроцессорные системы предназначены для измерения, сбора, обработки, хранения и отображения информации с реальных объектов, а также для управления ими.
Очень полно о современных системах сбора данных описывает в своей книге А.Ю. Кузьминов «Интерфейс RS-232. Связь между компьютером и микроконтроллером». Автор этой книги разделяет современные системы сбора данных на два основных класса.
К первому можно отнести так называемые компьютерные системы сбора, когда микроконтроллер расположен в специальном устройстве сопряжения с объектом (УСО), имеющем отдельный корпус, как правило, со своим блоком питания, подключаемым к сети (220В). К этому устройству подведены кабели от датчиков, с которых снимается информация. УСО сопрягается с компьютером по интерфейсу RS-232, по которому в компьютер передаётся измерительная информация. Управление УСО осуществляется также компьютером по тому же интерфейсу, т.е. микроконтроллер получает команды от компьютера, выполняет их, и результат выполнения посылает в компьютер. Последний получает предварительно обработанную (как правило, только оцифрованную) микроконтроллером информацию, окончательно её обрабатывает и выводит результаты этой обработки на экран монитора и/или принтер. Иногда УСО может находиться на значительном удалении от компьютера (до десятков метров и более); такие системы часто называют удаленными.
Отличительные черты компьютерных систем сбора следующие:
Ко второму классу можно отнести так называемые автономные системы сбора, представляющие собой по существу приборы, правда, достаточно «интеллектуальные». Здесь микроконтроллер выступает в качестве основы, как аппаратных, так и программных средств. Автономные системы сбора представляют собой устройства, оснащенные не только средствами измерений (датчиками измерительной информации), сбора и обработки измерительной информации, но и средствами индикации результатов измерений (в простейших системах это может быть, например, цифровой семисегментный индикатор с несколькими цифрами, в более сложных одно , либо двустрочный алфавитно цифровой или матричный графический дисплей; иногда автономная система оснащается даже примитивным печатающим устройством, например кассовый аппарат), а также средствами ручного ввода информации (например, кнопочной мембранной клавиатурой) или хотя бы примитивного ручного управления.
Автономные системы конструируются в отдельном корпусе и оснащаются своим блоком питания (во многих случаях батарейным). Часто автономные системы содержат в своем составе интерфейс сопряжения с компьютером (например, RS-232). Иногда этот интерфейс выполнен только опционально, реже он все таки используется, но основные его задачи плановый съём архивной информации, тестирование системы, начальное занесение в систему необходимых коэффициентов и/или режимов работы и т.п. При штатном режиме работы автономной системы интерфейс, как правило, не используется.
Отличительные черты автономных систем сбора следующие:
2 Анализ технического задания.
Согласно ТЗ на курсовой проект необходимо разработать систему сбора данных с использованием стендов SDK 1.1 и SDX 0.9.
Исходные данные:
- число каналов 8;
- источник входного сигнала генератор звуковых частот;
- диапазон частот входного сигнала (20-20000)Гц;
- оцифрованные данные должны сохраняться на ЖМД ПК;
- интерфейс связи с ПК RS-232.
Записываемая на ЖМД информация должна включать:
- 12-разрядные оцифрованные данные;
- номер канала;
- время начала оцифровки данных.
По заданию на КП необходимо разработать систему сбора данных с последующей их оцифровкой и записью на жесткий магнитный диск. Система включает программную и аппаратную части. Аппаратная часть реализована на базе двух стендов и описана ниже.
Рассмотрим аппаратную часть микропроцессорного стенда SDK-1.1.
В своей основе стенд имеет микроконтроллер ADuC812BS. Процессор ADuC812 является клоном Intel 8051 со встроенной периферией.
Основные характеристики микропроцессора:
рабочая частота 11,0592 МГц;
8-канальный 12-битный АЦП со скоростью выборок 200 K/c (в режиме ПДП);
два 12-битных ЦАП (код-напряжение);
внутренний температурный сенсор;
640 байт программируемого E2PROM со страничной организацией (256
страниц по 4 байта);
256 байт внутренней памяти данных (участок регистров общего назначения, битовый сегмент, свободный участок, участок регистров специального назначения);
адресное пространство 16 Мб;
память программ 8Кб
внешнее ОЗУ 512 Кб;
режим управления питанием;
асинхронный последовательный ввод-вывод;
интерфейс I2C;
три 16-битных таймера/счетчика и таймер WatchDog.
Внешняя E2PROM. E2PROM - перепрограммируемое электрически стираемое постоянное запоминающее устройство. Объем памяти E2PROM, установленной в стенде SDK-1.1, составляет 128 байт (возможна установка E2PROM большего объема, до 32 Кб). Микросхема E2PROM взаимодействует с процессором посредством интерфейса I2С. В таблице 1.2 дана адресация микросхем E2PROM.
Основные характеристики E2PROM:
возможность перезаписи до 1 млн. раз;
возможность побайтной и постраничной записи (в текущей конфигурации
размер страницы составляет 8 байт).
Таблица 1 Адресация микросхем E2PROM
Бит |
Значение |
Описание |
0х7 |
RW |
переключатель |
0х6 |
А0 |
Адреса устройств расширения |
0х5 |
А1 |
|
0х4 |
А2 |
|
0х3 |
0 |
Обязательная последовательность для всех устройств E2PROM |
0х2 |
1 |
|
0х1 |
0 |
|
0х0 |
1 |
Адресное пространство процессора разделяется на два, не отображаемых друг на друга участка - внешнюю память и внутреннюю. На рисунке 1 показана схема распределения памяти в SDK-1.1. На представленной схеме внутренняя память расположена в левой части, а внешняя в правой части.
Рисунок 1. Схема распределения памяти SDK-1.1
Внутренняя память. Микропроцессор ADuC812BS,являясь аналогом процессора Intel 8051, унаследовал типичную для процессоров этого семейства структуру организации внутренней памяти. Внутренняя память (256 байт) разделена на 4 участка:
участок регистров общего назначения;
битовый сегмент;
свободный участок;
участок регистров специального назначения.
В таблице 2 содержится информация о распределении внутренней памяти в SDK-1.1.
Стандартная для архитектуры 8051 структура внутренней памяти представлена четырьмя банками по восемь регистров общего назначения (диапазоны адресов 00h-07h, 08h-0Fh, 10h-17h, 18h-lFh), битовым сегментом (20h-2Fh), свободным участком 30h-7Fh, областью размещения SFR (регистров специального назначения) 80h-FFh, доступной при прямой адресации, и свободной областью 80h-FFh, доступной при косвенной адресации.
Таблица 2. Распределение внутренней памяти
Регистры общего назначения |
Битовый сегмент |
Свободный участок |
Рег. Спец. наз |
||||
1 |
2 |
3 |
4 |
||||
Адрес |
00-07 |
08-0F |
10-17 |
18-1h |
20-2F |
30-7F |
80-FF |
Внешняя память. Внешняя память SDK-1.1 разбита на следующие области: AduC812 Flash/EE, SRAM, MAX. Распределение адресов внешней памяти представлено в таблице 3.
Таблица 3. Распределение адресов внешней памяти
Flash/EE |
SRAM |
|||
Page 1 |
Pages 2..7 |
Page 8 |
Диапазон адресов |
|
0x0000 |
0x02000 |
0x10000 |
0x80000 |
|
0x2000 |
0x0FFF |
0x7FFFF |
0x8FFFF |
ADuC812 Flash/EE. Память Flash/EE представляет собой постоянную память, в которой хранится сервисная программа обслуживающая стенд, в ней находится набор тестов оборудования и драйвер RS232, позволяющий загружать пользовательский программы. При подаче питания или сбросе управление передаётся по нулевому адресу и происходит инициализация всех регистров.
Если пользовательская программа обратится к адресу 0, то стенд пройдёт процедуру реинициализации, что равносильно нажатию кнопки «сброс». Запись в эту область памяти возможна только в режиме программирования Flash-памяти, в простом режиме доступ к ним закрыт. Это необходимо учесть при разработке программы - код должен располагаться по адресам не ниже 0x2000. Это область, в которой располагается таблица векторов прерываний и резидентный загрузчик файлов в формате HEX в память SRAM.
Память SRAM (Внешнее ОЗУ). Статическая память имеет страничную организацию и представляет собой восемь страниц размером 64Кб каждая. Условно всю память SRAM разделяют на три участка: первая страница, страницы со второй по седьмую и восьмая страница.
Выборка кода может осуществляться только из первой страницы, и поэтому весь код должен располагаться именно здесь. Страницы со второй по седьмую могут быть использованы только для хранения данных. Восьмая страница особенна тем, что в первых 8 байтах расположены регистры микросхемы MAX 8064.
В младших адресах восьмой страницы адресного пространства (080000h-080007h) располагается 8 ячеек регистров ПЛИС МАХ8064 (МАХ8128). Эта область предназначена для взаимодействия с периферийными устройствами стенда.
Таблица 4. Модели и селекторы памяти
Селек-тор |
Область памяти |
data |
128 байт во встроенной RAM непосредственная адресация |
bdata |
16 байт во встроенном RAM - непосредственная битовая/байтовая адресация |
idata |
256 байт во встроенном RAM - косвенная адресация |
pdata |
256 байт в страничной внешней RAM |
xdata |
64 Kбайт расширенной RAM |
code |
64 Kбайт памяти программ |
far |
16 Мбайт памяти data/const, размер объекта 64 Kбайт |
near |
64 Kбайт непосредственно адресуемой памяти для 251 |
huge |
16 Мбайт косвенно адресуемой памяти, объект произвольного размера |
edata |
96 байт расширенной побитно адресуемой памяти для 251 |
Рассчитаем объем памяти буферного ОЗУ, которое необходимо для хранения данных, которые будут получены за 1 секунду работы АЦП.
Согласно техническим параметрам стенда SDK1.1, быстродействие встроенного АЦП, т.е время, которое требуется АЦП на преобразование одной выборки равно 20 тактам (периодам) частоты АЦП. Диапазон частот АЦП 400КГц 3 МГц. Частота тактового генератора стенда FBQ=11,059. Тактовая частота АЦП выбирается программистом с помощью регистра ADCCon1. Программный делитель частоты, задаются битами 4 и 5 этого регистра след значение -1,2,4,8
Fтактовое АЦП=
где k принимает значение 1,2,4,8
Fтакт ацп== 1,382375 МГц
Tпреобр АЦП =20*Такт=20
По теореме Котельникова следует, что частота дискретизации должна быть минимум вдвое выше верхней частоты спектра (по заданию 20КГц), следовательно, частота дискретизации будет равна 40КГц.
Период дискретизации =
Это означает, что временной интервал между выборками составляет 25 микросекунд. Мы получаем 40 тысяч выборок за одну секунду. Размер каждой выборки равен двум байтам, соответственно, нам необходим объем памяти равный 80 тысячам байт или 80 килобайтам для одного канала и 640 килобайтам для восьми каналов, соответственно. Следовательно, мы получим слишком большой объем данных. Так как 8кб внутренней памяти программ нам недоступно, а 640 Байт внутренней памяти данных нам явно недостаточно, мы вынуждены будем использовать для хранения данных внешнее ОЗУ, а точнее его 456 килобайт (первые 64 Кб из 512Кб используются для хранения программ). Подробнее структурная организация внешнего ОЗУ описана выше. Распределение адресов внешней памяти приведено в таблице 3.
Нам необходимо решить ситуацию с размещением данных в памяти без их потери. Решений проблемы несколько понижение частоты ГТИ или уменьшение частоты дискретизации. Можно также использовать стенд в режиме прямого доступа к памяти для приложений, в которых ЦП не может поддерживать высокую скорость оцифровки.
Так как в данном стенде используется микроконтроллер ADuC812, мы не можем изменить частоту тактового генератора (она жестко фиксирована), а лишь с использованием делителя частоты (к=8). Есть еще вариант выключать АЦП и производить обработку данных и запись их в память, затем включать АЦП и получать следующую порцию данных. Понижение верхней частоты спектра с 20КГц до 10КГц мы добьемся уменьшения частоты дискретизации также в два раза. (Уменьшив частоту дискретизации вдвое, уменьшится количество выборок, время преобразования АЦП увеличится). Но и эти действия не позволят целиком решить проблему,
Нам необходимо разбить 1 секунду на интервалы, которые позволят АЦП успеть оцифровать данные и записать их в память. Период дискретизации будем задавать при помощи таймера счетчика.
Следующей задачей является запись данных из внешнего ОЗУ стенда на ЖМД компьютера через интерфейс RS-232. Проблема заключается в согласовании обмена данными между стендом и ПК. Появляется необходимость написания управляющей программы, которая бы принимала данные от стенда через СОМ порт и записывала их на ЖМД в нужном нам формате.
По ТЗ необходимо в записываемых данных учитывать также номер канала, и время начала оцифровки.
Для программирования стенда может использоваться любой транслятор ассемблера или C для ядра 8051, например, пакет µVision (Keil Software). До
начала программирования на языке C рекомендуется внимательно ознакомиться с документацией по используемому компилятору, так как компиляторы для микроконтроллеров имеют нестандартные расширения.
Основные этапы программирования стенда:
подготовка программы в текстовом редакторе или среде программирования;
транслирование исходного текста и получение загрузочного HEX-модуля программы;
подготовка и загрузка HEX-модуля в стенд через интерфейс RS232C с помощью поставляемых инструментальных систем. Под подготовкой понимается добавление в конец модуля строчки со стартовым адресом программы, то есть адреса, по которому передается управление после загрузки в стенд;
прием и обработка HEX-модуля резидентным загрузчиком HEX202,передача управления загруженной программе.
На рисунке 2 показаны этапы программирования стенда SDK-1.1.
Рисунок 2. Этапы программирования на стенде SDK-1.1
Напишем алгоритм приблизительной работы нашей будущей программы:
При написании программ для стенда будем пользоваться средой программирования Keil Vision. Для приема данных от стенда и последующей их записи была выбрана программа Terminal v1.9b. Для написания программы работы с уже полученными данными выбрана среда программирования Borland Delphi 7.
3 Разработка структурной схемы системы и ее описание.
Рисунок 3. Структурная схема стенда системы накопления.
Учебный лабораторный комплекс SDK1.1 разработан на базе микроконтроллера ADuC812 с ядром MCS51.
В состав учебного стенда SDK-1.1 входят:
Технические и эксплуатационные характеристики
Модуль дискретного и аналогового вводавывода SDX09 обеспечивает согласование уровней напряжения и тока, гальваническую изоляцию при подключении типовых датчиков (дискретных и аналоговых) и исполнительных устройств (двигатели, клапаны, лампы).
Технические и эксплуатационные характеристики
Рисунок 4. Структурная схема стенда-расширителя SDX-09
4 Разработка функциональной схемы системы и ее описание
В этой главе будут рассмотрены основные функциональные блоки стенда SDK-1.1: микроконтроллер ADuC812, внешняя память, матричная клавиатура, жидко кристаллический индикатор, часы реального времени, ПЛИС, интерфейс RS 232, интерфейс процессора с памятью и будет разработана функциональная схема всего стенда.
4.1 Микроконтроллер ADuC812
Микропроцессорный стенд SDK-1.1 построен на базе однокристальной микро-ЭВМ фирмы Analog Device типа ADuC812 (вычислительное ядро MCS-51). ADuC812 - интегральная 12-разрядная система сбора информации, включающая в себя прецизионный многоканальный АЦП с самокалибровкой, два 12-разрядных ЦАП и программируемое 8-битное микропроцессорное ядро (совместимое с 8051, MCU). MCU поддерживается внутренними 8К FLASH ЭРПЗУ программ, 640 байт ЭРПЗУ памяти данных и 256 байт статической памяти данных с произвольной выборкой (RAM). MCU поддерживает следующие функции: сторожевой таймер, монитор питания и канал прямого доступа к памяти для АЦП. Для мультипроцессорного обмена и расширения ввода/вывода имеются 32 программируемые линии, I2C, SPI и UART интерфейсы. Для гибкого управления в приложениях с низким потреблением в MCU и аналоговой части предусмотрены 3 режима работы: нормальный, холостой и дежурный. Продукт специфицирован для +3/+5В работы в индустриальном диапазоне температур и поставляется 52-выводном пластмассовом корпусе (PQFP).
Микроконтроллер имеет стандартный набор из 4-х 8-разрядных портов ввода/вывода дискретных сигналов P0, P1, P2 и P3. Они характеризуются многофункциональностью.
Рисунок 5. Структурная схема ADuC812
Рисунок 6. Условно-графическое изображение ADuC812
4.2 Внешняя память E2PROM
E2PROM перепрограммируемое электрически стираемое постоянное запоминающее устройство. Объем памяти E2PROM, установленной в стенде SDK-1.1, составляет 128 байт (возможна установка E2PROM большего объема, до 32 Кб). Микросхема E2PROM взаимодействует с процессором посредством интерфейса I2C.
Основные характеристики:
• Возможность перезаписи до 1 млн. раз.
• Возможность побайтной и постраничной записи (в текущей конфигурации размер страницы составляет 8 байт).
Диапазон рабочих температур -55°C - +125°C
Условия хранения -65°C - +150°C
Напряжение на ножках с учетом заземления -0.1V - +7.0V
Максимальное рабочее напряжение 6.25V
Постоянный ток выхода 5.0 mA
Рисунок 7. Микросхема AT24C01A (объемом 128 кб)
4.3 Матричная клавиатура AK1604A-WWB
Клавиатура организована в виде матрицы 4x4. Доступ к колонкам и рядам организован как чтение/запись определенного байта внешней памяти (4 бита соответствуют 4 колонкам, другие 4 бита - рядам).
Рисунок 8. Схема электрическая принципиальная матричной клавиатуры AK1604A-WWB.
При нажатии на кнопку напряжение не сразу устанавливается на уровне 0 В, а "скачет" в течение некоторого времени (1-10 мс), пока цепь надежно не замкнется. После того, как клавиша будет отпущена, напряжение также "скачет", пока не установится на уровне логической "1".
Рисунок 9. Дребезг
Поскольку процессор обладает высоким быстродействием, то он может воспринять эти скачки напряжения за несколько нажатий. Для программного устранения влияния "дребезга" используется задержка. После того, как в результате сканирования обнаружится "0" в регистре ROW, сканирование прекращается и производится задержка на некоторое время. После этого сканируется тот же столбец и, если на том же месте регистра ROW обнаружен "0", то фиксируется нажатие клавиши. После этого через некоторое время, достаточное для отпускания клавиши, еще раз проверяется тот же столбец. Если состояние линии изменилось, то фиксируется отпускание клавиши и продолжается сканирование клавиатуры. Если клавиша все еще нажата, то производится задержка на время перед повтором символа, и если состояние регистра не изменилось, то в буфер клавиатуры повторно заносится символ. После этого, пока клавиша не будет отпущена, в буфер заносится код клавиши через промежутки времени, определяемые скоростью повтора символа.
4.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
PCF8583 часы/календарь с памятью объемом 256 байт, работающие от кварцевого резонатора с частотой 32.768 кГц. Питание осуществляется ионистором (0.1 ф). Из 256 байт памяти собственно часами используются только первые 16 (8 постоянно обновляемых регистров-защелок на установку/чтение даты/времени и 8 на будильник), остальные 240 байт доступны для хранения данных пользователя. Точность измерения времени до сотых долей секунды. Взаимодействие с процессором осуществляется через интерфейс I2C.
Рисунок 12. Схема электрическая принципиальная PCF8583P
4.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 |
W |
Регистр управления портами ввода-вывода, звуком, сигналом INT0 и прерыванием от клавиатуры. |
080006H |
C_IND |
W |
Регистр управления ЖКИ. |
080007H |
SV |
W |
Регистр управления светодиодами. |
ПЛИС выбирается при выставлении сигнала #CS RAM/EPM (на второй защелке в схеме интерфейса памяти) - то есть при выборе восьмой страницы памяти. Регистры ПЛИС можно читать или писать через подсоединенную шину адреса/данных - видна на левой средней половине микросхемы на рисунке. Через эту же шину выставляется адрес используемого регистра ПЛИС. Выводы ПЛИС в принципе соответствуют регистрам, которые расположены в ней - то что мы подаем на соответствующие вывода ПЛИС, отображается в соответствующих регистрах и наоборот.
Определенные выводы микросхемы подключены к внешнему разъему и к DIP-переключателям. Когда эти переключатели отключены, высокий уровень напряжения с +5V поступает на соответствующие выводы ПЛИС и в регистрах устанавливаются соответствующие значения. Когда же переключатели включены, высокий уровень напряжения с +5V идет на землю, и на выводах ПЛИС мы получаем низкий уровень напряжения - логический ноль.
4.7 Интерфейс RS232 (COM порт)
Эта схема, в принципе, типична - присутствует оптическая развязка (KPC357), DC/DC-преобразователь (VA-0505S1) и основной элемент - драйвер RS-232 (ST202CD). Эта микросхема обеспечивает обмен последовательными
данными с другим устройством через протокол RS-232 (в случае ПК используется COM порт). Данные преобразуются из параллельной формы в последовательную при помощи встроенного в ADuC812 UART-контроллера, драйвер же лишь преобразует сигнал, выдаваемый UART так, чтобы он соответствовал требования стандарта.
На схеме стенда можно заметить элементы (рядом с микроконтроллером) внешней EEPROM и часов реального времени - AT24C02A и PCF8583P соответственно. С микроконтроллером они общаются при помощи I2C
Рисунок 14. Схема электрическая принципиальная RS232
4.8 Интерфейс процессора с памятью
В силу того, что в SDK1.1 используется общая шина адреса-данных, мы вынуждены использовать защелки для передаваемого адреса ячейки - пара маленьких прямоугольных элементов посередине схемы. Вначале, мы используем шину, как шину адреса - передаем по ней адрес ячейки. Этот адрес мы запоминаем в защелках - специальных запоминающих элементах, по сигналу ALE с микроконтроллера. На следующем такте работы микроконтроллера мы используем шину, уже как шину данных посылаем, или передаем по ней информацию. При этом, адрес, выставленный на адресных входах микросхемы остается неизменным - ведь на этом такте мы считываем его с защелок, а не с шины адреса/данных.
Стоит заметить, что в силу использования в стенде Гарвардской архитектуры, процессы чтения/записи из памяти команд и данных различаются. В случае чтения команд мы используем сигнал PSEN для сигнализации процесса начала чтения. Для адресации используется лишь два байта - мы используем просто 2 защелки.
Для сигнализации начала чтения данных используется сигнал RD. Для адресации используются уже три байта. Младший байт адреса передается через порт P0 - запоминается в верхней по схеме защелке. Старший байт запоминается в нижней по схеме защелке (через порт P2). Средний же байт передается через порт P2 уже после того, как два остальных байта "запомнились" в защелках.
Для записи информации в память данных используется сигнал WR; в память же команд писать нельзя.
Рисунок 15 - Микросхема памяти K6X4008C1F
Рисунок 16. Интерфейс процессора с памятью
Подробнее структура распределения памяти стенда приведена в анализе технического задания.
5 Разработка схемы электрической принципиальной системы и ее описание
Схема электрическая принципиальная строится на основании структурной схемы. Схема и перечень элементов, входящих в систему накопления данных, представлены в Приложении 1.
Работа схемы электрической принципиальной разрабатываемой системы происходит по тем же принципам, что и работа структурной схемы. Описание работы системы изложено в разделе «Разработка структурной схемы системы и ее описание» (раздел 3).
6.1 Разработка программы для микроконтроллера
Основные этапы разработки ПО и его загрузки в стенд SDK-1.1, исключая разработку алгоритмов решения задачи, таковы (см. Рисунок 2)
Написание программы для стенда производилось в среде Keil Visio. В основе данной среды лежит язык C 51.
В состав инструментальных средств для процессоров с ядром АРМ7 входит:
1. Интегрированная среда разработки uVision;
2. Компилятор языка C;
3. Ассемблер;
4. Симулятор отладчик;
5. Линкер;
6. Библиотекарь;
7. Комплект компиляторов с лицензией GNU.
Рассмотрим подробнее процесс работы в среде uVision;
Рисунок 18. Схема средств разработки, входящих в состав пакета Keil Software
6.1.1 Создание нового проекта
После создания программного проекта в интегрированной среде программирования keilc конечным файлом трансляции является абсолютный файл. Для загрузки в микросхему обычно используется 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.
6.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-----------
TH1 = 0xFD; // Скорость 9600 бит/с
TMOD = 0x20;// Таймер 1 в режиме autoreload
TCON = 0x40;// Запуск таймера 1
SCON = 0x50;// 8 bit UART, разрешение приема
PCON &= 0x7F;// Отключение удвоения скорости
TI = 1; // Флаги UART
RI = 1; // Transmit & Recive
EA =0x0;// UART interrupts only
// Настроить A/D to sequentially convert each input channel.
ADCCON1 = 0x7C; // 0111 1100
Так как микроконтроллер не имеет своей операционной системы, возникает необходимость реализовать цикл бесперебойной работы микроконтроллера от момента запуска оператором до момента остановки, опять же, оператором. Для этого создадим бесконечный цикл, в котором и будет происходить обработка всех поддерживаемых действий (например оцифровка, смена номера канала и т.д.). На языке Си это будет выглядеть следующим образом:
do
{
…// здесь будет расположена большая часть кода
}
While(1)
В основном цикле программы будут выполняться следующие действия:
Это минимально необходимые действия для нормального функционирования системы:
unsigned int conv_val = 0;
unsigned char channel = 0;
unsigned char c=0;
if (ScanKBOnce(&c))
NumChanel=chrtoint(c);
if (NumChanel>8)// каналы больше 8го не обрабатываем
NumChanel=255;
if (NumChanel!=255)// 255 - ошибка выбора канала
{
// начать преобразование и дождаться завершения
ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;
SCONV = 1;
while (ADCCON3 & 0x80);
// Чтение A/D данных
channel = ADCDATAH >> 4;
conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
// вывод на терминал
if (NumChanel==8)
{
value2= (675-conv_val*0.61)/3;
printf ("ADC Channel %d = %f C\n", NumChanel,value2);
}else
{
printf ("ADC Channel %d = 0x%X\n", NumChanel,conv_val);
}
}else
{
printf("Error selection channel\n");
}
// выведем оцифрованное значение
/*
зажигаем светодиот соответствующий номеру канала
который в данный момент оцифровываем
*/
svet=convert(NumChanel,0);
WriteMax(0x7,svet);//вывод на светодиды
for(pause=0;pause<=64000;pause++);// задержка
Полный листинг программы, а также доработанная версия с использованием таймера/счетчика (с подробными комментариями описания каждого участка программы) приведены в приложении А.
6.2 Разработка программы для ПК
Компьютерная программа должна выполнять следующие функции:
Всеми вышеприведенными функциями обладает уже созданное программное обеспечение Terminal.
Данная программа позволяет выполнять не только вышеприведенные действия но и некоторые другие, такие как отображение принятой информации в графическом виде, задание различных параметров сопряжения и т.д.
Terminal - простая программа эмуляции терминала последовательного порта (COM). Она может использоваться для соединения с различными устройствами, такими как модемы, маршрутизаторы, встроенные uC системы, телефоны GSM... Это очень полезное средство отладки для приложений последовательной передачи.
Данное ПО полностью устраивает требования задания курсового проекта. Поэтому для записи на ЖМД будем использовать её.
Для сопряжения стенда и ПК необходимо задать правильные настройки программы:
Рисунок 19. Главное окно программы Terminal
После того как все настройки были выставлены можно подключаться к стенду, для этого служит кнопка «Connect».
Для того что бы данные записывались на диск нужно нажать кнопку «StartLog», после этого появится окно выбора файла, в который и будут сохраняться принятые данные.
Заключение.
В данном курсовом проекте была разработана система накопления данных, которая предназначена для оцифровки данных, поступающих с генератора звуковых частот, и записи их на жесткий магнитный диск. Данные записываются в файл, имя файла задает оператор, со служебной информацией, такой как время начала/конца оцифровки и номера оцифрованного канала. Спроектированная система организована с помощью учебного стенда SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 и расширителя SDX-09.
Разработка проектируемой системы состоит из двух этапов:
Результатом первого этапа разработки является принципиальная электрическая схема системы сбора данных. В процессе этого этапа первоначально была разработана структурная и функциональная схемы и изучена элементная база для построения требуемой системы.
На втором этапе был разработан алгоритм управления, который затем был реализован в виде программы на языке C#. Была написана программа непосредственно для стенда и выбрана программа для сохранения получаемых данных на компьютере.
Список использованных источников.
Приложение А
Листинг доработанной программы для микроконтроллера
#include <ADuC812.h>
#include <stdio.h>
#define MAXBASE 0x8
#define MyData 0x3
#define KB 0x0
/*
То, что эта ячейка памяти находится во внешней
памяти данных показывает уточняющее слово “xdata”,
*/
unsigned int xdata conv_val[127] = 0;// массив из 128 элементов
unsigned short CountMas = 127;// кол-во элементов в массиве
unsigned int IndexMas = 0;
char KBTable[]="147*2580369#ABCD";
unsigned int NumChanel = 8;// номер канала для оцифровки
unsigned int OldChanel = 8;// номер канала для оцифровки
//******************************************************************************************************************//
//Функция записи значения регистра regnum.
/*
входные данные:
*regnum - адрес регистра
val - записываемое значение
возвращаемый результат:
отсутствует
*/
void WriteMax(unsigned char xdata *regnum, unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MAXBASE;
*regnum=val;
DPP=oldDPP;
}
//Функция чтения значения регистра regnum.
/*
входные данные:
*regnum - адрес регистра
возвращаемый результат:
значения регистра
*/
unsigned char ReadMax(unsigned char xdata *regnum)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MAXBASE;
val=*regnum;
DPP=oldDPP;
return val;
}
//******************************************************************************************************************//
//Функция реализующая опрос клавиатуры.
/*
входные данные:
*ch - адрес буфера куда будет записан прочитанный результат
возвращаемый результат:
0 - в случае если нажатия не было
1 - нажатие было
*/
bit ScanKBOnce(char *ch)
{
unsigned char row,col,rownum,colnum;
unsigned int i;
//Сканирование производится по "столбцам" клавиатуры, на которые подается
//"бегущий 0".
for(colnum = 0; colnum < 4; colnum++)
{
col = 0x1 << colnum; //0001, 0010, 0100, 1000, 0001, ...
WriteMax(KB, ~col); //11111110, 11111101, 11111011, 11110111, 11111110, ...
//При подаче нуля на очередной столбец на каждом из "рядов" проверяется
//наличие нуля (факт замыкания контакта клавишей)
for(rownum = 0; rownum < 4; rownum++)
{
row = ReadMax(KB) & (0x10 << rownum);
if( !row ) //Обнаружено нажатие клавиши:
{
for(i = 0; i<10000; i++)continue;//проверка на дребезг контакта:
//через примерно 40мс повтор сканирования той же клавиши
row = ReadMax(KB) & (0x10 << rownum);
if( !row )
{
*ch = (KBTable[(colnum<<2) + rownum]);
return 1; //Стабильное нажатие клавиши
}
}
}
}
return 0; //Ни одна клавиша не нажата
}
//******************************************************************************************************************//
// функция преобразует символ в число
/*
входные данные:
ch - символ, который необходимо преобразовать
возвращаемый результат:
255 - в случае если передана не цифра(код ошибки)
либо преобразованную цифру(0,1,2...,9)
*/
unsigned int chrtoint(char ch)
{
char Digits[]="0123456789";
unsigned int sym;
for (sym=0;sym<=9;sym++)
{
if (Digits[sym]==ch)
{
return sym;
}
}
return 255;// ошибка
}
//******************************************************************************************************************//
unsigned char ReadEXTRAM(unsigned char xdata *adr)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MyData;
val=*adr;
DPP=oldDPP;
return val;
}
void WriteEXTRAM(unsigned char xdata *adr,unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MyData;// третья страница памяти
*adr=val;
DPP=oldDPP;// возвращаем старое значение
}
// передача данных на ПК
/*
описание:
передает, через UART, массив(conv_val) с сохраненными, в нем до этого, значениями
входные данные:
отсутствуют
возвращаемый результат:
отсутствует
*/
void WriteToUART(unsigned short count)
{
unsigned short i;// счетчик
unsigned short tmp=0;
printf ("ADC Channel: %d\nData start:\n", NumChanel);// номер канала и служебное слово
for (i=0;i<=count;i++)
{
tmp=ReadEXTRAM(i);
//val=conv_val[i];
printf ("%d\n", tmp);// передача данных
}
printf ("Data stop\n");// конец вывода данных
}
// запись значения во внешенее ОЗУ
/*
описание:
записывает входное значение в массив,хранящейся во внешнем ОЗУ
входные данные:
Value - записываемое значение
Channel - номер канала с которого было получено значение,
необходимо для вывода сохраненных до этого значений при смене канала оцифровки
возвращаемый результат:
отсутствует
*/
void WriteValue(unsigned short Value,unsigned short Channel)
{
if (Channel!=OldChanel)// если был сменен канал нужно вывести данные
{
WriteToUART(--IndexMas);// вывод
IndexMas=0;// данные выведены можно заполнять массив сначала
}
WriteEXTRAM(IndexMas,Value);// пишем во внешнее ОЗУ
//conv_val[IndexMas]=Value;// пишем данные во внешнее ОЗУ
IndexMas++;// увеличиваем индекс
if (IndexMas>=CountMas)// Проверяем не конец ли это массива
{
WriteToUART(--IndexMas);// если массив заполнен выведем данные
IndexMas=0;// данные выведены можно заполнять массив сначала
}
}
//******************************************************************************************************************//
/*
описание:
основная часть программы на которую после загрузки попадает управление
входные данные:
отсутствуют
возвращаемый результат:
отсутствует
*/
void main(void)
{
float grad = 0;
unsigned char c=0;
unsigned char svet = 0;
unsigned short tmpVal = 0;
//-------Инициализация UART-----------
TH1 = 0xFD;// Скорость 9600 бит/с
TMOD = 0x20;// Таймер 1 в режиме autoreload
TCON = 0x40;// Запуск таймера 1
SCON = 0x50;// 8 bit UART, разрешение приема
PCON &=0x7F;// Отключение удвоения скорости
TI = 1; // Флаги UART
RI = 1; // Transmit & Recive
// инициализация таймера Т0
TCON &=0xC0; //T0 stop.
TMOD &=0xF0; //сброс настроек T0.
TMOD |=0x01; //установка T0 в режим T 16-bit
TL0 = 0xFE; //задержка
TH0 = 0x32; //
IE = 0x9A; //UART enable
// Настроить A/D to sequentially convert each input channel.
ADCCON1 = 0x7C;
TCON |=0x10; //запуск T0
do
{
while(!TF0);
TCON &=0xC0; //остановим T0
//*******************************************************************//
if (ScanKBOnce(&c))
NumChanel=chrtoint(c);
/*
зажигаем светодиот соответствующий номеру канала
который в данный момент оцифровываем
*/
if (NumChanel<9)
/*
для объединения бит в одно число использована операция
логического суммирования(|=), а для указания номера бита
сдвиг(<<) единицы влево на необходимое число разрядов(NumChanel)
*/
svet=(1<<(NumChanel-1));
else
svet=255;// неправильно выбран канал
WriteMax(0x7,svet);//Зажигаем светодиоды
if (NumChanel<9)
{
// начать преобразование и дождаться завершения
ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;
SCONV = 1;
while (ADCCON3 & 0x80);
// Чтение A/D данных
tmpVal = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
// вывод на терминал
if (NumChanel==8)// если номер канала равен восьмому
{ // то нужно преобразовать полученное значение в понятное для человека(в температуру)
grad = (675-tmpVal*0.61)/3;
WriteValue(grad,NumChanel);// запишем значение
}else
WriteValue(tmpVal,NumChanel);// запишем значение
}else
printf ("Error selection channel\n");// скажем что неверно выбран канал
OldChanel=NumChanel;// для отслеживания изменения канала
//*****************************************************************************//
// повторная настройка таймера и его запуск
TL0 = 0xFE; //задержка
TH0 = 0x32; //
TCON |=0x10; //запуск T0
}// do
while(1);// бесконечный цикл
}
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _WriteMax (BEGIN)
; SOURCE LINE # 28
;---- Variable 'val' assigned to Register 'R5' ----
;---- Variable 'regnum' assigned to Register 'DPTR' ----
0000 8F82 MOV DPL,R7
0002 8E83 MOV DPH,R6
; SOURCE LINE # 29
; SOURCE LINE # 30
;---- Variable 'oldDPP' assigned to Register 'R7' ----
0004 AF84 MOV R7,DPP
; SOURCE LINE # 31
0006 758408 MOV DPP,#08H
; SOURCE LINE # 32
0009 ED MOV A,R5
000A F0 MOVX @DPTR,A
; SOURCE LINE # 33
000B 8F84 MOV DPP,R7
; SOURCE LINE # 34
000D 22 RET
; FUNCTION _WriteMax (END)
; FUNCTION _ReadMax (BEGIN)
; SOURCE LINE # 42
;---- Variable 'regnum' assigned to Register 'DPTR' ----
0000 8F82 MOV DPL,R7
0002 8E83 MOV DPH,R6
; SOURCE LINE # 43
; SOURCE LINE # 44
;---- Variable 'oldDPP' assigned to Register 'R7' ----
0004 AF84 MOV R7,DPP
; SOURCE LINE # 45
;---- Variable 'val' assigned to Register 'R6' ----
; SOURCE LINE # 46
0006 758408 MOV DPP,#08H
; SOURCE LINE # 47
0009 E0 MOVX A,@DPTR
; SOURCE LINE # 48
000A 8F84 MOV DPP,R7
; SOURCE LINE # 49
000C FF MOV R7,A
; SOURCE LINE # 50
000D ?C0002:
000D 22 RET
; FUNCTION _ReadMax (END)
; FUNCTION _ScanKBOnce (BEGIN)
; SOURCE LINE # 60
0000 8B00 R MOV ch,R3
0002 8A00 R MOV ch+01H,R2
0004 8900 R MOV ch+02H,R1
; SOURCE LINE # 61
; SOURCE LINE # 66
;---- Variable 'colnum' assigned to Register 'R4' ----
0006 E4 CLR A
0007 FC MOV R4,A
0008 ?C0003:
; SOURCE LINE # 67
; SOURCE LINE # 68
0008 7401 MOV A,#01H
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 7
000A A804 MOV R0,AR4
000C 08 INC R0
000D 8002 SJMP ?C0045
000F ?C0044:
000F C3 CLR C
0010 33 RLC A
0011 ?C0045:
0011 D8FC DJNZ R0,?C0044
;---- Variable 'col' assigned to Register 'R7' ----
; SOURCE LINE # 69
0013 F4 CPL A
0014 FD MOV R5,A
0015 E4 CLR A
0016 FF MOV R7,A
0017 FE MOV R6,A
0018 120000 R LCALL _WriteMax
; SOURCE LINE # 72
;---- Variable 'rownum' assigned to Register 'R5' ----
001B E4 CLR A
001C FD MOV R5,A
001D ?C0006:
; SOURCE LINE # 73
; SOURCE LINE # 74
001D E4 CLR A
001E FF MOV R7,A
001F FE MOV R6,A
0020 120000 R LCALL _ReadMax
0023 7410 MOV A,#010H
0025 A805 MOV R0,AR5
0027 08 INC R0
0028 8002 SJMP ?C0047
002A ?C0046:
002A C3 CLR C
002B 33 RLC A
002C ?C0047:
002C D8FC DJNZ R0,?C0046
002E 5F ANL A,R7
002F FF MOV R7,A
;---- Variable 'row' assigned to Register 'R7' ----
; SOURCE LINE # 75
0030 7036 JNZ ?C0008
; SOURCE LINE # 76
; SOURCE LINE # 77
;---- Variable 'i' assigned to Register 'R2/R3' ----
0032 FB MOV R3,A
0033 FA MOV R2,A
0034 ?C0010:
0034 ?C0012:
0034 0B INC R3
0035 BB0001 CJNE R3,#00H,?C0048
0038 0A INC R2
0039 ?C0048:
0039 BA27F8 CJNE R2,#027H,?C0010
003C BB10F5 CJNE R3,#010H,?C0010
003F ?C0011:
; SOURCE LINE # 79
003F E4 CLR A
0040 FF MOV R7,A
0041 FE MOV R6,A
0042 120000 R LCALL _ReadMax
0045 7410 MOV A,#010H
0047 A805 MOV R0,AR5
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 8
0049 08 INC R0
004A 8002 SJMP ?C0050
004C ?C0049:
004C C3 CLR C
004D 33 RLC A
004E ?C0050:
004E D8FC DJNZ R0,?C0049
0050 5F ANL A,R7
; SOURCE LINE # 80
0051 7015 JNZ ?C0008
; SOURCE LINE # 81
; SOURCE LINE # 82
0053 EC MOV A,R4
0054 25E0 ADD A,ACC
0056 25E0 ADD A,ACC
0058 2D ADD A,R5
0059 2400 R ADD A,#LOW KBTable
005B F8 MOV R0,A
005C E6 MOV A,@R0
005D AB00 R MOV R3,ch
005F AA00 R MOV R2,ch+01H
0061 A900 R MOV R1,ch+02H
0063 120000 E LCALL ?C?CSTPTR
; SOURCE LINE # 83
0066 D3 SETB C
0067 22 RET
; SOURCE LINE # 84
; SOURCE LINE # 85
; SOURCE LINE # 86
0068 ?C0008:
0068 0D INC R5
0069 BD04B1 CJNE R5,#04H,?C0006
; SOURCE LINE # 87
006C ?C0005:
006C 0C INC R4
006D EC MOV A,R4
006E 6404 XRL A,#04H
0070 7096 JNZ ?C0003
0072 ?C0004:
; SOURCE LINE # 88
0072 C3 CLR C
; SOURCE LINE # 89
0073 ?C0014:
0073 22 RET
; FUNCTION _ScanKBOnce (END)
; FUNCTION _chrtoint (BEGIN)
; SOURCE LINE # 99
0000 8F00 R MOV ch,R7
; SOURCE LINE # 100
; SOURCE LINE # 101
0002 7800 R MOV R0,#LOW Digits
0004 7C00 R MOV R4,#HIGH Digits
0006 7D00 MOV R5,#00H
0008 7BFF MOV R3,#0FFH
000A 7A00 R MOV R2,#HIGH _?ix1000
000C 7900 R MOV R1,#LOW _?ix1000
000E 7E00 MOV R6,#00H
0010 7F0B MOV R7,#0BH
0012 120000 E LCALL ?C?COPY
; SOURCE LINE # 103
;---- Variable 'sym' assigned to Register 'R6/R7' ----
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 9
0015 E4 CLR A
0016 FF MOV R7,A
0017 FE MOV R6,A
0018 ?C0015:
; SOURCE LINE # 104
; SOURCE LINE # 105
0018 7400 R MOV A,#LOW Digits
001A 2F ADD A,R7
001B F8 MOV R0,A
001C E6 MOV A,@R0
001D B50001 R CJNE A,ch,?C0017
; SOURCE LINE # 106
; SOURCE LINE # 107
0020 22 RET
; SOURCE LINE # 108
; SOURCE LINE # 109
0021 ?C0017:
0021 0F INC R7
0022 BF0001 CJNE R7,#00H,?C0051
0025 0E INC R6
0026 ?C0051:
0026 EF MOV A,R7
0027 640A XRL A,#0AH
0029 4E ORL A,R6
002A 70EC JNZ ?C0015
002C ?C0016:
; SOURCE LINE # 110
002C 7E00 MOV R6,#00H
002E 7FFF MOV R7,#0FFH
; SOURCE LINE # 111
0030 ?C0019:
0030 22 RET
; FUNCTION _chrtoint (END)
; FUNCTION _ReadEXTRAM (BEGIN)
; SOURCE LINE # 113
;---- Variable 'adr' assigned to Register 'DPTR' ----
0000 8F82 MOV DPL,R7
0002 8E83 MOV DPH,R6
; SOURCE LINE # 114
; SOURCE LINE # 115
;---- Variable 'oldDPP' assigned to Register 'R7' ----
0004 AF84 MOV R7,DPP
; SOURCE LINE # 116
;---- Variable 'val' assigned to Register 'R6' ----
; SOURCE LINE # 117
0006 758403 MOV DPP,#03H
; SOURCE LINE # 118
0009 E0 MOVX A,@DPTR
; SOURCE LINE # 119
000A 8F84 MOV DPP,R7
; SOURCE LINE # 120
000C FF MOV R7,A
; SOURCE LINE # 121
000D ?C0020:
000D 22 RET
; FUNCTION _ReadEXTRAM (END)
; FUNCTION _WriteEXTRAM (BEGIN)
; SOURCE LINE # 122
;---- Variable 'val' assigned to Register 'R5' ----
;---- Variable 'adr' assigned to Register 'DPTR' ----
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 10
0000 8F82 MOV DPL,R7
0002 8E83 MOV DPH,R6
; SOURCE LINE # 123
; SOURCE LINE # 124
;---- Variable 'oldDPP' assigned to Register 'R7' ----
0004 AF84 MOV R7,DPP
; SOURCE LINE # 125
0006 758403 MOV DPP,#03H
; SOURCE LINE # 126
0009 ED MOV A,R5
000A F0 MOVX @DPTR,A
; SOURCE LINE # 127
000B 8F84 MOV DPP,R7
; SOURCE LINE # 128
000D 22 RET
; FUNCTION _WriteEXTRAM (END)
; FUNCTION _WriteToUART (BEGIN)
; SOURCE LINE # 138
0000 8E00 R MOV count,R6
0002 8F00 R MOV count+01H,R7
; SOURCE LINE # 139
; SOURCE LINE # 141
0004 E4 CLR A
0005 F500 R MOV tmp,A
0007 F500 R MOV tmp+01H,A
; SOURCE LINE # 142
0009 7BFF MOV R3,#0FFH
000B 7A00 R MOV R2,#HIGH ?SC_0
000D 7900 R MOV R1,#LOW ?SC_0
000F 850000 E MOV ?_printf?BYTE+03H,NumChanel
0012 850000 E MOV ?_printf?BYTE+04H,NumChanel+01H
0015 120000 E LCALL _printf
; SOURCE LINE # 143
0018 E4 CLR A
0019 F500 R MOV i,A
001B F500 R MOV i+01H,A
001D ?C0022:
001D D3 SETB C
001E E500 R MOV A,i+01H
0020 9500 R SUBB A,count+01H
0022 E500 R MOV A,i
0024 9500 R SUBB A,count
0026 5025 JNC ?C0023
; SOURCE LINE # 144
; SOURCE LINE # 145
0028 AE00 R MOV R6,i
002A AF00 R MOV R7,i+01H
002C 120000 R LCALL _ReadEXTRAM
002F 750000 R MOV tmp,#00H
0032 8F00 R MOV tmp+01H,R7
; SOURCE LINE # 147
0034 7BFF MOV R3,#0FFH
0036 7A00 R MOV R2,#HIGH ?SC_29
0038 7900 R MOV R1,#LOW ?SC_29
003A 850000 E MOV ?_printf?BYTE+03H,tmp
003D 850000 E MOV ?_printf?BYTE+04H,tmp+01H
0040 120000 E LCALL _printf
; SOURCE LINE # 148
0043 0500 R INC i+01H
0045 E500 R MOV A,i+01H
0047 70D4 JNZ ?C0022
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 11
0049 0500 R INC i
004B ?C0052:
004B 80D0 SJMP ?C0022
004D ?C0023:
; SOURCE LINE # 149
004D 7BFF MOV R3,#0FFH
004F 7A00 R MOV R2,#HIGH ?SC_33
0051 7900 R MOV R1,#LOW ?SC_33
0053 020000 E LJMP _printf
; FUNCTION _WriteToUART (END)
; FUNCTION _WriteValue (BEGIN)
; SOURCE LINE # 162
0000 8E00 R MOV Value,R6
0002 8F00 R MOV Value+01H,R7
;---- Variable 'Channel' assigned to Register 'R4/R5' ----
; SOURCE LINE # 163
; SOURCE LINE # 164
0004 ED MOV A,R5
0005 6500 R XRL A,OldChanel+01H
0007 7003 JNZ ?C0053
0009 EC MOV A,R4
000A 6500 R XRL A,OldChanel
000C ?C0053:
000C 6014 JZ ?C0026
; SOURCE LINE # 165
; SOURCE LINE # 166
000E E500 R MOV A,IndexMas+01H
0010 1500 R DEC IndexMas+01H
0012 7002 JNZ ?C0054
0014 1500 R DEC IndexMas
0016 ?C0054:
0016 14 DEC A
0017 FF MOV R7,A
0018 AE00 R MOV R6,IndexMas
001A 120000 R LCALL _WriteToUART
; SOURCE LINE # 167
001D E4 CLR A
001E F500 R MOV IndexMas,A
0020 F500 R MOV IndexMas+01H,A
; SOURCE LINE # 168
0022 ?C0026:
; SOURCE LINE # 169
0022 AE00 R MOV R6,IndexMas
0024 AF00 R MOV R7,IndexMas+01H
0026 AD00 R MOV R5,Value+01H
0028 120000 R LCALL _WriteEXTRAM
; SOURCE LINE # 171
002B 0500 R INC IndexMas+01H
002D E500 R MOV A,IndexMas+01H
002F 7002 JNZ ?C0055
0031 0500 R INC IndexMas
0033 ?C0055:
; SOURCE LINE # 172
0033 C3 CLR C
0034 9500 R SUBB A,CountMas+01H
0036 E500 R MOV A,IndexMas
0038 9500 R SUBB A,CountMas
003A 4014 JC ?C0028
; SOURCE LINE # 173
; SOURCE LINE # 174
003C E500 R MOV A,IndexMas+01H
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 12
003E 1500 R DEC IndexMas+01H
0040 7002 JNZ ?C0056
0042 1500 R DEC IndexMas
0044 ?C0056:
0044 14 DEC A
0045 FF MOV R7,A
0046 AE00 R MOV R6,IndexMas
0048 120000 R LCALL _WriteToUART
; SOURCE LINE # 175
004B E4 CLR A
004C F500 R MOV IndexMas,A
004E F500 R MOV IndexMas+01H,A
; SOURCE LINE # 176
; SOURCE LINE # 177
0050 ?C0028:
0050 22 RET
; FUNCTION _WriteValue (END)
; FUNCTION main (BEGIN)
; SOURCE LINE # 187
; SOURCE LINE # 188
; SOURCE LINE # 189
0000 E4 CLR A
0001 F500 R MOV grad+03H,A
0003 F500 R MOV grad+02H,A
0005 F500 R MOV grad+01H,A
0007 F500 R MOV grad,A
; SOURCE LINE # 190
0009 F500 R MOV c,A
; SOURCE LINE # 191
000B F500 R MOV svet,A
; SOURCE LINE # 192
000D F500 R MOV tmpVal,A
000F F500 R MOV tmpVal+01H,A
; SOURCE LINE # 194
0011 758DFD MOV TH1,#0FDH
; SOURCE LINE # 195
0014 758920 MOV TMOD,#020H
; SOURCE LINE # 196
0017 758840 MOV TCON,#040H
; SOURCE LINE # 197
001A 759850 MOV SCON,#050H
; SOURCE LINE # 198
001D 53877F ANL PCON,#07FH
; SOURCE LINE # 199
0020 D299 SETB TI
; SOURCE LINE # 200
0022 D298 SETB RI
; SOURCE LINE # 202
0024 5388C0 ANL TCON,#0C0H
; SOURCE LINE # 203
0027 5389F0 ANL TMOD,#0F0H
; SOURCE LINE # 204
002A 438901 ORL TMOD,#01H
; SOURCE LINE # 205
002D 758AFE MOV TL0,#0FEH
; SOURCE LINE # 206
0030 758C32 MOV TH0,#032H
; SOURCE LINE # 207
0033 75A89A MOV IE,#09AH
; SOURCE LINE # 209
0036 75EF7C MOV ADCCON1,#07CH
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 13
; SOURCE LINE # 210
0039 438810 ORL TCON,#010H
; SOURCE LINE # 212
003C ?C0032:
; SOURCE LINE # 213
003C 308DFD JNB TF0,?C0032
003F ?C0033:
; SOURCE LINE # 214
003F 5388C0 ANL TCON,#0C0H
; SOURCE LINE # 216
0042 7B00 MOV R3,#00H
0044 7A00 R MOV R2,#HIGH c
0046 7900 R MOV R1,#LOW c
0048 120000 R LCALL _ScanKBOnce
004B 5009 JNC ?C0034
; SOURCE LINE # 217
004D AF00 R MOV R7,c
004F 120000 R LCALL _chrtoint
0052 8E00 R MOV NumChanel,R6
0054 8F00 R MOV NumChanel+01H,R7
0056 ?C0034:
; SOURCE LINE # 222
0056 C3 CLR C
0057 E500 R MOV A,NumChanel+01H
0059 9409 SUBB A,#09H
005B E500 R MOV A,NumChanel
005D 9400 SUBB A,#00H
005F 5013 JNC ?C0035
; SOURCE LINE # 228
0061 E500 R MOV A,NumChanel+01H
0063 14 DEC A
0064 FF MOV R7,A
0065 7401 MOV A,#01H
0067 A807 MOV R0,AR7
0069 08 INC R0
006A 8002 SJMP ?C0058
006C ?C0057:
006C C3 CLR C
006D 33 RLC A
006E ?C0058:
006E D8FC DJNZ R0,?C0057
0070 F500 R MOV svet,A
0072 8003 SJMP ?C0036
0074 ?C0035:
; SOURCE LINE # 230
0074 7500FF R MOV svet,#0FFH
0077 ?C0036:
; SOURCE LINE # 231
0077 AD00 R MOV R5,svet
0079 7F07 MOV R7,#07H
007B 7E00 MOV R6,#00H
007D 120000 R LCALL _WriteMax
; SOURCE LINE # 232
0080 C3 CLR C
0081 E500 R MOV A,NumChanel+01H
0083 9409 SUBB A,#09H
0085 E500 R MOV A,NumChanel
0087 9400 SUBB A,#00H
0089 506D JNC ?C0037
; SOURCE LINE # 233
; SOURCE LINE # 235
008B E5D8 MOV A,ADCCON2
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 14
008D 54F0 ANL A,#0F0H
008F 4500 R ORL A,NumChanel+01H
0091 F5D8 MOV ADCCON2,A
; SOURCE LINE # 236
0093 D2DC SETB SCONV
0095 ?C0038:
; SOURCE LINE # 237
0095 E5F5 MOV A,ADCCON3
0097 20E7FB JB ACC.7,?C0038
009A ?C0039:
; SOURCE LINE # 239
009A E5DA MOV A,ADCDATAH
009C 540F ANL A,#0FH
009E ADD9 MOV R5,ADCDATAL
00A0 F500 R MOV tmpVal,A
00A2 ED MOV A,R5
00A3 F500 R MOV tmpVal+01H,A
; SOURCE LINE # 241
00A5 E500 R MOV A,NumChanel+01H
00A7 6408 XRL A,#08H
00A9 4500 R ORL A,NumChanel
00AB 703E JNZ ?C0040
; SOURCE LINE # 242
; SOURCE LINE # 243
00AD AC00 R MOV R4,tmpVal
00AF 120000 E LCALL ?C?FCASTI
00B2 7BF6 MOV R3,#0F6H
00B4 7A28 MOV R2,#028H
00B6 791C MOV R1,#01CH
00B8 783F MOV R0,#03FH
00BA 120000 E LCALL ?C?FPMUL
00BD A804 MOV R0,AR4
00BF A905 MOV R1,AR5
00C1 AA06 MOV R2,AR6
00C3 AB07 MOV R3,AR7
00C5 7F00 MOV R7,#00H
00C7 7EC0 MOV R6,#0C0H
00C9 7D28 MOV R5,#028H
00CB 7C44 MOV R4,#044H
00CD 120000 E LCALL ?C?FPSUB
00D0 E4 CLR A
00D1 FB MOV R3,A
00D2 FA MOV R2,A
00D3 7940 MOV R1,#040H
00D5 7840 MOV R0,#040H
00D7 120000 E LCALL ?C?FPDIV
00DA 8F00 R MOV grad+03H,R7
00DC 8E00 R MOV grad+02H,R6
00DE 8D00 R MOV grad+01H,R5
00E0 8C00 R MOV grad,R4
; SOURCE LINE # 244
00E2 120000 E LCALL ?C?CASTF
00E5 AD00 R MOV R5,NumChanel+01H
00E7 AC00 R MOV R4,NumChanel
; SOURCE LINE # 245
00E9 8008 SJMP ?C0059
00EB ?C0040:
; SOURCE LINE # 246
00EB AD00 R MOV R5,NumChanel+01H
00ED AC00 R MOV R4,NumChanel
00EF AF00 R MOV R7,tmpVal+01H
00F1 AE00 R MOV R6,tmpVal
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 15
00F3 ?C0059:
00F3 120000 R LCALL _WriteValue
; SOURCE LINE # 247
00F6 8009 SJMP ?C0042
00F8 ?C0037:
; SOURCE LINE # 248
00F8 7BFF MOV R3,#0FFH
00FA 7A00 R MOV R2,#HIGH ?SC_44
00FC 7900 R MOV R1,#LOW ?SC_44
00FE 120000 E LCALL _printf
0101 ?C0042:
; SOURCE LINE # 249
0101 850000 R MOV OldChanel,NumChanel
0104 850000 R MOV OldChanel+01H,NumChanel+01H
; SOURCE LINE # 252
0107 758AFE MOV TL0,#0FEH
; SOURCE LINE # 253
010A 758C32 MOV TH0,#032H
; SOURCE LINE # 254
010D 438810 ORL TCON,#010H
; SOURCE LINE # 255
; SOURCE LINE # 256
0110 020000 R LJMP ?C0032
; FUNCTION main (END)
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 16
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
NumChanel. . . . . . . . . . . . . . . PUBLIC DATA U_INT 0000H 2
SCONV. . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00DCH 1
IE . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A8H 1
_WriteValue. . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
Value. . . . . . . . . . . . . . . . AUTO DATA U_INT 0000H 2
Channel. . . . . . . . . . . . . . . * REG * DATA U_INT 0004H 2
_WriteToUART . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
count. . . . . . . . . . . . . . . . AUTO DATA U_INT 0000H 2
i. . . . . . . . . . . . . . . . . . AUTO DATA U_INT 0002H 2
tmp. . . . . . . . . . . . . . . . . AUTO DATA U_INT 0004H 2
size_t . . . . . . . . . . . . . . . . TYPEDEF ----- U_INT ----- 2
_printf. . . . . . . . . . . . . . . . EXTERN CODE PROC ----- -----
RI . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0098H 1
_ScanKBOnce. . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
ch . . . . . . . . . . . . . . . . . AUTO DATA PTR 0000H 3
row. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
col. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
rownum . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
colnum . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0004H 1
i. . . . . . . . . . . . . . . . . . * REG * DATA U_INT 0002H 2
TI . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0099H 1
IndexMas . . . . . . . . . . . . . . . PUBLIC DATA U_INT 0002H 2
I2CCON . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00E8H 1
DCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00E8H 1
_ReadMax . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
regnum . . . . . . . . . . . . . . . * REG * DATA PTR 0082H 2
oldDPP . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
val. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
main . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
grad . . . . . . . . . . . . . . . . AUTO DATA FLOAT 0000H 4
c. . . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0004H 1
svet . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0005H 1
tmpVal . . . . . . . . . . . . . . . AUTO DATA U_INT 0006H 2
ADCDATAH . . . . . . . . . . . . . . . SFR DATA U_CHAR 00DAH 1
CountMas . . . . . . . . . . . . . . . PUBLIC DATA U_INT 0004H 2
ADCDATAL . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D9H 1
PCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0087H 1
SCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0098H 1
TMOD . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0089H 1
TCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0088H 1
_WriteMax. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
regnum . . . . . . . . . . . . . . . * REG * DATA PTR 0082H 2
val. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
oldDPP . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
_?ix1000 . . . . . . . . . . . . . . . STATIC CODE ARRAY 0045H 11
TF0. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 008DH 1
TH0. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008CH 1
TH1. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008DH 1
TL0. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008AH 1
_ReadEXTRAM. . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adr. . . . . . . . . . . . . . . . . * REG * DATA PTR 0082H 2
oldDPP . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
val. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
ADCCON1. . . . . . . . . . . . . . . . SFR DATA U_CHAR 00EFH 1
ADCCON2. . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D8H 1
conv_val . . . . . . . . . . . . . . . PUBLIC XDATA ARRAY 0000H 254
ADCCON3. . . . . . . . . . . . . . . . SFR DATA U_CHAR 00F5H 1
C51 COMPILER V9.00 HELLO 12/30/2010 14:08:56 PAGE 17
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
_WriteEXTRAM . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adr. . . . . . . . . . . . . . . . . * REG * DATA PTR 0082H 2
val. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
oldDPP . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
DPP. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0084H 1
OldChanel. . . . . . . . . . . . . . . PUBLIC DATA U_INT 0006H 2
_chrtoint. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
ch . . . . . . . . . . . . . . . . . AUTO DATA CHAR 0000H 1
Digits . . . . . . . . . . . . . . . AUTO DATA ARRAY 0001H 11
sym. . . . . . . . . . . . . . . . . * REG * DATA U_INT 0006H 2
KBTable. . . . . . . . . . . . . . . . PUBLIC DATA ARRAY 0008H 17
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 663 ----
CONSTANT SIZE = 80 ----
XDATA SIZE = 254 ----
PDATA SIZE = ---- ----
DATA SIZE = 25 31
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 3 WARNING(S), 0 ERROR(S)
Описание основных блоков:
1.
unsigned char ReadEXTRAM(unsigned char xdata *adr)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MyData;
val=*adr;
DPP=oldDPP;
return val;
}
Данная функция читает из внеш.ОЗУ из страницы, номер которой записан в переменную MyData (0х3) (см. начало программы описание переменных), по адресу adr и возвращает значение, хранящееся в ячейке по этому адресу.
2.
void WriteEXTRAM(unsigned char xdata *adr,unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MyData;// третья страница памяти
*adr=val;
DPP=oldDPP;// возвращаем старое значение
}
Данная функция является аналогом ReadEXTRAM, только используется для записи: пишем в ячейку с адресом adr значение переменной val.
3.
void WriteToUART(unsigned short count)
{
unsigned short i;// счетчик
unsigned short tmp=0;
printf ("ADC Channel: %d\nData start:\n", NumChanel);// номер канала и служебное слово
for (i=0;i<=count;i++)
{
tmp=ReadEXTRAM(i);
//val=conv_val[i];
printf ("%d\n", tmp);// передача данных
}
printf ("Data stop\n");// конец вывода данных
}
Данная функция вызывает чтение из внешней памяти (ReadEXTRAM) и записывает в COM-Port.
4.
void WriteValue(unsigned short Value,unsigned short Channel)
{
if (Channel!=OldChanel)// если был сменен канал нужно вывести данные
{
WriteToUART(--IndexMas);// вывод
IndexMas=0;// данные выведены можно заполнять массив сначала
}
WriteEXTRAM(IndexMas,Value);// пишем во внешнее ОЗУ
//conv_val[IndexMas]=Value;// пишем данные во внешнее ОЗУ
IndexMas++;// увеличиваем индекс
if (IndexMas>=CountMas)// Проверяем не конец ли это массива
{
WriteToUART(--IndexMas);// если массив заполнен выведем данные
IndexMas=0;// данные выведены можно заполнять массив сначала
}
}
Данная функция методом комбинирования вышеописанных функций выводит данные, если канал был сменен (т.е. срабатывает при смене канала, когда нажата клавиша). Затем когда данные выведены, заполняет массив снова и пишет во внеш.ОЗУ и выводит в COM-Port.
|
МИВУ 230101.65 05 ПЗ |
Лист |
||||
55 |
||||||
Изм |
Лист |
№ документа |
Подпись |
Дата |