ATmega128 7세그먼트 카운터 - ATmega128 7segeumeonteu kaunteo

[ATmega128]을 이용한 7-세그먼트 Delay와 Timer/Counter 실험

ATmega128 7세그먼트 카운터 - ATmega128 7segeumeonteu kaunteo
지나감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/io.h>

#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에 들어감

PORTC = FND[i];

i=i+1;

}

}

int main(void)

{

DDRC = 0xFF;//7-Segment 출력 핀으로 설정

TCCR0 |= 1<<CS02 | 1<<CS01;//256분주 프리스케일러

TIMSK |= 1<<TOIE0;//타이머/카운터0 인터럽트 활성화

sei();

while(1);

return 0;

}

위의 영상과 같이 delay 함수를 사용했을 때와 타이머/카운터0를 사용했을 때의 실험 결과는 같습니다.

-지나감!