[Atmega8 EVM] USB HID 테스트
USB HID을 이용하면 윈도 표준 입력 인터페이스로 드라이버 필요 없이(정확히는 Windows 내부 표준 드라이버) USB연결 할 수 있다. USB Mouse, Keyboard, Joystick 등이 이 표준을 따르는데 USB를 연결하면 바로 동작하기 때문에 사용자 입장에서 상당히 편리한 인터페이스 이다.
이번에는 AVR AtMega8
(ATMega8-EVM) 의 USB 소프트웨어 스텍을 이용하여 HID Data 테스트를 해 보았다. 스프트웨어 스텍이라 약간 불안하거나 속도에 문제가 있지 않을까 했는데.. 테스트 결과 속도도 나쁘지 않고 저렴고 간단하게 사용할 수 있어서 좋은것 같다.
Atmeg8 EVM을 USB에 연결하면 HID장치로 인식되고 휴먼인터페이스 장치에서 확인 할 수 있다. (드라이버 설정 필요 없이 바로 인식된다.)
AVR USB HID처리
uchar ProcessUSB(uchar *data, uchar len)
{
unsigned char temp[9];
unsigned int adc=0;
switch(data[0])
{
case CMD_LED_OFF:
Led1Off();
break;
case CMD_LED_ON:
Led1On();
break;
case CMD_EEPROM_READ:
eeprom_read_block(data, (uchar *)0 + data[1], data[2]);
SendUsb((void *)&data, 8);
break;
case CMD_EEPROM_WRITE:
eeprom_write_block(data, (uchar *)0 + data[1], data[2]);
break;
case CMD_GET_ADC:
adc = AdcRead(0);
//DebugPrint("ADC:%d\r\n", adc);
temp[0] = adc&0xFF;
temp[1] = (adc>>8)&0xFF;
SendUsb((void *)&temp, 8);
break;
}
}
HID제어 Main Source Code
int main(void)
{
uchar i;
//System Init
SystemInit();
Led1Init();
Led1On();
//UART Init
DebugInit(BAUD_38400);
DebugPrint("USB HID Test Program\r\n");
//ADC Init
AdcInit();
//USB Init
usbInit();
usbDeviceDisconnect();
i = 0;
while(--i){ /* fake USB disconnect for > 250 ms */
wdt_reset();
_delay_ms(1);
}
usbDeviceConnect();
sei();
while(1)
{
wdt_reset();
//USB 처리
usbPoll();
}
return 0;
}
HID제어 PC Host 프로그램
PC용 프로그램은 C#을 이용하여 작성하였다.
HID제어 부분을 표준 DLL로 제작해 두었기 때문에 VC++, VB, C#에서 쉽게 제어 가능하다.
HID제어 DLL이용하면 아주 간다하게 프로램을 작성할 수 있다.
private void button2_Click(object sender, EventArgs e)
{
bool ret;
ret = GPortIOHidInit(0, 0);
if (ret)
{
label1.Text = "USB HID Init OK";
}
else
{
label1.Text = "USB Init ERROR";
}
}
private void button3_Click(object sender, EventArgs e)
{
int ret;
ret = OutPort(CMD_LED_ON, 0)
}
private void button4_Click(object sender, EventArgs e)
{
int ret;
ret = OutPort(CMD_LED_OFF, 0)
}
private void button5_Click(object sender, EventArgs e)
{
int ret;
int adc_val;
byte[] Buffer = new Byte[8];
ret = InPort(CMD_ADC_READ+0 ), Byte)
adc_val = Buffer[1] | Buffer[2] << 8;
label1.Text = adc_val.ToString();
}
AVR HID테스트 동영상
HID를 이용하여 LED를 제어 하고 Mega8의 EEPROM에 데이터를 읽고 쓰며 ADC값을 그래프로 표시하는 테스트 이다. 소프트웨어 스텍임에도 속도가 나쁘지 않다.
댓글을 달아 주세요