본문 바로가기

Embeded/ATmega128

2010년 10월 25일 월요일 (LED 랜덤 on / off)

// 각각 LED 난수 발생 on/off
//#include <avr/io.h>
#include "portio.h"
#include "TC0.h"
#include <stdlib.h>

#define LED_DDR DDRF
#define LED_OUT PORTF

#define CPU_CLOCK 16000000
#define TICKS_PER_SEC 1000
#define PRESCALER 128

volatile unsigned int g_elapsed_time; // 시간변수
void sleep(unsigned int elapsed_time); // sleep함수
//SIGNAL(SIG_OVERFLOW0); // timer0의 오버플로우 시그널함수
//SIGNAL(SIG_OUTPUT_COMPARE0); // timer0의 비교매치 시그널함수

int minute(int sec);

void init_LED(void); // LED포트 초기화 함수 원형
void init_TIMER(int timers); // Timer Counter 설정
void init_TC0(void); // Timer0 초기화 함수 원형


int main()
{

int count;
SREG = (1<<7)|SREG; // 전체 인터럽트 활성화
init_LED(); // LED포트 초기화
init_TC0(); // Timer0 초기화
init_TIMER(OCIE0); // 타이머 설정
OCR0 = 0x7D; // 비교매치 인터럽트 비교값 설정
//TCNT0 = 0x83; // 오버플로 인터럽트 시작점 설정
//TIFR |= 0x01; // TOV0 오버플로 클리어
sei(); // 인터럽트 활성화 함수
srand((unsigned int)CPU_CLOCK); // 난수 발생 함수

while(1)
{
for(count=0; 7>=count; count++)
{
asm("NOP");
LED_OUT=~(rand()%2<<count); // 난수 LED / ON
sleep(500);
//LED_OUT=0xFF; // LED off
//sleep(500);
}
}
return 1;
}
// LED포트 초기화 설정 함수
void init_LED(void)
{
LED_DDR = 0xFF; // PORTF 출력모드 설정
LED_OUT = 0xFF; // PORTF 초기화
}
// 타이머 설정 함수
void init_TIMER(int timers)
{
TIMSK=(1<<timers);
}
// Timer0 초기화 설정 함수
void init_TC0(void)
{
//TCCR0 = 0x0D; // TCCR0 CTC모드 설정 / 분주비 설정
TCCR0 = 1<<2|0<<1|0<<0; // 이런식으로 설정도 가능함
}

int minute(int sec)
{
int min;
min=min|sec;
return min;
}

void sleep(unsigned int elapsed_time)
{
g_elapsed_time=0;
while(g_elapsed_time<elapsed_time)
{
}
}

/*     시그널 함수 */
/*  비교매치 인터럽트 */
void __vector_15(void)
{
g_elapsed_time++;
}

/* 오버플로 인터럽트
SIGNAL(SIG_OVERFLOW0)
{
TCNT0 = 256-(((CPU_CLOCK/TICKS_PER_SEC)/PRESCALER));
g_elapsed_time++;
}
*/