본문 바로가기

_스타디

[AVR] 세븐세그먼트 이용 카운터 타이머 만들기 | 마이크로프로세서 중간고사

반응형
#include <avr/io.h> //Atmega128 사용 선언
#include <avr/interrupt.h> //Atmega128 인터럽트사용 / 인터럽트 : 예외 상황 발생
#include <util/delay.h> //딜레이를 사용하겠다 선언
Usigned char font[10] = { //세븐 세그먼트 0~9 까지 16진수로 정의 → 폰트에 저장
	0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f
};

int Cnt=0, ten_min=0, one_min=0, ten_sec=0, one_sec=0; //분, 초를 저장할 함수 정의, Cnt  인터럽트 카운트

ISR(TIMER0_OVF_vect){ //타이머0 오버플로우 인터럽트
	++Cnt;
	If ( Cnt == 450 ){ //인터럽트 발생 450회 → 1초
		One_sec++; // 1의 자리 초 숫자 1 증가
		Cnt = 0; // 1초가 증가하였으므로 카운트 초기화 → 다시 카운트 세기
		If ( one_sec == 10){ //10초가 되었을 때
			Ten_sec++; //10의 자리 초 숫자 1 증가
			One_sec = 0; // 1의 자리 초 숫자 초기화
			If ( ten_sec == 6 ){ //10의 자리 초 숫자 6 → 60초가 되었을 때
				One_min++; // 1의 자리 분 숫자 1 증가
				Ten_sec = 0; //10의 자리 초 숫자 초기화
				If ( one_min == 10 ){ // 10분이 되었을 때
					Ten_min++; //10의 자리 분 숫자 1 증가
					One_min=0; //1의 자리 분 숫자 초기화
				}
 			}
 		}
 	}
}
Int main(void){
	DDRA = 0xff; //DDRA 포트를 사용 선언
	DDRB = 0xff; //DDRB 포트를 사용 선언
	PORTB = 0xff; //PORTB 출력포트를 사용 선언 (세븐 세그먼트 숫자 출력), (0→미출력, 1→출력)
	//PORTA  세븐 세그먼트 자리 값을 출력, 0001 으로 초기화 되있다 (0→출력, 1→미출력) *위와 반대*
	// 0001 → 1의 자리 첫번째 자리, 2의자리 두번째 자리, 4의자리 세번째 자리, 8의 자리 네번째 자리
	//타이머 설정
	TCCR0 = 3; //분주비 설정 3→ 011 → 분주비 (32비트)
	TCNT0 = 0; //카운트 초기값 0~256까지 전체 카운트 선언
	TIMSK = 1; //TOIE0 = 1 (타이머/카운트0 오버플로우 인터럽트 인에이블 비트), 타이머0 오버플로우 인터럽트 사용
	SREG = 0x80 //전역 인터럽트 인에이블 (인터럽트를 사용하겠다 선언)
	While(1){ // 무한루프
		PORTA = ~1; //4번째 세그먼트 사용
		PORTB = font[ten_min]; //10의 자리 분 숫자를 출력
		_delay_ms(1); //딜레이 0.001초
		PORTB = 0; //충돌방지 초기화
		_delay_ms(1);
		PORTA = ~(1 >> 1); //3번째 세그먼트 사용 >> : 우로 한칸, ~2로 대체가능
		PORTB = font[one_min]; //1의 자리 분 숫자 출력
		_delay_ms(1);
		PORTF = 0;
		_delay_ms(1);
		PORTA = ~(1 >> 2); //2번째 세그먼트 사용, 우로 두칸이동, ~4로 대체가능
		PORTB = font[ten_sec]; //10의 자리 초 숫자 출력
		_delay_ms(1);
		PORTF = 0; //출력 충돌방지 초기화
		_delay_ms(1);
		PORTA = ~(1 >> 3) //첫번째 세그먼트 사용 우로 세칸이동, ~8대체가능
		PORTB = font[one_sec]; //1의자리 초 숫자 출력
		_delay_ms(1);
		PORTF = 0;
		_delay_ms(1);
		}
    return 0;
}

*타이머 계산 1s (1초) → 0.001ms (밀리세컨) → 0.000001us (마이크로 세컨)

3.6864 MHz 시스템 1 시스템 클럭 주기 = 1/(3.6864 * 10(6제곱)) = 0.27us

 

1024분주비의 256 클럭 카운트 후

→ 인터럽트 발생 소요시간 0.27*1024*256 = 70778.88…us

→ 0.07s 0.07초 마다 인터럽트 발생 인터럽트 14회 발생

→ 0.07s x 14 = 0.98s 이런식으로 초를 구함

반응형