티스토리 뷰

이번 글에서는 TM1637을 제어하여 4자리 숫자를 표시해 보도록 하겠다.


이전 글에서 간단하게 언급하였지만 MCU와 TM1637간의 연결은 CLK, DIO 이렇게 2개의 시그널을 이용한다.  동작 원리는 I2C와 비슷하다는것도 앞에서 설명하였다.

TM1637 datasheet에 설명되어 있는 방법중 "Write SRAM data in a fixed address mode"라는 동작을 이용하여 숫자를 표시하게 된다.

CLK, DIO가 high 상태에서 DIO가 low가 되면 start 된다는 것을 의미한다.

CLK 신호가 low에서 high 상태로 변경되는 시점의 DIO 값이 TM1637로 전달된다.  데이터가 나가는 순서는 LSB부터 나가도록 되어있는데 datasheet에는 이 부분이 정확히 설명되어 있지 않다.

8비트 데이터가 모두 나간후 그 다음 클럭에서 TM1637이 DIO 시그널을 low로 떨어뜨리게 된다.  즉, Ack 동작을 수행하는 것이다.

데이터 전송이 모두 끝나면 stop 신호를 주기 위하여 CLK을 한번 토글 시키고 난 후 DIO 신호를 low에서 high가 되도록 만들어 준다.

위의 그림이 좀더 자세하게 설명되어 있으므로 참고하면 도움이 된다. 

TM1637에서는 세종류의 command가 제공되며 위의 표에서처럼 최상위 2비트값으로 command를 구별하게 된다.

데이터를 내보낼때 사용하기 위한 data command 구조는 위의 표와 같다.  이번 프로젝트에서는 각각의 숫자를 개별적으로 지정해 주기 위하여 Fixed address를 사용하여야 하므로 B2값을 1로 설정한 후 데이터를 전송하게 된다.

TM1637은 모두 6개의 7세그먼트를 구동할 수 있다.  B0 ~ B3의 값으로 특정 숫자를 지정해 줄 수 있게 된다.

7세그먼트의 출력을 제어하기 위하여 Display command를 사용하게 된다.  B3비트 값에 따라 On/Off 제어를 할뿐만 아니라 B2~B0 값을 이용하여 8단계로 밝기 조절이 가능하다.  Cds로 주위 밝기를 측정한 후 display command로 7세그먼트 밝기를 조절할 예정이다.

Datasheet 분석이 끝났으면 최소한의 기능을 구현하여 제대로 동작되는지 확인해 보도록 하겠다.


cbi, sbi 는 AVR 명령이며 지정한 단 1비트값을 0으로 만들거나, 반대로 1로 만들어 주는 명령이다.  CLK, DIO 값을 1혹은 0으로 만들때 사용하기 위하여 macro로 만들어 두었다.

ATtiny85의 GPIO 포트를 제어하기 위한 PINB, DDRB, PORTB의 주소는 위의 표와 같다.

cbi, sbi 명령을 사용할때 주어지는 레지스터 주소를 설정하였고, 각 핀에 연결된 시그널들을 해당 핀 번호에 매핑하였다.

start 신호와 stop신호에 맞게 CLK과 DIO 핀을 구동하도록 하였고, 데이터를 전송하기 위한 send() 동작도 위의 코드처럼 만들어 두었다.

Command를 전송하기 위한 send_cmd()와 7세그먼트 값 data를 전송하기 위한 send_data() 함수를 위의 코드처럼 만들었다.

TM1637 모듈을 초기화 하기 위한 tm1637_init() 함수는 위와 같다.  DIO, CLK 신호를 출력으로 설정한 후 그 값을 모두 high 상태로 만든다.

그 다음 On 신호와 함께 가장 밝게 동작 되도록 밝기 값을 최대값인 7로 설정하였다.

setup() 함수를 통하여 기본적인 초기화를 수행한 후, loop() 함수에서 4개의 숫자를 하나씩 차례대로 모두 on 시킨 후 clear 하도록 하였다.

일단 여기까지 코드를 작성한 다음 프로젝트를 빌드하여 보드에서 동작시켜 보도록 한다.

실행 결과 왼쪽에서부터 오른쪽으로 숫자 8이 차례로 나타났다가 지워지는 것을 볼 수 있다.  즉, 왼쪽에 있는 숫자가 주소 0번이 되고 차례로 오른쪽으로 1,2,3의 주소를 가지게 되는 것을 알 수 있게 되었다.

loop() 함수를 위와 같이 만들고 난 다음 다시 동작을 확인해 보도록 하자.

숫자를 이루는 LED 소자 하나 하나의 위치가 몇번째 비트값에 매핑되어 있는지 알 수 있다.

4자리 숫자를 표시하기 위한 disp_number() 함수를 위와 같이 만든다음 0 ~ 9999까지의 숫자가 제대로 표시되는지 확인해 본다.




tiny_clock.zip



'프로젝트 > Tiny Clock' 카테고리의 다른 글

Tiny Clock - 기능 통합  (0) 2018.05.21
Tiny Clock - 푸쉬버튼  (0) 2018.05.21
Tiny Clock - Cds 측정  (0) 2018.05.18
Tiny Clock - 타이머 설정  (1) 2018.05.18
Tiny Clock - 회로 구성  (0) 2018.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함