Atmega 128

타이머

지화명이 2010. 4. 19. 13:53


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

#define CPU_CLOCK     16000000  // cpu clodk = 16,000,000 Hz
#define TICKS_PER_SEC 1000      // Ticks per sec = 1,000
#define PRESCALER     64        // 클럭의 배수 (크기,오버헤드)
#define DDR_LED DDRF
#define DATA_TO_LED PORTF
#define DDR_SENSOR DDRD
#define DATA_FROM_SENSOR PIND

volatile unsigned int g_elapsed_time;   //  시간 변수

initLED();               // LED 초기화
setTCCR0();
initTCNT0();
setTIMSK();
sleep(unsigned int elapsed_time);  // 1초대기
SIGNAL(SIG_OVERFLOW0);

int main()

 
 
 
 
 initLED();      
 setTCCR0();      
 initTCNT0();
 setTIMSK();
 sei();   // 인터럽트 활성화
 
 
 while(1)    
 {
  
     

  
  sleep(1000);

  
  
  DDR_LED=DDR_LED+1
 
 }
 return 1;
}

initLED()   //LED 초기화 함수

 DDR_LED=0xFF;
 DATA_TO_LED=0xFF;  // 전부켜져있음
}
setTCCR0()   //분주비 64로 설정
{
 TCCR0=0b00000100;  
}
initTCNT0()  // 카운터 6으로 초기화
{
 TCNT0=0b00000110;
}
setTIMSK()   // 오버플로우 사용하겠다.
{
 TIMSK=0b00000001;
}

sleep(unsigned int elapsed_time) // elapsed_time = 1000
{
 int a=0;

 g_elapsed_time=0;
 
 while(1)
 {
  if(elapsed_time==g_elapsed_time)
  {  
   break; 
  }

  
 
 DDR_LED=~a;
 a++;
  
 }
}

SIGNAL(SIG_OVERFLOW0)
{
 initTCNT0() ;
 g_elapsed_time=g_elapsed_time+1; 
}