이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.

 


(본 글은 2009.01.27.에 daum의 블로그(http://blog.daum.net/microcontroller/13651109)에 적었던 것을 옮겨왔습니다.)

 

 

 

만물상닷컴의 김원규 사장님으로부터 두 개를 기증 받았다.

 

이 매트릭스를 이용하는 글들은 인터넷 상에도 몇 군데 있는 것 같은데

소스를 받아 분석하는 것도 그렇고 해서

출력하는 방법은 매뉴얼을 보고 나름대로 작성했다.

 

(1) AVR의 내부 SRAM의 일부를 VRAM으로 할당하고,출력 함수는 이 VRAM에다가 이미지를 뿌리도록 한다.

ATmega32의 내부램이 2KB이니까 64자를 표시하는 것으로 삼았다. (64 * 16 = 1024) 즉 VRAM으로 전체 내부램의 50%를 할당했다. DisplayKSC5601String 함수에서 맨 마지막 문자는 NULL이 되어야 하므로 실제 출력 가능한 글자 수는 63자이다.

 

(2) 한글 출력 함수는 기존의 VFD에서 사용하던 함수를 그대로 사용한다.

한글 출력 함수명은 DisplayHangeul(unsigned int unHcode), 영문 출력 함수명은 DIsplayASCII(unsigned char ucCode)로 하였고, 이 함수들은 VRAM에 폰트 이미지를 뿌린다.

 

(3) 타이머 인터럽트를 이용해서 일정 간격마다 VRAM을 읽어서 도트매트릭스에 뿌려준다.

이 때에 뿌려 주기 시작하는 위치를 지정할 수 있도록 하자.

이렇게 하면 시작 위치를 바꾸어 줌으로써 애니메이션 효과를 낼 수 있을 것이다.

예를 들어서 X축의 시작 위치를 하나씩 증가시키면 화면에서는 글자가 왼쪽으로 흐르는 효과를 낼 수 있을 것이다. 반대로 하나씩 감소 시키면 글자가 오른쪽으로 흐르는 것처럼 보일 것이다.

Y축으로도 같은 효과를 만들 수 있는데 현재는 구현하지 않았다.

 

(4) 도트매트릭스 자체가 다이내믹 구동 방식으로 되어 있기 때문에 이 방식으로만 구동이 가능하다. 만물상닷컴의 테스트 기판을 이용하여 작성했는데, 16MHz로 AVR을 구동시켜서 초당 800번의 인터럽트를 만들어서 각각 1행을 출력한다. 따라서 16행을 출력하니까 각 행은 초당 50회 출력하는 결과가 된다. 예민한 사람은 깜빡거림을 느낄 수 있지만 대부분의 사람에게는 무난할 것이다.

 

역시 여러 번의 삽질이 있었다.

 

첫번째 삽질은 착각때문이었다.

매뉴얼에 의하면 도트매트릭스를 뒷면에서 보았을 때에, 클럭과 함께 신호를 보내면 가장 오른쪽에 있는 도트가 제일 먼저 신호를 받는 것으로 되어 있다.  이 그림은 뒷면에서 본 것이므로 앞면에서 보면 왼쪽의 도트부터 신호를 받는 것으로 생각했어야 하는데, 앞면의 글자도 오른쪽부터 신호가 들어 오는 것으로 착각하여 폰트를 모두 바꾸는 헛수고를 하였다.

예를 들어 0x00,0x38로 되어 있던 것을 좌우를 뒤집어서 0x1C,0x00으로 바꾸는 작업을 한 것이다. 나중에 도로 바꾸는 일을 했어야 했다. 완전한 삽질...

 

두번째 삽질은 매뉴얼의 부실함 때문이었다.

매뉴얼 어디를 봐도 "LED를 제어하는 R_DATA, G_DATA가 0이면 켜지고 1이면 켜지지 않는다."는 내용이 없는 듯하다. 매뉴얼을 대충 봐서 흘렸을지는 모르지만, 신호 라인에 역신호라면 /R_DATA, /G_DATA라고 해주어야 옳지 않은가 생각한다.

R_DATA 신호와 G_DATA 신호가 0이되어야 켜진다는 사실을 모르고 하루를 삽질했다.

 

세번째 삽질은 대충주의 때문이었다.

뭐 16MH니까 대충해도 행당 50번 출력하는 것에는 문제가 없을거야...

하고 VRAM을 도트매트릭스에 뿌려 주는 함수인 DisplayKLM을 대충 만들었다.

그 함수 안에 정수 연산을 많이하고 있다.

최대 매트릭스 숫자를 2개로 할 때에는 잘 보이는데 3개로 하면 깜빡 거림이 보인다. 4개로 하면 출렁거릴 정도...한 행 출력에 20,000 클럭 이상을 사용한다는 말이다. 정수 연산을 가능하면 최대로 줄이도록 했다. 현재는 15개까지 가능하다. 16개를 달려면 내부 함수들을 수정해야 한다. BYTE형을 int 형으로 수정해야 할 것들이 여러 개 있다.

 

네번째 삽질은 PC와의 시리얼 통신.

출력 가능한 문자수를 PC 프로그램과 AVR 프로그램에서 달리 잡아 놓아 데이터 타입 struct DAT_TYPE의 크기가 다르게 해 놓는 실수를 범한 것이다. 양쪽에서 모두 DATA_TYPE만큼의 자료과 올 때까지 대기하다가 timeout 에러를 발생하도록 프로그램 해 놓았다. 그런데 양 쪽의 DATA_TYPE의 크기가 다르니 한 쪽은 늘 기다리다가 timeout 에러를 만나는 것이지.... 수 시간의 삽질 끝에 간신히 발견했다.

또 PC로 부터 전달 받는 내용을 구조체에 새로 기록하는 내용을 빼먹고 EEPROM에 기록하도록 한 어이없는 실수도 있었다. 통신은 성공적으로 완료했는데 내용이 안바뀌는 것이었다.

 

하여간 지금은 잘된다.

 

앞면 사진이다.

만물상닷컴의 제어 기판은 뒤집혀 있다. 연결선이 짧아서 어쩔 수 없다.

제어기판의 흰 선과 붉은 선, 다이오드는 실제 양산되 기판에는 필요없다.

 

 

뒷면 사진이다.

 

 

키트에서 도트매트릭스를 제어할 때에 휴즈비트를 설정해야 한다.

ATmega32에서는 C포트의 일부를 JTAG으로 사용한다.

C 포트의 2, 3, 4, 5 비트를 JTAG 기능으로 사용하고, 휴즈에서 JTAG를 활성화 시키면 DDR의 설정과 상관없이 JTAG으로 동작한다.

키트에서는 C포트의 0, 1, 2, 3 비트를 도트매트릭스 행제어에 사용하므로 휴즈비트에서 JTAG를 비활성화시켜야 한다.

 

또한 시리얼 입력을 받아서 EEPROMdp 저장하기 위해서 EEPROM에 기록하는 루틴이 들어 있다. 이 루틴이 들어 있을 때에는 전원이 나갈 때에 의도하지 않게 EEPROM에 엉터리 내용을 기재하는 일이 발생할 수도 있다 이를 방지하기 위해서 일정 전압 이하로 내려가면 리셋 상태로 가도록 BROWN OUT DETECT 기능을 활성화 시켜야 한다.

 

AVR 휴즈 비트 중, JTAG 기능은 JTAGEN의 체크를 해제하여야 하고, BROWN OUT DETECT는 BODEN 비트의 체크를 설정하면 된다. BODLEVEL은 BROWN OUT 기능이 2.7V에서 동작할 것인지, 4.0v에서 동작할 것인지를 정한다. 

 

다음은 AVR Sutdio와 Ponyprog에서 도트매트릭스를 제어하기 위해서 설정한 휴즈 상태이다.

 

(AVR Studio) 

 

 (Ponyprog)

 

 

 

 

 

 동작하는 동영상이다.

 

 

 

 표시할 메시지를 전달하는 PC 프로그램.

 

 

블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,