BASIC4MCU | 질문게시판 | ATMEGA128 타이머 문의 드립니다.
페이지 정보
작성자 수제비성애자 작성일2021-11-17 01:21 조회4,997회 댓글3건본문
#define F_CPU 16000000
#define INIT_SEC 0
#define INIT_MIN 0
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char count_int=0;
char count=0, Seconds=INIT_SEC, Minutes=INIT_MIN;
ISR(TIMER0_OVF_vect) // TIMER0 has overflowed
{
count_int++; // count_int값이 하나 증가
// 244번에 한번씩 seconds를 하나 증가 즉, 244.14 Hz / 244 = 1Hz, 즉 1초임.
if(count_int == 244){
PORTG ^= 0x03;
Seconds++;
count_int=0;
}
}
int main(void)
{
const unsigned char Segment_Data[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
//"0, 1, 2, 3, 4, 5, 6, 7, 8, 9"
unsigned int COLUMN[4]={0,0,0,0};
DDRA=0xff; // PORTA 출력용으로 설정
DDRC=0xff; // PORTC 출력용으로 설정
DDRG = 0x03; // PORTG의 D0, D1을 출력으로 설정
TCCR0 = 0x06; // Normal mode, prescale 256, 16M/256=62500Hz
TCNT0 = 0x00; // n=0, 256 count, 62500Hz/256=244.14Hz
TIMSK = 0x01; // timer0 OVERFLOW interrupt enable
SREG |= 0x80; // Global Interrupt Enable
while (1)
{
COLUMN[0] = (Minutes%100)/10; // 분의 십의자리를 계산하여 넣는다.
COLUMN[1] = (Minutes%10); // 분의 일의자리를 계산하여 넣는다.
COLUMN[2] = (Seconds%100)/10; // 초의 십의자리를 계산하여 넣는다.
COLUMN[3] = (Seconds%10); // 초의 일의자리를 계산하여 넣는다.
for(int i=0;i<4;i++)
{
// i번째 자리의 DIGIT만 선택. common Anode라서 거기만 Common을 0을 주어 켤 수 있도록 함.*/
PORTC=~(0x01<<i);
// i번째 자리에 해당하는 세그먼트의 숫자를 켬
PORTA = Segment_Data[COLUMN[i]];
_delay_ms(2);
}
if(Seconds>=60) // 초값이 60이 되면 1분 = 60초
{
Seconds=0; // 초값을 0으로 만듦
Minutes++; // 분값은 하나 증가함
}
}
}
다음을 활용하여
1. 7-segment의 display 되는 숫자를 아래와같이 나타나게 표현해주세요 (점표현은 시간단위와 1분단위쪽에 표시)
[시간단위.] [10분단위] [1분단위.] [10초단위]
2. 초기값을 1시간 59분 40초로 해주세요 (초기값이 1.59.4 로 표시되면 됨)
3. 타이머 관련 옵션을 조정해서 시간을 두배 빠르게 카운트되게 해주세요
#define INIT_HOU 0
if(Minutes>=60) // 분값이 60이 되면 60분 = 1시간
{
Minutes=0; // 분값을 0으로 만듦
Hour++; // 시간값은 하나 증가함
}
을 추가해서 시간을 세도록 만들었습니다.
초기값 1,59,4 를 어떻게 표현해야 할까요?
댓글 3
조회수 4,997master님의 댓글
master 작성일
#define INIT_SEC 4
#define INIT_MIN 59
#define INIT_HOU 1
char count=0, Seconds=INIT_SEC, Minutes=INIT_MIN, Hour=INIT_HOU;
1시 59분 4초의 초기값은 위 선언에서 하면 됩니다.
수제비성애자님의 댓글
수제비성애자
1시간 뒤에 닷, 59분 뒤에 닷 표시는 어떻게 하면 될까요?
master님의 댓글
master 작성일
COLUMN[0] = (Hour%100)/10; // 시의 십
COLUMN[1] = (Hour%10); // 시의 일
COLUMN[2] = (Minutes%100)/10; // 분의 십
COLUMN[3] = (Minutes%10); // 분의 일
COLUMN[4] = (Seconds%100)/10; // 초의 십
COLUMN[5] = (Seconds%10); // 초의 일
for(int i=0;i<6;i++){
PORTC=~(1<<i); // DIGIT
PORTA=Segment_Data[COLUMN[i]]; // 세그먼트 숫자
if((i==1)||(i==3))PORTA|=0x80; // DOT
_delay_ms(2);
}