레이블이 etc인 게시물을 표시합니다. 모든 게시물 표시
레이블이 etc인 게시물을 표시합니다. 모든 게시물 표시

2013/01/04

XMOS ??

멀티코어 MCU??
FPGA와 MCU의 중간 정도 영역일거라고 하는데...

FPGA 입장에서 본다면
-> 아주 럭저리한 LUT를 몇개 가지고 있지 않은 FPGA

MCU 입장에서 본다면
-> 중간정도 성능의 MCU를 몇개 붙여놓은 MCU

일려나...

2012/08/20

윈도우7 64bit에 OrCAD 16.3 설치시 또는 구동시 문제 발생

가끔 크랙이 안먹을때가 있다.
잘 동작하다가 가끔 맛갈때도 있고

하루종일 재설치하다가 한번 해본건데

1. XP mode에서 OrCAD 설치
2. 라이센스 확인 후 설치 폴더를 윈도우7로 복사
3. 동작 확인
4. 추후 작동 불량시 다시 복사
5. 끝

오매 간단한그

2012/08/13

STM32 F1/F2/F4 통합보드 테스트



EP4CE PCB 발주 보내고, STM32 통합보드 받고 수납하고 디버깅코드 짜고

헥헥헥

돌아가는거 겨우 확인했다. 오늘은 좀 쉬자...

2012/08/07

STM32 F1, F2, F4 통합보드 설계


아오 눈빠질라 그러네...

다음은 싸이클론IV

그 다음은 바이폴라 스텝모터 드라이버

그 다음은 DC 모터 드라이버

그 다음은 ... 스마트퓨전

아오 쉣

2012/04/10

XMEGA PWM ASF




ASF Wizard로 PWM service using timer/counter(service)를 추가

그리고 ASF Explorer에서 API Documentation을 열어보자.


요런 화면이 뜬다.

여기서 Quick Start Guide(s)로 가보자.
왠지 느낌이 좋은데...흐흐흐






































그래 바로 이거야!!!

struct pwm_config pwm_cfg;
pwm_init(&pwm_cfg, PWM_TCE0, PWM_CH_A, 500);
pwm_start(&pwm_cfg, 50);

이거면 끝. 소스는 여기

디버깅 메뉴에 추가해서 함 돌리보자.






도...돌리보자구...
끝

2012/04/08

XMEGA256A3BU+ USB/CDC Standard I/O

AVRStudio5는 적응하기가 힘드네...ASF라는거도 그렇고...
전체적으로 쓰기 쉬운 방향으로 가는건 좋긴한데 적응기간이 필요한거같다.

일단 AVRStudio6를 깔고 버전을 확인해보자.
1. AVRStudio 6 version 6.0.1703 - beta
2. ASF 3.0.1
3. AVRGCC 3.3.2.31

XMEGA256A3BU 모듈보드도 만들어놨으니 이제 디버깅 코드를 만들어서 돌려보자.
CDC를 사용해서 호스트랑 시리얼 통신을 하고 디버깅 메뉴를 추가하면 끝~~

프로젝트 생성부터 시작해보자.

여기로 가서


XMEGA256A3BU니까 이 템플릿을 선택하자. 프로젝트 명은 test로~~


여기서 정확한 MCU 파트명을 정해주면 된다.


프로젝트 만들었고 여기서 ASF Wizard를 실행해보자

여기서 USB/CDC Standard I/O (stdio)(component)를 선택해서 추가하면 된다.
여기까지 하면 USB/CDC를 standard IO로 연결해주는 소스가 프로젝트에 추가된다.

그럼 여기서 끝???

일리가 없지...


일단 클럭설정부터 해보자구. conf_clock.h로 가보자.

기본설정은 2MHz 내부 클럭으로 설정되었는데 USB 구동을 위한 설정은 아래쪽에 이미 설정되어 있다. 

#define CONFIG_USBCLK_SOURCE     USBCLK_SRC_RCOSC
//#define CONFIG_OSC_RC32_CAL      48000000UL
//#define CONFIG_OSC_AUTOCAL          OSC_ID_RC32MHZ
//#define CONFIG_OSC_AUTOCAL_REF_OSC  OSC_ID_USBSOF
//#define CONFIG_SYSCLK_SOURCE     SYSCLK_SRC_RC32MHZ
//#define CONFIG_SYSCLK_PSADIV     SYSCLK_PSADIV_2
//#define CONFIG_SYSCLK_PSBCDIV    SYSCLK_PSBCDIV_1_1
이렇게~~

앞에 주석을 제거하자.

#define CONFIG_SYSCLK_SOURCE          SYSCLK_SRC_RC2MHZ
#define CONFIG_SYSCLK_PSADIV          SYSCLK_PSADIV_1
#define CONFIG_SYSCLK_PSBCDIV         SYSCLK_PSBCDIV_1_1


여기는 주석을 추가해주도록 하자.


다음은 USB 설정...conf_usb.h로 가자.

#define  USB_DEVICE_VENDOR_ID             0x0000
#define  USB_DEVICE_PRODUCT_ID            0x0000

이 설정을

#define  USB_DEVICE_VENDOR_ID             0x03EB
#define  USB_DEVICE_PRODUCT_ID            0x2404

이렇게 바꿔줘야한다.

그리고 아래 콜백 함수들을 
#define  UDI_CDC_ENABLE_EXT()             true
#define  UDI_CDC_DISABLE_EXT()

stdio_usb.c의 stdio_usb_enable()과 stdio_usb_disable() 함수와 연결해준다.
#define  UDI_CDC_ENABLE_EXT() stdio_usb_enable()
#define  UDI_CDC_DISABLE_EXT() stdio_usb_disable()

그리고 그 아래쪽에 설정을 잘 봐둬라.
#define  UDI_CDC_DEFAULT_RATE             115200
#define  UDI_CDC_DEFAULT_STOPBITS         CDC_STOP_BITS_1
#define  UDI_CDC_DEFAULT_PARITY           CDC_PAR_NONE
#define  UDI_CDC_DEFAULT_DATABITS         8

보레잇 115200, Stop bit 1. parity 없음, 데이터비트 8~~


그리고 main() 함수에 셋업 함수를 추가해보자.

int main (void)
{
irq_initialize_vectors();
cpu_irq_enable();
sleepmgr_init();
sysclk_init();
board_init();
stdio_usb_init(&USB);
while(1)
printf("hello\r\n");

// Insert application code here, after the board has been initialized.
}

자 여기까지 하고 컴파일을 함 돌리보자.

아 에러가 뜨네...

stdio_usb 의 함수를 인식못하는거 같응께 conf_usb.h에 stdio_usb.h를 인클루드 시켜주자.
conf_usb.h의 아래부분
/**
 * USB Device Driver Configuration
 * @{
 */
//@}

//! The includes of classes and other headers must be done at the end of this file to avoid compile error
#include "udi_cdc_conf.h"
#include <stdio_usb.h>
#endif // _CONF_USB_H_

여기에다 인클루드시켜주자.

그런다음 컴파일 오케이~~

플립으로 다운로드 하고 리붓~~


이렇게 COM34로 잡힌다. 
드라이버는 atmel_device_cdc.inf다. 프로젝트 폴더내에 생성되어 있으니 걱정마시라.

이제 COM34, 115200/8/none/1/none 으로 접속하면


아차 무한루프로 계속 출력시켰지...


디버그 코드 만든다고 이것저것 테스트 중인데 
printf는 잘 동작하는데
scanf는 이상하게 동작한다.

걍 scanf 말고 udi_cdc_getc 를 대신 썼다.


이것저것 뚝딱뚝딱해서 디버그 코드 완성했다.

소스는 여기



흠...

간단하다고 할수도 없고 복잡하다고 하기도 좀 그렇다. 애매한데...
ASF는 문서화가 관건이겠네. 어플노트를 정확하게만 만들어주면 실무 개발자들은 상당히 편할거같다.


끝






2012/04/02

XMEGA256A3BU Module



얼마전 만든 AVR XMEGA 보드.
AVR과 달리 5V 구동이 안된다.
그리고 JTAG는 지원하지만 ISP는 PDI로 변경되었다.

그래서 ISPmkII를 새로샀다....아 내돈 ㅠㅠ

모듈 보드 설계한다고 데이터시트와 어플노트를 이것저것읽어봤는데
성능이 어느정도 향상이 된거같긴한데 내가 관심있게 본건 사용상의
편의성이다.

현재 가지고 있는 ISP나 JTAG는 정품이 아니라 AVRStudio5에서 인식이
안되는데 그렇다고 정품을 사기는 좀 비싸고...그래서 생각한게
AS5에서 컴파일하고 Flip으로 다운로드해서 쓰자 -> 그럼 USB가
지원되는 모델로 -> 그중 용량 좀 크고 쓸만한거 -> 하지만 칩
사이즈는 작았으면 좋겠다.

그래서 XMEGA256A3BU를 선택했다.

PCB 납땜 후 Flip 구동시키는데 젠장 인식도 안되고...
USB DFU 어플 노트에는 기본적으로 부트로더가 들어가있다고
나오는데(잘못봤나?)
내 확인해본바...없다. 직접 구워야 됨.

이젠 디버깅 코드를 넣어보자.

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/06

AT90USB1287

1287도 입수~~

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

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

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


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

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

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

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

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의 부트로더다.
인터넷에서 다운받아서 부트로더 날라간 보드에 다운로드해보니까 잘 인식된다.

오케 오늘은 여기까지~~