[AVR]/AVR_EVM2011.10.16 12:09

AVR 개발환경 설정 - 무료 개발툴(WINAVR + AVR Studio) 이용

AVR 개발환경 설정 - 무료 개발툴 이용


개발 환경 설치
AVR 개발 환경 구축을 하기 위해 필요한 파일은 AVR을 컴파일 할 수 있는 WINAVR과 IDE 및 프로그래밍 툴인 AVR Studio 이고 아래링 크에서 다운 로드 가능하다.
1) WINAVR 다운로드 : http://winavr.sourceforge.net/download.html
2) AVR Studio 다운로드 : http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725

각 파일의 최신 버전을 다운로드 받아 설치한다. (별다른 설정 없이 각 파일을 디폴트 디렉토리에 설치하면 된다.)



IDE환경 설정 및 기본 예제 컴파일

프로그램 설치가 완료 되었다면 AVRStudio를 실행한다.

새로운 프로젝트 생성
메뉴에서 [project->Nwe Project] 를 클릭하여 새로운 프로젝트파일을 생성한다.

 

 

Project Tyoe를 AVR GCC로 설정하고(C언어를 이용하기 위해), 원하는 폴더에 원하는 프로젝트명으로 프로젝트 파일을 생성한다.

 

 

디버깅 툴 및 디바이스 설정

 

 

새로운 프로젝트 파일이 생하면 기본적인 환경설정이 이루어 지는데 메뉴에서 [Edit Configuration Option]을 이용해서 디바이스를 다시 설정하거나 컴파일 옵션등을 변경할 수 있다.

 

 

간단히 LED O/Off하는 예제를 작성해서 메뉴에서 [Build -> Build] 를 클릭하면 에러 없이 컴파일되는 것을 확인 할 수 있다.

 

 



프로그램 다운로드

컴파일이 완료 되었다면 실제로 보드에 다운로드 해서 테스트 해볼 수 있다.

메뉴에서 [Tools -> Program AVR -> Connect]를 클릭해서 다운로드 툴을 선택한다. (여기서는 AVRISP mkii를 이용한다.)

 

 

한번 설정하면 다음부터는 AVRISP로 바로 들어갈 수 있다.

먼저 [Main]탭에서 디바이스를 선택한다. 

 

 

[Fuses]탭에서 적절한 Fuses 비트를 선택한다.

여기서는 CKDIV8를 선택 해지하고, SUT_SKCSEL 을 8Mhz 이상으로 선택한다.

 

 

최종적으로 [Program] 탭에서 컴파일 된 hex파일을 선택하고 [Program] 을 클릭하면 다운로드 되는것을 확인 할 수 있다.

 

 



참고

LockBit설정

AVR에 프로그램 후에 프로그램된 내용을 확인할 수 없도록 Lock을 설정할 수 있다. 양산품이라면 보드의 프로그램 내용을 보호하기 위해 설정이 필요하다.

 

 

 

TIP

AVR Studio의 버그? 인지 몰라도 프로젝트에 파일을 추가하면 절대 경로로 잡히는데...

파일이 많아지고 여러폴더에서 링크하거나 다른 컴퓨터로 복사해서 다른 폴더에서 실행하면 경로를 잡지 못해서 에러가 발행하는데..

프로젝트 파일인 *.asp 파일을 열어서 절대 경로를 삭제 하거나 상대 경로로 설정해 주면 이런 문제를 해결 할 수 있다.

Posted by nexp
[AVR]/AVR_EVM2011.09.29 18:32

[AVR] Atmel AVR Studio5 를 이용한 개발환경 설정

[AVR] Atmel AVR Studio5 를 이용한 개발환경 설정

기존 버전에서 완전히 새로운 형태의 AVR Studio5 가 릴리즈 되었다.

AVR Studio5를 이용하여 프로젝트 생성하여 테스트 해보았다.


새로운 프로젝트 생성
AVR Studio4와는 완전히 다른 느낌이다. 이클립스 기반인듯한데...
컴파일러는 기존의 WINAVR을 링크해서 사용하다.




디바이스 선택



이렇게 하면 간단히 프로젝트파일이 생성되고 원하는 파일을 작성하여 컴파일 하면 문제 없이 컴파일 되는 것을 확인 할 수 있다.



여러가지 기능들 변수, 함수 보기나 프로젝트 관련 기능들은 최신의 IDE환경을 따라 편리한 기능들이 많다.



아쉬운점(버그?)
다른 폴더에 있는 파일을 프로젝트에 추가 시키면 기존 AVRStudio와 다르게 파일이 복사가 된다.
이건 좀 이상하다.
자세히 보니 추가 시킬때 옵션으로 Link가 있다. 링크로 추가 시키면 문제 없다.
(다른 IDE환경에서는 기본이 링크로 되는데... AVR Studio5는 디폴트가 복사이다. 물어보지도 않고...?)




가장 큰 문제점이 발생했다.
내가 작성했던 기존 프로젝트들은 기본적으로  /01_drv 폴더에 하드웨어 종속적인 드라이버 파일을 넣고 프로젝트 폴더에서 참조해서 공용으로 쓰고 있다. 그래서 컴파이러 상에서 Path를 잡아 주면 드라이버 파일의 중복을 피하고 한번 수정으로 모든 프로젝트에 적용할 수 있어 편리 하다.

그런데 문제가 생겼다.
AVR Strudio5 에서도 Directory 설정이 가능하긴 한데 설정해서 정상적으로 참조를 못하는것 같다. 디렉토리를 찾지 못한다고 에러를 발생한다. 기존 프로젝트 파일을 다 바꿀 수도 없는 일이고... 뭐가 문제 이지? 아직 초기 버전이라  버그인것 같기도 한데...
좀더 알아 볼 필요가 있다.(PATH 설정 안되는 IDE는 처음이다.)

Posted by nexp
[AVR]/AVR_EVM2011.09.28 12:26

AVR 파워다운 모드 전류측정 실험

AVR 파워다운 모드 전류측정 실험

AVR은 저전류 전용 칩이 아니기 때문에 고려 해본적이 없었는데 전류소모를 적게 해야 할 일이 있어 AVR소비 전류를 줄이는 방법에 대해 검토 해 보았다. MSP430에 비하면 비할 바가 못되지만 아무튼 5단계의 슬립모드 설정이 가능하고 실험 결과 나쁘지 않게 사용가능할것 같다.


AVR전류 측정

전원 공급후 while루프 돌때 - 12mA
USB기능 동작시 - 25mA

아무런 동작을 하지 않아도 12mA가 흐러고 타이머나 기타 페리를 사용하는 순간 25mA까지 소비 한다.

이 상태로는 좀 문제가 있는것 같고 슬립모드 관련 데이터 시트를 보니 몇가지 방법이 있는것 같다. 테스트에 사용한 칩은 ATmega88V이다. 예전 버전 ATmega8을 가지고 테스트 하다 고생 했는데.. 결국 새로운 칩은 슬립 모드 관련 상당히 개선된 점이 많았다.


AVR에는 5단계의 슬립모드가 있다.



IDLE Mode
표에서 처럼 CPU클럭만 멈추고 다른 페리들은 살아 있어서 외부 페리의 이벤트에 따라 께어날 수 있다. 하지만 소비 전류는 크게 줄어들지 않는다.

WINAVR에서 제공하는 코드로 아래와 같이 하면 슬리모드로 진입할 수 있다.
  set_sleep_mode(SLEEP_MODE_IDLE);
  sleep_mode();

실험 결과 슬립모드로 들어 들어 갔을때 9mA 정도 소비 한다. 일반 동작시보다는 3mA정도 줄어 든것 같다


ADC Noise Reduction Mode
IDLE모드 보다는 조금더 페리를 정지 시켜서 전류 소모를 줄이는데... ADC노이즈를 줄이는데 효과가 있다고 하니 사용해볼 만하다.


Power-save Mode
슬립모드에서도 타이머를 사용할 수 있기 때문에 일정시간 이후 슬립모드에서 깨어날 수 있도록 할 수 있다. 
아래 코드로 진입 가능하며 하다.
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_mode();

타이머 인터럽트로 일정 시간 이후 깨어날 수 있으므로 일정시간 간격으로 데이터 센싱하는 용도로 사용하면 파워를 많이 줄일 수 있다.
실험 결과 파워세이브 모드에서 1mA 정도의 소비 전류가 있다.


Power-down Mode
표와같이 모든 페리를 끄고 외부 인터럽트만 동작하는 모드로 가장 전류 소모를 줄일 수 있다. 하지만 께어날 수 있는 방법이 스위치 등을 달아서 에서 인터럽트 발생하는 방법 밖에 없으로 일정시간 후 스스로 께어나기는 힘들다.
아래 코드로 설정 가능하다.
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_mode();

실험 결과 파워다운 모드에서 0.6uA 정도의 전류 소모로 동작이 가능하다.




파워다운 모드가 좋은데 아쉬운 점은 스스로 께어나지 못한다는 점이다. 그렇다고 파워 세이브 모드로 해서 타이머를 켜두면 1mA의 전류가 흐르기 때문에 문제이다.
메뉴얼을 보니 와치독 타이머 인터럽트로 CPU를 깨울 수 있다고 한다.
와치독타이머로 일정 시간후 스스로 께어나게 코드 수정 후 테스트 결과 6uA정도 소모 한다. 께어나는 동안 페리가 동작하므로 잠깐 13uA까지 모소 하지만 파워 세이브 모드와 유사하게 동작하지만 전류는 상당히 줄일 수 있었다.




참고로 ATMega8 (예전 버전)에는 슬립모드 관련 기능이 많이 빈약하다.


Posted by nexp
[AVR]/AVR_EVM2011.07.28 19:04

AVR 와치독(Watchdog) 타이머 사용하기

AVR 와치독(Watchdog) 타이머 사용하기
MCU가 예외 상황으로 멈춰 있을때 리셋을 걸어 주어야 하는데.. 이때 Watchdog를 사용할 수 있다.
초기화는 WDTCR레지스터의 비트3을 설정해주면 와치독 타이머가 동작한다.
이때 주의 사항은 MCUSR레지스터의 WDRF비트를 0으로 설정해 주어야 한다.

와치독 타이머가 동작하면 설정한 주기 이내로 레지스터 값을 클리어 해 주어야 하는데
#asm("WDR")
로 가능하다.

WIN AVR을 이용하면 wdt.h에 기본 함수가 정의 되어 있어 간단히 사용할 수 있다.


AVR Watchdoc 타이머 사용 예제 소스코드
#include <avr/wdt.h>

#define  WDTO_15MS   0
#define  WDTO_30MS   1
#define  WDTO_60MS   2
#define  WDTO_120MS   3
#define  WDTO_250MS   4
#define  WDTO_500MS   5
#define  WDTO_1S   6
#define  WDTO_2S   7 


void main(void)
{
   :
   
    //Watchdog 초기화 - ATmega162에서는 MCUSR레지스터가 MCUCSR이다.

    MCUCSR &=~(1<<WDRF);
    wdt_enable(WDTO_500MS);


    while(1)
   {
      :  
      //주기적으로 와치독 클리어
      if(gTimerTickWD>400)
      {
          gTimerTickWD = 0;
          wdt_reset();
      }
   }
  }
Posted by nexp
TAG AVR, WATCHDOG
[AVR]/AVR_EVM2010.08.21 23:07

[ATXmega128a1 EVM] TFT LCD EXP 보드 테스트

[ATXmega128a1 EVM] TFT LCD EXP 보드 테스트



ATXmega128a1 보드를 이용하여 LCD_EXP_EVM 보드 를 테스트 했다.


회로도
LCD_EXP_EVM보드 회로도


ATXmega128 EVM 보드 회로도



ATXmega128a1 TFT LCD(COM26T2844) 테스트 예제 코드
//-----------------------------------------------------------------------------
// TFT LCD(COM26T2844) Driver
#define LCD_LAT_BIT      BIT8
#define LCD_LAT_PORT     PORTA
#define LCD_LAT_ON()     Sbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_LAT_OFF()     Cbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT1
#define LCD_EN_PORT      PORTF
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      BIT5
#define LCD_RST_PORT     PORTF
#define LCD_RST_ON()     Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT4
#define LCD_RS_PORT      PORTF
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT1
#define LCD_WR_PORT      PORTE
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      //BIT7
#define LCD_RD_PORT      //PORTA
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT0
#define LCD_BL_PORT      PORTF
#define LCD_BL_OFF()     Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(LCD_BL_PORT, LCD_BL_BIT)

#define TFTGpioInit()     PORTJ_DIR = 0xFF;\
          PORTK_DIR = 0xFF;\
          Sbi(PORTF_DIR, BIT0|BIT1|BIT4|BIT5);\
          Sbi(PORTE_DIR, BIT1);
//----------------------------------------------------------------------------- 


XMega128a1 TFT LCD테스트 동영상



기존 ATMega128 7.3728Mhz에서 TFT LCD테스트와 비교하면 속도차를 느낄 수 있다.

Posted by nexp