[AVR]/ATTiny2013. 1. 1. 21:00

[ATtiny10] ADC, PWM 테스트

[ATtiny10] ADC, PWM 테스트



ATtiny 시리즈는 대부분의 코드가 호환된다.



ATtiny10 ADC 소스코드

//Read ADC Value

unsigned char AdcRead(unsigned char Channel)

{

unsigned int value = 0;


ADMUX = Channel&7;

ADCSRA = ADCSRA|ADC_START_CONVERSION;


while(!(ADCSRA & ADC_COMPLETE));


value = ADCL;

return value;

}



ATtiny10 PWM 소스코드

void InitPWM0_A(void)

{

    Sbi(PWM0A_DDR, PWM0A_BIT); //Output for PWM

    

    //TCCR0A |= (PWM0B_CLEAR|PWM_MODEA_FAST);

    TCCR0A |= (PWM0A_SET|PWM_MODEA_PHASE);

TCCR0B |= (PWM0_PRESCALE_DIV8);

//TCCR0A |= (PWM0_PRESCALE_DIV256);

TCNT0 = 200;

    SetPwm0A(0);

}



ATtiny10 ADC, PWM 테스트 동영상




ATtiny10 ADC, PWM 테스트 소스코드
#include "system.h"
#include "pwm.h"
#include "adc.h"
//-----------------------------------------------------------------------------
int main(void)
{
unsigned char pwm = 0;
unsigned char flag = 0;
//시스템 초기화
SystemInit();

        //PWM 초기화
InitPWM0_A();
AdcInit();
while(1)
{
SetPwm0A(~(AdcRead(2)));
Delay(10);
}
}
//-----------------------------------------------------------------------------



Posted by nexp

댓글을 달아 주세요

[AVR]/Mega82012. 5. 9. 23:51

[ATmeag88] Timer2 테스트 - 8-bit Timer/Counter2 with PWM

[ATmeag88] Timer2 테스트 - 8-bit Timer/Counter2 with PWM

 

- Single Channel Counter
- Clear Timer on Compare Match (Auto Reload)
- Glitch-free, Phase Correct Pulse Width Modulator (PWM)
- Frequency Generator
- 10-bit Clock Prescaler
- Overflow and Compare Match Interrupt Sources (TOV2, OCF2A and OCF2B)
- Allows Clocking from External 32 kHz Watch Crystal Independent of the I/O Clock

 

 

 

 

Timer2 초기화

#define TIMER2_VALUE      (256-115)

 

#define TIMER2_CLK_DIVCLK                   1
#define TIMER2_CLK_DIV8                     2
#define TIMER2_CLK_DIV32                    3
#define TIMER2_CLK_DIV64                    4
#define TIMER2_CLK_DIV128                   5
#define TIMER2_CLK_DIV256                   6
#define TIMER2_CLK_DIV1024                  7

 

#define TIMER2_DISABLE_PWM                 0

 

 

#define TIMSK        TIMSK2
#define TIMER2_INT_ENABLE     BIT0
#define Timer2Set(Value)     (TCNT2 = Value)
#define TCCR2        TCCR2B

 

//Initialize Timer2

void IntitTime2(void)
{

    // Enable Timer 2 output compare interrupt
    Sbi(TIMSK, TIMER2_INT_ENABLE);

 

    // Start timer 2 with prescaler 128

    Sbi(TCCR2, TIMER2_CLK_DIV128);

   //set 1ms
   Timer2Set(TIMER2_VALUE);
}

 

 

Timer Interrupt Handler

 SIGNAL(SIG_OUTPUT_COMPARE2A)

    gTimeTick++;

    Timer2Set(255-5);

}   

 

 

 

Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012. 1. 29. 10:40

[AT90USB1287] Timer2 테스트

[AT90USB1287] Timer2 테스트

AT90USB1287의 타이머 관련 레지스터는 ATMega128과 약간 다른데 드라이버 코드를 수정할 필요가 있다.
//---------------------------------------------------------------------------------------
#define TIMER2_VALUE      (256-115)

volatile unsigned int m_TimerTick = 0;

//---------------------------------------------------------------------------------------
// Timer2
#define TIMER_STOP                         0
#define TIMER2_CLK_DIVCLK                   1
#define TIMER2_CLK_DIV8                     2
#define TIMER2_CLK_DIV32                    3
#define TIMER2_CLK_DIV64                    4
#define TIMER2_CLK_DIV128                   5
#define TIMER2_CLK_DIV512                6
#define TIMER2_CLK_DIV1024                7

#define TIMSK        TIMSK2
#define TIMER2_INT_ENABLE     BIT0
#define Timer2Set(Value)     (TCNT2 = Value)
#define TCCR2        TCCR2B

void Timer2Init(void)
{
    Sbi(TIMSK, TIMER2_INT_ENABLE);
 Sbi(TCCR2, TIMER2_CLK_DIV128);

 //set 1ms
 Timer2Set(TIMER2_VALUE);
}
//---------------------------------------------------------------------------------------



Timer2 인터럽트 핸들러
//---------------------------------------------------------------------------------------
// Timer2 Handler
SIGNAL(TIMER2_OVF_vect)
{
 m_TimerTick++;

 //Led2Toggle();

 //set 1ms
 Timer2Set(TIMER2_VALUE);
}
//---------------------------------------------------------------------------------------



AT90USB1287 Timer 테스트 예제 소스코드
//-----------------------------------------------------------------------------
int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1Off();

 Led2Init();
 Led2Off();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("[AT90USB1287-EX] Test Program - Timer\r\n");

//Timer2초기화
 Timer2Init();
 enable();

 while(1)
 {
  if(m_TimerTick>100)
  {
   
   Led2Toggle();
   m_TimerTick = 0;
  }
 }
}
//-----------------------------------------------------------------------------



Posted by nexp

댓글을 달아 주세요

[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_EVM2007. 12. 7. 15:53

printf_P() 함수를 이용한 SRAM절약

printf_P() 함수를 이용한 SRAM절약

AVR에서 문자열은 일반 컴파일러와 다르게 SRAM에 저장이 된다.
특히나 램이 적은 MCU에서는 디버깅 출력을 위한 문자열 때문에 곤욕을 치루는데...
printf_P()함수를 이용하면 쉽게 해결 할 수 있다.


printf("\n\n**  String Test - Memory Alocated FLASH. **\n");
일반적인 printf를 이용하면 문자열이 SRAM영역으로 잡힌다.


#include <avr/pgmspace.h>

printf_P(PSTR("\n\n**  String Test - Memory Alocated FLASH. **\n"));
printf_P()함수를 이용하면 문자열이 FLASH영역으로 잡히므로 램을 줄일 수 있다.


따지고 보면 아래과 같은 형식이다. 예전에는 이렇게 사용했고...
static PROGMEM char  string[] = "\n\n**  String Test - Memory Alocated FLASH. **\n"
memcpy_P(buf, string, sizeof(string));
printf((buf);
Posted by nexp

댓글을 달아 주세요