반응형
#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 이런식으로 초를 구함
반응형
'_스타디' 카테고리의 다른 글
정보처리기사 이번엔 붙자. -1 (0) | 2022.08.26 |
---|---|
[conda] Solving environment : failed with initial frozen solve. Retrying with flexible solve : \ 하고 멈춰버릴때! (0) | 2022.06.06 |
SC error 315 / 스타 에러 오류 315 (0) | 2021.08.07 |
SAMSUNGSDS 랜선멘토링20210629 정리 (0) | 2021.06.29 |
_운영체제_중간고사_20210615_21-1 (0) | 2021.06.15 |