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 어플 노트에는 기본적으로 부트로더가 들어가있다고
나오는데(잘못봤나?)
내 확인해본바...없다. 직접 구워야 됨.

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