PCB 업체 휴가라 참 오래 걸렸다.
아름다웠지만 저 Dsub가 에러~~
나도 이제 Cortex-M3 함 써보자
2011/08/10
2011/08/08
AVR271: USB Keyboard Demonstration on megaAVR with USB-01
자 키보드 만들어 보자...야무지게
시작은 심히 미약하구나
일단 12X7=84 키 매트릭스를 만들어서 테스트해봤다.
싱글 키 스캔은 완료했다. keyboard_task.c의 kbd_test_hit 함수를 수정하면 싱글 키스캔은 돌아간다.
void kbd_test_hit(void)
{
//20110807 --> added
unsigned char i=0, i_Pre=0, in=0, in_Pre=0;
PORTB = 0xFF;
PORTA = 0xFF;
Key_Scan:
for(i=0;i<12;i++){
if(i < 8)
PORTB = ~(0x01 << i);
else
PORTA = ~(0x01 << (i-8));
_NOP();_NOP();_NOP();_NOP();
in = ~PINC;
PORTB = 0xFF;
PORTA = 0xFF;
if(in){
if(i_Pre == i && in_Pre == in)
goto Key_Value;
else{
i_Pre = i;
in_Pre = in;
goto Key_Scan;
}
}
}
//Key 신호 없음 구간 -->
//키 홀딩, 홀딩 카운트, 연속입력, 키 갱신 신호 초기화.
Key_No:
state_HOLD = 0;
same_Count = 0;
Key_con = 0;
Key_update = 0;
usb_kbd_state = 0;
goto ROUTINE_OUT;
//<-- Key 신호 없음 구간
//Key 위치 판정 구간 -->
Key_Value://Key 위치 판정
if(in & _BV(0)){
if(i == 0)usb_key=HID_F11;
else if(i==1)usb_key=HID_F10;
else if(i==2)usb_key=HID_F9;
else if(i==3)usb_key=HID_F8;
else if(i==4)usb_key=HID_F7;
else if(i==5)usb_key=HID_F6;
else if(i==6)usb_key=HID_F5;
else if(i==7)usb_key=HID_F4;
else if(i==8)usb_key=HID_F3;
else if(i==9)usb_key=HID_F2;
else if(i==10)usb_key=HID_F1;
else if(i==11)usb_key=HID_ESCAPE;
}
else if(in & _BV(1)){
if(i == 0)usb_key=HID_UNDERSCORE;
else if(i==1)usb_key=HID_0;
else if(i==2)usb_key=HID_9;
else if(i==3)usb_key=HID_8;
else if(i==4)usb_key=HID_7;
else if(i==5)usb_key=HID_6;
else if(i==6)usb_key=HID_5;
else if(i==7)usb_key=HID_4;
else if(i==8)usb_key=HID_3;
else if(i==9)usb_key=HID_2;
else if(i==10)usb_key=HID_1;
else if(i==11)usb_key=HID_TILDE;
}
else if(in & _BV(2)){
if(i == 0)usb_key=47;
else if(i==1)usb_key=HID_P;
else if(i==2)usb_key=HID_O;
else if(i==3)usb_key=HID_I;
else if(i==4)usb_key=HID_U;
else if(i==5)usb_key=HID_Y;
else if(i==6)usb_key=HID_T;
else if(i==7)usb_key=HID_R;
else if(i==8)usb_key=HID_E;
else if(i==9)usb_key=HID_W;
else if(i==10)usb_key=HID_Q;
else if(i==11)usb_key=HID_TAB;
}
else if(in & _BV(3)){
if(i == 0)usb_key=52;
else if(i==1)usb_key=51;
else if(i==2)usb_key=HID_L;
else if(i==3)usb_key=HID_K;
else if(i==4)usb_key=HID_J;
else if(i==5)usb_key=HID_H;
else if(i==6)usb_key=HID_G;
else if(i==7)usb_key=HID_F;
else if(i==8)usb_key=HID_D;
else if(i==9)usb_key=HID_S;
else if(i==10)usb_key=HID_A;
else if(i==11)usb_key=HID_MODIFIER_LEFT_CTRL;
}
else if(in & _BV(4)){
if(i == 0)usb_key=HID_MODIFIER_RIGHT_SHIFT;
else if(i==1)usb_key=HID_SLASH;
else if(i==2)usb_key=HID_DOT;
else if(i==3)usb_key=HID_COMMA;
else if(i==4)usb_key=HID_M;
else if(i==5)usb_key=HID_N;
else if(i==6)usb_key=HID_B;
else if(i==7)usb_key=HID_V;
else if(i==8)usb_key=HID_C;
else if(i==9)usb_key=HID_X;
else if(i==10)usb_key=HID_Z;
else if(i==11)usb_key=HID_MODIFIER_LEFT_SHIFT;
}
else if(in & _BV(5)){
if(i == 0)usb_key=HID_F12;
else if(i==1)usb_key=HID_BACKSPACE;
else if(i==2)usb_key=HID_PLUS;
else if(i==3)usb_key=HID_DELETE;
else if(i==4)usb_key=HID_END;
else if(i==5)usb_key=HID_HOME;
else if(i==6)usb_key=HID_MODIFIER_RIGHT_CTRL;
else if(i==7)usb_key=HID_MODIFIER_LEFT_ALT;
else if(i==8)usb_key=HID_SPACEBAR;
else if(i==9)usb_key=HID_MODIFIER_RIGHT_ALT;
else if(i==10)usb_key=HID_MODIFIER_RIGHT_GUI;
else if(i==11)usb_key=HID_CAPSLOCK;
}
else if(in & _BV(6)){
if(i == 0)usb_key=HID_RIGHT;
else if(i==1)usb_key=HID_DOWN;
else if(i==2)usb_key=HID_UP;
else if(i==3)usb_key=HID_LEFT;
else if(i==4)usb_key=HID_ENTER;
}
else{
//중첩키 구간 -->
goto Key_No;
//<-- 중첩키 구간
}
Key_Continuous://Key 입력 상태 판정
if(state_HOLD){//Key Holding state.
if(!Key_con){//<-- 연속 입력 상태 아님
if(same_Count < 10000){//30
same_Count++;
goto ROUTINE_OUT;
}
else{
same_Count = 0;
Key_con = 1;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
}
else{//<-- 연속 입력 상태
if(same_Count < 1000){//10
same_Count++;
goto ROUTINE_OUT;
}
else{
same_Count = 0;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
}
}
else{//Key First_IN state
state_HOLD = 1;
same_Count = 0;
pre_Key = cur_Key;
Key_con = 0;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
KEY_UPDATE:
if(Key_update){
usb_data_to_send --;
key_hit = TRUE;
}
Key_update = 0;
ROUTINE_OUT:
_NOP();
//<-- 20110807
}
다음 할 일은 멀티 키스캔이지...
그리고 HID modifier 사용법도 심도있게 살펴봐야것군.
쉬프트나 컨트롤 쓸라면 이걸 알아야되는거 같애..
아차 한영변환은???
시작은 심히 미약하구나
일단 12X7=84 키 매트릭스를 만들어서 테스트해봤다.
싱글 키 스캔은 완료했다. keyboard_task.c의 kbd_test_hit 함수를 수정하면 싱글 키스캔은 돌아간다.
void kbd_test_hit(void)
{
//20110807 --> added
unsigned char i=0, i_Pre=0, in=0, in_Pre=0;
PORTB = 0xFF;
PORTA = 0xFF;
Key_Scan:
for(i=0;i<12;i++){
if(i < 8)
PORTB = ~(0x01 << i);
else
PORTA = ~(0x01 << (i-8));
_NOP();_NOP();_NOP();_NOP();
in = ~PINC;
PORTB = 0xFF;
PORTA = 0xFF;
if(in){
if(i_Pre == i && in_Pre == in)
goto Key_Value;
else{
i_Pre = i;
in_Pre = in;
goto Key_Scan;
}
}
}
//Key 신호 없음 구간 -->
//키 홀딩, 홀딩 카운트, 연속입력, 키 갱신 신호 초기화.
Key_No:
state_HOLD = 0;
same_Count = 0;
Key_con = 0;
Key_update = 0;
usb_kbd_state = 0;
goto ROUTINE_OUT;
//<-- Key 신호 없음 구간
//Key 위치 판정 구간 -->
Key_Value://Key 위치 판정
if(in & _BV(0)){
if(i == 0)usb_key=HID_F11;
else if(i==1)usb_key=HID_F10;
else if(i==2)usb_key=HID_F9;
else if(i==3)usb_key=HID_F8;
else if(i==4)usb_key=HID_F7;
else if(i==5)usb_key=HID_F6;
else if(i==6)usb_key=HID_F5;
else if(i==7)usb_key=HID_F4;
else if(i==8)usb_key=HID_F3;
else if(i==9)usb_key=HID_F2;
else if(i==10)usb_key=HID_F1;
else if(i==11)usb_key=HID_ESCAPE;
}
else if(in & _BV(1)){
if(i == 0)usb_key=HID_UNDERSCORE;
else if(i==1)usb_key=HID_0;
else if(i==2)usb_key=HID_9;
else if(i==3)usb_key=HID_8;
else if(i==4)usb_key=HID_7;
else if(i==5)usb_key=HID_6;
else if(i==6)usb_key=HID_5;
else if(i==7)usb_key=HID_4;
else if(i==8)usb_key=HID_3;
else if(i==9)usb_key=HID_2;
else if(i==10)usb_key=HID_1;
else if(i==11)usb_key=HID_TILDE;
}
else if(in & _BV(2)){
if(i == 0)usb_key=47;
else if(i==1)usb_key=HID_P;
else if(i==2)usb_key=HID_O;
else if(i==3)usb_key=HID_I;
else if(i==4)usb_key=HID_U;
else if(i==5)usb_key=HID_Y;
else if(i==6)usb_key=HID_T;
else if(i==7)usb_key=HID_R;
else if(i==8)usb_key=HID_E;
else if(i==9)usb_key=HID_W;
else if(i==10)usb_key=HID_Q;
else if(i==11)usb_key=HID_TAB;
}
else if(in & _BV(3)){
if(i == 0)usb_key=52;
else if(i==1)usb_key=51;
else if(i==2)usb_key=HID_L;
else if(i==3)usb_key=HID_K;
else if(i==4)usb_key=HID_J;
else if(i==5)usb_key=HID_H;
else if(i==6)usb_key=HID_G;
else if(i==7)usb_key=HID_F;
else if(i==8)usb_key=HID_D;
else if(i==9)usb_key=HID_S;
else if(i==10)usb_key=HID_A;
else if(i==11)usb_key=HID_MODIFIER_LEFT_CTRL;
}
else if(in & _BV(4)){
if(i == 0)usb_key=HID_MODIFIER_RIGHT_SHIFT;
else if(i==1)usb_key=HID_SLASH;
else if(i==2)usb_key=HID_DOT;
else if(i==3)usb_key=HID_COMMA;
else if(i==4)usb_key=HID_M;
else if(i==5)usb_key=HID_N;
else if(i==6)usb_key=HID_B;
else if(i==7)usb_key=HID_V;
else if(i==8)usb_key=HID_C;
else if(i==9)usb_key=HID_X;
else if(i==10)usb_key=HID_Z;
else if(i==11)usb_key=HID_MODIFIER_LEFT_SHIFT;
}
else if(in & _BV(5)){
if(i == 0)usb_key=HID_F12;
else if(i==1)usb_key=HID_BACKSPACE;
else if(i==2)usb_key=HID_PLUS;
else if(i==3)usb_key=HID_DELETE;
else if(i==4)usb_key=HID_END;
else if(i==5)usb_key=HID_HOME;
else if(i==6)usb_key=HID_MODIFIER_RIGHT_CTRL;
else if(i==7)usb_key=HID_MODIFIER_LEFT_ALT;
else if(i==8)usb_key=HID_SPACEBAR;
else if(i==9)usb_key=HID_MODIFIER_RIGHT_ALT;
else if(i==10)usb_key=HID_MODIFIER_RIGHT_GUI;
else if(i==11)usb_key=HID_CAPSLOCK;
}
else if(in & _BV(6)){
if(i == 0)usb_key=HID_RIGHT;
else if(i==1)usb_key=HID_DOWN;
else if(i==2)usb_key=HID_UP;
else if(i==3)usb_key=HID_LEFT;
else if(i==4)usb_key=HID_ENTER;
}
else{
//중첩키 구간 -->
goto Key_No;
//<-- 중첩키 구간
}
Key_Continuous://Key 입력 상태 판정
if(state_HOLD){//Key Holding state.
if(!Key_con){//<-- 연속 입력 상태 아님
if(same_Count < 10000){//30
same_Count++;
goto ROUTINE_OUT;
}
else{
same_Count = 0;
Key_con = 1;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
}
else{//<-- 연속 입력 상태
if(same_Count < 1000){//10
same_Count++;
goto ROUTINE_OUT;
}
else{
same_Count = 0;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
}
}
else{//Key First_IN state
state_HOLD = 1;
same_Count = 0;
pre_Key = cur_Key;
Key_con = 0;
Key_update = 1;
usb_data_to_send++;
usb_kbd_state = 1;
goto KEY_UPDATE;
}
KEY_UPDATE:
if(Key_update){
usb_data_to_send --;
key_hit = TRUE;
}
Key_update = 0;
ROUTINE_OUT:
_NOP();
//<-- 20110807
}
다음 할 일은 멀티 키스캔이지...
그리고 HID modifier 사용법도 심도있게 살펴봐야것군.
쉬프트나 컨트롤 쓸라면 이걸 알아야되는거 같애..
아차 한영변환은???
2011/08/05
AT90USB USB CDC 관련
아트멜 홈페이지 어플리케이션 노트 중 AVR272 항목이 USB CDC에 대한 내용이다.
pdf 문서를 읽어보면
"UART싸미 USB에 달아 서로 사맛디아니할쎄
이런 전차로 어린 백셩이 니르고져 CDC를 맹그노니...."
긍께 COM 포트가 PC에서 사라지는 추세니까 USB로 uart를 구현했다 이거지 머.
일단 다운받은 AVR272_USB_CDC_Virtual_Com_Port.zip을 살펴보자
이미지가 넘 작게 나오네...
어째뜬 \USBKEY_STK525-series6-cdc-2_0_6-doc\at90usb128\demo\USBKEY_STK525-series6-cdc\gcc
아이구 길기도 하네...
여기로 가면 gcc-avr로 컴파일 가능한 프로젝트 파일이 있다.
AVR Studio 버전별로 다른건지 모르지만 내가 지금 쓰고있는 버전(4.18)에서는 이대로 컴파일되지 않는다. 외부 makefile 사용부분을 disable하고 MCU 클럭을 설정해줘야 하고 wdt_drv.c파일을 소스파일에 추가해줘야 한다.
이러면 아래처럼 구동이 되는거다.
좀 한방에 깔끔하게 컴파일되도록 만들어 달란 말이다.
이 어플 노트를 이용하면 AT90USB를 구동하고 디버깅하는데 USB 케이블만 있으면 된다.
전원도 USB로
다운로드도 USB로
디버그 메세지도 USB로
삼위일체, 일타쓰리피... 머든 좋다 간단해져서
소스 자체는 별로 어렵지 않아서 간단하게 디버깅용 콘솔 프로그램을 만들어 봤다.
저기에 이젠 2번 3번 이런식으로 디버그 메뉴를 추가해주면 OK~~
간단한 테스트용으론 최강이로구나!
pdf 문서를 읽어보면
"UART싸미 USB에 달아 서로 사맛디아니할쎄
이런 전차로 어린 백셩이 니르고져 CDC를 맹그노니...."
긍께 COM 포트가 PC에서 사라지는 추세니까 USB로 uart를 구현했다 이거지 머.
일단 다운받은 AVR272_USB_CDC_Virtual_Com_Port.zip을 살펴보자
이미지가 넘 작게 나오네...
어째뜬 \USBKEY_STK525-series6-cdc-2_0_6-doc\at90usb128\demo\USBKEY_STK525-series6-cdc\gcc
아이구 길기도 하네...
여기로 가면 gcc-avr로 컴파일 가능한 프로젝트 파일이 있다.
AVR Studio 버전별로 다른건지 모르지만 내가 지금 쓰고있는 버전(4.18)에서는 이대로 컴파일되지 않는다. 외부 makefile 사용부분을 disable하고 MCU 클럭을 설정해줘야 하고 wdt_drv.c파일을 소스파일에 추가해줘야 한다.
이러면 아래처럼 구동이 되는거다.
좀 한방에 깔끔하게 컴파일되도록 만들어 달란 말이다.
이 어플 노트를 이용하면 AT90USB를 구동하고 디버깅하는데 USB 케이블만 있으면 된다.
전원도 USB로
다운로드도 USB로
디버그 메세지도 USB로
삼위일체, 일타쓰리피... 머든 좋다 간단해져서
소스 자체는 별로 어렵지 않아서 간단하게 디버깅용 콘솔 프로그램을 만들어 봤다.
저기에 이젠 2번 3번 이런식으로 디버그 메뉴를 추가해주면 OK~~
간단한 테스트용으론 최강이로구나!
피드 구독하기:
글 (Atom)