본문 바로가기

ATMEGA

10월 22일 ATMEGA

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CLOCK    16000000
#define TICK_PER_SEC  1000
#define PRESCALER    128


volatile unsigned int g_elapsed_time; //g_elapsed_time 전역변수로 선언
volatile unsigned int i,k,t,a,j,h;

void sleep(unsigned int elapsed_time); //sleep 함수를 선언
SIGNAL(SIG_OVERFLOW0); //SIGNAL함수를 선언

int main(void)
{
  DDRE=0xFF; //E포트의 I/O핀을 출력용으로 설정
  PORTE=0xFF; //E포트의 I/O핀에 대한 출력값 초기화
  DDRC=0xFF;
  PORTC=0xFF;
  TCCR0=0x05//프리스케일러가 128 분주비 이기 떄문에 101로 비트를 세트
  TCNT0=0x83//타이머 카운트레지스터 TCNT0를 분주비가 125칸이므로 131 으로 초기화
  TIMSK=0x01//인터럽트 마스크 레지스터 TIMSK를 사용함으로 설정 (오버플로우 인터럽트설정)
  
  sei();
  //같다 SREG=(1<<7)|SREG; //최상위비트를 1로만들어 상태레지스터(SREG) I비트 1설정 
              //인터럽트 활성화
  while(1)
  {
    
    for(i=0;i<=60;++i)
    {
      k=i%10;
      t=(i/10<<4)|k;
      sleep(1000); 
      PORTC=t;
      
      if(i==60)
      {  
        PORTE=0xfe<<j&PORTE;  //이전 점등을 유지하면서 점등
        ++j;
        i=0;
        
        if(PORTE==0x00)
        {
          
          PORTE=0xFF;
          
          
        }
        
      }
      
    }
    
  }
  return 1;
}
  
void sleep(unsigned int elapsed_time) //sleep 함수 구현
{
  
  for(g_elapsed_time=0;g_elapsed_time<elapsed_time;)//elapsed_time 값이 1000이므로 초기값 0에서 1씩증가 해서 1000과 비교
                            //SIGNAL 함수에서 ++g_elapsed_time으로 증가하고 있으므로 증감식 생략
  {
    continue;
  }
}
  




SIGNAL(SIG_OVERFLOW0) //오버플로우가 들어오면 시그널함수 호출
{
  TCNT0=0x83//타이머 카운트레지스터 분주비가 125칸이므로 131 으로 초기화
  ++g_elapsed_time; //시간변수 1증가
}  
  


분주비(prescaler)를 128 로 1초 딜레이를 주자

160000000 를 1/1000 해주고 다시 128 로 해주면 125 가 나온다.

그러므로 
TCNT0=0x83//타이머 카운트레지스터 TCNT0를 분주비가 125칸이므로 131 으로 초기화 
              256때



비교 매치 인터럽트를 사용해서 LED점등 하기(CTC)모드

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CLOCK    16000000
#define TICK_PER_SEC  1000
#define PRESCALER    128


volatile unsigned int g_elapsed_time; //g_elapsed_time 전역변수로 선언

void sleep(unsigned int elapsed_time); //sleep 함수를 선언
SIGNAL(SIG_OUTPUT_COMPARE0); //(SIG_OUTPUT_COMPARE0)으로 비교매치 함수를 불러온다.

int main(void)
{
  DDRE=0xFF; //E포트의 I/O핀을 출력용으로 설정
  PORTE=0xFF; //E포트의 I/O핀에 대한 출력값 초기화
  TCCR0=0x0D; //프리스케일러128이므로 101 에 CTC 온 이 1이므로 1101
  //TCNT0=0x00; //비교매치때늦ㄴ 사용하지 않는다.  
  TIMSK=0x02//인터럽트 마스크 레지스터 TIMSK를 CTC모드로 사용함으로 설정 
  OCR0=0x7D; //카운터 최대값 프리스케일러에따라 다름.
  
  sei();
  //같다 SREG=(1<<7)|SREG; //최상위비트를 1로만들어 상태레지스터(SREG) I비트 1설정 
              //인터럽트 활성화
  while(1)
  {
    
    PORTE=~PORTE;
    
    sleep(1000); //1초대기
  }
  return 1;
}
  
void sleep(unsigned int elapsed_time) //sleep 함수 구현
{
  
  for(g_elapsed_time=0;g_elapsed_time<elapsed_time;)
    //elapsed_time 값이 1000이므로 초기값 0에서 1씩증가 해서 1000과 비교
    //SIGNAL 함수에서 ++g_elapsed_time으로 증가하고 있으므로 증감식 생략
  {
    continue;
  }
}
  

SIGNAL(SIG_OUTPUT_COMPARE0) //오버플로우가 들어오면 컴페어 함수 호출
{
  //TCNT0=0x00; //타이머 카운트레지스터 TCNT0를 6으로 초기화
  //비교매치이므로 TCNT0=0x00; 사용않함
  ++g_elapsed_time; //시간변수 1증가
}  
  


 
 

'ATMEGA' 카테고리의 다른 글

타이머 카운터 응용실습2  (0) 2010.10.25
10월 25일 ATMEGA  (0) 2010.10.25
타이머 카운터 응용실습  (0) 2010.10.21
10월 21일 ATMEGA  (0) 2010.10.21
10월 19일 ATMEGA  (0) 2010.10.19