1. 1초씩 FND 숫자가 증가하도록 하시오.
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 16000000
#define TICK_PER_SEC 1000
#define PRESCALER 64
volatile unsigned int g_elapsed_time; //g_elapsed_time 전역변수로 선언
volatile unsigned int i,k,t;
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=0x04; //T/C 컨트롤 레지스터 TCCR0 의 CS02비트를 1로 설정 00000100으로 4 값이 된다.
TCNT0=0x06; //타이머 카운트레지스터 TCNT0를 6으로 초기화
TIMSK=0x01; //인터럽트 마스크 레지스터 TIMSK를 사용함으로 설정 (오버플로우 인터럽트설정)
sei();
//같다 SREG=(1<<7)|SREG; //최상위비트를 1로만들어 상태레지스터(SREG) I비트 1설정
//인터럽트 활성화
while(1)
{
for(i=0;i<100;++i)
{
k=i%10;
t=(i/10<<4)|k;
sleep(1000);
PORTC=t;
}
}
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=6; //타이머 카운트레지스터 TCNT0를 6으로 초기화
++g_elapsed_time; //시간변수 1증가
}
2. 1초마다 FND값을 증가시키다가 60초가 되는 순간 LED를 하나씩 ON하시오.
FND는 0으로 초기화된 후 다시 증가합니다.
#include <avr/io.h>
//#include <avr/signal.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 16000000
#define TICK_PER_SEC 1000
#define PRESCALER 64
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=0x04; //T/C 컨트롤 레지스터 TCCR0 의 CS02비트를 1로 설정 00000100으로 4 값이 된다.
TCNT0=0x06; //타이머 카운트레지스터 TCNT0를 6으로 초기화
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);
if(PORTE==0x00&i==60)
{
PORTE=~PORTE;
j=0;
i=0;
}
PORTC=t;
if(i==60)
{
PORTE=0xfe<<j&PORTE; //이전 점등을 유지하면서 점등
++j;
i=0;
}
}
}
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=6; //타이머 카운트레지스터 TCNT0를 6으로 초기화
++g_elapsed_time; //시간변수 1증가
}
|
|
|