Пакет «Домашняя лаборатория»

Данный документ описывает структуру пакета Домашняя лаборатория. 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 = «www. *****»

ProductName = для самописца – «MP730»

для генератора – «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;

}

};

};

Поле command

Поле command содержит код команды из нижеприведенного списка:

#define COM_NULL 0x00 // пока не используется

#define COM_ERROR 0xFF // пока не используется

#define COM_IN_MAIN_DATA 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.

// структура данных для управления самописцем

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-го канала

б) в нормальном режиме -

значение == 0x00

uchar adcval2_low; // а) в режиме пикового детектора -

минимальное значение на периоде

опроса 2-го канала

б) в нормальном режиме - значение

АЦП 2-го канала

uchar adcval2_high; // а) в режиме пикового детектора -

максимальное значение на периоде

опроса 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; // зарезервировано

};

// значения битов регистра управления генератора

#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; // зарезервировано

uchar reserved1; // зарезервировано

};

Диапазон адресов доступный для записи в RAM – [0х0051..0x0051] = OSCCAL (внутренний регистр)

Диапазон адресов доступный для записи в EEPROM – [0x0010..0x00FF]

Функция чтения доступна для всех возможных адресов ячеек памяти.

Поле check

Поле check обеспечивает дополнительный уровень защиты при передаче данных, несмотря на то, что пакеты, передаваемые по USB интерфейсу, уже содержат контрольную сумму (CRC). Это поле также подтверждает, что полезные данные сформированы хостом либо устройствами адекватно.

Поле check вычисляется как сумма элементов массива data[] с последующей операцией XOR. На языке высокого уровня check = (data[0]+…+data[4]) ^ 0xFF.