V-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 변환기 사용Reference
이 문제에 관하여(V-USB로 타이밍 키 처리.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Shigosen/items/9bbd5ba8b9ad20d5adaa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)