본문 바로가기

[AVR]/Mega8

[Atmega8 EVM] USB HID 테스트

[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값을 그래프로 표시하는 테스트 이다. 소프트웨어 스텍임에도 속도가 나쁘지 않다.




반응형