Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 24. WoodmanUSB. Часть 2

Дмитрий Иванов, 09 Декабря 2013

Файлы к статье скачать
Имя: KA024.zip (ZIP архив)
Размер: 73 КБ

Итак, продолжаем осваивать шину USB с помощью модуля WoodmanUSB. Давайте займемся схемой нашего первого устройства. Соберите схему на основе модуля WoodmanUSB по рисунку, показанному ниже. Как видно из рисунка, ничего сложного в схеме нет, только не перепутайте выводы светодиодов. Все светодиоды садятся на землю (вывод 28 модуля - земля).

простая схема USB устройства

Внешне схема может выглядеть так, как на фото ниже. Рекомендую для опытов и проверок использовать макетную плату. Очень удобно - не надо сидеть с паяльником и подпаивать проводники.

простая схема USB устройства


Напишем программу для управления нашим устройством. Писать будем на языке С++. Используем компилятор Microsoft Visual Studio 6.0 (можно любую другую версию). Подробнее о работе с другими языками и средами разроботки будет рассказано в следующих статьях. А пока, рассмотрим работу в Microsoft Visual C++ 6.0.

Запускаем программу. Выбираем: File -> New. Должно появиться окошко, как на рис. ниже. В поле Location указываем место, где будут храниться файлы проекта, а в поле Project Name - имя проекта, например TestWUSB. Для начала проект сделаем консольным - чтобы легче было разобраться. Поэтому, выбираем тип проекта Win32 Console Application. Нажимайте Ok.

В следюущем окне выбирайте пункт An empery project и жмете Finish.

Теперь опять File -> New. Отображается закладка Files. Выбирайте там C++ Source File. В поле File name укажите имя TestWUSB для этого файла. Нажимайте Ok.

Теперь важный момент. Необходимо к нашему проекту подключить библиотеку для работы с модулем. Из папки с драйверами, которую Вы скачали к предыдущей статье, скопируйте следующие файлы: WUSBdrv.dll, WUSBdrv.h и WUSBdrv.lib в папку нашего проекта, а файл WUSBdrv.dll также скопируйте в папку Debug (или Release, в зависисмости от того в какой конфигурации компилируется проект) проета, где будет находится откомпилированная программа.

Далее выбираем Project -> Add to Project -> Files... В открывшемся окне отыскивайте папку Вашего проекта. В списке Тип файлов выберите пункт "Все файлы". В окне выбираете только что помещенные туда файлы WUSBdrv.h, WUSBdrv.lib и нажимайте Ок. Файлы добавяться в проект.

После этого, древо проекта должно иметь вид как на рис. ниже.

Все, подготовительные работы закончили. В древе проекта выбирайте файл TestWUSB.cpp (он по-идее сейчас и должен быть открыт, если Вы его не закрывали) и помещаем туда код, представленный ниже.

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "WUSBdrv.h"

int main()
{	
  int status = WUSB_Open();

  if(status == WUSB_ERROR)
  {
    printf("ERROR! Can`t open WodmanUSB device...\n");
    getch();
    return false;
  }
  else
  {
    printf("WodmanUSB Open Ok!\n");		
  }


  WUSB_SetupPortA(255); //Set all pins PORTA to OUT

  unsigned int byte = 0;	
  printf("Enter the Data write to PORTA: \n");	

  while(true)
  {
    scanf("%d", &byte);
   if(byte > 255)
    break;

    WUSB_WritePortA(byte);
  }		

  WUSB_Close();
  return true;
}


Далее выбираем Build -> Compile TestWUSB.cpp Начнется процесс компиляции. Если возникли ошибки, то скорее всего не подключена библиотека WUSBdrv. Теперь самый интересный момент - запуск приложения. Подключите наше устройство к USB порту компьютера. Выбираем Build -> Execute TestWUSB.exe Должна запуститься только что написанная нами программа:

Давайте запишем что-нибудь в наше устройство. Вводим целое число в диапозоне от 0 до 255 и нажимаем Enter. При этом некоторые из светодиодов будут загоратся. Что бы выйти из этого цикла и программы нужно ввести чило большее чем 255.

Почему, например, когда мы записали число 217 загорелись светодиоды, подключенные к 15, 18, 19, 21 и 22 выводам модуля? Тут все довольно просто: числу 217 в десятичной системе счисления соответствует 11011001 в двоичной системе. Именно в таком виде оно (число) побитно и записывается на выходные линии порта PORTA модуля WoodmanUSB. Тут полная аналогия с записью данных в регистр Data LPT порта.

Итак, первым делом, вызывается функция WUSB_Open(), которая пытается открыть доступ к модулю WoodmanUSB. Если модуль подключен и для него установлены драйвера функция открытия устройства отработает успешно, о чем будет выведено соответствующее сообщение. Если связь не установлена, на экран выводится сообщение об ошибке. Такое может случиться, например, если USB удлинитель плохо контактирует с разъемом.

Затем, идет вызов функции WUSB_SetupPortA(). Она позволяет устанавливать направление передачи информации через порт PORTA модуля. В качестве параметра этой функции передается т.н. маска ввода-вывода в виде одного байта. Если соответствующий бит этой маски равен единице, то соответствующий бит порта PORTA будет настроен на вывод информации (если 0 - то на ввод). В нашем случае мы хотим настроить все выводы порта на выход. Для этого посылаем число 255, которому в двоичной системе счисления соответствует число 11111111.

Далее создается "бесконечный цикл". Давайте посмотрим из чего он состоит. Сначала проводится ввод числа с клавиатуры для записи в устройство и его проверка на соответствие допустимым границам. Я думаю, очевидно что это число должно находится в пределах от 0 до 255, т.к. порт PORTA модуля 8-ми разрядный, и соответсвенно, максимальное число которое может быть туда записано равно 28-1=256-1=255. Если ввести большее число, то получился удобный способ выйти из цикла и соответственно из программы. Затем вызывается функция WUSB_WritePortA(). В качестве параметра ей передается число, которое мы хотим записать в порт PORTA модуля WoodmanUSB.

В конце работы с программой закрываем соединение с помощью функции WUSB_Close().



Теперь давайте рассмотрим как можно записывать данные в порт PORTA "снаружи". Соберите устройство на основе WoodmanUSB по рис. ниже., заменив в старой схеме все светодиоды ключами (в простейшем случае можно замыкать и размыкать проводником).

простая схема USB устройства

Внесем некоторые изменения в код программы. Теперь она примет следующий вид:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "WUSBdrv.h"

int main()
{	
	int status = WUSB_Open();
	if(status == WUSB_ERROR)
	{
		printf("ERROR! Can`t open WodmanUSB device...\n");
		getch();
		return false;
	}
	else
	{
		printf("WodmanUSB Open Ok!\n");		
	}


	WUSB_SetupPortA(0); //Set all pins PORTA to IN

	unsigned char byte = 0;
	char ch;		
	printf("Press any key to get data from PORTA: \n");	

	while(true)
	{
		ch = getch();
		if(ch == '#')
			break;

		WUSB_ReadPortA(&byte);
		printf("%d\n", byte);
	}		

	WUSB_Close();
	return true;
}


Компилируем и запускаем программу. Давайте ее протестируем. Например, замкнем ключ соединенный с выводом модуля PORTA6 (вывод 21) а остальные оставим разомкнутыми. Нажимаем любую клавишу (кроме символа решетка '#' - по его вводу мы выйдем из программы) и увидим на экране число 191. Почему? - ответ становится очевидным, если записать это число в двоичной системе счисления - 10111111. Шестой бит - ноль, ведь действительно, мы замкнули шестой бит порта PORTA на землю. Аналогично, если замкнуть все ключи, то мы прочтем чило 0. А если все разомкнуть - то 255.

Если посмотреть код данного примера, то можно заметить что уже известная нам функция WUSB_SetupPortA() на этот раз вызывается с параметром 0. Таким образом мы устанавливаем все линии порта PORTA на ввод информации. Также немного изменился код рабочего цикла. Теперь там вызывается новая для нас функция WUSB_ReadPortA(). Ей передется адрес на переменную в которую функция поместит байт данных, прочтенный из порта PORTA модуля.


Используя функцию WUSB_SetupPortA() можно организовать довольно хитрое сочетание направлений линий ввода-вывода порта PORTA. Вполне допустимо, чтобы одновременно часть линий была настроена на вывод информации, а другая часть на ввод. Например, если установить маску ввода-вывода в виде числа 226 (в двоичной системе счисления 11100010), то можно собрать вот такую схему:

простая схема USB устройства

При этом, при использовании функции записи данных WUSB_WritePortA() полезную информативную нагрузку будут нести 1, 5, 6 и 7 биты записываемого числа. А при чтении данных - 0, 2, 3 и 4 биты числа, возвращенного функцией WUSB_ReadPortA().


Двигаемся дальше. Разобравшись с принципами работы с портом PORTA модуля WoodmanUSB, в следующей статье мы напишем приложение под Windows на основе MFC с удобным графическим интерфейсом для управления портом PORTA модуля.


© Дмитрий Иванов
09 Декабря 2013 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2024