레이블이 7세그먼트인 게시물을 표시합니다. 모든 게시물 표시
레이블이 7세그먼트인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 20일 토요일

ATmega8(A) 7세그먼트 실험 (Part 1)

 7세그먼트는 숫자나 시간을 표시하는데 사용되며 우리 주변에서 흔히 볼 수 있는 부품이다. 외관은 아래와 같다.

[그림 1] 7세그먼트의 외관
구동원리는 LED 어레이와 동일하고 도트까지 포함해서 총 8개의 LED가 숫자를 표시하기 위한 레이아웃으로 배치되어 있다. 각각의 LED의 위치 및 명칭과 구조는 다음 [그림 2]와 같다.
[그림 2] 7세그먼트의 구조와 각 LED의 명칭

7세그먼트는 애노드 공통형(anode common type)과 캐소드 공통형(cathod common type)으로 나뉘는데 이는 LED들을 어디에서 결선했는지에 따라서 달라지며 각각에 대한 내부 회로도는 다음 [그림 3]과 같다.

[그림 3] 7세그먼트의 내부 회로도

ATmega8(A)을 이용한 7세그먼트 실험을 위한 회로도는 [그림 4]와 같다. 이것을 구동하기 위해서는 DDRD6='0', PORTD6='1'로 설정해서 GND에 연결된 트랜지스터를 ON시켜야 하여 매크로 Turn7SegOn에 이 동작을 수행하도록 정의하였다. 포트핀의 방향 설정은 초기화 함수 InitAM8()에서 수행한다.
[그림 4] 실험 키트의 7세그먼트 회로도

예를 들어서 숫자 1을 표시 하는 경우는 아래와 같이 LED B와 C를 켜면 된다.
[그림 5] 숫자 1을 표시할 경우

표시 숫자에 따른 전체 데이터 값들은 다음 그림과 같다.

[표 1] 7세그먼트의 숫자 표시 데이터


숫자 0부터 9까지 순차적으로 표시하기

 가장 간단한 실험인 숫자 0부터 9까지 순차적으로 표시하기를 수행한다. <표 5.4.1>에 적힌 데이터를 포트B에 순서대로 내보내기만 하면 된다.

#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include "Am8USBasp.h"
uchar nums[10] =
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
int main(void) {
   uchar byNumId;
   InitAM8();
   while(1) {
       for (byNumId=0; byNumId<10; byNumId++) {
           SEG(nums[byNumId]);
           _delay_ms(500);
       }
   }
}

숫자 데이터를 저장하기 위해서 배열을 사용했다. main()함수에서 하는 일은 이 배열의 데이터를 시차를 두고 내보는 일을 무한히 반복하는 것이다.