Структура пакета «Домашня лаборатория

advertisement
Пакет «Домашняя лаборатория»
Данный документ описывает структуру пакета Домашняя лаборатория.zip и принципы работы с устройствами, водящими в программноаппаратный комплекс «Домашняя лаборатория».
Структура пакета «Домашня лаборатория»
Пакет «Домашняя лаборатория» содержит следующие файлы:
 «Домашняя лаборатория».pdf – текущий документ;
 Домашняя лаборатория.exe – исполняемый код интерактивной
оболочки;
 Домашняя лаборатория Инструкция.pdf – инструкция по применению интерактивной оболочки;
 Домашняя лаборатория.cpp – исходные коды варианта реализации интерактивной оболочки.
Введение
Устройства, входящие в «Домашнюю лабораторию» (далее по тексту – устройства), являются простейшими низкоскоростными USB
устройствами (Low Speed USB devices), принадлежащими к HID-классу.
Данный класс поддерживается практически всеми современными операционными системами, что исключает необходимость разработки и установки специализированных драйверов. Более того, программное обеспечение, реализующее взаимодействие ПК с устройствами может быть
написано практически в любой среде программирования (Builder, Delphi,
Code vision) – достаточно использовать любую библиотеку для работы с
HID.
В устройствах используется драйвер V-USB от OBJECT
DEVELOPERS.
Все устройства имеют следующие идентификаторы:
 VID = 0x20A0
 PID = 0x4173
Для однозначной идентификации устройств используются:
VendorNane
ProductName
=
=
«www.masterkit.ru»
для самописца – «MP730»
1
для генератора – «MP731»
для частотомера – «MP732»
Принцип взаимодействия устройств с ПК
Не углубляясь в подробности работы USB интерфейса (официальную спецификацию которого можно изучить на сайте
http://www.usb.org/developers/docs/), опишем принципы взаимодействия устройств с персональным компьютером (хост, в терминологии
спецификации).
После подключения устройства к шине USB и инициализации хост
может запрашивать данные с помощью IN-репортов Get Feature или
передавать данные с помощью OUT-репортов Set Feature.
В соответствии со спецификацией, инициатором обмена всегда
является хост.
Репорты представляют собой блоки данных, имеющие фиксированный размер. В нашем случае размер блока данных равен 8-ми
байтам. Данные, входящие в блок, структурированы.
Структура данных
Данные репорта структурированы следующим образом:
struct ul_dataexchange_struct
{
uchar command;
uchar counter;
uchar data[5];
uchar check;
// команда (номера команд приведены в
списке ниже)
// счетчик команд
// данные (структурированные)
// проверочный байт =
=( сумма data[i] ) ^ 0xFF
void CountCheck ( void )
{
check = ( data[0]+data[1]+data[2]+data[3]+data[4] ) ^ 0xFF;
};
bool CheckGood ( void )
{
if ( check == ( data[0]+data[1]+data[2]+data[3]+data[4] ) ^ 0xFF )
{
return true;
}
else
{
return false;
2
}
};
};
Поле command
Поле command содержит код команды из нижеприведенного списка:
#define COM_NULL
#define COM_ERROR
#define COM_IN_MAIN_DATA
0x00
0xFF
0x01
#define COM_OUT_MAIN_DATA
0x02
#define COM_IN_RAM_DATA
0x03
#define COM_OUT_RAM_DATA
0x04
#define COM_IN_EEPROM_DATA
0x05
#define COM_OUT_EEPROM_DATA 0x06
// пока не используется
// пока не используется
// получить основные
данные от устройства
// послать основные данные
устройству
// получить значение ячейки
ПЗУ устройства
// записать значение ячейки
ПЗУ устройства
// получить значение ячейки
ОЗУ устройства
// записать значение ячейки
ОЗУ устройства
Поле counter
Поле counter содержит счетчик команд (используется в примере)
или любое другое значение на усмотрение разработчика.
Устройства копируют поле counter OUT-репорта в одноименное
поле следующего IN-репорта, позволяя тем самым, отслеживать порядок работы связки хост-устройство.
Поле data
Поле data содержит массив полезной информации. Этот массив
структурируется в зависимости от типа устройства и команды.
Основные структуры данных
Основные структуры предназначены для приема/передачи характерных данных для каждого из устройств.
Структуры самописца
Ниже представлены структуры, применяемые к изделию MP730.
3
// структура данных для управления самописцем
struct ul_logger_out_main_data
{
uchar csr;
// регистр управления и статуса
short reserved1;
// зарезервировано
short reserved2;
// зарезервировано
};
// структура данных самописца в 10-ти битном режиме
// используется, если бит LOGGER_CSR_RES == 0 в регистре управления и
статуса
struct ul_logger_in_main_data_10bit
{
uchar csr;
// значение регистра управления и статуса
short adcval1;
// а) в режиме пикового детектора минимальное значение на периоде
опроса выбранного канала
б) в нормальном режиме - значение АЦП
1-го канала
short adcval2;
// а) в режиме пикового детектора максимальное значение на периоде
б) опроса выбранного канала в нормальном
режиме - 10-ти битное значение АЦП
2-го канала
};
// структура данных самописца в 8-ми битном режиме
// используется, если бит LOGGER_CSR_RES == 1 в регистре управления и
статуса
struct ul_logger_in_main_data_8bit
{
uchar csr;
// значение регистра управления и статуса
uchar adcval1_low;
// а) в режиме пикового детектора минимальное значение на периоде
опроса 1-го канала
б) в нормальном режиме - значение
АЦП 1-го канала
uchar adcval1_high; // а) в режиме пикового детектора максимальное значение на периоде
опроса 1-го канала
б) в нормальном режиме -
4
uchar adcval2_low;
uchar adcval2_high;
значение == 0x00
// а) в режиме пикового детектора минимальное значение на периоде
опроса 2-го канала
б) в нормальном режиме - значение
АЦП 2-го канала
// а) в режиме пикового детектора максимальное значение на периоде
опроса 2-го канала
б)в нормальном режиме - значение
== 0x00
};
Структуры генератора
Ниже представлены структуры, применяемые к изделию MP731.
// структура данных для управления генератором
// выбор осуществляется в соответствии с битом GENERATOR_CR_OUT_NUM
в регистре управления
struct ul_generator_out_main_data_1ch
{
uchar cr;
// регистр управления
uchar TCCR0Ar;
// регистр TCCR0A
uchar TCCR0Br;
// регистр TCCR0B
uchar OCR0Ar;
// регистр OCR0A
uchar reserved0;
// зарезервировано
};
struct ul_generator_out_main_data_2ch
{
uchar cr;
// регистр управления
uchar TCCR1r;
// регистр TCCR1
uchar GTCCRr;
// регистр GTCCR
uchar OCR1Сr;
// регистр OCR1С
uchar PLLCSRr;
// регистр PLLCSR. доступны биты
LSM и PCKE
};
// структуры данных от генератора
struct ul_generator_in_main_data
{
uchar cr;
int
reserved0;
int
reserved1;
};
// регистр управления
// зарезервировано
// зарезервировано
5
// значения битов регистра управления генератора
#define GENERATOR_CR_OUT1_TYPE 0
// 0 - генератор,
1 - управление с ПК
#define GENERATOR_CR_OUT2_TYPE 1
// 0 - генератор,
1 - управление с ПК
#define GENERATOR_CR_OUT1_VALUE 2
// 0 - LOW, 1 - HIGH
(активно при управлении
с ПК)
#define GENERATOR_CR_OUT2_VALUE 3
// 0 - LOW, 1 - HIGH
(активно при управлении
с ПК)
#define GENERATOR_CR_OUT3_VALUE 4
// 0 - LOW, 1 - HIGH
(активно при управлении
с ПК)
#define GENERATOR_CR_OUT_NUM
5
// 0 - настройки генератора
OUT1, 1 - настройки
генератора OUT2
Структуры частотомера
Ниже представлены структуры, применяемые к изделию MP732.
// структура данных частотомера
struct ul_frequencymeter_in_main_data
{
uchar sr;
// регистр статуса, значения битов
описаны ниже
// измеренная частота
unsigned long
frequency;
};
// значения битов регистра статуса частотомера
#define FREQUENCYMETER_SR_INPUT 0
// состояние
дополнительного входа
Структура данных для чтения/записи ячеек RAM и EEPROM
Общей для всех устройств является структура данных для чтения/записи ячеек памяти. С ее помощью можно считывать и записывать ячейки RAM и EEPROM основного микроконтроллера (ATTiny45).
Структура имеет следующий вид:
// структура данных для чтения/записи ячеек памяти устройств
struct ul_data_struct
{
short
addr;
// адрес ячейки
uchar data;
// содержание ячейки
uchar reserved0;
// зарезервировано
6
uchar
reserved1;
// зарезервировано
};
Диапазон адресов доступный для записи в RAM –
[0х0051..0x0051] = OSCCAL (внутренний регистр)
Диапазон адресов доступный для записи в EEPROM –
[0x0010..0x00FF]
Функция чтения доступна для всех возможных адресов ячеек памяти.
Поле check
Поле check обеспечивает дополнительный уровень защиты при
передаче данных, несмотря на то, что пакеты, передаваемые по USB
интерфейсу, уже содержат контрольную сумму (CRC). Это поле также
подтверждает, что полезные данные сформированы хостом либо
устройствами адекватно.
Поле check вычисляется как сумма элементов массива data[] с
последующей операцией XOR. На языке высокого уровня check =
(data[0]+…+data[4]) ^ 0xFF.
7
Download