반응형

[다시 쓰는 8051 따라하기] 환경설정과 시리얼통신 예제
+------------------------------------------------------+
게시장소 : 개인블로그와 다음카페 로봇자작천국
작 성 자 : Timy(me^^;)
작 성 일 : 2004.11.1
문    의 : 다음카페 http://cafe.daum.net/tinyrobo 혹은
           개인블로그 http://electoy.cafe24.com/blog
+------------------------------------------------------+
[시작]

## 환경설정과 시리얼통신 예제

1. 환경설정

우선 컴파일러로 ASEM-51 이라는 어셈블러와 SDCC 라는 C 컴파일러를 설치한다. 두가지는 모두 공개된 소프트웨어이고 상용에 비해 불편한 감을 있지만 학습용으로 전혀 지장이 없을뿐더러 내가 어떤 프로그램을 만들어 소스를 공개하도 떳떳한 장점도 있다. KEIL이나 IAR 이 많이 쓰는 상용이고 디버깅도 괜찮은 툴이 있지만 공개용으로 나온 것은 제대로 컴파일도 안되고, 되봐야 아주 작은 2k 정도 밖에 안된다. 물론 이걸로도 얼마든지 사용할 수 있다고 하지만 정작 그래픽LCD 하나 구동시켜려면 이걸로는 아무래 봐도 무리다.

그래서 두번째 방법은 크랙된 해적판 소프르웨어를 구하는 방법이다. 사실 이 방법도 그다지 어려운 방법은 아니다. 알게 모르게 주변에 이런 소프트웨어들이 꽤 돌아다니고 있고, 그래서 구하려고만 하면 얼마든지 구할수 있는게 현실이다. 워낙 인터넷 환경이 좋아지다보니 p2p 로 이런 소프트웨어가 공개된 것을 종종 보게 된다. 당나귀에서 검색을 해보면 화면 두장정도는 쉽게 넘어간다. 서버를 외국쪽으로 돌려도 얼마든지 다운 받을 수 있다. 당나귀는 이제 거의 검열의 상식적 수준을 넘은 존재가 된듯하다. MP3 공유로 국내 서버를 못쓰게 하면 외국 서버로 몰리게 된다. 막기보다는 더 좋은 대안을 제시하고 그리로 끌이들이는 정책이 필요할때 무지한 자의 정면대결은 스스로를 망하게 하는 지름길일 뿐이다. 결국은 스스로도 힘들고, 잘 모르는 어린 사용자들은 그나마 금지되었던 성인용 포르노에 노출된 것이 현실이 아닌가(이것이 법을 넘은 p2p의 현주소이기도 하다).... 차라리 소리바다나 기타 다른 mp3 를 받을수 있는 통로를 유지하면서 다른 방법으로 사용자에게 적절한 대안을 제시했더라면 국내 인터넷이 이정도로 오염되지는 않았을거라는게 개인적인 생각이다. 결국 잘 모르는 이들에게 맡겨두면 이렇게 된다는 역사의 교훈이 한국땅에서 제대로 보여지고 있는 셈이기도 하다. 스스로도 지키지못할 법을 들어 상대를 제압하려는 자는 스스로의 밧줄에 얽혀 낭패를 보게 되는 법이다.
 
사설은 그만하고, 어쨌건 해적판 소프트웨어를 구하는 방법이 있다고 했다. 쉽게 구할수 있다. 그러니 그걸 쓰든지 알아서 해라. 사용해보면 편한 것은 있다. 그리고 KEIL 이나 IAR 을 쓰면서 발생하는 문의사항은 8051에 직접 관련된 것이 아닌 컴파일러에 관련된 것이라면 왠만하면 내겐 묻지 마라.. ^^ 나는 그래도 무료로 불편없이 쓸수 있는 어셈블러와 C 컴파일러까지 이렇게 소개해주고 설정방법까지 알려주는데, 여기와서 KEIL과 IAR을 묻는 것은 나의 이러한 노력을 무참히 짓밟는 것이다 ㅜ.ㅜ

그러니 KEIL 에 관한 문의는 판매처인 www.8051.co.kr 에 가서 할 것을 권한다. IAR 은 잘 모르겠다. 국내서 어디서 판매를 하는지 모르겠다. 다만 www.microrobot.com 에 있는 8051 보드에 IAR 컴파일러를 쓰고 있으니 거기서 문의를 하면 답변을 얻을 수 있을 것이다. 나는 나도 잘 모르지만 ASEM-51 과 SDCC 에 관한 부분만 보도록 하겠다. 사실 나도 이번에 처음 이 두개의 컴파일러를 사용한다. 그래서 모르는 것이 더 많다. 하나씩 하나씩 메뉴얼 보면서 익히고 있는 중이다.

잡담은 이쯤에서 하고 이제 ASEM-51 과 SDCC 를 설치하도록 하자.

http://reinerjansen.de/4flash/
http://sdcc.sourceforge.net/
http://www.aec-electronics.co.nz/software.htm  

위 두군데서 각각 ASEM-51 과 SDCC 를 다운받는다. 최신버젼이 있으면 직접 받아도 좋다.
세번째 링크는 AEC_ISP 라는 프로그램을 다운받는다. 도스용 프로그램이지만 쓰기에는 별 불편한 것을 느끼지 못했다. 조금 느린것 같긴한데, 오히려 다른 프로그램들보다 안정성이 있는 것 같아서 이걸 쓴다. 참고로 하나 더 소개한다면 맨 위 링크에서 JSIM51 이라는 8051 시물레이터를 다운 받을 수 있다. 물론 여기 소개된 모든 프로그램은 무료고 공개된 소프트웨어다.

다운 받기 용이하도록 자료창고용으로 쓰는 파란의 블로그로 업로드시켜둔다. 여기 가서 받아도 되고, 직접 각 링크를 통해 들어가서 파일을 다운 받아도 된다.
직접 받는것도 좋지만 외국이고 하다보니 다운받는데 속도도 느려지고 가끔 사이트들이 없어지기도 하고 그래서 왠만하면 자료실로 쓸만한 곳을 정해두고 내가 필요한 자료는 한번 더 저장해서 백업용으로 가지고 있는게 좋다.

http://blog.paran.com/timy/760414

SDCC 를 설치하기 위해서 sdcc-2.4.0-setup.exe 를 실행시키면 자동 인스톨이 된다.
ASEM-51 어셈블러의 설치는 asem5113.zip 파일을 적당한 디렉토리에 압축을 풀어 넣은 다음 거기 있는 install.bat 파일을 실행시키면 된다. 실행시 설치할 디렉토리를 넣어준다. 필자의 경우는 ASEM51 이란 이름으로 했다. INSTALL ASEM51 [ENTER] 이렇게 하면 ASEM51 디렉토리가 만들어지고 거기에 필요한 파일이 모두 들어가게 된다.
AEC_ISP 의 설치도 마찬가지다. 오히려 쉽다. 파일을 받아서 압축을 풀면 딸랑 세개의 파일이 나오는데 실행파일은 하나다. 나머지는 환경설정을 저장해 두는 cfg 파일이고 다른 하나는 메뉴얼 문서 파일이다. 이것은 그냥 받아서 ASEM-51 폴더에 넣어두자. 크지도 않고 많지도 않고 이렇게 쓰는 것이 오히려 편할것 같다. 따로 폴더를 만들고 패스거는 것보다 3개밖에 안되는 녀석, 그냥 어셈블러와 같은 폴더에 넣어둬도 전혀 문제될 것이 없다.

이제 대충 설치는 끝마쳤다. 설치를 하면서 자동적으로 AUTOEXEC.BAT 파일 내부에 PATH 를 걸어줄 것이다. 어디서든지 SDCC 와 ASEM , AEC_ISP 을 치면 그 명령이 실행되도록 되어 있을 것이다. 만약 그렇지 않다면 AUTOEXEC.BAT 파일을 조금 손봐주면 된다. 내부에 PATH 라고 되어 있는 부분을 살펴보면 중복되어서 여러번 들어있는 PATH 가 있을 것이다. 그 중복된 부분을 제거한다.

PATH C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\UltraEdit;C:\BAT;C:\tic3x4x\c3x4x\cgtools\bin;C:\Program Files\SDCC\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\HNC;C:\asem51

만약 위와 같은 식이라면 C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem; 이 두번 들어있는 셈이다. 여기서 C:\ 로 시작되면서 ; 로 끝나는 부분까지가 하나의 PATH 다. 이렇게 구성된 단위로 중복된 것을 삭제한다. 그리고 마지막부분에 C:\asem51 이라고 되어 있는 부분을 C:\asem51; 로 고친다. 마지막에 ; (세미콜론)을 넣어준다. 이렇게 하면 아마 path 가 잘 걸릴것이다. 이렇게 고쳤으면 저장하고 한번 실행시켜본다. 그런다음 도스창에서 path 명령을 치면 화면에 나오는 것을 보고 제대로 되었는지 확인 할수 있다.

path 가 되었으면 다음은 내가 원하는 작업 디렉토리를 하나 만들자. 이것저것 여러군데서 하다보면 소스와 기타 파일들이 많아진다. 가능하면 한군데서 하고 다 되면 다른곳으로 백업해 두는 방식으로 하도록 하자. TRY51 이라는 디렉토리를 만들고 여기서 작업을 한다고 치면 C:\ 에서 TRY51 폴더를 만든다. 그 다음 거기서 필요한 소스를 두고 작업을 하면 되는 것이다.

작업을 할때 조금 편리하도록 도스 명령으로 된 패치파일을 하나 만들었다.
파일이름은 ASEM51.BAT 로 하였다.
이걸 사용하면 어셈블과 ISP 를 통한 업로드가 한번에 실행된다.
사용방법은 어셈블러로 된 소스로 S1.A51 이라는 소스가 있다고 하면,

ASEM51 S1

이렇게 해주면 끝이다. 그러면 어셈블러가 어셈블을 하고 S1.LST 와 S1.HEX 파일을 만들어준다. 이렇게 만들어진 파일중 S1.HEX 파일은 다신 AEC_ISP 에 연결되서 프린트포트에 isp 로 연결된 8051 보드로 들어가게 된다. AEC_ISP 를 실행하면서 HEX 파일까지 읽어온 상태이므로 나머지 설정과 쓰기만 해주면 된다.


----------------------------(시작)----------------------------------
@ECHO OFF
REM ==========================================
REM    Assemble & ISP Sending BATCH File
REM    Compiler : ASEM51
REM    ISP : AEC_ISP
REM ==========================================
REM
CHCP 437
SET ASEM51INC=c:\asem51\MCU
SET DPMIMEM=MAXMEM 16383
C:\ASEM51\ASEM %1
IF ERRORLEVEL 1 GOTO END

C:\ASEM51\AEC_ISP %1.HEX
GOTO END2
:END
@ECHO ON
@ECHO ERROR !!! CHECK THE SOURCE FILE !!!

:END2
----------------------------( 끝 )----------------------------------

SDCC 는 별도로 설정할 것이 없다. 그냥 SDCC C_SOURCE.C 해주면 된다. 무슨 뜻인지는 잘 알것이라 생각한다.
혹시 울트라에디터나 아니면 다른 에디터를 쓰고 그 에디터에서 외부프로그램을 연결해서 실해시켜주는 기능이 있다면 그 기능을 쓰면 훨씬 편해진다. UEditor 에서 프로그램 소스를 만든 다음 도스 창에서 컴파일하고 다시 AEC_ISP 를 써서 올리는 것이 번거로운 사람은 프로그램 내부에 있는 기능을 쓰면 좋다.

UltraEditor 의 경우를 예로 들면 [고급] - [도구설정] 으로 가서 거기서 설정을 해주면 설정에 관한 것은 여기서 다룰 내용은 아니므로 알아서 하든지 아니면 몰라도 약간만 수고하면 되고, 또 위에 있는 배치파일을 쓰면 별로 수고할 것도 없다. 에디터에서 소스만들고, 수정하고, 한쪽에 도스창 띄워두고 거기서 바로 위에 나온 배치파일 써서 컴파일시키고 동시에 ISP 업로드까지 하면 수고할 것도 없이 바로 된다.





아래는 시리얼통신을 실행시키기 위한 예제 파일이다.
이것을 그대도 실행시켜 결과를 얻는다.
우선 컴퓨터에 8051과 통신할 수 있는 프로그램이 있어야 한다.
이야기 또는 세롬데이타맨을 공개 자료실에서 얻어 설치한다. 필자는 세롬보다는 이야기가 좋다. 심파일 자료실에 가면 이야기가 있다. 워낙 오래된 프로그램이긴하지만 여전히 시리얼통신이 필요할때는 그걸 가져다 쓴다.
또한 시리얼통신이 되어야 하므로 컴퓨터에서 시리얼모뎀을 설치한다. 하드웨어 설치를

[설정] - [제어판] - 시스템 - 하드에어 - 장치관리자 - 모뎀 - 두 컴퓨터간의 통신케이블

이 있는지 확인한 후 없으면 - 아마 없을 것이다 - 설치한다.

[설정] - [제어판] - 새하드웨어추가 - 목록에서 직접 -  ... - 모뎀설치 - 검색하지 않고 목록에서 - 표준모뎀 : 두 컴퓨터간의 통신케이블

이렇게 선택을 하면 된다. 모뎀을 설치하는데 하드웨어적으로 있는 것이 아니라 COM1 포트를 예전에 널모뎀이라고 불렀던 방식으로 시리얼통신을 사용하기 위해 시리얼을 서로 연결하고 통신을 하는 방식을 말한다. 8051과도 시리얼통신을 하는 것이기 때문에 COM1 혹은 COM2 포트에 모뎀이 있는 것처럼 하고, 그 모뎀은 [두 컴퓨터간의 통신케이블] 혹은 [널모뎀] 이라고 하는 것을 선택하면 된다.

그 다음 시리얼모뎀으로 연결하고, 이야기에서 통신설정을 한다. N81 로 설정한다.

프로그램은 ASEM-51 로 컴파일한다. 원 파일의 이름은 s1.asm 이었고, 이것을 컴파일하면 s1.hex 파일이 생성된다.
그 다음 설치된 aec_isp 를 실행시킨다. 이것을 위에서 짠 배치파일을 쓰면,

ASEM51 S1

해주면 끝이다.
리셋키(8051의)를 누르면 프로그램은 시작된다.

다음은 시리얼통신용 프로그램에서 어떤 키보드를 누를때마다 그보다 +1 된 값을 화면상에 보여주는 프로그램이다.
프로그램을 8051로 전송한 다음 컴퓨터에서 이야기프로그램을 실행시키고 컴퓨터의 시리얼포트와 8051의 시리얼포트를 연결시키고 리셋버튼을 눌러주면 그때부터 작동이 시작된다. 컴퓨터의 키보드상에서 누른 값에 1을 더한 값을 출력하는 프로그램이다. 이 프로그램은 JS8051A1 을 소개한 [8051기초 + a]라는 책에서 빌어왔다. 좋은 책이다 사서 꼭 소장할 만한 책이다. 한번 보기 바란다.


;=====================================================================
;
; ASEM-51 V1.3
;
;      MCS-51 Family Macro Assembler   A S E M - 5 1   V 1.3
;     =====================================================
;
;
;
;        Source File:        s1.asm
;        Object File:        s1.hex
;        List File:          s1.lst
;
;=====================================================================

        ORG      00H
        JMP      START

        ORG      35H

START:

        MOV      SP,#50   ; INITIALIZE STACK POINTER
        CALL     SERIAL9600    ; INITIALIZE SERIAL PORT
        
REP:
        CALL     RXDATA
        ADD      A,#1
        CALL     TXDATA
        JMP      REP


;=====================================================================
;=====================================================================

SERIAL9600:

           CLR      ET1            ; TIMER1 INT DISABLE
           MOV      TMOD,#25H      ;
           MOV      SCON,#52H      ; SERIAL MODE 1, REN=1, TI=1, RI=0
           MOV      PCON,#80H      ; PCON.7=SMOD=1
           MOV      TH1,#243       ; TH1 = #243 for 9600bps
           SETB     TR1            ; START THE TIMER1
           RET

;=====================================================================
;=====================================================================

TXDATA:
           JNB      TI,$           ; IF SCON.TI = 0 THEN WAIT
           CLR      TI             ; SCON.TI <- 0
           MOV      SBUF,A         ; SBUF <- A
           RET

;=====================================================================
;=====================================================================

RXDATA:

           JNB      RI,$           ; IF (RI=0) THEN WAIT
           MOV      A,SBUF         ; A <- SBUF
           CLR      RI             ; SCON.RI <- 0, FOR NEXT RECEPTION
           RET

;=====================================================================
;=====================================================================

           END




[끝]
+------------------------------------------------------+
반응형

+ Recent posts