Разработка модуля ввода-вывода информации, сопрягаемого с ЭВМ через шину USB

Алгоритм функционирования модуля ввода-вывода аналоговой информации по шине USB с использованием микросхемы PDIUSBD12 фирмы Philips Semiconductors. Разработка интерфейса и исполнительной части модуля. Листинг программы обработки аналогового сигнала.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 30.11.2013
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Описание структурной схемы модуля

1.1 Канал вывода цифровой информации

1.2 Канал ввода аналоговой информации

2. Разработка функциональной схемы

2.1 Интерфейсные блоки модуля

2.2 Исполнительные блоки модуля

2.3 Временные диаграммы работы модуля ввода-вывода информации

3. Алгоритм функционирования модуля ввода-вывода информации

4. Разработка принципиальной схемы

4.1 Обоснование элементной базы

4.2 Разработка интерфейсной части модуля

4.3 Разработка исполнительной части модуля

4.4 Другие элементы модуля

4.5 Программа функционирования модуля ввода-вывода информации

4.6 Расчёт потребляемой мощности

5. Требования к объекту управления

Заключение

Список литературы

Приложение А. Перечень элементов

Введение

USB (Universal Serial Bus - универсальная последовательная шина) является промышленным стандартом расширения архитектуры персонального компьютера ориентированным на интеграцию с телефонией и устройствами бытовой электроники. Версия 1.0 была опубликована в январе 1996 года. Архитектура USB определяется следующими критериями:

· Легко реализуемое расширение периферии PC.

· Дешевое решение, поддерживающее скорость передачи до 12 Mбит/с.

· Полная поддержка в реальном времени передачи аудио и (сжатых) видеоданных.

· Гибкость протокола смешанной передачи изохронных данных и асинхронных сообщений.

· Интеграция с выпускаемыми устройствами.

· Доступность в PC всех конфигураций и размеров.

· Обеспечение стандартного интерфейса, способного быстро завоевать рынок.

· Создание новых классов устройств, расширяющих PC.

С точки зрения конечного пользователя, привлекательны следующие черты USB:

· Простота кабельной системы и подключений.

· Скрытие подробностей электрического подключения от конечного пользователя.

· Самоидентифицирующиеся ПУ, автоматическая связь устройств с драйверами и конфигурирование.

· Возможность динамического подключения и конфигурирования ПУ.

С середины 1996 года выпускаются PC со встроенным контроллером USB, реализуемым чипсетом. Уже появились модемы, клавиатуры, сканеры, динамики и другие устройства ввода/вывода с поддержкой USB, а также мониторов с USB-адаптерами - они играют роль концентраторов для подключения других устройств.

В версии 2.0, опубликованной в 2000 году, определена ещё и высокая скорость - 480 Мбит/с. Шина с использованием промежуточных концентраторов позволяет соединить устройства, удалённые от компьютера на расстояние до 25 метров.

Сегодня USB - это очень популярная универсальная последовательная шина. Она предназначена для легкого подключения различного вида устройств: клавиатуры, мыши, джойстики, колонки, модемы, мобильные телефоны, ленточные, дисковые, оптические и магнитооптические накопители, флэш-диски, сканеры и принтеры, словом все, что подключается к ПК.

1. Описание структурной схемы модуля

По требованиям технического задания (ТЗ) разрабатываемый модуль должен выполнять две функции:

Передачу цифровой информации (12 байт за один цикл обмена) объекту управления с частотой сигнала 2 кГц.

Приём аналоговой информации (импульсы переменной длительности 1-10 мсек.) от объекта управления (ОУ) с частотой сигнала 0,05 кГц. Максимальная ошибка преобразования - 0,4 %.

Анализируя техническое задание, можно сделать следующие предварительные выводы о структуре разрабатываемого модуля. Конструкция должна содержать следующие блоки:

- Специальное USB устройство - оно обычно используется совместно с микроконтроллером и связывается с ним по высокоскоростному 8 разрядному универсальному параллельному интерфейсу.

- Преобразователь аналогового сигнала в цифровой код. Для преобразования аналогового сигнала, поступающего от ОУ, в цифровой код будут использоваться двоичные счетчики. Для подсчета импульсов переменной длительности от 1 до 10 мс, согласно ТЗ, необходимо, чтобы погрешность преобразования не превышала 0,4 %. Это обозначает, что сигнал длительностью 1 мс должен быть определен с точностью до 0,004 мс. Такой период дискретизации обеспечивает максимальную ошибку преобразования импульсов переменной длительности. Значит, цифровой код на выходе блока преобразователя аналог-код должен иметь разрядность:

- Делители частоты - формируют строб СLK, поступающий с необходимой частотой на вход преобразователя цифрового сигнала.

- Микроконтроллер - управляет работой всех вышеперечисленных блоков модуля, формируя необходимые стробы, а также хранит данные, которые необходимо передавать/принимать ОУ или хосту.

Схема электрическая структурная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э 1.

Таким образом, анализируя ТЗ и функции модуля ввода-вывода информации, можно выделить два канала передачи данных.

1.1 Канал вывода цифровой информации

1. Если буфер передаваемых данных для ОУ не пустой, то в порт микроконтроллера, подключённый к шине данных, записывается цифровая информация.

2. Микроконтроллер ожидает появления сигнала Input с ОУ, свидетельствующий о том, что ОУ желает принять данные.

3. По приходу этого сигнала микроконтроллер выдает данные на шину.

4. Микроконтроллер посылает строб сопровождения Output, говорящий о том, что на шине данных находится информация, которую должен считать ОУ.

5. Передача продолжается до тех пор, пока модуль ввода/вывода не передаст все 12 байт.

6. Передача данных ОУ завершается, и микроконтроллер переходит к пункту 1.

Подсчёт байт, переданных ОУ будет осуществляться программно.

1.2 Канал ввода аналоговой информации

аналоговый алгоритм листинг интерфейс

1. Микроконтроллер проверяет состояние сигнала Data_ok, идущего с триггера говорящий о том, что с ОУ поступил аналоговый сигнал.

2. Микроконтроллер ожидает перехода сигнала Data (аналоговый сигнал с ОУ) в низкий (нулевой) уровень, т. е. свидетельствует об окончании передачи импульса переменной длительности.

3. Получив этот сигнал, микроконтроллер начинает принимать данные с блока преобразования код-аналог.

4. После того, как все данные переданы, микроконтроллер посылает сигнал Start_CT, который сбрасывает счетчики импульсов и триггер, с выхода которого передается сигнал ОУ Data_ok, говорящий о том, что микроконтроллер готов принимать новые данные.

5. Микроконтроллер переходит к пункту 1.

Преобразование очередных данных в блоке преобразователя аналог-кода осуществляется по сигналу Clk, который поступает с выхода блока делителя частоты.

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

2. Разработка функциональной схемы

Функциональную схему, исходя из структурной схемы (ПУКП. 020100. 000Э 1), можно представить как совокупность интерфейсных и исполнительных элементов, которые взаимодействуют между собой. Интерфейсными элементами являются блоки, которые отвечают за связь разрабатываемого модуля ввода-вывода информации с ЭВМ. Под исполнительными элементами понимаются блоки, отвечающие за непосредственное выполнение основных функций модуля, таких как преобразование аналогового сигнала в цифровой код, деление частоты и т. д.

Микроконтроллер организует функционирование модуля, путём формирования управляющих стробов, а также связывает интерфейсную и исполнительную части разрабатываемого модуля. В качестве микроконтроллера выбрана микросхема 83C152JA фирмы Intel, имеющая 5 портов ввода-вывода. Таким образом, просматривается следующее деление модуля.

Интерфейсная часть:

- Специальное USB устройство, в качестве которого выбрана готовая микросхема PDIUSBD12 фирмы Philips Semiconductors. PDIUSBD12 полностью соответствует USB спецификации версии 2.0.

Исполнительная часть:

- Делитель частоты.

- Преобразователь аналогового сигнала в цифровой код.

Такое разбиение разрабатываемого модуля ввода-вывода информации на два типа элементов упрощает понимание его работы, так как происходит разделение управляющих и исполнительных функций.

Схема электрическая функциональная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э 2

2.1 Интерфейсные блоки модуля

Специальное USB устройство PDIUSBD12.

Данный блок взаимодействует с блоком микроконтроллера Intel 83C152JA посредством следующих сигналов:

А 0 - данный сигнал отвечает за выборку фазы команд (А 0=1) и фазы данных (А 0=0) и должен формироваться программно;

INT_N - данный сигнал формируется PDIUSBD12 и сообщает микроконтроллеру о том что необходимо принять данные от хоста или передать данные в хост (активный 0 уровень);

WR - с помощью данного строба происходит запись информации из микроконтроллера в порт PDIUSBD12 (активный уровень 0);

RD - с помощью данного строба происходит чтение информации из порта PDIUSBD12 в микроконтроллер (активный 0 уровень);

CLKOUT - сигнал синхронизации для микроконтроллера;

Data<0> ... Data<7> - восьмиразрядную шину данных, через которую осуществляется передача данных между микроконтроллером и PDIUSBD12.

XTAL1 и XTAL2 - входы, для подключения кварцевый резонатор РК 169МВ-7АП с частотой 6MГц;

СS_N - (выбор чипа) подаётся активный уровень 0 (земля);

ALE - (включение закрытия адреса) подаётся 0 для разделения конфигурации шины адрес/данные.

2.2 Исполнительные блоки модуля

Блок делителей частоты.

Данная схема необходима для получения сигнала Clk, который должен следовать с частотой F на преобразователь аналог-код. Период дискретизации Т = 0,004 мс (см. п. 1) соответствует частоте сигнала F = 250 кГц.

Этот сигнал можно получить путем деления сигнала CLKOUT с USB-устройства на 6.000.000 / 250.000 = 24 (соответствует 11000). Это можно осуществить при помощи двух четырехразрядных двоичных счетчиков и логических элементов.

Блок преобразователя аналогового сигнала в цифровой код.

Данная схема необходима для преобразования сигнала переменной длительности от 1 до 10 мс в цифровой код. Для этого будут использоваться реверсивные счетчики. На вход разрешения счета +1 поступает сигнал с логического элемента "И", на вход которого поступает сигнал с блока делителя частоты Clk и аналоговый сигнал с ОУ Data. Сигнал высокого уровня на выходе логического элемента появится и на счетном входе, и счетчик начинает работать в режиме прямого счета.

Для подсчета импульсов переменной длительности от 1 до 10 мс, с точностью до 0,004 мс (см. п. 1), потребуется три четырехразрядных двоичных счетчика и два логических элемента "НЕ".

Для корректной работы микроконтроллера используется D-триггер, который устанавливается в 1 по фронту импульса с ОУ, это используется для того, чтобы микроконтроллер смог отследить все приходящие от ОУ импульсы и посылать ОУ сигнал Data_OK о готовности принять следующий пакет данных. Сброс триггера осуществляется одновременно с счетчиками импульсов сигналом Start_CT, формируемым программно.

2.3 Временные диаграммы работы модуля ввода-вывода информации

Для пояснения принципа функционирования разрабатываемого модуля приводятся временные диаграммы для основных сигналов. На рисунке 2.1 приведены временные диаграммы для канала ввода аналоговой информации, а на рисунке 2.2 - временные диаграммы для канала вывода цифровой информации.

Рисунок 2.1 - Временные диаграммы для канала ввода аналоговой информации

По поступлению аналогового сигнала формируется строб наличия данных Data_ok.

Преобразование данных от ОУ начинается по высокому уровню импульса CLK с делителя частоты и аналоговому сигналу Data. На счетный вход счетчика импульсов преобразователя аналог-код поступает сигнал Ready.

На выходах счетчиков формируется цифровой код ID0 ID11. Микроконтроллер по спаду аналогового сигнала и высокому уровню сигнала Data_ok считывает цифровой код и формирует строб Start_CT, по которому счетчики устанавливаются в состояние "логического нуля", и сбрасывается сигнал наличия данных.

По наличию низкого уровня сигнала Data_ok на входе ОУ передача очередного импульса данных может быть начата.

Рисунок 2.2 - Временные диаграммы для канала вывода цифровой информации

Передача данных объекту управления из модуля ввода-вывода начинается установкой строба Input в 1 уровень.

Установка строба Input, поступающему с объекта управления указывает, что ОУ желает принять данные от модуля ввода-вывода. Микроконтроллер выдает на шину данных байт Data 0, и сопровождает его стробом Output, говорящим, что на шине данные, которые надо считать. ОУ принимает данные.

По фронту сигнала Output ОУ сбрасывает сигнал запроса на прием данных Input. По спаду Input строб сопровождения передачи данных сбрасывается. Микроконтроллер ожидает появления запроса на передачу данных.

3. Алгоритм функционирования модуля ввода-вывода информации

Алгоритм функционирования модуля ввода-вывода информации оформлен в виде блок-схемы и изображён на рисунке 3.1.

Рисунок 3.1 - Макроуровень программы функционирования модуля

Макроуровень программы состоит из блоков, которые оформлены в виде процедур:

- "Подключение к шине USB" (USB_Data);

- "Обслуживание запросов от PDIUSBD12" (Int_USB);

- "Обслуживание ОУ" (Proc_OY).

Блок-схемы алгоритмов основных процедур показаны на рисунках 3.2 - 3.9.

Рисунок 3.2 - Процедура подключения к шине USB (USB_Data)

Рисунок 3.3 - Алгоритм процедуры обслуживания прерывания (Int_USB)

Рисунок 3.4 - Алгоритм процедуры Process_EP0_OUT_Interrupt

Рисунок 3.5 - Алгоритм процедуры D11WriteEndpoint

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

Рисунок 3.6 - Алгоритм процедуры D12_ReadEndpoint

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

Рисунок 3.7 - Алгоритм процедуры Proc_OU

Для вывода данных из модуля ввода-вывода вызывается процедура OUT_OU.

Для ввода данных из объекта управления вызывается процедура INP_OU.

Рисунок 3.8 - Алгоритм процедуры INT _OU

Рисунок 3.9 - Алгоритм процедуры OUT _OU

4. Разработка принципиальной схемы

Схема электрическая принципиальная модуля ввода-вывода информации имеет шифр ПУКП. 020100. 000Э 3.

4.1 Обоснование элементной базы

При выборе элементной базы руководствовались такими параметрами микросхем, как быстродействие, разрядность, потребляемая мощность, функциональное и электрическое сопряжение и другие параметры. Таким образом, для построения модуля ввода-вывода информации используются цифровые микросхемы серии КР 1533. Маломощные цифровые интегральные микросхемы серии КР 1533 предназначены для организации высокоскоростного обмена и обработки цифровой информации, временного и электрического согласования сигналов в вычислительных системах.

Выбор данной серии основан на том, что цифровые микросхемы этой серии имеют наиболее подходящие параметры для разрабатываемого устройства сопряжения, по сравнению с другими сериями, а именно:

- малые входные токи (I1вх< 0,02 мА, I0вх< - 0,2 мА)

- относительно высокое быстродействие (средняя задержка при переходах "0®1" и "1®0" 4 нс);

- относительно малая потребляемая мощность (Pпот<1 мВт на один логический элемент);

- питание микросхем от +5 В, которое можно получить с шины USB.

В качестве микроконтроллера выбрана микросхема 83C152JA фирмы Intel, имеющая 5 портов ввода-вывода.

4.2 Разработка интерфейсной части модуля

Специальное USB устройство PDIUSBD12.

Этот узел представлен на принципиальной схеме модуля элементом DD10. Блок состоит из микросхемы PDIUSBD12, которая соединяется с блоком микроконтроллера Intel 83C152JA (DD9) через восьмиразрядную шину данных DU0…DU7. Узел соединяется с шиной USB посредством линий D+ и D-. К линии D+ подсоединён согласующий резистор номиналом 1,5 кОм, данный резистор уже встроен в PDIUSBD12 и может быть подключён программным путём. Данный тип подключения свидетельствует, что устройство, присоединяемое к шине USB, является полно скоростным.

4.3 Разработка исполнительной части модуля

Блок делителей частоты.

Данный блок представлен на принципиальной схеме двумя четырехразрядными двоичными реверсивными счётчиками DD1 и DD2, логическими элементами "И" DD5.1 и "НЕ" DD4.1. В качестве микросхем выбраны КР 1533ИЕ 7, КР 1533ЛИ 1 и КР 1533ЛН 1. Счетчик обеспечивает деление деления сигнала CLKOUT с USB-устройства на 16. Низкий уровень сигнала с выхода прямого переноса поступает на инвертор и служит сигналом для разрешения счета на счетчиках блока аналог-код.

Блок преобразователя аналогового сигнала в цифровой код.

Данный блок представлен на принципиальной схеме микросхемами трех четырехразрядных двоичных реверсивных счётчиков КР 1533ИЕ 7 (DD6…DD8), логическим элементом "И" КР 1533ЛИ 1 (DD5.2) и инверторами "НЕ" КР 1533ЛН 1 (DD4.2…DD4.3). На элемент "И" поступают сигналы с блока делителя частоты Clk и аналоговый сигнал с ОУ Data. Когда на выходе логического элемента появится сигнал высокого уровня, запускается счетный вход счетчика DD6. Таким образом, происходит счет импульсов, идущих с делителя частоты, которые формируют код, соответствующий поступающему с ОУ импульсу переменной длительности.

4.4 Другие элементы модуля

Объект управления подключается через разъем X1, в качестве которого взят разъем СНП 37. Этот разъем имеет 20 выводов, 12 выводов используются для подключения объекта управления к модулю, а остальные остаются не подключёнными, это можно использовать для дальнейшей модификации модуля. Также, немало важно то, что разъем СНП 37 обеспечивает передачу как цифровых, так и аналоговых сигналов.

С шиной USB разработанный модуль ввода-вывода информации подключается обычным образом, то есть с помощью разъёма X2, в качестве которого взят стандартный USB разъём USBA-1J (тип А), одинарной конструкции, применяемый в качестве узла коммутации для персональных компьютеров и периферийных устройств.

Уровень логической "1" организуется подачей напряжения +5 В с шины USB через токоограничивающий резистор R1 с номиналом 2 кОм.

К каждые 3 - 4 DIP-корпуса цифровых микросхем подключается керамический конденсатор емкостью 68 пФ (на принципиальной схеме конденсаторы C3..C7). Также подключается один общий электролитический конденсатор С 2, емкостью 47 мкФ.

4.5 Программа функционирования модуля ввода-вывода информации

Листинг программы функционирования модуля приведён ниже.

#include <pic.h>

#include <stdio.h>

#include <string.h>

#include "usbfull.h"

/*описание стандартных дескрипторов USB*/

const USB_DEVICE_DESCRIPTOR DeviceDescriptor = {

sizeof(USB_DEVICE_DESCRIPTOR), /* Длинна дескриптора */

TYPE_DEVICE_DESCRIPTOR, /* Тип дескриптора */

0x0110, /* Версия USB Version 1.1 */

0, /* bDeviceClass */

0, /* bDeviceSubclass */

0, /* bDeviceProtocol */

64, /* размер пакета bMaxPacketSize 64Bytes */

0x0000, /* Производитель idVendor */

0x0000, /* Продукт idProduct (USB Thermometer Example) */

0x0001, /* Версия устройства bcdDevice */

1, /* iManufacturer String Index */

0, /* iProduct String Index */

0, /* iSerialNumber String Index */

1 /* число конфигураций bNumberConfigurations */

},

const USB_CONFIG_DATA ConfigurationDescriptor = {

{ /* configuration descriptor */

sizeof(USB_CONFIGURATION_DESCRIPTOR), /* bLength */

TYPE_CONFIGURATION_DESCRIPTOR, /* bDescriptorType */

sizeof(USB_CONFIG_DATA), /* wTotalLength */

1, /* bNumInterfaces */

1, /* bConfigurationValue */

0, /* iConfiguration String Index */

0x40, /* питание автономное*/

0x85 /* bMaxPower, 133 mA */

},

{ /* interface descriptor */

sizeof(USB_INTERFACE_DESCRIPTOR), /* bLength */

TYPE_INTERFACE_DESCRIPTOR, /* bDescriptorType */

0, /* Номер интерфейса */

0, /* bAlternateSetting */

0x2, /* Количество точек */

0xFF, /* Класс интерфейса(Производителя) */

0xFF, /* Класс интерфейса (Производителя) */

0xFF, /* Протокол интерфейса (Производителя) */

0 /* iInterface String Index */

},

{ /* Дескриптор точки*/

sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */

TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */

0x82, /* точка 2 ввода */

0х1, /* точка 1 вывода */

0x11, /* bmAttributes - прерывание */

0x0064, /* wMaxPacketSize */

0x10 /* для передач данных - bInterval */

},

{ /* endpoint descriptor */

sizeof(USB_ENDPOINT_DESCRIPTOR), /* bLength */

TYPE_ENDPOINT_DESCRIPTOR, /* bDescriptorType */

0x81, /* bEndpoint Address EP1 IN */

0x03, /* bmAttributes - Interrupt */

0x0008, /* wMaxPacketSize */

0x10 /* bInterval */

}

};

const MANUFACTURER_DESCRIPTOR Manufacturer_Descriptor = { производитель */

sizeof(MANUFACTURER_DESCRIPTOR), /* bLenght */

TYPE_STRING_DESCRIPTOR, /* bDescriptorType */

"m\0a\0r\0i\0n\0a\0" /* Название в UNICODE */

};

#define MAX_BUFFER_SIZE 80

bank1 unsigned char circularbuffer[MAX_BUFFER_SIZE];

unsigned char inpointer;

unsigned char outpointer;

unsigned char *pSendBuffer;

unsigned char BytesToSend;

unsigned char CtlTransferInProgress;

unsigned char DeviceAddress;

unsigned char DeviceConfigured;

#define PROGRESS_IDLE 0

#define PROGRESS_ADDRESS 3

void main (void)

{

TRISB = 0x03; /* Int & Suspend Inputs */

RB3 = 1; /* Device Not Configured (LED) */

RB2 = 0; /* Reset PDIUSBD12 */

I2C_Init();

RB2 = 1; /* Bring PDIUSBD12 out of reset */

USB_Data();

while(1) {

if (!P3.2) Int_USB(); /* если было прерывание */

else Proc_OU(); /* если не было прерывание */

}

}

void USB_Data(void)

{

unsigned char Buffer[2];

/* Установка адреса по умолчания и активация функции */

Buffer[0] = 0x80;

D11CmdDataWrite(D11_SET_ADDRESS_ENABLE, Buffer, 1);

/* Активировать конечную точку */

Buffer[0] = 0x01;

D11CmdDataWrite(D11_SET_ENDPOINT_ENABLE, Buffer, 1);

/* Установка режима - Enable SoftConnect */

Buffer[0] = 0x1E; /* ISO-i/o,SoftConnect ,no interrupt,clock,no lazy clock*/

D11CmdDataWrite(D11_SET_MODE, Buffer, 1);

}

void Int_USB(void)

{ unsigned short Irq;

unsigned char Buffer[1];

/* Считываем регистр прерываний */

D11CmdDataRead(D11_READ_INTERRUPT_REGISTER, (unsigned char *)&Irq, 2);

/*сброс по шине*/

if (Irq & D11_INT_BUS_RESET) {/**/

USB_Init();

}

/*конечная точка 0 out*/

if (Irq & D11_INT_EP0_OUT) {

Process_EP0_OUT_Interrupt();

}

/*конечная точка 0 in*/

if (Irq & D11_INT_EP0_IN)

if (CtlTransferInProgress == PROGRESS_ADDRESS) { /*передали адрес?*/

D11CmdDataWrite(D11_SET_ADDRESS_ENABLE,&DeviceAddress,1);

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);

CtlTransferInProgress = PROGRESS_IDLE;

}

else {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);

WriteBufferToEndPoint();

}

}

/*конечная точка 1 iout*/

if (Irq & D11_INT_EP1_OUT) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_OUT, Buffer, 1);

bytes = D11ReadEndpoint(D11_ENDPOINT_EP1_OUT, Buffer);

for (count = 0; count < bytes; count++) {

circularbuffer[inpointer++] = Buffer[count];

if (inpointer >= MAX_BUFFER_SIZE) inpointer = 0;

}

loadfromcircularbuffer(); //Kick Start

}

if (Irq & D11_INT_EP1_IN) {

printf("EP1_IN\n\r");

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_IN, Buffer, 1);

loadfromcircularbuffer();

}

if (Irq & D11_INT_EP2_OUT) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_OUT, Buffer, 1);

Buffer[0] = 0x01; /* Stall Endpoint */

D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_OUT, Buffer, 1);

}

if (Irq & D11_INT_EP2_IN) {

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_IN, Buffer, 1);

Buffer[0] = 0x01; /* Stall Endpoint */

D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_IN, Buffer, 1);

}

}

void Process_EP0_OUT_Interrupt(void)

{

unsigned long a;

unsigned char Buffer[2];

USB_SETUP_REQUEST SetupPacket;

/* Проверка типа пакета SETUP или DATA */

D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_OUT, &SetupPacket, 1);

if (SetupPacket.bmRequestType & D11_LAST_TRAN_SETUP) {

/* если это пакет установки считываем его */

D11ReadEndpoint(D11_ENDPOINT_EP0_OUT, &SetupPacket);

/* посылаем сигнал квитирования и очищаем буфер точки 0 OUT */

D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);

D11CmdDataWrite(D11_CLEAR_BUFFER, NULL, 0);

/* посылаем сигнал квитирования в точку 0 IN*/

D11CmdDataWrite(D11_ENDPOINT_EP0_IN, NULL, 0);

D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);

/* Рассматриваем тип запроса */

switch (SetupPacket.bmRequestType & 0x7F) {

case STANDARD_DEVICE_REQUEST:

/*стандартный запрос к устройству*/

switch (SetupPacket.bRequest) {

case GET_STATUS:

/* Remote Wakeup and Self Powered Status */

Buffer[0] = 0x01;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

case CLEAR_FEATURE:

/*выбор возможности*/

case SET_FEATURE:

ErrorStallControlEndPoint();

break;

case SET_ADDRESS:

/*установка адреса*/

DeviceAddress = SetupPacket.wValue | 0x80;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

CtlTransferInProgress = PROGRESS_ADDRESS;

break;

case GET_DESCRIPTOR:

/*дать дескриптор*/

GetDescriptor(&SetupPacket);

break;

case GET_CONFIGURATION:

/*дать конфигурацию*/

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, &DeviceConfigured, 1);

break;

case SET_CONFIGURATION:

/*установить конфигурацию*/

DeviceConfigured = SetupPacket.wValue & 0xFF;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

break;

//case SET_DESCRIPTOR:

default:

/* Unsupported - Request Error - Stall */

ErrorStallControlEndPoint();

break;

}

break;

case STANDARD_INTERFACE_REQUEST:

/*стандартный запрос к интерфейсу*/

switch (SetupPacket.bRequest) {

case GET_STATUS:

/* Дать стстус */

/* статус 0 */

Buffer[0] = 0x00;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

case SET_INTERFACE:

/* Device Only supports default setting, Stall may be */

/* returned in the status stage of the request */

if (SetupPacket.wIndex == 0 && SetupPacket.wValue == 0)

/* Interface Zero, Alternative Setting = 0 */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

else ErrorStallControlEndPoint();

break;

case GET_INTERFACE:

if (SetupPacket.wIndex == 0) { /* Interface Zero */

Buffer[0] = 0; /* Alternative Setting */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 1);

break;

} /* else fall through as RequestError */

//case CLEAR_FEATURE:

//case SET_FEATURE:

/* Interface has no defined features. Return RequestError */

default:

ErrorStallControlEndPoint();

break;

}

break;

case STANDARD_ENDPOINT_REQUEST:

/*Запрос к точке доступа*/

case CLEAR_FEATURE:

case SET_FEATURE:

/* Halt(Stall) feature required to be implemented on all Interrupt and */

/* Bulk Endpoints. It is not required nor recommended on the Default Pipe */

if (SetupPacket.wValue == ENDPOINT_HALT)

{

if (SetupPacket.bRequest == CLEAR_FEATURE) Buffer[0] = 0x00;

else Buffer[0] = 0x01;

switch (SetupPacket.wIndex & 0xFF) {

case 0x01 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_OUT, Buffer, 1);

break;

case 0x81 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_IN, Buffer, 1);

break;

case 0x02 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_OUT, Buffer, 1);

break;

case 0x82 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_IN, Buffer, 1);

break;

case 0x03 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_OUT, Buffer, 1);

break;

case 0x83 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_IN, Buffer, 1);

break;

default : /* Invalid Endpoint - RequestError */

ErrorStallControlEndPoint();

break;

}

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

} else {

/* No other Features for Endpoint - Request Error */

ErrorStallControlEndPoint();

}

break;

case GET_STATUS:

/* Get Status Request to Endpoint should return */

/* Halt Status in D0 for Interrupt and Bulk */

switch (SetupPacket.wIndex & 0xFF) {

case 0x01 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_OUT, Buffer, 1);

break;

case 0x81 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP1_IN, Buffer, 1);

break;

case 0x02 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_OUT, Buffer, 1);

break;

case 0x82 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP2_IN, Buffer, 1);

break;

case 0x03 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_OUT, Buffer, 1);

break;

case 0x83 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \

D11_ENDPOINT_EP3_IN, Buffer, 1);

break;

default : /* Invalid Endpoint - RequestError */

ErrorStallControlEndPoint();

break;

}

if (Buffer[0] & 0x08) Buffer[0] = 0x01;

else Buffer[0] = 0x00;

Buffer[1] = 0x00;

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

default:

/* Unsupported - Request Error - Stall */

ErrorStallControlEndPoint();

break;

}

break;

case VENDOR_DEVICE_REQUEST:

case VENDOR_ENDPOINT_REQUEST:

printf("Vendor Device bRequest = 0x%X, wValue = 0x%X, wIndex = 0x%X\n\r", \

SetupPacket.bRequest, SetupPacket.wValue, SetupPacket.wIndex);

switch (SetupPacket.bRequest) {

case VENDOR_GET_ANALOG_VALUE:

printf("Get Analog Value, Channel %x :",SetupPacket.wIndex & 0x07);

ADCON0 = 0xC1 | (SetupPacket.wIndex & 0x07) << 3;

/* Wait Acquistion time of Sample and Hold */

for (a = 0; a <= 255; a++);

ADGO = 1;

while(ADGO);

Buffer[0] = ADRESL;

Buffer[1] = ADRESH;

a = (Buffer[1] << 8) + Buffer[0];

a = (a * 500) / 1024;

printf(" Value = %d.%02d\n\r",(unsigned int)a/100,(unsigned int)a%100);

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);

break;

case VENDOR_SET_RB_HIGH_NIBBLE:

printf("Write High Nibble of PORTB\n\r");

PORTB = (PORTB & 0x0F) | (SetupPacket.wIndex & 0xF0);

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

break;

default:

ErrorStallControlEndPoint();

break;

}

break;

default:

printf("UnSupported Request Type 0x%X\n\r",SetupPacket.bmRequestType);

ErrorStallControlEndPoint();

break;

}

} else {

printf("Data Packet?\n\r");

/* This is a Data Packet */

}

}

/*Вернуть дескриптор*/

void GetDescriptor(PUSB_SETUP_REQUEST SetupPacket)

{

switch((SetupPacket->wValue & 0xFF00) >> 8) {

case TYPE_DEVICE_DESCRIPTOR:

/*дескриптор устройства*/

pSendBuffer = (const unsigned char *)&DeviceDescriptor;

BytesToSend = DeviceDescriptor.bLength;

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;

case TYPE_CONFIGURATION_DESCRIPTOR:

/*дескриптор конфигурации*/

SetupPacket->wLength, sizeof(ConfigurationDescriptor));

pSendBuffer = (const unsigned char *)&ConfigurationDescriptor;

BytesToSend = sizeof(ConfigurationDescriptor);

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;

case TYPE_STRING_DESCRIPTOR:

/*дескриптор строки*/

SetupPacket->wIndex, SetupPacket->wValue & 0xFF);

switch (SetupPacket->wValue & 0xFF){

case 0 : pSendBuffer = (const unsigned char *)&LANGID_Descriptor;

BytesToSend = sizeof(LANGID_Descriptor);

break;

case 1 : pSendBuffer = (const unsigned char *)&Manufacturer_Descriptor;

BytesToSend = sizeof(Manufacturer_Descriptor);

break;

default : pSendBuffer = NULL;

BytesToSend = 0;

}

if (BytesToSend > SetupPacket->wLength)

BytesToSend = SetupPacket->wLength;

WriteBufferToEndPoint();

break;

default:

ErrorStallControlEndPoint();

break;

}

}

/*читать точку*/

unsigned char D11ReadEndpoint(unsigned char Endpoint, unsigned char *Buffer)

{

unsigned char D11Header[2];

unsigned char BufferStatus = 0;

/* Проверяем буфер точки */

D11CmdDataRead(Endpoint, &BufferStatus, 1);

if(BufferStatus & 0x01)

{

/*читаем из буфера*/

D11CmdDataRead(D11_READ_BUFFER, D11Header, 2);

if(D11Header[1]) D11CmdDataRead(D11_READ_BUFFER, Buffer, D11Header[1]);

/* очищаем буфер*/

D11CmdDataWrite(D11_CLEAR_BUFFER, NULL, 0);

}

return D11Header[1];

}

/*записываем в точку*/

void D11WriteEndpoint(unsigned char Endpoint, const unsigned char *Buffer, unsigned char Bytes)

{

unsigned char D11Header[2];

unsigned char BufferStatus = 0;

D11Header[0] = 0x00;

D11Header[1] = Bytes;

D11CmdDataRead(Endpoint, &BufferStatus, 1);

/* записываем заголовок */

D11CmdDataWrite(D11_WRITE_BUFFER, D11Header, 2);

/* записываем в буфер*/

if (Bytes) D11CmdDataWrite(D11_WRITE_BUFFER, Buffer, Bytes);

/* Буфер полон */

D11CmdDataWrite(D11_VALIDATE_BUFFER, NULL, 0);

}

/*записываем буфер в точку*/

void WriteBufferToEndPoint(void)

{

if (BytesToSend == 0) {

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);

} else if (BytesToSend >= 64) {

/* считываем 64 байта и посылаем */

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, pSendBuffer, 8);

pSendBuffer += 64;

BytesToSend -= 64;

} else {

D11WriteEndpoint(D11_ENDPOINT_EP0_IN, pSendBuffer, BytesToSend);

BytesToSend = 0;

}

}

void loadfromcircularbuffer(void)

{

unsigned char Buffer[10];

unsigned char count;

// Read Buffer Full Status

D11CmdDataRead(D11_ENDPOINT_EP1_IN, Buffer, 1);

if (Buffer[0] == 0){

// Buffer Empty

if (inpointer != outpointer){

// We have bytes to send

count = 0;

do {

Buffer[count++] = circularbuffer[outpointer++];

if (outpointer >= MAX_BUFFER_SIZE) outpointer = 0;

if (outpointer == inpointer) break; // No more data

} while (count < 8); // Maximum Buffer Size

// Now load it into EP1_In

D11WriteEndpoint(D11_ENDPOINT_EP1_IN, Buffer, count);

}

}

}

/*команда записать*/

void D11CmdDataWrite(unsigned char Command, const unsigned char *Buffer, unsigned char Count)

{

I2C_Write(D11_CMD_ADDR, &Command, 1);

if(Count) I2C_Write(D11_DATA_ADDR_WRITE, Buffer, Count);

}

/*команда читать*/

void D11CmdDataRead(unsigned char Command, unsigned char Buffer[], unsigned char Count)

{

I2C_Write(D11_CMD_ADDR, &Command, 1);

if(Count) I2C_Read(D11_DATA_ADDR_READ, Buffer, Count);

}

/*Обработка ОУ*/

void Proc_OU(void)

{

if (P3.0==1) OUT_OU(); /*если необходим вывод в ОУ*/

if (P3.1==0), (P3.5==1) INP_OU(); /*если необходим ввод из ОУ*/

}

void INP_OU (void)

{

unsigned char Buffer[2];

Buffer[0] = P1; /*считывание первого байта */

Buffer[1] = P0; /*считывание второго байта */

P0.4 Buffer[1] = 0;

P0.5 Buffer[1] = 0;

P0.6 Buffer[1] = 0;

P0.7 Buffer[1] = 0;

P3.4 = 1; /* импульс START_CT*/

D11WriteEndpoint(D11_ENDPOINT_EP2_IN, Buffer, 2); /*запись данных в буфер*/

}

void OUT_OU (void)

{

unsigned char Buffer[64];

unsigned char count;

unsigned char byte;

byte = D11ReadEndpoint(D11_ENDPOINT_EP2_OUT, Buffer);

if (byte){

/* если непустой*/

for (count = 0; count < byte; count++) {

while(P3.0) /*если ОУ требует данные */

{

P2 = buffer[count];

P0.7 = 1; /*строб данных Output*/

}

P0.7 = 0; /*сброс строба данных*/

}

}

4.6 Расчет потребляемой мощности

Потребляемая мощность рассчитывается по формуле:

(1)

Таким образом, каждая микросхема имеет следующие параметры:

DD1, DD2, DD5…DD7 (КР 1533ИЕ 7)

Uп = +5 В, Iпот = 22 мА, Pпот = 110 · 5 = 550 мВт;

DD3 (КР 1533ТМ 2)

Uп =+5 В, Iпот =4 мА, Pпот = 20 мВт;

DD4 (КР 1533ЛН 1)

Uп = +5 В, Iпот = 4,2 мА, Pпот = 21 мВт;

DD5 (КР 1533ЛИ 1)

Uп = +5 В, Iпот = 4 мА, Pпот = 20 мВт;

DD9 (Intel 83C152JA)

Uп = +5 В, Iпот = 41,1 мА, Pпот = 205,5 мВт;

DD10 (PDIUSBD12)

Uп = +5 В, Iпот =100 мА, Pпот =500 мВт;

На резисторах мощность рассчитывается по следующей формуле:

(2)

Потребляемая мощность резисторами будет равна:

R1 = 2 кОм, Iд = 2,5 мА, Pпот = 12,5 мВт;

Таким образом, общая потребляемая мощность модуля равна:

Pпот = 1329 мВт =1,329 Вт.

5. Требования к объекту управления

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

- объект управления должен принимать цифровые данные (12 байт за 1 цикл обмена) с максимальной частотой 2 кГц;

- строб Input должен иметь активный 1 уровень;

- объект управления может выдавать аналоговый импульс при низком уровне сигнала Data_ok;

- входной аналоговый сигнал по напряжению должен соответствовать положительной ТТЛ-логике;

- объект управления должен иметь 8-ми разрядную шину данных DA0DA7;

- объект управления должен подключаться к модулю ввода-вывода информации через разъем СНП 34;

- в качестве соединительного кабеля необходимо использовать витую пару.

Заключение

В результате проделанной работы был разработан модуль ввода-вывода информации. В качестве документации к разработанному модулю прилагается:

- пояснительная записка;

- схема электрическая структурная (ПУКП. 020100. 000Э 1);

- схема электрическая функциональная (ПУКП. 020100. 000Э 2);

- схема электрическая принципиальная (ПУКП. 020100. 000Э 3);

- перечень элементов (ПУКП. 020100. 000ПЭ).

В пояснительной записке приведены временные диаграммы, поясняющие работу модуля ввода-вывода информации. Также приводится листинг программы функционирования модуля.

Был сделан расчет потребляемой мощности и токовой нагрузки по каждому виду напряжения.

Таким образом, задание на курсовой проект, с учетом всех требований к разработке модуля и оформлению документации, выполнено.

Список литературы

Вишняков В.А., Беляев О.А. Универсальная последовательная шина USB: Пособие. - Рыбинск: РГАТА, 2004.

Вишняков В.А., Соколов С.Ю. Микроконтроллеры семейства MCS-51: Пособие. - Рыбинск: РГАТА, 2004.

Вишняков В.А., Рахманин Д.А. Специализированное USB устройство PDIUSBD12: Пособие. - Рыбинск: РГАТА, 2004.

Вишняков В.А. Интерфейсы периферийных устройств: Методические указания к курсовой работы. - Рыбинск: РГАТА, 2004. - 8 с.

Единая система конструкторской документации: Справочное пособие / Борушек С.С., Волков А.А., Ефимова М.М. и др. - 2-е изд., перераб. и доп. - М.: Издательство стандартов, 1989.

Комаров В.М. Микропроцессорные системы: Учебное пособие. - Рыбинск: РГАТА, 1997.

Петровский И.И., Прибыльский А.В., Троян А.А. Логические ИС КР 1533, КР 1554. Справочник. - М.: Бином, 1993.

http://www.mcsclub.ru.

Приложение А. Перечень элементов

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [36,8 K], добавлен 18.09.2010

  • Разработка модуля для вычисления значения функции, который впоследствии подключается к программе ввода исходных данных с контролем допусимого значения в таблицу. Проектирование модуля для работы со строками и для обработки массивов текстовой информации.

    курсовая работа [17,8 K], добавлен 24.09.2010

  • Схема и программное обеспечение модуля генератора последовательностей на шине ISA IBM PС AT. Операция "Запись в 16-и разрядное устройство ввода-вывода". Использование триггера для хранения информации в селекторе адреса. Увеличения разрядности счетчика.

    контрольная работа [363,3 K], добавлен 05.01.2013

  • Использование программой функции ввода-вывода данных для реализации дружественного интерфейса с пользователем. Функции консоли и особенности их применения для обеспечения аккуратного ввода информации и упорядоченного вывода. Обзор стандартных функций.

    лабораторная работа [40,4 K], добавлен 06.07.2009

  • Разработка устройства ввода аналоговой информации (напряжения в диапазоне 0-100 мВ) в персональный компьютер через LPT-порт с предварительным ее сохранением в памяти устройства. Его структурная схема. Алгоритм работы программы чтения данных в ПК.

    курсовая работа [1,9 M], добавлен 25.12.2012

  • Моделирование предметной области. Состав программного модуля. Разработка логической структуры единой базы данных банковской информационной системы "БИС". Создание экранных форм для ввода и корректировки информации. Разработка интерфейса пользователя.

    курсовая работа [1,8 M], добавлен 17.05.2016

  • Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.

    курсовая работа [215,3 K], добавлен 01.09.2010

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

    курсовая работа [1,7 M], добавлен 25.12.2011

  • Разработка СУБД - программного модуля для систематизации, хранения и обработки сведений о работниках лаборатории. Технологический процесс машинной реализации задачи, составление алгоритма, описание переменных процедур и функций. Листинг программы.

    курсовая работа [1,7 M], добавлен 11.01.2013

  • Практическое обоснование выгодности использования web-модуля "Расширенный поиск по сайту". Схема отображения процесса ввода и запроса информации. Описание алгоритма и модель решения задачи. Структура и характеристика базы данных расширенного поиска.

    дипломная работа [2,4 M], добавлен 19.01.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.