반응형

오늘은 ATmega128의 7 segment들을 다루는 것에 대해 포스팅 하겠습니다.

전전기초실험 전공 시간에 진행했던 순서대로 진행하겠습니다.

개요 : Microcontroller에 대한 소개

  • AVR Pin function, GPIO (DDRx, PORTx, PINx)
  • 7Segment Control
  • Common Anode & Common Cathode
  • 예제 : 초시계 만들기 (_delay_ms())

AVR Pin function, GPIO (DDRx, PORTx, PINx)

1. 우리가 사용하는 ATmega128은 여러 pin이 모여 하나의 port를 이룬다.

2. DDRx = Data, Direction Register로 읽기, 쓰기가 가능하며, 해당 portpin의 입출력 방향을 설정한다. 1로 설정되면 출력, 0으로 설정하면 입력으로 설정하는 것을 의미

ex) 0XF0 = 0X11110000(b) 이므로 3~0pin은 입력 7~4pin은 출력으로 사용

3. PINx = Port Input Pins Register로 읽기만 가능하다. 해당 port는 입출력 값이 저장 되어있다. DDRx 값과 관계없이 작동한다. DDRx에 의해 출력으로 설정된 pin이라도 PINx Register를 사용해 현재 Pin의 상태 확인 가능

ex) k = PINF; PORT F의 상태를 읽어 K값에 저장, 만약 K0b10000000이면 PF7HIGH 나머지는 LOW를 의미

4. PORTx = Data Register로 읽기, 쓰기가 가능! 해당 PortPinDDRx Register에 의해 출력 방향으로 설정된 경우, 해당 Pin의 출력 값을 의미. 1이면 High 출력, 0이면 Low 출력

ex) PORTF = 0x01<<4 PF4HIGH 출력 (<<bit shift)

5. 74HC753D 소자 조사

=> 74HC753DD-flipflop으로써 LEOE핀의 입력에 의해 각각 입력과 출력을 제어하는 장치입니다.

=> AVR 내부에서 사용될 때는 schemetic에을 보면, OEGND에 연결되어있다. 따라서 항상 출력이 ON 되어있는 상태이고, 입력은 LE(Latch Enable)핀에 의해 사용자가 자릿수(LED_CTL)를 정하거나, LED DATA를 입력해서 데이터를 사용할 수 있습니다. (아래 그림의 table 참고)

6. SEGMENT를 동시에 켜지 못하는 이유

=> Segment2가지의 구동방식을 가지고 있는데, 하나는 다이나믹 구동방식 다른 하나는 스테틱 구동방식이 있습니다.

=> 다이나믹(Dynamic) 구동방식은 세그먼트를 순차적으로 빠르게 점등 시켜서, 잔상이 남아 우리 눈은 모두 켜져 있는 것처럼 보이게 되는 방식이다.

=> 이와 반대로 스테틱(Static) 구동방식은 한번에 전체 7세그먼트를 모두 켜는 방식이다. 스테틱 구동방식을 이용하려면 다른 세그먼트들과 A~DP 핀이 병렬로 연결되면 안됩니다.

=> 하지만 위의 그림과 같이 모두 병렬연결이 되어있기 때문에 SEG를 동시에 키는 방식(스테틱 방식)을 선택할 수 없습니다. 추가적으로 다이나믹 방식은 MCU에서 사용되는 GPIO 숫자를 줄일수 있고 소모 전류도 낮은 장점이 있습니다.


위에서 이론적인 부분들에 대해서 알아봤고, 아래부터는 코드를 입력해서 간단하게 초시계를 만들어 볼 것입니다.

예제 : 초시계 만들기

그림1. 포트 선언 및 초기화
그림2. void형 time_check()함수 정의

- (그림1)에선 SEGMENT을 구현하기 위해 PORTA, E, G에 대한 입/출력의 방향과 value에 대한 초기화 함수 init_port()를 정의하였습니다.

- (그림2)에선 AVR에서 SEGMENT의 구현을 담당할 void형 함수 time_check()을 정의하였다. PORTELED_CTLLED_DATA를 담당하는 pin을 이용하여, PORTA에 값을 넘겨줄 자리수(FND_SEGPOS)와 값(FND_SEGNP)을 할당해줬습니다. 4개의 SEGMENT가 우측부터 각 0.01(sec)부터 10(sec)자릿수를 의미하며, segment에 출력을 위해 delay 함수를 하나씩 배정했습니다.

- (그림2)에서 1s 자릿수의 경우 FND_SEGWP를 이용하는데, 이는 자릿수의 차이를 나타내기 위한 dot point를 쓰기 위해서 다른 자리가 사용하는 SEGNP가 아닌 SEGWP를 사용하는 것입니다.

그림3. 소스코드 – SW5를 누를 시 시작
그림4. 소스코드 – SW5 누를 시 정지 => SW5 다시 누르면 재시작, SW6 누르면 0000으로 초기화
그림5. 소스코드 내용 – SW6 누를 시 초기화 => SW5 누르면 시작

- PORT초기화에서 DDRG에 대한 부분은 BoardSW버튼을 이용하기 위해서였고, 이를 이용해서 SW5는 정지, SW6는 상태 초기화의 기능을 수행할 수 있도록 코드를 작성했습니다.

- (그림3)(그림4)SW5(정지)의 기능을 정의했습니다. “while((PING & 0x0F) != 0x0E)” 을 이용해서 프로그램을 실행시켰을 때 SW5가 눌리기 전까지는 0000을 계속 화면에 띄우도록 만들었습니다. 이후 SW5 신호가 들어오면 while문을 탈출해서 초시계가 작동합니다.

- while(1)문 안에서 버튼들의 기능들이 각각 정의되는데, 실행되고 나서 SW5가 입력된다면 또 다른 while(1)문 안에 집어넣어 SW5SW6가 들어오기 전까지 대기 상태로 만듭니다. 이후 SW5가 입력되면 while문을 탈출시켜서 다시 초시계 기능을 수행하도록 만들고, SW6가 입력된다면 자리수를 모두 0000으로 초기화시킨 다음에 동작 정지합니다. 이 후 다시 SW5를 누르게 되면 정상 작동하게 되도록 만들었습니다.

- (그림5)에선 SW6(0x0D)에 입력이 들어온다면 각 자리수가 0의 값으로 초기화됩니다. 이후에 SW5가 입력된다면 다시 정상 작동하게 됩니다.

- 추가적으로, SW5SW6의 입력을 인식하는 곳에는 _delay_ms_ 함수가 들어가게 되는데 그 이유는 스위치 바운싱(or 채터링 현상)을 방지하기 위함입니다. delay를 넉넉히 주지 않게 된다면 스위치를 정상적으로 인식하지 못하게 됩니다. 따라서 최소 3ms 정도씩 배정시켜줬습니다.

그림7. 소스코드 – 각 자릿수 증가

- (그림7)은 초시계의 실질적인 기능이 이뤄지는 부분입니다. 0.01(s)자리의 변수 d가 우선 0에서 10만큼 counting이 되면, 0.1(s)자리의 변수 c가 증가하며 변수 d0으로 초기화되고 다시 counting이 됩니다. 동일한 과정이 변수 b(1s)와 변수 a(10s)에도 적용되고, 변수 a10에 도달되면 더 이상 4개의 SEGMENT로는 표현이 불가하기 때문에 ‘0000’으로 초기화시키고 작동하게 됩니다.

결과를 확인해보면,

0000 초기화
STOP at 05.19

위와 같이 구현이 된 것을 확인할 수 있습니다. 보드가 있는 분은 위의 예제코드를 입력함으로써 구현이 된 것을 확인할 수 있습니다.

결론

- SEGMENT10진수를 표현하기 위해선 최소 8개의 신호(A~G)가 필요하며, 4개의 SEGMENT를 이용하게 된다면 32(4*8)개의 pin이 필요합니다. 하지만, 53개의 pin밖에 없는 AVR 보드에서 SEGMENT에만 32개의 pin을 사용하는 것은 비효율적이며, 추가적인 pin의 이용에 제한이 걸리게 됩니다. 이를 해결하기 위해서 이번 실험에선 PORTA4개의 SEGMENT에 동일한 신호를 주고, PORTELED_CTLLED_DATA2개의 pin을 이용하여 SEGMENT을 구현하였습니다.

- PORTG“DDRG = 0x00”으로 전부 입력으로 정해주어 버튼(SW5, SW6)을 이용해서 초시계를 제어했습니다. while(1)(infinite loop)에 대해 조건에 맞게 break를 걸어서 while(1)문을 빠져나오는 방식으로 초시계 정지, 재시작, 초기화를 구현했습니다.

 

Reference

- 74HC574D
https://html.alldatasheet.com/html-pdf/15662/PHILIPS/74HC75/995/4/74HC75.html
- Seven SEGMENT
https://dokkodai.tistory.com/89
- ATmega128
http://www.kjit.bme.hu/images/stories/targyak/mechatronika_robot_mcu/SH_kepzes/atmel_atmega128_manual.pdf

보고서 작성에 사용했던 자료들을 이용했던 것이라 어투가 딱딱할 수 있는데, 궁금한 점이 있으면 댓글 달아주시면 됩니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기