Tuesday, June 18, 2019

Futaba M202MD08A(2x20) VFD GPIO Interface Demo

Interfacing a Futaba Custom VFD(IBM POS CustomDisplay) with AVR GPIO
Note : VFD(Vacuum fluorescent display)가 생소하다면, How does a VFD work?.을 먼저 읽어 보시는걸 추천 드립니다.
Note: If you don’t know what is a VFD(Vacuum fluorescent display) I recommend you to read a How does a VFD work?.


오래전, 즐겨 찾는 불용품 판매처에서 IBM VFD(Vacuum fluorescent display)를 저렴하게 팔길래 몇개 구입했습니다, 물건을 받자 기계적으로 구글링 부터, 구동전압은 DC +12V, IBM사 485 통신을 한다는거 이외 다른 정보는 찾을 수 없더군요. 더 이상 진행하는건 무리라 판단, 방치하고 있다 최근에 다시 눈에 띄여 MCU의 GPIO로 직접 구동하기로 마음먹었습니다.



훑어보기

TD62C950(U2)는 Grid Driver이고  datasheet는 인터넷에서 쉽게 찾을수 있었고, SN755700A(U3,U4)는 Anode Driver 이건 TI(Texas Instruments)사 제품임에도 datasheet를 찾을 수 없어 조금 답답하더군요, 기능 자체는 크게 다를게 없으니 차차 파악 하기로 하고 끝으로  P87C58X80(U1) 은 80계열 MCU로 VFD의 Brain Box 인거 같습니다.

* Graphic LCD를 다뤄 보신 분이라면 VFD의 Grid/Anode = Common/Segment로  생각하시는것도 VFD의 동작을 이해하는데 무리가 없을거 같습니다.






준비.

대략 파악되었으니, 작업의 편리성, 분석 오류로 인한 시행착오, 그로 인한 시간낭비를 방지 하기 위해 U1, U2, U3, U4를 제거합니다, 제거 하는 이유는 PCB 표면에 부식방지와 절연을 위해 투명 Comfomal coating 처리가 되어있는데, 이게 핀과 핀사이가 물리적으로 연결 되어 있어도 절연체가 간섭을 일으켜 정확한 분석에 방해가 됩니다. 탈거한 부품과 PCB에 끈적 거리는 잔여물은 Aceton으로 깨끗하게 세척, 이제 다음 단계인 분석을 위한 준비 작업이 완료 되었습니다.

분석.

확인 해야할 IC는 3개, Pin 수가 좀 많아도, 핵심 기능은 몇개 되지 않아  금세 윤곽이 보이는군요,  화면에 뭔가를 표현하기 위해서는 4 bit data bus 그리고  4개의 control pin 총 8개의 GPIO가 필요하고, 만약 밝기 조절(Dimming)을 하지 않는다면 VFD_BK 핀은 VFD_GCLK와 같이 사용해도 되므로 GPIO 7개로도 가능합니다.
Anode Driver인  SN755700A(U3,U4 )의 Serial Clock 은 예상과 달리 Brain Box인 U1이 아니라 분석대상에서 제외시킨  U11 XOR Gate에 연결되있었습니다, 글로 다 표현하지 못한 세세한 내용은 아래 Photos를 참고하세요.

분석이라 해서  뭔가 기술적이고 첨단 장비가 동원되는 세련된 일 같지만 VFD, LCD, Dot Matrx LED와 같은 Display 장치가 그러하듯 Shifter Register 조합이다 보니, 여기서도 Datasheet없는 Shifter Resister의 핀을  멀티미터로 콕콕 찍어가며 파악하는 단조롭고, 시간이 소요되는 일입니다.
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
/**
 * Abbreviations
 *
 * GCLK,    (Grid) shift register clock(TD62C950RFG)
 * GSI,     (Grid) serial data Input.
 * ACLK,    (Anode) shift register clock(SN755700A x 2)
 * SINx     (Anode) serial data Input. (4Bits)
 * BK,      (Anode) output blanking Control input 
 *
 * TMARK    Triangle Mark, That only applies to line 2
 *   |      □ □ □ □ □ □ . . . □ □ □ □ □ □
 *   |      □ □ □ □ □ □ . . . □ □ □ □ □ □
 *   +--->  ▼ ▼ ▼ ▼ ▼ ▼ . . . ▼ ▼ ▼ ▼ ▼ ▼
*/ 

#define VFD_CONTROL_DDR      DDRC
#define VFD_CONTROL          PORTC
#define VFD_GCLK             1    /* U1(3), Grid serial data clock
                                     Anode data latch enable are linked to this pin  */
#define VFD_GSI              2    // U1(2) 
#define VFD_BK               3    // U1(1) 
#define VFD_ACLK             4    // U8(11) 

#define VFD_DATA_DDR         DDRD
#define VFD_DATA             PORTD
#define VFD_SIN0             4    // U1(37) -> U4(A1~A10)
#define VFD_SIN1             5    // U1(36) -> U4(A11~A20)
#define VFD_SIN2             6    // U1(35) -> U3(A21~A30)
#define VFD_SIN3             7    // U1(34) -> U3(A31~A36)
 http://hilite.me/

The Key Point. (자리확보, 내용 추가예정)
VFD의 5x7 Dot Matrix 구성과 화면에 데이터가 표현되는 형식
Anode Driver(Segment)에 4Bit (SIN0~SIN3) 데이터 처리 방법
74HC157(8 to 4 multiplexer)를 이용하는 Hardware적인 방법과
Software로 구현하는 방법



.

.
.
.
.
.
.
.
.
.
.



1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// code that supports software 8 to 4 multiplexer(74HC157)
  // 0,2,4,6 even 4bit
  for(uint8_t i=0; i<5; i++)
  {
    if(data[i] &  _BV(0)) VFD_DATA |=  _BV(VFD_SIN0); else VFD_DATA &= ~_BV(VFD_SIN0);    
    if(data[i] &  _BV(2)) VFD_DATA |=  _BV(VFD_SIN1); else VFD_DATA &= ~_BV(VFD_SIN1);    
    if(data[i] &  _BV(4)) VFD_DATA |=  _BV(VFD_SIN2); else VFD_DATA &= ~_BV(VFD_SIN2);    
    if(data[i] &  _BV(6)) VFD_DATA |=  _BV(VFD_SIN3); else VFD_DATA &= ~_BV(VFD_SIN3);    
    
    sck_anodeHL();
  }

  // 1,3,5,7 odd 4bit
  for(uint8_t i=0; i<5; i++)
  {
    if(data[i] &  _BV(1)) VFD_DATA |=  _BV(VFD_SIN0); else VFD_DATA &= ~_BV(VFD_SIN0);    
    if(data[i] &  _BV(3)) VFD_DATA |=  _BV(VFD_SIN1); else VFD_DATA &= ~_BV(VFD_SIN1);    
    if(data[i] &  _BV(5)) VFD_DATA |=  _BV(VFD_SIN2); else VFD_DATA &= ~_BV(VFD_SIN2);    
    if(data[i] &  _BV(7)) VFD_DATA |=  _BV(VFD_SIN3); else VFD_DATA &= ~_BV(VFD_SIN3);    
    
    sck_anodeHL();
  }
 http://hilite.me/

본격적으로 구현(코딩)에 들어가기 전, PCB에 마침 사용하지 않는 빈자리가 있어 에나멜선(이쁘게)을 정리하고, 핀헤더를  부착 하였습니다, 아마 다른 모델을 위한 SRAM과EPROM 자리인거 같군요.
이미 내가 원하는 위치에 쩜(Dot) 하나는 찍어봤으니 자잘한 기능 구현은 뭐, 다 끓인 콩나물국에 고추가루 조금 뿌리는 정도입니다, 기능설명은  소스코드를 참고하세요. 가능한 주석을 자세히 달아두었습니다, 

주의! 동작시 55V의 고전압이 흐릅니다, 작업시 주의가 필요합니다.


Schematic
VFD 구동 전압은DC +12V(340mA) , MCU구동을 위한 전압은 VFD에서 나오는 +5V를 이용합니다

Source 파일에는 Eagle CAD, pdf, jpg 형태로 첨부되어있습니다(보기에는 pdf가 좋아요)
정리.
구입 하고나서 일치김치 포기하고 방치했던 이유는 이게 단순 485통신이 아니라 IBM 제품 답게 SNA 하부구조인 Synchronous Data Link Control (SDLC)를 기반으로 하고 있기에, 일단 복잡합니다. 무었보다, 메세지 기반 통신은 과거 Transac의 Encina 부터 최근 TIBCO Rendezvous에 이르기 까지 충분히 고통(?)받았으므로 여가 시간까지 그것들을 소환하고 싶지 않더군요, 만약 원형 그대로 사용하기를 원하신다면 구현과 분석에 필요한 기술자료는 공개되어있고 아래 Referece Link를 참고하시기 바랍니다.


Video



Source Code.
https://github.com/boricha/M202MD08A

Reference. 

https://github.com/gzalo/LCD-M202MD08A
A Guide to Fundamental VFD Operation

How does a VFD work?
Another IBM POS VFD(RS-232C Interface)
ECR Customer Display - IBM 93F1090 - how to control it?
Octoglow VFD - Main display board

Photos, A Picture paints a thousand words.


* 뭔가를 단시간에 글로 표현하는건 노력이 많이 들어가고 쉬운일이 아닙니다,  특히 분석한게 맞는지 검증하는 과정(파형비교)은 비슷한 일을 할때 유용할거 같아 수시로 추가, 수정 보완 할 예정입니다.