2011/09/27

잡솔~~

내가 왜 알레그로 문서를 읽어보고 있지??

전혀 관심없는데...

이러다 말겠지 머.

2011/08/10

STM32F103 64 LQFP Module PCB

PCB 업체 휴가라 참 오래 걸렸다.


아름다웠지만 저 Dsub가 에러~~

나도 이제 Cortex-M3 함 써보자

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 사용법도 심도있게 살펴봐야것군.
쉬프트나 컨트롤 쓸라면 이걸 알아야되는거 같애..

아차 한영변환은???

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~~

간단한 테스트용으론 최강이로구나!

2011/05/19

2011/05/04

이 한장의 사진

6년전에 찍어서 웹에 올린 사진이 아직 검색이 되는군...

멋진 일인지 무서운 일인지...

인터넷에 인간의 일생이 저장된다면 어떻게 되려나?





만능기판에 납땝한 사진 보고 인간의 일생을 고민해 보다니...나 참

2011/05/01

포커X 리니어 홀라당

이번에 구한 포커X 리니어 

똑딱이 단추를 벗겨내는듯한 손놀림으로 홀라당~~



 여기서 키 스캔 코드를 따오고



 아 이건 회로를좀 분석해봐야 알것는걸...

PCB 사이즈와 홀 위치만 알면 새로 PCB를 만들면 되는건데

일단은 포커X PCB 베이스로 하고 AT90USB을 MCU로 해서
USB 키보드 인터페이스 함 만들어 보자... 

아 점퍼 무진장 날려야겠군.




아 생돈 날리는거 아닌가 몰라....

2011/04/27

LED BLU-2

이건 576블럭 RGB LED BLU

블럭간 휘도 보정 알고리즘도 포함되었다.

어두운 화면에 자막은 쥐약이지만

마크로스 프론티어 꽤나 볼만했지.


처음으로 CPLD가 아닌 FPGA를 사용해봤다.

한 3년 전이었나~~

LED BLU-1


64 블럭 White LED BLU

VHDL 학습용으로 시작한 프로젝트가 이렇게 커지다니...

4년전에 만들어서 동영상 싱크 부분은 아직 개선의 여지가 많다.

블럭이 클때는 잘 표시 안나지만
블럭수가 몇백개로 늘어나면 블럭간 휘도 보정을 해줘야겠다는 생각이 든다.

CPLD로 했다는게 자랑~~

2011/04/20

Quartus 와 윈도우7 64비트

더할나위없이 훌륭하다

서브스크립트 버전뿐만 아니라 웹 버전도 속도가 확 빨라지네

램 용량에 걸려 죽는일은 이제 바이바이

램을 4기가로 늘려야겠다

2011/04/06

AT90USB1287

1287도 입수~~

이거면 USB 호스트도 가능하다고 하는데...

이걸로 USB 키보드 만들기는 좀 아깝고

USB 오디오 앰프나 만들어보까 생각중임.


근데 AT90USB1286도 그렇고 1287도 그렇고

ISP 연결해서 퓨즈비트나 헥사파일 다운로드 할때 에러가 뜨고

Flip에서는 아무 문제없이 잘 됨...

이건 머가 문제인지 ~~ 설마 ISP가 고물이라 그런건 아니것지...

2011/03/27

EP3C120F484C8N

아이쿠 이놈들 넘 오랜만이네

이걸로 NIOS나 해봐야것다.

2011/03/25

AT90USB1286 CKDIV8 퓨즈 세팅

기본 세팅은 CKDIV8이 enable 상태이다.
외부 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의 부트로더다.
인터넷에서 다운받아서 부트로더 날라간 보드에 다운로드해보니까 잘 인식된다.

오케 오늘은 여기까지~~

2011/03/17

아이폰 3GS 배터리 자가 교체

자가 교체 완료~~


분해 조립에 애좀 먹었지만 그래도 12500원에 새 배터리로 교환했다.

교체 후 LCD 백화 현상과 터치가 안돼는데 복원하면 원상복귀됨.

우훗~~

2011/03/03

라이센스 없는 Nios II

- 일정 시간 후 동작하지 않는 코드

멈미...라이센스 사라는 이야기잔수

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

외부 램은 필요가 없나???
그래도 연결은 해두는게....