V-USB로 타이밍 키 처리.

2525 단어 AVRV-USB

V-USB를 사용하여 타이밍 키 처리를 하는 방법.


V-USB를 사용할 때 인터랙티브 전송에서 사용하는 경우 10ms마다 USB가 끊기며 다른 장치와의 통신이 끊기면 문제가 발생하기 때문에 인터럽트와 동기화하여 문제를 피한다.
예를 들어 애플의 구규격 키보드(ADB)의 USB 변환기 등을 만들려면 키보드에 명령을 보내 데이터 수신에 앞서 USB가 끊긴 경우 데이터는 무시된다.
이러한 상황을 피하기 위해 USB 인터럽트가 발생할 때 표지판을 세우고 다음 인터럽트가 발생하기 전에 처리를 끝내 문제를 피한다.
V-USB는 상당히 정시적으로 엄격한 인코딩이기 때문에 로고가 세워진 코드에 문제가 발생하지 않도록 vusb/usbdrv 내의 usbdrvasmXXX.inc의 USBINT_VECTOR: 바로 시작하는 타이밍이 좋아요.
usbdrvasmXXX.inc

waitForJ:
    inc     YL
    sbis    USBIN, USBMINUS
    brne    waitForJ        ; just make sure we have ANY timeout
waitForK:
;The following code results in a sampling window of 1/4 bit which meets the spec.

     ldi x4,1        <ここでフラグを立てる
     sts adbSend,x4

    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS ;[0]
    rjmp    foundK          ;[1]
usbdrvasmXXX.inc는 usbdrvasm입니다.S에 포함되므로 태그가 지정된 변수 extern입니다.
usbdrvasm.S

    extern  usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset
    extern  usbCurrentTok, usbRxLen, usbRxToken, usbTxLen
    extern  usbTxBuf, usbTxStatus1, usbTxStatus3
    extern  adbSend  <これ
main.c에 표시된 선언,volutile 선언을 잊지 마세요.
main.c
volatile uchar adbSend = 0;
main 내에서 로고가 세워지면 인터럽트 복구 후 이어진 것으로 판단하고 로고를 제거하여 처리하며 다음 인터럽트까지 8ms 정도의 처리로 동기화하면 문제가 발생하지 않습니다.
main.c
      usbPoll();
      if (usbConfiguration && usbInterruptIsReady()) {

        if(adbSend == 1){

          adbSend = 0;   /*フラグをクリア*/
             メインの処理
Atmega328용 ADBtoUSB 변환기 사용

좋은 웹페이지 즐겨찾기