본문 바로가기

AVR(ATmega128)로 장난하기

AVR(ATmaga128)로 FND 4Digt 7세그먼트 전자회로 장난하기



안녕하세요 고군입니다. 이번에는 4자리 FND에 대해 알아보고 예제 프로그램을 통해 표시하는 방법도 알아보겠습니다.


1. 4-digit FND 7세그먼트 특성 및 전자회로



FND 4-Digit 7세그먼트 외형과 회로



위 그림은 숫자 4자리를 표시할 수 있는 7세그먼트의 외형 및 핀 구조를 보이고 있습니다. 2개의 공통 핀을 사용하는 1자리 표시용 7세그먼트와 달리 공통 단자가 각 자리별로 1개씩 있습니다. 위 그림에서 공통 단자를 COMn으로 표기하고 있으며, COM1 ~ COM4까지 사용하고 있습니다, 또한 a~g, 그리고 dp등 총 8개의 세그먼트 핀이 존재합니다. 따라서 12핀으로 구성됩니다.


(a) 4-digit 규격의 공통 음극(Common Cathod)방식


그림 (a)는 4-digit 규격의 공통 음극 방식 7세그먼트의 핀 번호와 핀 이름을 나타내고 있습니다. 공통 단자인 COM1,2,3,4에 모두 마이너스(-) 신호를 가하고, 데이터 신호인 a~g, dp에 모두 플러스(+) 신호를 가하면 모든 7세그먼트는 켜지게 됩니다. 이때 데이터 신호(a~g,dp)중에 하나라도 마이너스(-) 신호로 바뀌면 해당 세그먼트(공통으로 묶인 4개)는 꺼집니다.


(b) 4-digit 규격의 공통 양극(Common Anode)방식


그림 (b)는 4-digit 규격의 공통 양극 방식 7세그먼트의 핀 번호와 핀 이름을 나타내고 있습니다. 공통 단자인 COM1,2,3,4에 모두 플러스(+) 신호를 가하고, 데이터 신호인 a~g, dp에 모두 마이너스(-) 신호를 가하면 모든 7세그먼트는 켜지게 됩니다. 이때 데이터 신호(a~g,dp)중에 하나라도 플러스(+) 신호로 바뀌면 해당 세그먼트(공통으로 묶인 4개)는 꺼집니다.


그림 (a),(b)와 같이 데이터 신호선이 공통으로 연결된 7세그먼트에 각각 다른 숫자를 표시하기 위해서는 동적 디스플레이 제어방식을 사용해야 합니다. 이 방식은 데이터 신호선인 a-b,dp에 자신이 원하는 신호를 인가하고, 공통 단자인 COM1~4중 한 핀만 마이너스(-) 신호를 인가하고 나머지는 공통 단자 핀에(+) 신호를 인가하는 것입니다.


예를  들어 숫자 '1234'를 4개의 7세그먼트에 표시할 때는 그림(C)와 같은 방식으로 신호를 제어해야 합니다. 그림(C)에서는 7세그먼트에 동적 디스플레이 제어를 하기 위한 타이밍 차트를 보이고 있는데, 각 자리별로 시분할하여 자리별로ON/OFF 하는 신호 파형을 보이고 있습니다. COM1 ~ COM4까지는 동일한 분할 시간동안 하나의 핀만(-)신호를 출력한다. 또한 T1에서 T2로 다른 시분할 시간 이동시 COMn신호와 데이터 신호(a~g,dp)는 모두 (-)신호를 출력하는데 이것은 동적디스플레이 제어에 잔상효과를 없애기 위한 방법이다. 잔상효과란 T1 시간에서 출력한 신호가 T2 시간에 영향을 미쳐 원하지 않는 조각이 흐릿하게 디스플레이 되는 현상을 말한다. 또한 잔상효과를 없애기 위해서는 충분한 OFF시간이 필요한데 너무 짧은 경우 잔상효과가 나타날 수 있고, 너무 길면 시분할 디스플레이가 눈에 보이게 되어 원하는 동적 디스플레이 제어를 할 수 없게 된다. 동적 디스플레이 제어 방식은 착시현상을 이용한 제어방식이며, 잔상효과가 나타날 경우 ON/OFF시간을 충분히 조절해야 하므로 정적 디스플레이(static display)제어 방식에 비해 다소 제어가 어려운 단점이 있으나 전력소모가 적다는 장점이 있습니다.



(C) 동적 디스플레이 제어를 위한 각 핀들의 타이밍 차트



2. FND 7세그먼트 제어에 사용되는 디지털 출력 레지스터


DDRx 레지스터는 포트의 입출력 방향을 결정하는 레지스터이며 DDRxn의 값이 0이면 입력, 1이면 출력으로 설정된다. x는 포트명을 가리키는 문자이고 n은 비트를 나타내는 숫자입니다. ATmega128에서 레지스터는 0번부터 7번까지 8비트가 존재합니다. PORTx 레지스터는 포트에 출력할 논리 값을 저장하는 레지스터이며 x는 포트명입니다.





3. AVR 연습용 키트를 사용한 실제 FND 7세그먼트 전자회로


 


AVR 연습용 키트에는 4-Digit로 구성된  7세그먼트 블록이 있으며, 7세그먼트의 a ~ g,dp핀이 연결된 DATA 커넥터와 7세그먼트의 Common핀과 연결된 COM커넥터로 구성됩니다.



위 표는 주로 사용되는 FND 7세그먼트의 디스플레이 폰트를 나타내고 습니다. FND 7세그먼트의 핀 이름이 알파벳에 연속된 조건에서 a핀을 MSB(최상의 비트)로 하고, dp 핀을 LSB(최하위 비트)로 설정하여 폰트를 2진수로 나타내면 0=0B11111100, 1=0B01100000, ....이 됩니다.


4. AVR 연습용 메인 키트에서 동작시켜 보기



10pin 케이블을이나 점퍼선을 이용해 메인 키트의 PORTA와 7세그먼트 블록의 DATA커넥터와 연결하고, PORTC와 COM 커넥터와 연결합니다.



>>> (예제 1.) FND 7세그먼트에 0000 ~ 9999 까지 숫자를 카운터하여 화면에 표시하기



[단계 1] AVR Studio4로 Project를 생성하고, C언어 소스 작성하기 링크


AVR Studio4 편집 화면에 아래 C언어 소스 프로그램을 작성하여 화일명.c로 저장합니다.




▶ C언어 소스 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// ATmega128의 레지스터 등이 정의되어 있음
#include <avr/io.h>
 // _delay_ms() 함수 등이 정의되어 있음
#include <util/delay.h>
 
#define COM4 0
#define COM3 1
#define COM2 2
#define COM1 3 
 
// C 언어의 주 실행 함수
int main(void){
 
    char i, j;    // 8비트의 변수 선언
 
    int d1000, d100, d10, d1;
    // FND에 출력되는 문자 모양(Font, 폰트)을 배열을 이용해 설정
    char FND_Font[ ] = {
         //abcdefg.
 
                0b11111100// FND FONT0
                0b01100000// FND FONT1
                0b11011010// FND FONT2
                0b11110010// FND FONT3
                0b01100110// FND FONT4
                0b10110110// FND FONT5
                0b10111110// FND FONT6
                0b11100000// FND FONT7
                0b11111110// FND FONT8
                0b11110110  // FND FONT9
 
      };
 
      // 포트 A의 방향 설정, 0 : 입력, 1 : 출력
      DDRA = 0B11111111;
 
      // 포트 C의 방향 설정, 0 : 입력, 1 : 출력
      DDRC = 0B00001111;
      PORTB = 0;
      // while 블록 안의 문장을 무한 반복
      
      while(1){
 
        for( i = 0; i < 10000; i++)
        {
 
        d1000 = i /1000;
        d100 = i % 1000/100;
        d10 = i % 100/10;
        d1 = i % 10;
 
               for( j = 0 ; j < 10 ; j++)
            {
 
            // 1000의 자리 출력
            PORTA = FND_Font[d1000];
            PORTC |= 1 << COM1;  
            // 5ms 동안 대기
            _delay_ms(5);
            PORTC &= ~(1 << COM1);
 
            // 100의 자리 출력
            PORTA = FND_Font[d100];
            PORTC |= 1 << COM2;  
            // 5ms 동안 대기
            _delay_ms(5);
            PORTC &= ~(1 << COM2);
 
            // 10의 자리 출력
            PORTA = FND_Font[d10];
            PORTC |= 1 << COM3;  
            // 5ms 동안 대기
            _delay_ms(5);
            PORTC &= ~(1 << COM3);
 
            // 1의 자리 출력
            PORTA = FND_Font[d1];
            PORTC |= 1 << COM4;  
            // 5ms 동안 대기
            _delay_ms(5);
            PORTC &= ~(1 << COM4);      
            }
 
          }
    }     // 함수의 형태와 같이 정수형(int)의 값을 반환함
           return 1;
}
 
cs


[단계 2]AVR Studio 4로 C언어 소스프로그램을 빌드한다링크
[단계 3]AVR Studio 4로 타겟보드에 라이팅을 한다. 링크