본문 바로가기

하드웨어/Ben eater

8비트 컴퓨터 만들기 Ben Eater Part.6(output) [1.5] - Arduino programmer


EEPROM Arduino Programmer

저번 포스팅에서 EEPROM에 관한 아날로그 프로그래머를 만들었다. 하지만 그 방식은 각 바이트 별로 손으로 설정해줘야 한다는 단점이 있다. 그러니, 아두이노를 활용해 프로그램으로 순식간에 프로그래밍하는 도구가 필요하다. 이 내용은 다음에 대한 스포기도 한데, 앞으로는 EEPROM 많은 바이트에 값을 입력해야 하기 때문이다.

 

아두이노 칩이다

 

하지만, EEPROM의 11개의 주소핀과 8개의 I/O핀을 아두이노 칩 하나도 감당할 수 없다. 아두이노 칩에는 13개의 디지털 핀 밖에 없기 때문!

 

이번 포스팅은 시작부터 참신하다.

 

 


Shift Register

 

Shift Register

 

적은 수의 아두이노 핀 문제를 해결하기 위해 등장한 참신한 주인공. Shift Register이다.

나도 '하나의 핀으로 순차적으로 전달하면 되겠다!' 라고 생각은 했지만, 과거의 정보를 어떻게 저장할 수 있을까의 의문이 있었다.

Shift Register는 여러 개의 D flip flop을 이용하여 과거 정보를 유지한다.

정확히는, D flip flop이 한 텀 delay를 가지면서 정보를 이동시킨다는 특징을 이용하여 마치 배처럼 정보를 이동시킨다.

(이런 모양새 때문에 처음에는 Ship Register라고 들었었다)

 

74HC95

 

74HC95가 Shift Register관련 칩이다.

이 칩은 8-STAGE SHIFT REGISTER, 8-BIT STORAGE REGISTER, 3-STATE OUTPUTS로 이루어져 있다.

단순히 Shift Register만 있는게 아니라, Storage Register도 같이 있어서 좋다. clock(11,12번 핀)이 분리되어 있어서 Shift Register에서 Storage로 값을 이동시키고 싶을 때만 이동시킬 수 있다. 

이 레지스터는 핀 하나로 값을 저장할 수 있는 레지스터이자, 핀 하나를 핀 여덟 개로 늘릴 수 있는 도구인 셈이다.

 

9번 핀은 단순히 8번째 데이터를 출력하는 핀인데, 이 핀을 다른 Shift Register의 Data Input으로 연결해주면 이어서 사용할 수 있다. 그러면, 저장하는 용량이 16bit로 늘어난다. 

 

+ 하나의 핀으로 들어가고 (Serial-in) 여러 핀으로 나와서 (Parallel-out) SIPO(Serial-in to Parallel-out)라고 불린다고 한다.


 

프로그래밍

아두이노 ShiftOut 명령어

 

아두이노 함수 중 ShiftOut 함수는 Shift Register에 최적화되어 있다. 데이터 핀, 클락 핀을 맞추고 value에 1바이트의 값을 넣으면 하나의 핀을 이용하여 자동으로 Shift 레지스터에 하나의 핀을 이용하여 값을 넣어준다.

 

아두이노 코드 : 8개 키기

 

shiftOut 함수를 이용한 코드이다. 1byte를 표현했고, led를 전부 키게 된다.

(SHIFT_LATCH는 Storage Register의 클락 핀이 연결되어 있다.)

 

setAddress 함수로 따로 빼냄

 

 

Shift Register를 이용한 EEPROM의 주소 입력 부분이 될 것이다. 기능 setAddress로 따로 뺐다.

EEPROM 11비트 주소 핀에 대응해 두 개의 Shift Register를 사용했고, 코드 상에서도 두 줄을 이용해 표현했다. 

두 번째 레지스터의 마지막 비트는 11비트 주소 내에 들어가지 않으므로 따로 OutputEnable 플래그 값을 표현하는 데에 활용했다.

 

아두이노 코드 : readEEPROM 함수

 

readEEPROM 함수이다. 알잘딱깔센하게 이해가능하다.

 

임시 회로
EEPROM과 결합한 모습

 

setup 함수 내의 내용 -> 나중에 printContent 함수로 이동한다.

 

setup 함수 내에 추가한 내용이다. Serial 모니터를 활용하여 EEPROM의 모든 주소의 데이터를 읽어온다.

 

출력 화면

 

아두이노 코드 : writeEEPROM 함수

 

아두이노에는 자체 딜레이 기능이 있어서 참 편하다. 최대 시간을 지키기 위해 캐패시터를 이용할 필요가 없다.

다만 저 시간이 최대 시간이랑 아슬아슬하게 걸리는 데, ben eater씨가 데이터 시트를 자세히 보여주면서 High Reliability로 10000~100000 cycle은 버틸 수 있으니 괜찮다고 부연설명해줬다.

 

7-segment 숫자 핀 데이터
최종 setup 코드

 

이제 모든 함수를 완성했으니, 저번 포스팅의 내용을 아두이노를 활용하여 프로그래밍할 차례이다. 7-segment의 각 숫자에 맞는 핀 값을 16진수로 변환하여 data 변수로 넣어놨다.

이 후 writeEEPROM 함수를 이용하여 대입한다.


 

마무리

7-segment 회로와 디지털 EEPROM Programmer

 

완성!

 

이번 포스팅은 프로그래밍 코드가 많아서 다소 산만했던거 같다.

다음 포스팅은 여러 개의 7-segment를 어떻게 EEPROM 하나로 작동시킬 수 있는지에 관한 내용이다.

다음 내용이 진짜 참신했다!