내가 왜 알레그로 문서를 읽어보고 있지??
전혀 관심없는데...
이러다 말겠지 머.
2011/09/27
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~~
간단한 테스트용으론 최강이로구나!
2011/06/02
2011/05/19
2011/05/04
이 한장의 사진
6년전에 찍어서 웹에 올린 사진이 아직 검색이 되는군...
멋진 일인지 무서운 일인지...
인터넷에 인간의 일생이 저장된다면 어떻게 되려나?
만능기판에 납땝한 사진 보고 인간의 일생을 고민해 보다니...나 참
멋진 일인지 무서운 일인지...
인터넷에 인간의 일생이 저장된다면 어떻게 되려나?
만능기판에 납땝한 사진 보고 인간의 일생을 고민해 보다니...나 참
2011/05/01
포커X 리니어 홀라당
이번에 구한 포커X 리니어
똑딱이 단추를 벗겨내는듯한 손놀림으로 홀라당~~
여기서 키 스캔 코드를 따오고
아 이건 회로를좀 분석해봐야 알것는걸...
PCB 사이즈와 홀 위치만 알면 새로 PCB를 만들면 되는건데
일단은 포커X PCB 베이스로 하고 AT90USB을 MCU로 해서
USB 키보드 인터페이스 함 만들어 보자...
아 점퍼 무진장 날려야겠군.
아 생돈 날리는거 아닌가 몰라....
2011/04/27
2011/04/20
2011/04/06
AT90USB1287
1287도 입수~~
이거면 USB 호스트도 가능하다고 하는데...
이걸로 USB 키보드 만들기는 좀 아깝고
USB 오디오 앰프나 만들어보까 생각중임.
근데 AT90USB1286도 그렇고 1287도 그렇고
ISP 연결해서 퓨즈비트나 헥사파일 다운로드 할때 에러가 뜨고
Flip에서는 아무 문제없이 잘 됨...
이건 머가 문제인지 ~~ 설마 ISP가 고물이라 그런건 아니것지...
이거면 USB 호스트도 가능하다고 하는데...
이걸로 USB 키보드 만들기는 좀 아깝고
USB 오디오 앰프나 만들어보까 생각중임.
근데 AT90USB1286도 그렇고 1287도 그렇고
ISP 연결해서 퓨즈비트나 헥사파일 다운로드 할때 에러가 뜨고
Flip에서는 아무 문제없이 잘 됨...
이건 머가 문제인지 ~~ 설마 ISP가 고물이라 그런건 아니것지...
2011/03/27
2011/03/25
AT90USB1286 CKDIV8 퓨즈 세팅
기본 세팅은 CKDIV8이 enable 상태이다.
외부 8MHz 크리스탈 연결시 1MHz로 동작한다는 사실~~
USART 출력이 왜 깨지는지 한참 헤매다 ISP 연결해보고 알아냈다.
ATmega128에서는 이 퓨즈비트가 있다는 것도 몰랐는데...
USB만으로 간편하게 사용할 목적이었는데 ISP 물려서 일일이 퓨즈세팅 하기도 귀찮고 해서 걍
CLKPR = (1 << CLKPCE);
CLKPR = 0x00;
코드를 삽입하기로 했다.
AVR 한동안 안하다 하려니 머 이러케 걸리적거리는게 많으냐...
외부 8MHz 크리스탈 연결시 1MHz로 동작한다는 사실~~
USART 출력이 왜 깨지는지 한참 헤매다 ISP 연결해보고 알아냈다.
ATmega128에서는 이 퓨즈비트가 있다는 것도 몰랐는데...
USB만으로 간편하게 사용할 목적이었는데 ISP 물려서 일일이 퓨즈세팅 하기도 귀찮고 해서 걍
CLKPR = (1 << CLKPCE);
CLKPR = 0x00;
코드를 삽입하기로 했다.
AVR 한동안 안하다 하려니 머 이러케 걸리적거리는게 많으냐...
2011/03/22
AT90USB128 모듈
얼마전 설계한 AT90USB128 모듈 PCB 받아서 테스트 중임.
MCU 패드를 너무 작게 그려서 납땜하다 미칠뻔 했다.
JTAG 연결시 JTAGICE mkII 만 된다는거...하위 버전은 안됨.
USB 연결해서 Flip 연결하면 전원과 다운로드가 한방에 해결되니 어찌나 좋은지...
아직 문서를 덜 읽어봤지만 일단 JTAG나 ISP로 프로그램을 다운로드하면 USB로 다운로드하게 해주는 DFU 부트로더가 삭제되서 Flip 연결이 안되는거 같다.
것도 모르고 아무 생각없이 두장이나 부트로더를 날려먹었고 USB 연결 안된다고 뻘짓거리 한다고 오늘 하루 다 보냈네...
64x-usb-boot와 128x-usb-boot 파일이 AT90USB64x와 AT90USB128X의 부트로더다.
인터넷에서 다운받아서 부트로더 날라간 보드에 다운로드해보니까 잘 인식된다.
오케 오늘은 여기까지~~
JTAG 연결시 JTAGICE mkII 만 된다는거...하위 버전은 안됨.
USB 연결해서 Flip 연결하면 전원과 다운로드가 한방에 해결되니 어찌나 좋은지...
아직 문서를 덜 읽어봤지만 일단 JTAG나 ISP로 프로그램을 다운로드하면 USB로 다운로드하게 해주는 DFU 부트로더가 삭제되서 Flip 연결이 안되는거 같다.
것도 모르고 아무 생각없이 두장이나 부트로더를 날려먹었고 USB 연결 안된다고 뻘짓거리 한다고 오늘 하루 다 보냈네...
64x-usb-boot와 128x-usb-boot 파일이 AT90USB64x와 AT90USB128X의 부트로더다.
인터넷에서 다운받아서 부트로더 날라간 보드에 다운로드해보니까 잘 인식된다.
오케 오늘은 여기까지~~
2011/03/17
2011/03/03
Nios II Requirements
1. Quartus II 9.1 버전 이상
2. Nios II EDS 9.1 버전 이상
3. Stratix, Cyclone, Arria 시리즈
4. 2500LE 이상
5. 50개 이상의 M4K 또는 M9K
6. 굳건한 파형을 뽑아주는 오실레이터
7. Jtag
외부 램은 필요가 없나???
그래도 연결은 해두는게....
2. Nios II EDS 9.1 버전 이상
3. Stratix, Cyclone, Arria 시리즈
4. 2500LE 이상
5. 50개 이상의 M4K 또는 M9K
6. 굳건한 파형을 뽑아주는 오실레이터
7. Jtag
외부 램은 필요가 없나???
그래도 연결은 해두는게....
피드 구독하기:
글 (Atom)