BASIC4MCU | 질문게시판 | atmega128 타이머/카운터를 이용한 시계만들기
페이지 정보
작성자 여누셩 작성일2020-06-15 16:56 조회5,152회 댓글1건본문
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char fnd[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67};
typedef unsigned char u08;
typedef unsigned int u16;
#define bit(x) (1<<(x))
#define sbit(x,y) x |= bit(y)
#define cbit(x,y) x &= ~bit(y)
#define fbit(x,y) x ^= bit(y)
volatile unsigned int sec, min;
volatile unsigned char fnd_cnt, sec1=0, sec2=0, min1=0, min2=0;
SIGNAL(SIG_OVERFLOW1) // TCNT1의 값으로 타이머 카운터의 속도를 조절
{
TCNT1 = 3036;
sec++;
if(sec > 60)
{
sec = 0;
min++;
}
if(min > 60) min = 0;
}
int main(void)
{
min = sec = min1 = min2 = sec1 = sec2 = fnd_cnt = 0;
DDRA = 0xff;
DDRC = 0xff;
TCCR1B = 0b00000100;
TIMSK = 0b00000100;
TCNT1 = 3036; // 초기 TNCT1 값 설정
SREG = 0b10000000;
while(1)
{
sec1 = sec / 10;
sec2 = sec % 10;
min1 = min / 10;
min2 = min % 10;
if(fnd_cnt>4) fnd_cnt = 0;
switch(fnd_cnt++)
{
case 0 :PORTA = 0x00;
PORTC = 0b11110111;
PORTA = fnd[sec2];
break;
case 1 :
PORTA = 0x00;
PORTC = 0b11111011;
PORTA = fnd[sec1];
break;
case 2 :
PORTA = 0x00;
PORTC = 0b11111101;
PORTA = fnd[min2]+0x80;
break;
case 3 :
PORTA = 0x00;
PORTC = 0b11111110;
PORTA = fnd[min1];
break;
default : break;
}
_delay_ms(5);
}
return 0;
}
atmega128을 이용하여 타이머/카운터를 구현하였습니다.
여기서 전체적으로 어떤 흐름으로 타이머/카운터가 구동되는지 궁금합니다.
while문에 케이스 나눈것과 처음에 #define해준것들의 의미가 궁금합니다.
댓글 1
조회수 5,152master님의 댓글
master 작성일
몇 개월이 걸리는 강의를 적어달라는 요구 같습니다.
(그 것이 아니라면 숙제를 대신 해달라는...)