[ATmega128]을 이용한 7-세그먼트 Delay와 Timer/Counter 실험
지나감 ・ 2020. 1. 8. 12:09
안녕하세요~지나감입니다!
오늘은 7-세그먼트를 이용하여 숫자가 바뀌는 실험 2가지를 해보겠습니다.
ATmega128에 코드 넣는 방법은 제 블로그 '실습감'의 "<AVR Studio 4> 사용법>에 있고,
Timer/Counter에 대한 자료는 제 블로그 '개념감'의 "ATmega128 타이머/카운터 레지스터"에 있습니다! :)
회로도
*ATmega128을 아래 회로도와 같이 연결합니다.
테스트에 사용한 7-세그먼트는 공통 애노드 타입입니다.
타이머/카운터 알고리즘
타이머/카운터 순서도
Code 1 - delay 함수를 이용한 7-segment 제어
#include <avr/io.h>
#include <util/delay.h>
#define FND0 0x88 //7-세그먼트에서 0으로 보임
#define FND1 0xBE //7-세그먼트에서 1로 보임
#define FND2 0xC4 //7-세그먼트에서 2로 보임
#define FND3 0xA4 //7-세그먼트에서 3로 보임
#define FND4 0xB2 //7-세그먼트에서 4로 보임
#define FND5 0xA1 //7-세그먼트에서 5로 보임
#define FND6 0x83 //7-세그먼트에서 6로 보임
#define FND7 0xBC //7-세그먼트에서 7로 보임
#define FND8 0x80 //7-세그먼트에서 8로 보임
#define FND9 0xB0 //7-세그먼트에서 9로 보임
unsigned char FND[10] = {FND0, FND1, FND2, FND3, FND4, FND5, FND6, FND7, FND8, FND9};
int main(void)
{
int i=0;
int j=0;
DDRC = 0xFF;
while(1)
i=j%10;
PORTC = FND[i];
j=j+1;
_delay_ms(1000);
}
return 0;
Code 2 - Timer/Counter0를 이용한 7-segment 제어
#include <avr/interrupt.h>
#define FND0 0x88
#define FND1 0xBE
#define FND2 0xC4
#define FND3 0xA4
#define FND4 0xB2
#define FND5 0xA1
#define FND6 0x83
#define FND7 0xBC
#define FND8 0x80
#define FND9 0xB0
volatile unsigned long timer0;
volatile unsigned int i=0;
unsigned char FND[10]={FND0, FND1, FND2, FND3, FND4, FND5, FND6, FND7, FND8, FND9};
ISR(TIMER0_OVF_vect)
timer0++;//오버플로우마다 1씩 증가
if(timer0 % 250 == 0)//250회의 오버플로우 발생 시 마다 = 1초
i = i % 10;//10으로 나눈 나머지가 i에 들어감
i=i+1;
DDRC = 0xFF;//7-Segment 출력 핀으로 설정
TCCR0 |= 1<<CS02 | 1<<CS01;//256분주 프리스케일러
TIMSK |= 1<<TOIE0;//타이머/카운터0 인터럽트 활성화
sei();
while(1);
위의 영상과 같이 delay 함수를 사용했을 때와 타이머/카운터0를 사용했을 때의 실험 결과는 같습니다.
-지나감!