주희아빠의 헝그리 라이딩

마이크로컨트롤러의 조상 8051 시뮬레이터 EdSim51 그리고 Keil Compiler 본문

나름 IT 이야기

마이크로컨트롤러의 조상 8051 시뮬레이터 EdSim51 그리고 Keil Compiler

도림천 버섯돌이 2024. 4. 20. 11:15

2024.4.20

최근 '라즈베리파이 3b' 덕에 (혼자서) 'ARM 스페셜' 을 진행하다가 우연치 않게 마이크로 컨트롤러 8051에 대해 배울 수 있는 좋은 기회가 있었습니다. 마이크로 컨트롤러(이후 MCU)에 대해서는 너무나도 다른 세상이기 때문에 제가 뭘 어떻게 설명할 수는 없고 배웠던 내용 중 잊어버리지 않고 기억하기 위해 정리해 봅니다.

 

8051 이란? 인텔 8051은 1980년 발표된 8비트 마이크로컨트롤러로 8051 계열을 통틀어 MCS 51이라 부른다. 8051은 컴퓨터 시스템의 기초적인 요소인 'CPU-코어(ACC와 B레지스터, ALU, 일반 레지스터 뱅크, SP,PC), 포트, 타이머, 시리얼통신 등 하드웨어 모듈, 메모리인 PROM과 SRAM' 등을 한칩에 내장한 마이크로컨트롤러이다.
출처 : https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%85%94_8051#cite_note-1

나온 지 40년이 훌쩍 넘은 MCU 의 시조새 급인데 특허가 풀려서 복제품이나 개선품들도 많고 비용적으로도 유리해서 아직까지도 많은 곳에 사용이 되며 MCU 중 구조가 단순한 편이라서 처음으로 배우는 이들에게는 교육용으로 많이 등장한다고 합니다.

EDSIM51은 James Rogers 라는 분이 학습용으로 만든  8051 시뮬레이터로 몇 가지 외부 장치들을 내장한 것으로 구현되어 있습니다. 마치 요즘 나오는 '아두이노 교육용 키트' 와 같은 종합 선물 세트입니다.

http://www.edsim51.com/index.html

http://www.edsim51.com/8051simulator/edsim51di.zip

위 사이트에서 다운받은 후 압축 파일을 풀고 해당 디렉터리에서 다음과 같이 실행하면 됩니다. 

C:\home\edsim51di>java -jar edsim51di.jar

 

실행되면 다음과 같은 화면이 뜨게 됩니다. java 로 만든 것이라서 화면이 미려하지는 않고 쓰다 보면 약간의 버그도 있는 듯 하지만 이렇게 좋은 프로그램을 교육용으로 무료로 내놓은 것은 참으로 대단일 일이 아닐 수 없습니다.

The Virtual Peripherals:
Analogue-to-Digital Converter (ADC)
Comparator
UART
4 Multiplexed 7-segment Displays
4 X 3 Keypad
8 LEDs
DC Motor
8 Switches
Digital-to-Analogue Converter (DAC) - displayed on oscilloscope

제일 간단한 LED 부터 숫자 LED 와 문자 표현이 가능한 LCD, A/D 컨버터와 D/A 컨버터, 키패드와 모터, 시리얼 통신 등이 연결되어 있습니다. 

기본적으로 EdSim51 은 어셈블리어로 동작합니다. 하지만 어셈블리어를 꼭 공부할 필요는 없고 영어사전을 보고 단어를 찾듯이 그 명령어가 어떤 뜻인지 알 정도만 돼도 됩니다.

 

가장 단순한 샘플을 시험해 봅니다. 

1. Binary Pattern on the Port 1 LEDs - http://www.edsim51.com/examples/ledPatterns.asm

시뮬레이터 왼쪽 상단에 있는 Update Freq 를 1 으로 해주십시오. (기본값)

; port 1 의 값에서 1을 감소시켜 줍니다.
; 무한루프로 실행합니다.

start:
	DEC p1
	JMP start

 

시뮬레이터에 소스를 복사해 넣고 Run 을 누릅니다. 그러면 화면이 아래처럼 살짝 바뀌면서 동작합니다.

자세히 보면 P1 이라고 써진 곳의 16진수 값이 1씩 작아집니다. 그러면서 왼쪽 아래 있는 LED 가 변하는 것을 볼 수 있습니다. 엄청나게 짧지만 뭔가 동작하는 것을 직관적으로 볼 수 있는 예제입니다.

그런데 왼쪽 LED 말고 가운데 아래쪽에 있는 숫자 LED 도 이상하게 변하고 있습니다. 이것은 왼쪽 LED 의 출력과 숫자 LED 의 출력이 8051 의 데이터 아웃 핀을 함께 사용하고 있기 때문입니다. 이번 예제에서는 그냥 무시하면 됩니다.

 

두 번째 예제입니다.

3. Multiplexing the 7-segment Displays - http://www.edsim51.com/examples/sevenSegDisplays.asm

pause 로 멈춘 후 RST 를 눌러주면 다시 소스 편집 모드로 돌아갑니다. 

시뮬레이터 왼쪽 상단에 있는 Update Freq 를 100 으로 해주십시오. 시간을 빨리 돌리는 마법?!

; This program multiplexes the number 1234
; on the four 7-segment displays.

; Note: a logic 0 lights a display segment.

start:
	SETB P3.3			; |
	SETB P3.4			; | enable display 3
	MOV P1, #11111001B	; put pattern for 1 on display
	CALL delay
	CLR P3.3			; enable display 2
	MOV P1, #10100100B	; put pattern for 2 on display
	CALL delay
	CLR P3.4			; |
	SETB P3.3			; | enable display 1
	MOV P1, #10110000B	; put pattern for 3 on display
	CALL delay
	CLR P3.3			; enable display 0
	MOV P1, #10011001B	; put pattern for 4 on display
	CALL delay
	JMP start			; jump back to start

; a crude delay
delay:
	MOV R0, #200
	DJNZ R0, $
	RET

 

가운데 하단에 있는 숫자 LED 가 차례로 1,2,3,4 를 표현해 줍니다. 이번 학기에 어셈블리어 수업을 듣는 학생이 아니라면 굳이 한 줄씩 어셈블리를 해석하지는 마십시오. 곧 C 로 넘어갈 겁니다.

왼쪽에 있는 기본 LED 가 함께 변하지만 역시 무시해 줍니다.

 

다음은 8051 의 핀과 외부 장치들의 연결 상태를 보여주는 다이어그램입니다. 아래 P1 데이터 아웃을 보면 LED 와 숫자 LED 의 출력이 붙어 있는 것을 볼 수 있습니다.

시뮬레이터 왼쪽 하단의 'LD' 아이콘을 누르면 나옵니다. 필요한 장치만 체크해서 보는 것도 좋습니다.

 

이렇게 어셈블리를 이용해서 계속 프로그램을 짤 수도 있겠지만 상당히 어려운 일입니다. 그나마 어셈블리보다는 한 차원 올라간 C 를 사용해 보기로 합니다.

이를 위해서는 C 컴파일러를 사용해야 하며 Keil 사에서 만든 컴파일러를 사용합니다. 원래는 유료이지만 학습용으로 사용되는 적은 용량 버전은 무료로 이용을 할 수 있습니다.

 

다음 사이트에서 기본적인 정보를 제공하고 컴파일러를 다운 받아줍니다.

https://www.keil.com/demo/eval/c51.htm

 

다운 받은 소프트웨어를 설치하고 실행해 줍니다. 설치 시에는 특별한 옵션은 없습니다.

시작 후 Project - New uVision Project 에서 적당한 경로와 프로젝트 이름을 정해줍니다. 저는 LCD Module 이라고 했습니다.

그러면 바로 타겟 장치에 대한 옵션이 나오는데 이때 Search 에 intel 을 쳐 넣으면 나오는 결과중 '8051AH' 를 선택하고 OK 를 눌러 줍니다.

그리고 컴파일된 내용이 edsim51 에서 읽을 수 있도록 옵션을 정해주어야 합니다.

Target 에서 Code Rom Size 를 Small program 2K or less 로 선택해 줍니다.

Output 에서 Create HEX File 에 체크해줍니다.

Listing 에서 Symbols 과 Assembly Code 에 체크해 줍니다.

세팅이 완료된 이후 프로젝트 아래에서 다음 메뉴를 통해 소스를 추가해 줍니다.

 

http://www.edsim51.com/examples/lcd.c 에서 소스를 복사해 붙여 넣고 저장을 해줍니다.

F7 혹은 왼쪽 상단에 있는 Build 아이콘을 눌러서 컴파일을 해줍니다. 손으로 치지 않고 복/붙 한 것이라면 특별한 에러 없이 컴파일될 겁니다.

뭔가 에러가 나면 위에서 프로젝트 생성할 때 intel 8051AH 외에 다른 것을 선택한 것이 아닌지 확인해 보십시오.

올바르게 컴파일이 됐다면 다음 경로에 .hex 파일을 확인할 수 있습니다.

 

이제 다시 EdSim51 로 돌아가서 Load 메뉴를 통해 해당 소스를 읽어 드립니다.

 

그리고 Run 을 눌러 동작시켜 봅니다. 하단에 있는 문자 표시용 LCD 에 한 글자씩 찍히는 것을 볼 수 있습니다.

Update Freq 를 100 으로 하면 LCD 동작되는 내용을 확인하기 쉽습니다.

Update Freq 를 10 정도로 하고 Data Memory 를 지켜보면 기존 쓰레기 값이 00 으로 초기화 됐다가 다시 다른 값들로 채워지는 것을 볼 수 있습니다.

 

마무리.

처음 C 를 접할 때만 해도 까만 창에 printf 문을 찍으며 '뭐 이런 Low 한 환경이 다 있냐?' 고 궁시렁 거렸었는데, mcu 실습에서는 아예 출력이 없이 메모리 값을 지켜 보면서 프로그래밍을 하기도 합니다. 생각해 보니 실습했던 .c 소스에서 stdio.h 조차 include 를 하지 않습니다.

Assembly 를 보다 보니 왜 C 가 High Level Language 라고 하는 알 것 같습니다. 또한 왜 C 가 하드웨어 제어에도 유리한지 알 수 있었습니다.

2진수, 16진수, AND/ OR/ NOT 같은 논리연산, LCD, LED 세그먼트 등 평소에는 접하기 힘들었던 로우레벨의 기술들이 마구 등장합니다. 40~50년 전에는 주력 기술이었을 이런 내용들이 지금은 Embeded 라는 기술로 살아남아 꾸준히 이용되고 있었군요.

역시나 무엇이든지 기초가 중요하다는 것을 다시 한번 생각해 봅니다.

 

ps. 참고로 게임 하나 소개합니다. 아래 게임을 쉽게 클리어하시는 분들은 어셈블리에 소질이 있으신 분들입니다.

https://play.google.com/store/apps/details?id=com.tomorrowcorporation.humanresourcemachine <- Play Store

https://apps.apple.com/us/app/human-resource-machine/id1005098334 <- App Store

https://store.steampowered.com/app/375820/Human_Resource_Machine/?l=koreana <- PC 버전

 

Human Resource Machine on Steam

Program little office workers to solve puzzles. Be a good employee! The machines are coming... for your job. From the creators of World of Goo and Little Inferno.

store.steampowered.com

반응형