[9] 클럭을 넣어주자. 11/17 18:26 21 line

클럭을 넣어주자.

CPU가 돌아가기 위해서는 몇가지 기본적인 환경을 만들어 주어야 한다.

그중에 클럭은 핵샘 요건으로 CPU의 동작속도를 결정한다. 80C31에서는

칩 내부에 OSC라고 부르는 오실레이타 회로의 일부가 들어 있다.

직접적으로 속도를 결정하는 부분인 수정진동자(crystal)와 세라믹

콘덴서는 들어 있지 않다. 따라서 우리는 사용하려는 속도에 맞는 수정

진동자와 콘덴서를 달아준어야 한다. 수정 진동자는 나중에 직렬 통신을

위해 11.0592 MHz를 사용하고 콘덴서는 30pF 정도의 값을 사용하다.

(그림 1 참조) 수정 진동자 외에 세라믹 레조네이터라는 발진자를 써도

된다. 이때는 콘덴서 값을 47pF 정도인 것을 사용한다. 세라믹

레조네이터가 궁굼하신 분은 집에 있는 가전제품용 리모콘을 하나

박살내보자. 또 다른 클럭 공급 방법이 있지만 더이상의 설명은

초보자에게는 도움이 되지 않을 것 같다.

제작시 주의점은 콘덴서 C1,C2와 crystal Y1를 가능하면 CPU의 18,19번

핀에 가깝게 부쳐주어야 한다. C1,C2,Y1 모두 극성(polarity)은 없다.

참고로 JS8051A는 crystal을 ATS 타잎 (높이가 낮은 타잎)을 사용하여

CPU소켓안에 구성 되어 있어 겉에서는 보이지 않아 깔끔하고 컴팩트

하다.

[10] 리셋을 걸어주자. 11/17 18:28 40 line

RESET를 걸어 주자.

리셋신호는 CPU 및 다른 소자들을 초기화 시키는데 사용하는 신호로

반드시 규정에 맞게 공급해야 하는 신호입니다. 리셋은 전문적인

시스템에서는 의외로 민감한 문제 입니다. 리셋 회로를 정식으로

설명하자면 꽤 양이 됩니다. 하지만 초보자들은 그림 2와 같이 검증된

회로를 꾸며 사용하면 문제가 없습니다. CPU가 정상 동작 하기 위해서는

파워가 공급과 함께 리셋을 걸어 주어야 합니다. 혹시 CPU에 전원만

주면 초기화가 되는지 알고 있는 분들이 계실지도 모르겠군요. 하지만

그렇지 않습니다. 그림 2의 리셋 회로가 그러한 POWER-ON RESET 이라는

중요한 기능을 해 줍니다.

회로를 간단히 설명드리겠습니다. 하지만 이해가 안되면 그냥 넘어

가십시요. 전문 전자 쟁이가 아니면 괜찮습니다. 파워가 온이 되면

전하가 저항을 통해 콘덴서에 충전이 됩니다. 이때 충전 시간은

저항값과 콘덴서의 용량에 관계가 됩니다. 충전이 되는 동안 이미 다른

칩에는 VCC가 정상 공급 되게 됩니다. 그러면 HC04의 출력은 HIGH가

되지요. 충전이 계속되어 HC04의 입력 쪽이 HIGH가 되면 출력은 LOW가

되지요. 간단 하지요.

그런데 다이오드가 이상한 방향으로 걸려 있군요. 잘 생각해 보십시요.

전원이 나가면 VCC가 급격히 내려 갑니다.(물론 회로내에 버퍼링

콘덴서가 얼만큼 있느냐에 따라 다르지만) 그러나 콘덴서의 방전은

저항을 거쳐 방전되므로 서서히 방전 됩니다. 이럴때 다시 파워를

온하면 정상 리셋이 안 걸리지요. 따라서 방전은 빠르게 해주기 위해서

값싼 다이오드를 걸어 준 겁니다.

여러 IC 중에는 리셋이 HIGH 인것과 LOW인것이 있어 RESET를 한번더

반전 시켜 /RESET를 만들 었습니다.

PUSH SW는 (양)전하를 순간적으로 GND로 방전 시켜 리셋을 거는데

사용합니다.

제작시 주의 사항은 그림 3에서와 같이 HC04의 입력을 그냥 두면

안됩니다. VCC에 연결을 해주던지 다른 신호를 넣어어야 합니다. 기초가

든든한 분은 알고 있겠지만 일단은 그렇지 않은 분은 일단 그렇게 따라

주십시요. 이유를 설명하자면 CMOS 칩의 내부 구조가 나와야 하고 좀

복잡해 집니다.

11] 메모리와 I/O를 달자. 11/17 18:30 112 line

메모리와 I/O를 달자

먼저 레치를 달자.

'latch on' 이라는 숙어의 뜻을 사전에서 찾아보면 '<개가> 물고 놓지

않다'라는 뜻이 있는데 이것이 latch를 가장 잘 설명한 말일 겁니다.

회로에서의 레치의 기능은 데이타와 어드레스가 다중화된( 시분할로

출력되는) 라인에서 하위 바이트의 어드레스를 물고 일정 기간( 다음

ALE 신호가 오기 전까지 ) 동안 잡아 두는 기능을 합니다. latch용

소자는 몇 개가 있지만 저는 개인적으로 HC573을 좋아합니다. 그러니까

여러분들도 HC573을 쓰세요.("우와~ 이 엄청난 논리")

latch의 /OC( 앞에 슬래쉬(/)는 신호가 LOW 일때 동작하는 Active Low

임을 표시합니다. )는 출력 제어용 핀인데 우리는 무조건 출력으로 놓고

사용합니다. ALE 핀은 CPU에서 출력하는 ALE 핀을 바로 연결하면

됩니다. ALE의 출력은 우리가 만드는 것이 아니고 CPU가 알아서 해주니

너무 걱정하지 마십시요.

롬을 연결하자

롬은 27C256 이라는 32 K byte 짜리를 사용합니다. 데이타 버스와

어드레스 버스는 서로 연결하면 됩니다. 롬을 읽을때 CPU는 /PSEN을

사용합니다. 따라서 CPU의 /PSEN을 ROM의 /OE에 연결해 줍니다.

한가지 중요한게 있는데 회로도의 주1을 보십시요. 칩 선택 핀인

/CE(Chip Enable)은 칩이 항상 선택 상태로 되도록 GND에 물려 있지요.

혹시 이것을 보고 어떤분들은 데이타 버스가 난장판이 되지 않을까

의심을 품는 분이 있겠군요. 하지만 전혀 걱정하지 마십시요. 우리의

시스템은 전체 Program Memory Space에 단지 하나의 롬만 쓰고 있으니

충돌하지 않습니다.

JS8051A 보드를 사용하시는 분은 좀 더 진보된 형태의 ROM, RAM, I/O의

연결을 사용 할 수 있습니다. 자세한 내용은 앞으로 진행됩니다.

램과 I/O를 연결하자

램은 MCS-51에서 말하는 Data Memory Space에 들어가는데 일반적으로 이

공간에는 I/O도 같이 들어가야 합니다. Data Memory Space는 ROM이

들어있는 Program Memory Space와는 다른 완전히 구별된 다른 공간으로

읽고 쓰기가 모도 가능한 공간입니다. CPU가 읽을 때는 /RD 신호선을

쓸때는 /WR 신호선을 사용합니다. 주2를 보십시요. 램의 칩선택 핀이

ROM과 같이 GND에 안가있고 A15에 물려 있지요. 그렇게한 의도는 RAM을

A15가 0일때 선택되도록 하기 위해서 입니다. 그리고 A15가 1일때는

I/O가 선택되도록 꾸며 놓았습니다. 그림 4를 보십시요.



< Address for RAM >

A15 A0 A15 A0

binary : 0000 0000 0000 0000 ~ 0111 1111 1111 1111

hex : 0 0 0 0 ~ 7 F F F

< Address for I/O >

A15 A0 A15 A0

binary : 1000 0000 0000 0000 ~ 1111 1111 1111 1111

hex : 8 0 0 0 ~ F F F F

그림 4에서 좀 특이한 것은 HC139의 enable 핀인 1번 핀과 15번 핀에

각각 /RD와 /WR이 연결되어 있다는 것입니다. 이것은 출력을 계속

유지해주는 기능을 하는 플립플롭(HC574)이나 외부 입력 신호가 데이타

버스를 탈 수 있도록 문을 열어주는 기능이 있는 3상태 버스

버퍼(HC541)를 동작 시키는 신호로 사용하기 위해서 입니다. I/O 선택을

살펴보면 아래와 같습니다.

< 읽기 전용 >

.541_EN

A15,A14 A13 ~ A0

binary : 1 0 0 ~ 0

hex : 8000H

.EX_RD

A15,A14 A13 ~ A0

binary : 1 1 0 ~ 0

hex : C000H

< 쓰기 전용 >

.574_EN

A15,A14 A13 ~ A0

binary : 1 0 0 ~ 0

hex : 8000H

.EX_WR

A15,A14 A13 ~ A0

binary : 1 1 0 ~ 0

hex : C000H

"어~어, 쓸때와 읽을때의 번지가 같네"

맞습니다. 모두 C000H 입니다. 이렇게 전용의 읽기, 쓰기는 같은

번지로 설계가 가능합니다. 쓰는 명령과 읽는 명령이 다름으로 전혀

문제가 없으며 도리어 어드레스 공간을 효율적으로 쓸 수가 있는 것

입니다. 참고로 JS8051A 보드에서도 이와 비슷하게 같은 번지를 읽고

쓰지만 물리적으로는 다른 칩이 동작하게 되어 있습니다.

아직 어리둥절하신 분은 아래 문장을 소리내어 열번 반복해 읽고 다시

한번 읽으세요.

" 프로그램 메모리 스페이스는 '피에스이엔'으로 읽을 수만 있다."

" 데이타 메모리 스페이스는 '리드'로 읽고 '라이트'로 쓴다."


[12] 칩 선택 방법. 11/17 18:34 72 line

칩 선택

"사실 얼룽뚱땅 넘아가려 했는데 질문을 하시는 군요. ~쩝"

먼저 디코딩이라는 말의 개념을 잡을까요.

전자회로에서의 디코딩(decoding)이란 입력된 코드를 해석해서 특정

대상에게 선택 신호를 주는 기능을 말합니다. 예를 들면 전화번호를

누르면 그 전화 번호를 갖고 있는 해당 전화기에 벨이 울립니다. 이때

전화번호는 (어드레스) 코드에 해당되고 벨신호는 선택 신호에

해당됩니다. 대충은 아시겠지요. 참고로 디코딩에 반대되는 엔코딩

(encoding)이라는 말이 있습니다. 예를 들면 커피 자판기에 선택

스위치가 4개가 있다면 1번 밀크 커피를 누르면 4개의 스위치와 연결된

엔코더의 출력에는 00(binary)이 나옵니다. 그리고 4번 카프치노를

누르면 11(binary)이 출력됩니다. 이렇듯이 코드화를 하게 되면 신호

라인을 절약할 수 있고 우리가 알아보기가 쉬운 값이 됩니다. 당여히

신호 처리및 프로그램도 편해 지겠지요.

___________

| |--

| |--

4 ==> | decoder |-- \ /

| |----- o 4번 선에 불이 들어온다.

|___________|-- / \

___________

--| |

--| |

--| encoder | ==> 4(100b)가 튀어 나온다.

4 번을 눌렀다 o --| |

--|___________|

대충 감은 잡았지요.( 사과를 잡으면 안됨 )

CPU가 롬, 램, I/O 등 칩을 선택하는데는 어드레스 신호를 디코딩하는

방법이 일반적으로 사용됩니다. 칩 선택회로는 CPU 마다 신호선이

약간씩 다르고 억세스 타임이라는 이상한 파라미터가 끼어 들기 때문에

CPU 마다 다릅니다. 같은 CPU라도 속도에 따라서도 달라질 수가 있지요.

초보자는 거기까지는 걱정하지 않아도 됩니다. 일단 기분 나쁘더라도

남이 그려준 회로도를 보고 만드십시요.( <-- " 이자식이 내 자존심

건드리네 " - 초보자 왈)

전형적인 칩 선택 방법을 대충 정리하면

1. /CS를 항시 enable 시킨다.

2. /CS에 address line 중에 하나를 바로 연결한다.

3. /CS에 address line 몇개를 조합( AND, OR, NOR ...)해서 넣어준다.

4. 전용 디코더( HC138, HC139, HC154)를 사용한다.

5. CLK 또는 3상태 버퍼 enable 핀에는 address와 /RD, /WR등의 제어

신호를 조합해서 넣어 준다.

6. 비교기( HC688... )를 사용한다.

7. PLD( PAL, GAL ... )를 사용한다.

8. CPU자체 I/O 핀을 바로 연결한다.


이 정도가 되겠군요.( 혹시 더있나 ? )

이중에 HC138과 HC139는 가장 잘 알려져 있는 칩이라 따로 설명은

않하겠습니다. 한가지 조언을 하자면 선택입력( A,B,C,D )에는 꼭

address를 넣어야 하고 enable( G1, /G2A, /G2B )에는 꼭 VCC나 GND를

연결해야 한다는 고정관념은 버리십시요.

여기까지 읽고나서 어떻게 보면 알것도 같고, 어떻게 보면 모를 것도

같은 분은 그냥 넘어 가세요. 부담 갖지 말고.

추신) 아는 분도 그냥 넘어가시고, 모르는 분도 그냥 넘어 가세요.

[13] 시리얼 칩과 패스콘을 달자. 11/17 18:49 54 line

시리얼 과 패스콘

시리얼 (RS-232C) 드라이버, 리시버

다들 아시다시피 디지탈 회로에서는 일반적으로 high 또는 logic 1은

5V로 low 또는 logic 0는 0V로 실현을 합니다.( 요즘은 high를 3.3V

로도 많이 실현하지만 아직은 속도에서 문제가 있지요. ) 이러한 규칙은

디지탈 칩의 입력과 출력에 모두 적용됩니다. 하지만 통신이라는 특수한

용도에서는 5V, 0V 규격을 사용하지 않습니다. 왜냐하면 그런

규격으로는 고속으로 먼 거리( 1 m 이상)를 가는데 문제 있기 때문

입니다. 그래서 좀더 먼거리를 빠르게 보낼 수 있는 여러가지 통신

규격을 여러 선배님들( EIA )이 규정을 했습니다. 그 중에 히트를 친

것이 여러분의 컴퓨터에 붙어 있는 RS-232C라는 규격 입니다. 마우스나

외장 모뎀 연결하는 데 많이 쓰이 잔아요. 개인적으로는 통신 거리가

별로 안되 별로 좋아하지 않습니다만, 어째든 하드웨어를 하기로

하셨다면 반드시 정복해야할 낮은 언덕(?) 입니다. RS-232C 규격에서는

high, low나 1, 0 이라는 말 보다는 'marking', 'spacing'라는 말을

씁니다. 마킹은 -3V ~ -15V 사이를 스페이싱은 +3V 부터 +15V 까지를

말합니다.

80C31에도 다른 CPU와 통신할 수 있도록 시리얼 단자인 RXD, TXD 핀을

제공합니다. 이 핀들의 입,출력도 역시 1과 0이 디지탈 칩의 일발

규격인 5V와 0V를 따릅니다. 적어도 제가 아는 CPU들은 RS232C 규격을

바로 지원하지 않습니다. 그래서 우리가 그 작업을 해 주어야 합니다.

그런 작업을 하는 시리얼 전용 드라이버/리시버에는 우리에게 커피로

더 잘 알려진 맥심(MAXIM) 사의 MAX232라는 칩이 선두 주자 입니다.(

정말 처음 나왔을때 대단했다는 전설이 있음 ). 지금은 많은 다른

회사( 프림 만드는 회사, 설탕 만드는 회사 등등 )에서도 생산 하므로

구지 맥심을 주장하지는 마십시요. MAX232의 특징은 단일 전원 5V를

사용해서 입력 신호(5V, 0V)에 따라 10V와 -10V를 만들어 준다는

것입니다. 내부의 스위칭 회로와 외부에 부착한 콘덴서 4개 ( 잘

생각하면 왜 4개인지 나올텐데...)를 사용하여 배전압 회로에서 10V를

만들어 내고 전압 반전 회로에서 -10V를 만들어 냅니다. ( 몰라도 됨 )

그림 7과 같이 제작 할때 콘덴서의 방향을 주의 하십시요.

패스콘

'패스콘'이 뭐냐구요. 원래 정식 명칭은 bypass condencer로 디지탈

보드에서는 감초 같은 기능을 하지요. 그림 5를 보시면 오른쪽에 무극성

콘덴서가 7개가 있지요(" 에고,에고 하나 빠뜨렸네 칩이 8갠데. ").

용량은 104 = 0.1uF 이고요. 콘덴서의 제질은 상관 없습니다. 제작시 각

DIP 칩의 VCC단자와 GND단자에 가능하면 가장 가까이 달아 주십시요.

패스콘을 안달아준다고 해서 보드의 동작에 지대한 영향을 주지는

않지만 보드내의 noise immunity( 잡음에 견디는 능력 )를 향상 시켜

줍니다. 자세한 내용은 다른 기초 서적을 참고 하십시요.

포트 커넥터 해더 JP5, JP6는 자신이 좋아하는 스타일의 해더를

사용하여 조립하십시요.

Q&A] Polling 기법의 타이머 사용. 11/17 18:51 91 line

- OHMZ님 질문

안녕하십니까? 창원대 전기과에 다니는 학생입니다.

이번 학기에 8051 프로그래밍을 배우는데

저도 관심이 많아 두번이나 만능기판에 만들었는데 실패해서

강사님 소개로 믿고 키트를 주문 했습니다.

하지만 만든게 너무 아까워서 부품도 그렇고, 분명히 그대로

연결했는데... 다른 사람들은 돌아가는데 정말 미치겠습니다.

자꾸 물어보러 다니는 것도 창피하고요. 어떻게 좋은 방법이

없는지요? 버그 잡는 확실한 방법좀 가르켜 주세요.

도통검사는 했거든요.. 오실로 스코프로 해도 정확한 파형을 모르니.

더 중요한 질문이 있습니다. 다음강의에 있는지 모르지만.

어제 타이머로 LED 광고등 제어를 했거든요. 다른건 그럭저럭

이해가 가는데, 크리스탈 펄스를 이용한 DELAY TIME은 정말

해가 가지 않습니다. 12메가 크리스탈을 사용해서 하는데

정말 모르겠습니다. 강의때 들으니 13비트를 이용한 다고 하는데

무슨 말인지 정말 모르겠습니다.

제발 아래 명령어 설명 좀 부탁드립니다.. 제발...

- 답변

저도 대학교 1학녀때 Z-80을 만능 기판에 제작한 적이 있었는데 실패한

경험이 있습니다. 이유는 책에는 데이타 버스 버퍼와 어드레스 버스

버퍼가 모두 있는 상당히 큰 시스템 인데 초보자가 무턱대고 땜질으

시작했으니... 전선도 굵은 것을 사용하여 만능기판이 점점 두꺼워

지더군요.

죽은 보드를 살리는 방법은 하드웨어 강좌가 끝난 후에 올라 가야할

강좌라 일단 간단하게 알려 드리겠습니다.

먼저 땜 상태를 확인 하십시요.

자작인 경우는 회로도와 대조해 가면서 꼼꼼히 연결을 확인 하십시요.

칩의 VCC를 모두 확인 하십시요.

18,19 번에 클럭을 확인 하십시요.

9번의 리셋을 확인 하십시요. 파워 온 리셋이 걸려야 합니다.

만일 80C31이면 31번(/EA) 핀이 절대로 GND에 물려 있어야 합니다.

80C31이면 29번(PSEN) 핀과 30번(ALE) 핀은 ROM이 있던 없던간에 무조건

구형파가 나와야 합니다.

정 안되면, JS8051A를 구입하신다니 먼저 JS8051A로 학교에서 하는 공부를

먼저 따라 가십시요. 아래 예제를 보니 Port 1 전부를 쓰더군요. JS8051A

에서는 P1.7 비트는 보드가 사용합니다. 그래도 쓰시겠다면 16V8의 9번핀

만을 약간 밖으로 벌려서 소켓에서 빼십시요. 그리고 롬에 프로그램을 구워서

돌려야 합니다. 이유는 JS8051A 보드에서 P1.7의 연결을 차단하면 RAM을

롬처럼 사용할 수가 없어지게 됩니다.

아래 프로그램에 주석을 달아 드리겠습니다.

( Polling 기법을 사용한 타이머로 앞으로 진행될 강좌를 미리 공부

하시는 군요.)

org 0h

jmp start

;

start:

; * use timer 0 mode 0 *

mov tmod, #00000001b ; TIMER 0, MODE 1 사용

clr c ; carry = 0

mov a , #11111111b ; Acc = 1111 1111

loop:

rlc a ; carry 값인 0을 Acc를 거쳐

mov p1, a ; 비트단위로 순환 시켜면서 Port 1

mov r5, #250 ; 으로 내보낸다.

call delay jmp loop

; * delay time= (R5)*4 ms *

delay :

setb tr0 ; TIMER 0를 동작 시켜라.

again: mov t10, #(8192-4000).mod.32 ;16 비트 타이머의 하위 바이트에

mov th0, #(8192-4000)/32 ; 나머지 상위 바이트에 몫

wait:

jbc tf0, timeout ; 타이머 오버 플로우 비트인

jmp wait ; TF0를 검사하여 오버 플로우

; 이면 TF0에 0을 넣고 탈출.

timeout:

djnz r5, again ; 위의 과정을 R5의 값 만큼 반복해라.

; 단 0번을 설정하면 256번 돌아버린다.

clr tr0 ; TIMER 0 정지해라.

ret

end


"누구는 날때부터 80C31 알고 나옴니까. 까짓거 하면 되지. "

" OHMZ 화이팅 "

JS8051-A 보충 설명서 버전엎 했습니다. 11/18 15:22 9 line

안녕하십니까. JS8051A의 제작자 입니다.

JS8051-A 보충 설명서가 버전 1.1로 좋아졌습니다.

자료실에 있으니 Ver 1.0을 갖고 있는 분은 다운 받으십시요.

앞으로도 더욱 좋은 JS-쓰리즈가 되도록 노력하겠습니다.

-정용원 올림

김경근 (maroboss)

[14] 단순 어드레스 디코딩 (JS8051A) 11/24 16:13 112 line

JS8051-A의 하드웨어

JS8051A의 기초적인 부분은 앞에서 설명한 JSTEST 보드와 비슷하므로

나머지 다른 부분을 중심으로 설명 하겠습니다.

초보자들이 JS8051A 보드를 돌리고 활용하는데는 어렵지 않지만

하드웨어를 100% 이해하는데는 아직 무리가 있습니다. 하지만 한가지

한가지 열심히 배워나가다 보면 JS8051A도 그리 높은 언덕은 아니라고

느낄때가 올겁니다.

순 어드레스 디코딩 ( HC138 DECODE )

JS8051A의 칩 선택 소자로는 HC138과 GAL( 16V8, PAL을 써도됨)이 사용

되었습니다. 그림 8을 참조 하십시요. HC138은 전용 디코더 칩으로

단순히 상위 어드레스 만을 디코딩하는데 사용하였습니다. 주의 하실

점은 최상위 어드레스 라인인 A15가 HC138의 인에이블 입력에 연결된 점

입니다. 이 핀에 연결된 A15가 1이면 정상적으로 A14, A13, A12로

선택한 출력핀에 low 값을 내보내지만 A15가 0이면 HC138 자체가 어떠한

입력이 들어와도 동작을 하지 않고 모든 출력 핀을 high로 만듭니다.

어드레스 관점에서 보면 다음과 같습니다.

A15,A14,A13,A12 A11 ~ A0

0, x, x, x x .. x = 0000H ~ 7FFFH (동작안함)

A15,A14,A13,A12 A11 ~ A0

1, 0, 0, 0 x .. x = 8000H ~ 8FFFH ( Y0가 선택됨)

1, 0, 0, 1 x .. x = 9000H ~ 9FFFH ( Y1가 선택됨)

1, 0, 1, 0 x .. x = A000H ~ AFFFH ( Y2가 선택됨)

1, 0, 1, 1 x .. x = B000H ~ BFFFH ( Y3가 선택됨)

1, 1, 0, 0 x .. x = C000H ~ CFFFH ( Y4가 선택됨)

1, 1, 0, 1 x .. x = D000H ~ DFFFH ( Y5가 선택됨)

1, 1, 1, 0 x .. x = E000H ~ EFFFH ( Y6가 선택됨)

1, 1, 1, 1 x .. x = F000H ~ FFFFH ( Y7가 선택됨)

( x는 don't care state 라고 부르며 0이든 1이든 걱정하지 말라는뜻 )

(이하 평어를 사용함)

이렇게 해서 디코드된 출력 핀에 연결된 칩에 특정 번지를 할당하게

되는 것이다. 위에서와 같이 8000H ~ 8FFFH 번지중 아무 번지나

억세스하면( 읽거나 쓰면 ) 출력 핀 Y0가 선택되게 된다. JS8051A에서는

Y0에 EEPROM인 28C16의 칩 선택(/CE)이 연결되어 있으므로 이 칩이

선택된다. 그러나 칩이 선택되어 있다고 해도 무조건 그 칩이 동작하는

것은 아니다. /RD, /WR, /PSEN과 같은 제어선도 같이 활성화되야 그에

해당하는 동작을 한다. 따라서 칩에 필요한 제어선을 연결해 주어야

한다. 28C16에서는 /RD, /WR 핀이 함께 사용된다.

여기서 한가지 따지고 넘어가야 할 문제가 있다. 80C31이 출력하는

어드레스에는 두가지 종류가 있다. Program Memory Space를 위한, 쉽게

말해 롬을 읽기위한 어드레스와 Data Memory Space를 위한 즉 램과

I/O를 위한 어드레스가 있다. 따라서 위와같은 '단순 어드레스

디코딩'에서는 어드레스 종류에 관계없이 무조건 디코딩을 하기 때문에

디코딩된 번지가 Program Memory Space에 속하는지 Data Memory Space에

속하는지는 결정되지 않는다. 아니, 양쪽 메모리 공간의 번지 모두를

디코드하여 출력해 버린다. 따라서 디코더의 출력이 /RD, /WR와 같이

사용되거나 둘 중에 하나와 같이 사용된다면 그 선택된 칩은 Data

Memory Space에 위치하게 되는 것이고, /PSEN과 같이 사용되면 Program

Memory Space에 위치하게 되는 것이다.( 전문용어로 메모리 맵핑이라

한다.)

_______ ________

| |

Y0 |--------------------| /CE

| |

| /RD --| /RD

| |

| /WR --| /WR

_______| |________

HC138 응용 칩

(칩은 64K byte의 Data Memory Space 중에 8000H ~ 8FFFH을 할당 받는다.)

_______ ________

| |

Y0 |--------------------| /CE

| |

| |

| /PSEN --| /OE

| |

_______| |________

HC138 응용 칩

(칩은 64K byte의 Program Memory Space 중에 8000H ~ 8FFFH을 할당 받는다.)

JS8051A에서는 HC138의 출력 8개 중에 2개를 보드가 사용하고 6개를

사용자용으로 제공합니다. 핀 이름은 R&W_CS1 ~ R&W_CS6 입니다.

그럼, 질문을 몇가지 하겠습니다. 위는 보지말고 회로도만 보고

답하십시요.

1. 28C16은 어떤 메모리 공간에 위치하며 어떤번지를 갖습니까?

2. A123H 번지에 '3'을 써넣는다면 어떤 선택 핀이 활성와 됩니까?

3. 27C32( 4K byte )를 Program Memory Space중에 E000H ~ EFFFH 번지에

할당되도록 해보십시요.( 진짜 연결하지는 마시오, 충돌함 )

실제 JS8051A의 Program Memory Space는 꽉 차있습니다. 따라서

초보자들은 다른 메모리나 I/O를 그곳에 배치하면 안됨니다. 물론

80C31에는 날고, 기는 분들은 배치해도 됩니다. 말이 좀 이상하게

들리겠지만 초보분들은 위의 HC138 출력을 Data Memory Space에만

배치하여 사용하세요.

JS8051A의 가장 큰 특징은 엄청난(?) 확장성 입니다. 위에서 보신 것은

그중에 일부이며 많은 용도의 실무에도 바로 적용할 수 있도록 여러

제어핀과 믹스된 칩 선택 신호선등이 제공됩니다.


[15] 롬 연결에 대하여 (JS8051A) 11/24 16:14 95 line

롬 연결에 대하여

JS8051A에서도 롬은 27C256( 32K byte )를 사용하지만 JP4를 바꾸면

정상적으로 사용가능한 Program Memory Space의 최대 용량을 차지하는

27C512( 64K byte )를 사용할 수 있습니다.

27C256을 사용하면 나머지 32K byte의 비사용 메모리 공간은 비어 있게

됩니다. 따라서 앞에서 배운 것처럼 ROM의 선택 신호인 /CE를 GND에

바로 연결하여 항상 선택상태로 해놓아도 됩니다. 그런데 JS8051A에서는

RAM을 ROM처럼 쓸 수 있도록 특별한 하드웨어가 들어 있습니다.

JS8051A에서 사용한 방법외에 훨씬 간단한 방법으로도 RAM을 ROM처럼 쓸

수 있지만 그런 방법들은 몇가지 단점이 있습니다. 그런 몇가지

다른방법을 아시는 분들은 제가 사용한 방법과 어떻게 다른지

비교하면서 보십시요.

80C31에는 PC(program counter) 라는 레지스터가 있다고 했느데 이

레지스터는 대외적으로 나타나 있지 않습니다. 다시 말하면 다른

레지스터들 처럼 특정 내부 메로리 번지가 할당되어 있지 않습니다.(

전문 용어로하면 메모리 맵드 레지스터가 아닙니다.) 따라서 SFR에

속하지 않습니다. 이 레지스터는 우리가 마음데로 값을 읽거나 설정하지

못합니다. 프로그램의 시작 부터 끝날때까지 CPU 자체가 관리를 하지요.

PC의 주된 역할은 다음에 읽어올 롬( 더욱 정확히 하자면 Program

Memory Space )의 번지를 묵묵히 가지고 있습니다.( 얘기가 더 있지만

이정도로 줄이겠습니다. ) 리셋 직후 PC의 값은 0000H를 가지게 됩니다.

따라서 CPU는 시작과 동시에 무조건 ROM의 0000H 번지를 읽어

들이려고합니다. 그러므로 시스템 설계자는 CPU가 하려는데로 할 수

있도록 외부 회로를 설계해야 합니다.

(JS8051A의 초기 버전에는 램을 롬을 처럼 사용할 수 없었습니다.)

저는 이렇게 생각 했습니다. " ROM의 어드레스 공간을 모두 쓸 수

있으면서 필요시에는 RAM을 ROM처럼 쓸 수 없을까?." 그래서 /RD, /WR,

/PSEN을 놓고 생각을 했습니다. 몇가지 로직이 있으면 가능하겠더군요.

그리고 한가지 더, 리셋 직후 확정된 값( 0 이던지 1 이던지 무관함 )

을 가지면서 내 의도대로 바꿀수 있는 값이 필요 했습니다. 롬에서

램으로 또는 램에서 롬으로 바꿀때 필요한 제어선 말입니다. 다른

방식으로도 만들 수 있지만 80C31 자체의 I/O Port인 P1중에 하나를

쓰기로 했습니다. 그래서 제일 한가찐( 사투리 같은데 ! => 구석에

짱박힌 ) P1.7 비트를 반전시켜서 롬의 /CE 핀에 연결 했습니다.

롬의 /OE 핀은 JSTEST 보드와 같이 정석으로 /PSEN을 연결했습니다.

이렇게만 해주면 RAM을 ROM 처럼 쓸 수 있는것은 아니지요. 단지 롬을

선택하거나 선택하지 않거나 만을 할 수 있습니다.

이번 강좌는 여기가 끝 입니다.

< 머리 좀 식힙시다 >

라디오에서 들은 실화 입니다.

버스를 타고 등하교하는 어떤 여학생(편지쓴 사람)이 있었다. 그 버스

는 같은 방향에 여러 중,고등학교가 있어서 많은 남,여 학생들이

이용하는 버스 였다. 등교시에 어떤 남학생이 그 여학생과 자주

같은 버스를 타곤 했다. 그 남학생은 그 여학생이 마음에 들었다.

어느날 아침 사람도 그리 많지 않았고, 여전히 그 여학생은 뒷자리에

자신의 가방을 무릎위에 얹은체 밖을 보고 있었다. 남학생은 그

여학생에게 다가가 앞에 섰다. 무슨 말인가를 해야 했고 그 남학생은

용기를 내서 말했다.

"이보시오, 낭자, 제 가방 좀 받아주시요"

그녀는 돌아보며 위,아래를 훌터보더니 말했다.

"보아하니 쌍것 같은데 그냥 들고 가시오"

완전한 실패였다.

몇일후 그 여학생은 일찍 학교에서 돌아 왔다. 그런데 현관 입구에

남자들 신발이 서너 켤레가 더 있었다. 오빠방이 시끄러운 것으로 보아

오늘도 오빠친구들이 놀러 온것 같았다. 그때 마침 엄마가 과일을 좀

오빠 친구들에게 가져다 주라고 하셨다. 그래서 그 여학생은 과일을

오빠방에 가져다 주었다. 그런데, 이럴수가....

오빠 친구들 중에 몇일전에 보았던 그 쌍것이....

16] 롬 연결에 대하여 (JS8051A) 11/24 16:16 71 line

램 연결에 대하여

JS8051A에서는 램은 300 mil 짜리 62256( 32K byte )을 사용합니다.

참고로 실제 KIT에는 61256이 들어 있을 수 있는데 이것은 62256의 고속

타잎으로 기능은 같습니다. 62256은 64K byte Data Memory Space 중에

하위 절반을 차지하고 있습니다. 상위 32K byte의 일부는 EEPROM을

포함한 온 보드 I/O로 쓰이고 대부분의 공간은 사용자용으로

제공됩니다. 이 처럼 JS8051A의 Data Memory Space를 여러 칩이

나누어 사용하기 때문에 램의 선택 신호인 /CS를 GND에 연결하여 항상

동작 가능 상태로 할 수 없습니다. 하위 32K byte인 0000H ~ 7FFFH

까지의 어드레스가 선택되면 동작이 되고 8000H ~ FFFFH까지의

어드레스가 선택되면 동작이 안되도록 해주어야합니다. 어드레스 선을

보면 하위 32K byte와 상위 32K byte를 구분하는 선이 A15 임을 알 수

있습니다.

A15, A14, A13, .... A0

0, x, x, .... x => 0000H ~ 7FFFH

A15, A14, A13, .... A0

1, x, x, .... x => 8000H ~ FFFFH

A15는 하위 32K byte가 선택되면 "0"이 되고 상위 32K byte가 선택되면

"1"이 됩니다. 그러므로 A15를 램의 선택 신호인 /CS에 바로 연결하여

사용 하면 됩니다. 회로도에서 '주 4'를 보면 램의 /CS에 /RAMCS가

연결되 있는데 그림 10의 JP7을 보면 A15가 /RAMCS인 것을 알 수

있습니다. JP7은 외부 램 백업용 header로 일단 사용하지 않기로

하겠습니다. 램의 /WE 핀은 CPU가 Data Memory Space를 읽을때 사용하는

신호 핀인 /WE를 바로 연결하면 됩니다. 문제는 RAM의 /OE 핀을 어떻게

처리 해주느냐 하는 것입니다. JSTEST 보드 처럼 RAM을 RAM으로만

쓴다면 간단하지만 RAM을 ROM처럼 쓸 수 있게 해야하기 때문에 바로

CPU의 /RD 핀에 연결할 수 없습니다.

JS8051A에서는 P1.7 핀의 출력이 high이면 ROM이 ROM으로 RAM이 RAM으로

정상 동작하지만 low가 되면 ROM은 사라지고 RAM이 ROM 기능과 RAM 기능

모두를 하게 됩니다. 물론 다시 high가 되면 원상복귀됩니다

CPU는 외부 회로가 어떻든간에 한결같이 ROM( 정확히 말하면 Program Memory

Space )을 읽을 때는 /PSEN 신호를 사용합니다. 따라서 P1.7이 low가 되면

CPU의 /PSEN과 /RD 핀 모두가 62256을 읽는 신호가 되게 만들어 주어야 합니다.

그렇게 해주기 위해서는 로직 회로가 필요 합니다. JS8051A에서는 그 기능을

하는 로직 회로가 16V8에 들어가 있습니다.

JS8051A가 ROM을 사라지게 하지위해서는 /PSEN을 제어하지 않고 ROM의

선택신호인 /CE에 high를 연결하여 항상 ROM이 선택되지 않게 합니다.

그리고 ROM을 읽으려 할 때도 RAM이 선택되도록 해주었고 /PSEN은 RAM의

/OE 쪽으로도 가게 해주었습니다.

기초가 어느정도 있는분은 아래 답을 보기전에 위의 설명을 바탕으로

로직을 작성해 보십시요. P1.7, /RD, /PSEN을 사용하여 RAM의 /CS에

들어갈 신호(/RAMRD)를 만들어 보십시요.

/ROMCS = NOT( P1.7 )

/RAMRD = (/RD AND P1.7) OR (/RD & /PSEN)

/RAMCS = A15

[17] I/O 연결에 대하여 (JS8051A) 11/24 16:17 76 line

I/O 연결에 대하여

JS8051A 보드 내의 I/O( 입력과 출력이란 말 이외에 그런기능을 하는

칩을 일컫는 경우도 많다 )는 Data Memory Space의 상위 32K byte에

존재한다. 상위 32K byte에는 14개의 I/O 선택 신호가 제공되는데

EEPROM을 포함해서 보드 자체가 5개의 칩선택 선을 사용하고 나머지

9개는 사용자 확장용으로 제공된다.

_______

|

| -- 2개는 보드가 사용

| |

HC138 | 8개 출력 ==> -|

| |

| -- 6개는 사용자용

_______|

( 단순 어드레스 디코딩 )

_______

|

| -- 3개는 보드가 사용

| |

16V8 | 6개 출력 ==> -|

| |

| -- 3개는 사용자용

_______|


( 어드레스와 제어선의 조합신호 )

JS8051-A 보드의 I/O 선택

14개의 선택 신호선이 모두 같은 종류의 신호선은 아닙니다. HC138의

출력은 앞 강좌에서 알아본 것처럼 순한 어드레스 디코딩 신호이지만

16V8의 출력들은 좀더 복잡하며 제각기 서로 다른 신호입니다. HC541의

인에이블 입력으로 쓰이는 541_EN은 /RD와 특정 어드레스와의 조합이며

HC574의 CLK 입력으로 쓰이는 574_EN은 /WR와 특정 어드레스와의

조합이며 LCD의 인에이블 신호로 쓰이는 LCD_EN은 /RD, /WR, 특정

어드레스의 조합입니다.

541_en = !( (F000 ~ F1FF) x !(/RD) );

574_en = (F000 ~ F1FF) x !(/WR);

lcd_en = (F200 ~ F3FF) x (!(/RD) + !(/WR));

user_cs1 = (F400 ~ F5FF) x !(/WR);

user_cs2 = !( (F600 ~ F7FF) x !(/RD) );

user_cs3 = (F800 ~ F9FF) x !(/WR);

( ! => NOT , x => AND , + => OR )

위 식에서 보듯이 조합은 각각 다르게 되어있습니다. 위 조합은 제가

HC541, HC574, LCD 각각의 read, write 타이밍을 보고 만든 것입니다.

더욱 자세히 알고 싶은 분은 HC541, HC574, LCD의 데이타 북과

80C31의 read, write 타이밍을 보고 하나하나 따져 보십시요. 위 식과

같이 하지않고 다른 조합을 써도 됩니다.

위 식에서 보듯이 조합에 쓰이는 어드레스는 한 번지가 아니고 512

byte의 공간을 가지고 있습니다. 따라서 그 공간 내의 아무 번지나

억세스해도 그 칩 선택 신호가 발생합니다. 예를 들면 디스켓에

제공되는 모든 예제에는 HC574에 값을 쓰기 위해서는 F000H를

사용하였지만 실제는 F001H를 사용하거나 F1FFH를 사용해도 결과는

같습니다.

사용자용으로 제공되는 user_cs1, user_cs3는 574_en과 조합이 같으며

user_cs2는 541_en과 조합이 같습니다. read 또는 write 전용의 I/O를

추가할 경우 사용하십시요.

16V8이라는 칩은 롬을 굽듯이 내부에 논리 게이트를 프로그램해서 넣을

수 있는 IC 입니다. 여러번 전기적으로 지웠다 다시 쓸 수가 있으므로

경험 있는 분들은 제공되는 16V8 프로그램 쏘스를 참고하여 자신의

용도에 맞게 변경하여 쓰셔도 됩니다.

[18] 통신 케이블과 어셈블러 (JS8051A) 11/24 16:18 271 line

보드가 완성되었으니 통신 케이블과 어셈블러가 있어야 겠군요.

자료실에 몇가지 80C31 ASM을 묶어서 올림니다.( JS51_ASM.ARJ ) 모두

통신으로 받은 것들인데, 가지고 있는 분들도 많을텐데 그런 분들은

가지고 있는 것을 쓰십시요. 저는 개인적으로 Soft Mart. Inc의

X8051.EXE V2.04를 쓰는데 가장 안좋은 ASM입니다.( 하지만 버릇이

들어서...)

아래 내용은 JS8051-A KIT 제공 디스켓에 있는

'< JS8051-A 보충 설명서 Ver 1.1 >'의 통신 케이블과 어셈블러 관련


내용입니다. 따로 보충 설명서를 가지고 계신분은 읽지 않으셔도

니다. 다운 받는 사람이 어지러울까봐 자료실에 올린 ASM에는 배치

화일을 일부러 넣지 않았습니다. 아래 내용에 포함되어 있으니 자신이

사용할 ASM을 선정하여 배치화일을 직접 만들어 보십시요.

=========================

: :

: 2. 통신 cable 제작 :

: :

=========================

JS8051-A용 통신 케이블은 RxD,TxD,GND 3선을 사용합니다. PC쪽은 25 pin,

9 pin 아무거나 사용해도 관계없습니다. JS8051-A쪽은 5045 3pin(JP2와

짝이 되는) 커넥터를 사용합니다. 전선은 3선 쉴드 케이블을 권장합니다.

제작시 번호가 바뀌지 않도록 주의하십시요. ( 케이블 별도 판매 가격 :

2,000원 )

__

/ | _____

| | | |

| 2 | TXD____ ________ TXD | 3 |

| | \ / | |

| 3 | RXD____ / \ ________ RXD | 2 |

| | | |

| 7 | GND_________________ GND | 1 |

| | |_____|

\ __|

25 pin JS8051-A

__ _____

/ | | |

| 2 | RXD_________________ TXD | 3 |

| | | |

| 3 | TXD_________________ RXD | 2 |

| | | |

| 5 | GND_________________ GND | 1 |

\ __| |_____|

9 pin JS8051-A

(커넥터를 보면 번호가 써있다) ( JP2는 보드의 오른쪽이 1번,

제공되는 보드의 실크 인쇄도를

보시면 1번 핀에는 역삼각형이 있지요 )

롬라이터나 롬에뮬레이터가 있는 사람도 꼭 SERIAL DOWN LOADING을 한번 사용해

보십시요. 훨씬 편하고 빠릅니다. 초보자는 무조건 사용해야 합니다.

설계 형태를 자세히 보시면 32K byte(27C256과 같은 환경이 되어 번지를 수정할

필요가 없습니다) 공간 모두를 사용자 쓸 수 있도록 제작되어 있다는 것을 알

수가 있을 겁니다.

======================================

: :

: 3. ASSEMBLER 사용법 및 주의사항 :

: :

======================================

1) HEXBIN.EXE 사용법

2) X8051.EXE (V2.04 Soft Mart,Inc)

3) X8051.EXE (V4.03C 2500 A,D, Software,Inc)

4) ASM51.EXE (V2.2 Intel Corporation )

5) A8051.EXE (V2.02/DOS IAR System)

8051 어셈불러는 종류도 많고 다양하지만 대부분 사용법은 간단하고

비슷합니다. 통신하는 사람은 디지탈 동호회의 자료실로 들어가서 보면

여러 가지 어셈블러를 얻을 수 있습니다. 하이텔,천리안,나우콤 등에서

'GO DIG'하시고 자료실란에 들어가서 찾아보십시요. 제가 들어 가보지는

않은 다른 통신망에도 분명히 있을 겁니다.

먼저 초보자는 JS51P1_0.ASM(예제)을 사용하여 아래 프로그램의 사용법을

익히세요.

아래의 어셈블러 설명은 제가 경험적으로(? 치고 박고) 알아낸 것입니다.

따라서 더욱 자세한 사용을 원하신다면 해당 프로그램의 매뉴얼을 구해서

읽으십시요. 사실 이 정도의 사용법만으로도 사용상 지장은 없습니다.

1) HEXBIN 사용법

hex file을 이용하여 binary file로 만들어줍니다.

hex file은 어셈블러나 컴파일러가 생산하는 최종 화일 입니다. 일반

에디터를 사용하여 볼 수가 있습니다. 통일된 형식은 없고 각 회사별로

자신들의 형식(format)을 가지고 있습니다. 그렇기 때문에 정식으로는

인텔 핵사 화일, 모토롤라 핵사 화일, 택트로닉스 핵사 화일 등 앞에 회사

이름을 붙쳐 주어야 합니다. JS8051-A 보드의 CPU는 인텔 제품이므로 각종

어셈블러나 컴파일러들은 인텔 핵사 형식으로 화일을 만들어 줍니다. 원래

핵사 화일은 바로 롬에 구울 수 있는 형태가 아닙니다. 이진수 형태인

binary file로 바꾸어 주어야 합니다. 지금은 많은 롬 라이터나 롬

에뮬레이터의 프로그램 자체에서 변환을 지원합니다. 바이너리 화일은

아무런 변환 없이 바로 롬에 구워 넣을 수 있는 화일 입니다.

( 핵사 화일을 다운 로딩하여 실행 시키는 방법에서는 다운 로딩하는

프로그램이 바이너리 화일로 변환하여 전송하거나 타겟 보드네의 모니터

프로그램이 변환하여 램에 넣어 주는 방법을 사용합니다. )

.형 식 : HEXBIN hex_file bin_file I 2

: Intel format, FF로 채움( ROM의 프로그램이 안된 공간을 0으로

채우든 FF로 채우든 자유다. 하지만 ROM특성상 FF로 해주면

ROM의 건강(?)에도 좋고 빨리 구울 수 있다. )

2) X8051.EXE (V2.04 Soft Mart,Inc)

Soft Mart,Inc의 X8051.EXE V2.04는 링크과정이 없이 바로 HEX화일을

생성하는 간단하고 편리한 어셈블러인데 버그가 있어서 여러분의

시스템에서 돌아지 않을 수도 있습니다. 원인은 알 수 없지만, 만약

실행이 안되면 CONFIG.SYS의 EMM386.EXE의 옵션을 RAM AUTO로 하고 다시

부팅한뒤 해보십시요.

C:\DOS\E

.EXE RAM AUTO

그래도 안되면 또 다른 옵션을 사용해 보시거나 memory에 관련된 항목을

바꿔보세요. 만약 software 한글을 쓰신다면 지우고 다시 해보십시요.

혹시 프로그램이 안 돌아가도 절대로 실망하지 말고 다른 어셈블리어를

쓰세요.

X8051사용법은 매우 간단합니다.

아래 형식중에 마음에 드는 방식을 사용하십시요.

.형 식 1 : X8051 asm_file

: LIST FILE은 화면으로 HEX화일은 현재 디렉토리에 생성된다.

.형 식 2 : X8051 asm_file > JS.LST

: LIST FILE은 JS.LST로 일반 에디터(Q.EXE...)로 볼 수 있다.

쏘스 화일이 클 때는 LIST FILE을 렘드라이브에 생성하면 더욱

빨라진다. HEX화일은 현재 디렉토리에 생성된다. Error,

Warning은 LIST FILE 내에 나타난다.

.형 식 3 : X8051 asm_file > NUL

: LIST FILE은 생성되지 않는다. HEX화일은 현재 디렉토리에

생성된다.

.형 식 4 : X8051 asm_file | FIND "Error(s)"

: LIST FILE은 없고 Error갯수만 보여 준다. HEX화일 생성.

: FIND는 DOS 명령이다.

주의할 점( 초보자는 이해가 안 될겁니다. 지금 당장의 사용에는 지장이

없으니, 나중에 실력이 좀 붙은 후에 다시 한번 다시 보십시요.)

PUSH R0

라는 어셈블러 쏘스가 다른 어셈블리어와는 달리 에러 없이 어셈블이

됩니다. 만약에 레지스터 뱅크를 바꾸었다면 바꾼 레지스터 뱅크의 R0가

스택에 저장되리라 생각하겠지만 그렇지 않고 레지스터 뱅크 0의 R0가

저장이 됩니다. 주의 하십시요. 그리고 DB(Define Byte)를 사용할 때도 PC

상의 memory 설정에 따라 DB로 설정한 값의 첫 번째 값이 달라져 어셉블될

때가 있습니다. 예제 중에 JS51_LCD.ASM을 실행했을때 LCD에 첫 글자가

깨져서 나온다면 그 경우가 그렇습니다. EMM386.EXE의 옵션을 RAM AUTO로

바꾸고 다시 해보십시요. 예제가 잘못된 것이 아니니 주의 하십시요. 대

부분의 시스템에서는 정상 작동합니다.

DB 'JEONG' 정상일 때 4A454F4E47

이상일 때 06454F4E47

초보자는 다음을 따라해 보세요.( JS51P1_0.ASM은 예제 화일 입니다.)

X8051 JS51P1_0.ASM

: 화면에 리스트 화일이 나오고 JS51P1_0.HEX가 생성되어 있다.

X8051 JS51P1_0.ASM > J

: J 라는 이름의 리스트 화일이 생성되고 JS51P1_0.HEX가 생성되어 있다.

: J의 내용을 일반 에디터로 확인해 보자.

HEXBIN JS51P1_0.HEX A.BIN I 2

: JS51P1_0.HEX를 사용하여 A.BIN을 만들어 준다. A.BIN이 생성되어 있다

: A.BIN은 바로 롬으로 구울 수 있고 DOWN LOADING하여 실행시킬 수 있는

최종 화일이다.

3) X8051.EXE (V4.03C 2500 A,D, Software,Inc)

Soft,Mart,Inc의 어셈블리어와 이름은 같지만 다른 방식의 어셈블리어

입니다. OBJ(오브젝트)로 만들어 LINK를 할 수 가 있습니다. 다음과 같은

배치 화일을 만들어 사용하세요.

x8051 %1.asm -D

link -c %1

hexbin %1.hex a.bin i 2

이 어셈블리어는

PUSH R0

라는 명령을 에러로 간주합니다. R0가 몇 번째 뱅크의 R0인가가

불확실하다는 이유 때문 입니다. 물론 R1 ~ R7 모두에 대해서도

해당됩니다. 이것을 제대로 고치려면 R0나 R2와 같은 레지스터 이름보다는

레지스터의 번지를 바로 써주면 됩니다. 제공 되는 예제에서는 레지스터

뱅크를 바꾸지 않았으니 다음과 같이 고치면 이상이 없이 어셈블이

됩니다.( 참고 Register Bank 0의 R0의 번지는 0H 입니다.)

PUSH R0 => PUSH 0H

POP R0 => POP 0H

4) ASM51 (V2.2 Intel Corporation )

여러분이 잘 아시는 인텔사의 작품입니다. 사용이 간단하지요.

다음과 같이 배치화일을 만들어 사용하세요.

asm51 %1.asm

rl51 %1.obj ( <= 생략 가능 )

oh %1

hexbin %1.hex a.bin i 2

주의할 점은 이 어셈블리어 에서도 ' PUSH R0 '(또는 POP R0 )를

에러로 처리 합니다. 위 3)번에서와 같이 바꾸십시요. 한가지 더, 예제

중에 'DJNZ A,DELAY1' 이 들어있는 쏘스가 있는데 에러가 납니다.

원인은 A가 번지인지 ACCUMULATOR인지 확실히 해달라는 예기지요. 다음과

같이 고치십시요.

DJNZ A,DELAY1 => DJNZ ACC,DELAY1

5) A8051 (V2.02/DOS IAR System)

IAR System을 아는 분이 있을 겁니다. 그 유명한 8051,

6 C 언어를 제가

알기로는 적어도 우리 나라에 가장 많이 공급하는 회사일 겁니다. 이

어셈블러도 사용이 간단하지요. 다음과 같이 배치 화일을 만들어

사용하세요.

a8051 %1 %1.lst

xlink -c8051 %1 ( -c8051 에서 c는 반드시 소문자 )

hexbin aout.a03 a.bin i 2

주의할 점이 있습니다. 쏘스 화일의 디폴트 확장자가 ASM이 아니고

S03으로 해야 합니다. IAR System에서 디폴트 확장자를 그렇게 만든

거지요. 다른 사항은 다른 어셈블러와 비슷합니다. 다음과 같이 쏘스를

바꾼 후에 다시 어셈블을 하세요.

PUSH A => PUSH ACC

POP A => POP ACC

PUSH R0 => PUSH 0

DJNZ A,DELAY1 => DJNZ A,DELAY1

혹시 비트의 이름(8051에서는 비트별로도 이름을 갖고 있는 것이 있으며,

비트 별로 따로 번지도 가지고 있습니다.)에서 에러가 발생하면 비트의

이름을 번지로 대치해 주십시요.

[19] 고장난 보드는 버립시다. 12/02 11:34 126 line

고장난 보드는 버립시다.( 보드 수리법 )

대부분의 초보자들이 자작한 보드는 한번에 깨끗하게 돌아가지

않습니다. 가끔은 부품과 기판이 모두 제공되는 KIT 제품에서도 보드가

돌아가지 않는 경우가 있습니다. 그런 경우 자작 또는 조립한 사람은

크게 실망하고, 답답하고, 신경질이 나게 됩니다.

이런 불량 보드가 발생하는 데는 여러가지 원인이 있을 수 있습니다.

그중 가장 큰 원인은 납땜 불량 입니다. 자작 보드인 경우는 퍼센티지가

약간 다를 수 있으나 KIT 제품인 경우 고장 보드의 90% 이상은 납땜

인두 하나만 있으면 수리가 가능 합니다. 납땜을 잘 하는 분이라면

회로도 없이도( 회로도를 보지 않고도 ), 심지어 그 보드가 무슨

보드인지도 모르고도 납땜면(solder side)만 보고 고칠 수 있습니다.

겉보기에는 잘된 납땜이지만 실제로는 접촉이 안되어 있거나 될때 있고

안될때 있는 불량땜들이 있습니다. 이러한 땜을 '냉땜'이라고 하는데

초보자들에게 꽤 많이 발생합니다. PCB( Printed Circuit Board :

(동판에) 회로를 인쇄한 판대기)에 대해서 잘 아시는 분은 알고 게신

분들도 있겠지만 JS8051A 보드는 이러한 냉땜을 사전에 막기위해 많은

배려가 되있습니다. 한번에 바로 완성된 샘플 보드가 아니라 여러번

버전엎한 보드입니다. 진짜 납땜 초보들은 보드 조립전에 만능 기판과

전선( 랩핑 와이어 )을 사용하여 많은 연습을 해야 합니다. JS8051A

보드를 절대로 납땜 연습 보드로 사용하지 마십시요. 그것이 저( 보드

제작자 )에 대한 초소한의 예의 입니다.

그다음 고장 원인으로는 자작 보드인 경우는 잘못된 연결이고 KIT에서는

오삽( 잘못된 삽입 )입니다. 둘다 본인의 부주의로 발생하는 것으로

자작 보드인 경우는 다 만든 다음은 찾기가 쉽지 않고 눈이 아픔니다.

KIT에서는 당연히 잘못된 연결은 없겠지만 방향이나 극성을 갖는 부품을

잘못 꽂고 만드는 경우가 종종 있습니다. 조립 설명서와 회로도를

보면서 좀더 정성 스럽게 만드십시요.

조립을 다하셨다면 아래 방법대로 점검해 보십시요. 먼저 말씀 드리는데

아래 방법과 순서는 제가 여러분께 추천하는 방법입니다. 따라서

검사장비에 따라서, 보드를 검사하는 사람의 수준에 따라서 순서가

바뀌거나 다른 방법이 사용될 수도 있습니다.



1. 모든 부품이 제대로 꽂혀져 있는지 확인한다.

2. 납땜면에 빼먹은 곳이 있나 확인하고 의심가는 땜이 있으면 한번더

땜을 해준다.

3. 전원을 넣지 않은 상태에서 전원 스위치를 올리고 테스터를

사용하여 전원 단자를 찍어 본다. 순방향 190 ohm 정도가 나오면

정상이다.

5 ohm이 나온다고 놀라는 초보자들이 있는데 그 값도 정상 입니다.

아날로그 테스터에 대해서도 할말이 꽤 많지만 여기서 필요한

한가지만 말씀 드리겠습니다. 테스터에는 전지가 들어가는데 이

전지는 저항 측정시에만 사용됩니다. 전류나 전압 측정에는 전류나

전압 자체가 POWER이기 때문에 전지가 다 달거나 없이도 측정이

가능합니다. 어째튼 저항은 전류로 측정을 합니다. 그 전류는

테스터 자체에서 나가는데 검은색 봉으로 (+)가, 빨간색 봉으로

(-)가 나감니다. 색깔과 반대 이니 주의 하십시요. 따라서

초보자들이 알고 있는 '저항은 방향이 없다'라는 말은 정확히

말하면 무지하게 틀린 상식입니다. 그러므로 보드의 저항값을

측정하기 위해서는 보드 전원의 (+)에는 검은새 봉을 (-)에는

적색봉을 대서 측정해야 합니다. 이렇게 측정을 하면 약 190 Ohm이

나오는데 이값이 나온다고 해서 보드가 정상이라고 단정할 수는

없습니다. 그리고 전원이 5V 이고 보드 순방향 저항값이 190 ohm

이니까 보드의 총 전류는 V = I * R 에서 263 mA 이다 라고는 말 할

수 없습니다. 일단 그렇게만 알아 두십시요. 그리고 반대로 보드

저항을 측정하면 5 ohm이 나오는데 이 원인은 보드자체가 저항같은

passive device 뿐만 아니라 active device로도 구성이 되있어서

그렇습니다.

만약에 0 ohm이 나오면( 단연히 양방향 모두 ) 보드의 땜 상태를

다시 검사하십시요. 이런 경우를 short( 단락 : (+), (-)가 붙음.

반댓말은 long이 아니라 open 입니다.)라고 하는데 매우

위험합니다.

FLUKE 디지탈 테스터(DMM : Digital Multi Meter)로 측정을 하면

양방향 모두 17 Kohm 정도가 나오고 Tektronix DMM으로 측정을 하면

양방향 모두 18.1 Kohm 정도가 나옵니다.

숙련된 땜쟁이들은 테스터를 사용한 검사를 안해도 됩니다. 단 PC의

슬롯에 꽂는 보드거나 PC의 POWER를 사용하는 보드는 절대로 이

검사를 해야 합니다. 한번의 실수가 잘 돌아가는 PC를 업그레이드

해야하는 행운(?)을 안겨 줄 수도 있습니다.

초보자들에게는 벅찬 내용이지만 간단히 말해 short가 아니면 그냥

넘어 가라는 예기 입니다.

4. 전원을 넣은 후 파워 스위치를 올리면 LED에 불이 들어와야 합니다.

안들어 온다면, 전원의 방향 또는 LED의 방향이 잘 못된 것입니다.

5. CPU의 18번(X2) 핀과 19번(X1) 핀에 11.0592 MHz의 sin wave가

나와야 합니다.(정확한 sin은 아님) 안나오면 C1, C2, Y1을 살펴

보십시요.


6. CPU의 9번(RESET) 핀을 테스터나 오실로스코프로 찍은 후 리셋키를

누르면 high가 되야 하고, 놓으면 low가 되야 한다. 그렇게 되지

않는다면 '그림 2'의 리셋 부분의 회로를 점검한다.

7. CPU의 31번(/EA) 핀이 80C31이면 반드시 low 이어야 합니다. 조립

순서도 대로 만들었다면 당연히 low 일 것입니다.

8. 80C31이면 29번(PSEN) 핀과 30번(ALE) 핀은 ROM의 유무에 관계없이

구형파가 나와야 한다. PSEN과 ALE는 정확하게 동기 되어 있으며

11.0592 MHz 보드에서는 약 1.84 MHz의 주파수를 갖는다 ( 완전히

주기적은 아님). PSEN의 positive duty cycle은 약 50 % 이고 ALE의

positive duty cycle은 약 33.3 % 이다. 이러한 신호가 나오지

않는다면 CPU의 /EA 핀을 확인해 보십시요.

9. 예제로 제공되는 프로그램인 JS51P1_0.ASM을 롬으로 굽던지

다운로딩을 하여 실행 시키십시요. 그리고 CPU의 1번(P1.0) 핀을

오실로스코프로 찍어보면 주파수 230.4KHz, positive duty cycle

25 %인 구형파가 발생합니다. 파형이 나오지 않으면 프로그램이

실행되지 않는 것입니다. 전체적으로 땜을 다시 하십시요.

그래도 안되면 주변에 있는 선배나 전문가에게 보이 십시요. 다시한번

강조하지만 초기 보드 고장의 원인은 납땜 불량이 대부분 입니다. 제발

보드를 애인같이 다루어 주십시요( 단, 침 뭍히지 말것 )

- 좀 야한 감이 있군요.

납땜을 개발새발로 해놓고 안된다고 하는 분들이 있는데 그런 분들은

재판에 회부시켜 종신형을 때려 버리는 수가 있으니 주의 하십시요.

(단, 감방은 노태우 옆방 또는 전두환이 건넛방중 택일. 사식은 안됨)

아무리 해도 안되는 보드는 마이크로로 가져오시고 저에게 메일을

주십시요. 만약 제가 납땜인두 외에 전선을 사용해서 고치거나 부품을

갈아서 고쳤다면( 단, 과전압 및 역전압 에 의해 망가진 부품은 제외)

무료로 해드리겠습니다. 단, 제가 납땜인두 하나만 사용해서 고쳤다면

고친 비용을 반드시 주셔야 합니다. ( 그것도 괭장히 많이 )

Q&A] LCD & PC KEYBOARD INTERFACE 12/02 11:38 110 line

(SYSBEACK님 질문 1)

" JS51_LCD.ASM 의 프로그램 첫번째 부분에있는 내용중

궁금한 내용이 있어서 질문합니다.

LCDCW1 EQU 0F200H

LCDCR1 EQU 0F201H

LCDDW1 EQU 0F202H

LCDDR1 EQU 0F203H

로 설정한 특별한 목적이 있는지 궁금합니다. "

(답변)

대부분의 1 LINE OR 2 LINE CHARACTER LCD는 3개의 제어선으로 제어를

합니다. R/W( Read/Write ), RS( Register Select ), E( Enable ) 핀이

그것 입니다.



R/W : READ/WRITE 선택에 쓰임니다. high이면 READ, low이면 WRITE

RS : 제어명령 또는 어드레스를 수수할 때는 low, 데이타 램 또느

캐릭터 제너레이터 램을 수수할 때는 high

E : active high enable

LCD 스펙을 보시면 읽고 쓰기 타이밍도가 나와 있는데 참고 하십시요.

( 죄송합니다 제가 요즘 상당히 바쁘군요 ) 이 3 개의 제어선을

제어하는데 많은 사람들이 일반 포트핀을 사용하여 타이밍을 만들어

주는데 그렇게 하게 되면 LCD 데이타 버스를 위해서도 하나의 입출력

포트를 사용해야 하는 단점이 있습니다. 물론 포트가 남아도는

상황에서는 좋은 방법입니다.

JS8051A가 사용한 방법은 LCD를 하나의 I/O로 보고 어드레스 버스와

데이타 버스를 사용하여 억세스 합니다. 이때 R/W와 RS는 각각 어드레스

A0,A1에 연결하여 번지를 바꿈으로서 제어를 하게 되는 것입니다.

그리고 LCD의 가장 더러운 특징중에 하나가 active high 인 E( Enable )

신호 인데 이것을 제어하기 위해서는 약간의 로직이 필요합니다. 이것은

16V8안에 들어 있습니다. 제공되는 16V8의 Equations을 보시면 어렵지

않을 겁니다.

LCDCW1 EQU 0F200H

=> LCD Control Write 1 : A0 = R/W = 0, A1 = RS = 0

LCDCR1 EQU 0F201H

=> LCD Control Read 1 : A0 = R/W = 1, A1 = RS = 0

LCDDW1 EQU 0F202H

=> LCD Data Write 1 : A0 = R/W = 0, A1 = RS = 1

LCDDR1 EQU 0F203H

=> LCD Data Read 1 : A0 = R/W = 1, A1 = RS = 1

E( Enable ) 신호는 해당 번지를 읽거나 쓰면 16V8에서 자동으로

생성됩니다. 제어시 Write로 이름 붙인 번지는 쓰기 전용이고 Read로

이름 붙인 번지는 읽기 전용 입니다. 그리고 맨 끝에 1이 붙어 있는데

이것은 변경시키지 마십시요. 왜냐면 4 라인 LCD를 구동하시게 되면

LCDCW2, LCDCR2, LCDDW2, LCDDR2가 더 필요하게 됩니다.

기회가(시간이) 있으면 좀더 깊이 다루겠습니다.

(SYSBEACK님 질문 1)

" JS8051-A 에 있는 PORT에 IBM-PC용 KEY BOARD를 연결해서

사용할수 있는지도 궁금합니다.

연결할수 있다면 방법을 알려주시면 후사(???) 하겠습니다.

초보자들을 위해서 강의가 계속 진행되기를 기원합니다. "

(답변)

먼저 저는 키보드와 마이컴을 연결한 경험이 없습니다. 하지만 어려울

것같지는 않군요. 기본적으로 KEY BOARD는 JS8051A 뿐만 아니라

대부분의 마이컴과 여결이 가능합니다.

먼저 SYSBEACK님이 KEY BOARD와 연결을 하려고 하신다니 키보드의

기본제어 능력은 있으시겠군요. SCAN CODE, ASCII CODE, EXTENDED CODE,

KEY BOARD INTERRUPT, RING BUFFER, MAKE CODE, BREAK CODE 등등에 대한

개념이 있어야 합니다.

XT용 키보드와 AT 이상에서 사용되는 키보드는 전송 포맷이 다름니다.

키보드 뒤에 딥 스위치가 있어서 선택할 수 있습니다. 옛날 XT에서는

8088이 직접 키보드와의 통신을 관리 했지만 AT이상에서는 8042 CPU가

그쪽일을 담당 합니다. 따라서 PC의 키보드 통신은 PC의 8042과 키보드

내에 있는 8048이 신호를 주고 받는 것입니다. 양방향 데이타의 전송은

두개의 핀을 이용하여 하는데 하나는 CLOCK이고 하나는 DATA 입니다.

따라서 가장 간단하게는 2개의 포트 핀으로 할 수 있습니다.

보다 자세한 내용은 XT TECHANICAL REFERANCE, AT TECHANICAL REFERANCE

, 기타 IBM PC 제어 서적을 보시면 회로도와 전송 데이타 포맷,

프로토콜, 기타 흐름 제어 등에 대하여 많이 나와 있습니다.

더욱 자세히 알려 드리지 못해 죄송합니다. 나중에 혹시 기회가 있을

지도 모르겠군요.

SYSBEACK님이 '후사(???)'라고 하셨는데 다음부터는 후사 내용을 더욱

자세하게 밝혀 주십시요. 예를 들면 '후사(100만원을 드림)',

'후사(맥주와 안주와 (?) 제공)', '후사(막걸리와 파전)',

'후사(포테이토칩과 자유시간 2개씩 제공)', '후사(즉석 복권 3장)'....

[Q&A] 87C51( 또는 89C51 ) 사용법 12/02 11:41 65 line

JS8051A 에서 87C51(89C51)을 사용하려 하는데요.

< NYC님 질문 >

" 안녕하십니까

저는 JS8051 BOARD 를 구입하여 공부하고있는 회사원입니다.

이 BOARD 를 특별히 어디에 사용하겠다는 계획은 없는데 공부가 잘되면

MOUSE 나기타의 목적으로 사용할계획입니다.

그런데 얼마전 8751 CHIP 을 사둔게 있는데 이것을 사용하려고 합니다.

8751 CHIP 은 4K BYT 의 ROM 이 내장되어 있더군요 그리고 JP3 의 2번3번의

JUMP 도잘알겠습니다.

그런데 현재제가 통신 PORT 를 사용하여 DOWN LOAD 를 수시로 하면서 프로그램

을 공부하고 있습니다.

그런데 BOADR 내의 통신 PROGRAM 27256 ROM 에 있지 않는가 생각됩니다.

그래서 이 프로그램 을 그데로 8751 ROM 에 COPY 해도 통신하는데는 문제가

없는지 궁굼합니다. 또 그렇게 해서 8751 CHIP 을 사용한다면 27256 ADDRESS

가 기존 0번지가 4096 번지로 바뀌어 엑세스되는지 아니면 칩 셀렉터를 회로상

변경해 주어야 하는지 아니면 27256 의 4K 가 중첩되는지 또 보드의 통신

프로그램의 일부를 수정해서 카피해야 하는지도궁금합니다.

번거로우시 겠지만 좋은 답변부탁드립니다.

그리고 다른 종류도 취급하신다면 품명도 알려주십니요. "

< 답변 >

먼저 제 보드를 사용해 주셔서 감사합니다. 그리고 MOUSE를 하시려

한다니 저도 슬슬 손이 근질근질 하군요. JS8051을 사용한 마우스의

회로도는 이미 환성되 있고 하드웨어도 일부 완성되 있습니다. 올리고는

싶지만... 마음에 들게 굴러 가면 올리겠습니다. 참고로 용산에 있는

마이크로마우스 상점에는 거의 모든 마우스 재료가 구비되어 있습니다.

그리고 마우스 기구물 중 일부는 제가 설계한 것입니다. 회사원 이면서

마우스를 하시는 분이라니 괜히 반갑군요. 제생각으로 마우스라는

사업(?)이 장비 면이나 경제적인 면은 민간인 아니 사회인( 이말도 좀

이상 하군 )들이 났지만 아무래도 시간면에서는 학생들이 났겠지요.

8751을 사용하신 다구요. JS8051A 제공 디스켓을 보시면 모니터 롬

쏘스와 binary 화일인 ROM.BIN이 있는데 이것을 바로 87C51에 심어서

쓰시면 됩니다. 전혀 수정하지 않아도 됩니다. 그리고 외부롬은 알고

게신대로 4096(1000H) 번지부터 시작되야 합니다. 이때 외부 롬의 0

부터 4095 번지를 읽으려고 하면 내부 롬이 읽혀 집니다. 따라서

일반적으로는 사용할 수 없습니다. 그런대 왜 외부롬을 쓰면서 값비싼

87C51을 쓰려고 하는지요?

( <= " 온도랑 security 때문에 그런다 왜, 떨부냐? " )

아트멜(ATMEL)에서는 89C51이라고 87C51과 같으면서 내부 롬이

EEPROM으로 된것이 있는데 값도 싸고 사용하기는 더 편함니다. 그런데

6개를 사와서 해보니까 2개만 제대로 작동되더군요. 저는 롬라이터는

ALL-03A를 쓰는데 구버전 프로그램에서는 아예 안되고 신버전 V9.05

에서도 문제가 있는것 같아요. 아니면 ALL-03A 내부 하드웨어 셋팅이

제대로 않되었는지도 모르고, 그것도 아니면 아트멜 QC( Qulity Check,

제품 검사 )에 문제가 .... 어째든 어딘가 문제가 있습니다. 87C51은

아주 맞있게 잘 구워 지는데...

아직 다른 제품의 JS 쓰리즈는 나와있지 않습니다. 물론 계획은

있습니다. 앞으로의 제품도 역시 확실한 technical support를 보장하겠

습니다.

혹시 JS8051A를 사용하여 마우스를 계획하시거나 만드시는 분들

연락이나 하고 지냅시다. 그리고 다만들었으면 꼭 보여 주세요. 제것은

틈나는대로 만들다보니 앞으로도 꽤 걸릴것 같군요. 제것도 다 만들면

보여드리고 괜찬게 굴러가면 완전히 공개 하겠습니다. .

- 정용원 올림

[21] ASM의 세계로 오신것을 완영합니다.( 12/11 19:05 126 line

ASM의 세계로 오신것을 환영합니다.(용어정리)

( ASM = ASSEMBLER LANGUAGE )

80C31 초보자라고해도 이미 MASM 이나 TASM에서는 날고 기는 분들이

있을 거고 Z80 ASM을 해봤거나 다른 ASM을 해본 사람, C 만 해본사람

아니면 까막눈(?)도 있을텐데 모두 여기에 오신것을 환영합니다.

먼저 ASM에 들어가기 전에 몇가지 용어의 개념을 잡겠습니다.

지금 당장은 용어를 모두 이해할 필요는 없습니다. 앞으로 강좌가

진행되면서 해당 용어가 나오면 한번씩 봐 주십시요.

오퍼래이터(operator)

오퍼래이터(operator)라는 말을 들으면 무엇이 생각납니까? 컴퓨터 앞에

앉아있는 아리따운 아가씨를 생각하시나요. 그러나 ASM에서는

수학에서와 같이 +,-,x,/...등과 같은 것을 일컫는 연산자라는 말로

쓰입니다. 특히 기호 보다는 ADD, SUB, MUL, DIV ... 등 영어 약자로

쓰면서 operation code라고 부르며 줄여서 OP CODE(오피코드) 라는 말을

씁니다.

라벨(label)

라벨은 옷이나 물건에 붙은 상표 딱지를 말하는 것이 아니고 bookmark

( 책을 보다가 잘때 책갈피에 꽂아 놓는 조그만 책받침(?) )와 비슷한

기능을 하는 것으로 라벨은 그 라벨이 있는 위치의 번지를 대표합니다.

라벨은 프로그래머가 필요한 곳에 직접 붙이는 것입니다.

커맨트(comment)

난처한 질문을 받았을때 대답하는 'No comment'에서의 comment와 뜻이

같습니다. '할말 없음'의 '할말'이 순수한 우리말이고 설명, 주석을

말합니다. ASM에서 부연 설명을 할땐 세미콜론(;) 뒤에 쓰면 됩니다.

가짜 명령(pseudo instruction)

pseudo에서 p자가 묵음이라 '슈도우'로 읽습니다. 거짓 명령, 의사 명령

이라고도 하는데 ASM 쏘스에서는 CPU에게 명령하는 OP code 외에

어셈블러 프로그램 자체에 대하여 명령이나 정보를 줄수가 있는데 이런

명령이나 정보를 말하는 것입니다. OP code와 같이 직접 기계어 코드로

번역되지 안는다는 의미에서 가짜 명령이라고 부름니다. 이 가짜

명령들은 ASM 프로그램을 만든 회사마다 약간씩 다릅니다.

루틴(routine)

'일상적인', '틀에 박힌' 이라는 뜻이 아닙니다. 일반적으로 ASM에서는

전체 프로그램 중에 어떤 특정 기능을 하는 작은 프로그램을 일커를때

루틴 또는 써브루틴이라고 합니다.

재배치(relocation)

개념적으로 약간 어려운데, 여러개의 프로그램을 합칠때 루틴들이 서로

떰빵되지(겹쳐지지) 않게 번지를 할당해 주는 일을 말합니다. 우리가

하는것이 아니고 linker라는 똑똑한 프로그램이 알아서 해줍니다.

그리고 '재배치 가능한(relocatable) 프로그램' 이라는 말도 자주

사용하는데 이것은 프로그램 자체에 절대 번지가 없고 상대 번지(offset

address)로 되어있는 프로그램을 말하는데 이런 루틴은 (링커가) 임의의

번지에 박어 넣도 문제가 없습니다. 이런 기능은 CPU 설계에서부터

고려되어진 기능으로 고급언어로 올라 갈수록 더욱 중요해 집니다.

오브젝트 화일(object file)

'목적 화일' 이라고 직역하는 분들이 있는데, 별로 그 뜻이 와닸지

안는군요. 제가 번역한다면 '중간 화일'이라고 하겠습니다. 그래도 썩

어울리지는 않군요. 오브젝트 화일은 쏘스 화일과 실행가능 화일의

중간에 만들어지는 과도기적 화일 입니다. 쏘스 화일 안에 외부 함수

참조가 있을때 어셈블러나 컴파일러는 쏘스 안에는 그 함수에 대한

자료가 없기때문에 그 곳은 비워두고 나머지를 번역하게 됩니다. 이런

목적 화일은 링커에 의해서 완전한 화일로 됩니다. 외부 참조가 없다고

해도 오브젝트 화일을 거치는 과정 없이 바로 실행가능 화일이 되지는

않습니다. 그러나 일부 ASM 프로그램은 이러한 중간 화일을 만들지 않고

링크 기능 없이 바로 실행 화일을 만듭니다. 이런 ASM 프로그램은

여러개의 중간 화일이나 라이브러리 화일을 하나로 묵어 실행가능

화일을 생성하는 능력이 없습니다. 그렇다고 이런 류의 ASM 프로그램이

나쁘다고 단정적으로 말할 수는 없습니다.




링크(link)

'연결' 이라는 말보다는 그냥 '링크'라고 부르는 것이 자연 스럽군요.

여러개의 오브젝트 화일( 라이브러리 화일 포함 )을 뭉쳐서 실행가능

프로그램을 만드는 것을 말합니다. linker라는 프로그램이 수행을

하는데 linker는 오브젝트 화일들을 통짜바리로 합치지는 않습니다.

주가되는(main) 프로그램에서 필요한 것만을 조합해서 실행가능한

화일을 만듭니다. 이 과정에서 relocatable이라는 개념이 필요하게 되는

것입니다.

기계어(machine language)

여기서 기계는 CPU를 말합니다. 제 생각인데 아마 옛날 베지지가 만든

컴퓨터가 기계로 되있어서 그렇게 부르지 않을까 합니다. 기계어는

CPU를 설계한 사람이 그 CPU에게 부여한 명령 코드(machine code)로

되어있는 언어로 CPU 마다 서로 다름니다. 어셈블러와는 일대일

대응관계가 있습니다. binary 형태로 되있습니다.

이진 화일(binary file)

이진 화일은 CPU가 알아듯는 machine code로 되있는 화일로 롬에

구워넣을 수 있는 유일한 화일을 말합니다. 혹시 hex file을 롬에

구워넣을 수 있는 화일로 알고 있는 분들이 있는데 잘못 알고 있는

것입니다. hex file은 롬라이터나 롬에뮤레이터 프로그램에서 변환을

시키거나 타겟 보드에 박혀있는 모니터 프로그램이 변환을 시켜서

롬이나 롬 기능을 하는 램에 넣는 것입니다. 일반적으로 binary file은

hex file 보다 훨씬 적지만 특별한 경우에는 그렇지 않습니다. binary를

4 비트씩 잘라서 쓰거나 읽으면 hexdecimal이 되는데 어떻게 binary 와

hex를 따로 볼수 있는가? 맞습니다. 우리가 hex로 표현하지만 실제 전자

회로에서는 한 라인을 통해 한비트가 왔다 갔다 하고 머쉰 코드를 롬에

구울때와 롬에서 값을 읽을때 8 비트 단위로 억세스 됩니다. 따라서

전자회로와 논리회로 상에서는 binary로 봐도 octal로 봐도 hex로 봐도

관계가 없습니다. 하지만 binary file, hex file 처럼 뒤에 file이라는

말이 붙으면 ASM 세계에서는 그 의미가 달라짐니다. binary file은 그

의미가 우리가 알고 있는 것 순수한 머쉰 코드의 집합이라서 PC상의

EXE나 COM file 처럼 일반 에디터로는 값을 볼 수가 없습니다. 그러나

hex file은 CPU를 생산하는 회사마다 서로 다른 어떠한 포맷을 가지고

있습니다. 우리가 읽을 수 있는 택스트로 되어 있으며 번지및 기타 다른

정보를 함께 가지고 있습니다.

[22] ASM 구조 12/11 19:07 91 line

ASM 구조

영어로는 명령을 내릴때 동사를 앞에 씁니다. 그래서 ASM에서도 동사 즉

명령이 먼저 오고 뒤에 목적(대상)이 옵니다.

ADD A,B => 'A,B를 더해라. ( 결과는 A에 넣어라 )'

| |

명령 목적

| | |

OP 코드 | |__ 제 2 오퍼랜드 : source

|____ 제 1 오퍼랜드 : destenation

ASM이란 binary 레벨의 기계어를 1 : 1 로 우리가 알기 쉬운 말로 만들어

놓은 것입니다. 하지만 몇가지 주의할 점들이 있습니다. 먼저 1 : 1

대응이란 말은 'ADD A,B'를 예로 들면 'ADD'는 01H로 'A'는 02H로

'B'는 03H로 대응되듯이 OP 코드와 오퍼랜드가 해당하는 코드로 하나씩

대응된다는 말은 아닙니다. 아래 어셈블러 리스트에서 보듯이 'ADD A,B'가

통체로 25F0로 번역된다고 봐야 합니다. 더욱 자세히 뜯어보면 25F0 라는 머쉰

코드( machine code = 기계어 코드 = 이진 코드)의 구성에도 약간의 규칙이

있지만 종합적으로 보면 'ADD A,B' 전체가 25F0로 번역(assemble)된 것으로

봐야합니다.

번지 기계어 코드 ASM 쏘스

| | _____|______

| | / \

1 0000 25F0 ADD A,B

2 0002 2403 ADD A,#3

3 0004 28 ADD A,R0

4 0005 26 ADD A,@R0

( 오른쪽의 ASM 쏘스가 번역된 것이 왼쪽의 기계어 코드 입니다. )

그리고 'B 레지스터의 내용을 A 레지스터에 더해 넣어라'라는 뜻의

'ADD A,B'와 'R0 레지스터의 내용을 A 레지스터에 더해 넣어라'라는

뜻의 'ADD A,R0'는 우리가 보기에는 비슷하게 보이고 번역된 코드도

비슷하거나 연관성이 있다고 생각하기 쉬운데 기계어 코드를 보면 알 수

있듯이 서로간에 별로 연관성이 없습니다.

'ADD A,B' => 25F0 ( 2 byte )

'ADD A,R0' => 28 ( 1 byte )

두 ASM 쏘스의 어셈블된 기계어 코드는 그 길이에서부터 서로 다름니다.

당연한 말이지만 어셈블러가 그렇게 번역을 하는것은 MCS-51 명령어

코드 자체가 그렇게 되어있기 때문이고 명령어 코드 자체가 우리가

보기에 연관성이 없어 보이는 이유는 CPU를 처음에 그렇게 설계했기

때문입니다. CPU를 그렇게 설계한 이유는 엿장사 마음데로가 아니고

효율성에 때문입니다. MCS-51 명령어 중에는 일반적으로 잘 쓰이는

명령과 덜 쓰이는 명령들이 있는데 비교적 잘쓰이는 명령은 그렇지 않은

명령어보다 코드의 길이가 짧은 코드를 배정해 놓았습니다. 역으로

말하면 CPU를 만들때부터 몇가지 레지스터에 대해서는 많은 혜택을

부여한 것입니다. ASM을 직접 하시다보면 눈치를 체겠지만 MCS-51

계열의 CPU에서는 A, R0, R1 레지스터를 사용하는 명령에 많은 기능과

코드면에서 상대적으로 많은 혜택을 부여해 놓았습니다. 간단한 예로

A 레지스터에 바로 3을 더할 수는 있어도 B 레지스터에는 그렇게 할 수

없습니다. 간접 어드레스의 값을 더할때 R0, R1은 가능하지만 R2,R3..

등은 불가능 합니다.

ADD A,#3 => 2403

ADD B,#3 => ERROR : 해당 머쉰 코드가 존재하지 않는다.

ADD A,@R0 => 26

ADD A,@R1 => 27

ADD A,@R2 => ERROR : 해당 머쉰 코드가 존재하지 않는다.


그렇다면 머쉰 코드가 짧으면 어떤 이점이 있을까요? 가장 쉽게는

와닫는 이점은 binary 코드가 짧아 진다는 것입니다. 아주 재수 없는

경우겠지만 몇십 바이트, 몇 바이트 때문에 87C51( 또는 80C51 내부롬 4K

)을 못쓰고 87C52( 또는 80C52 내부롬 8K )를 써야할 경우도 상상할 수

있습니다. 한,두대의 제품은 크게 문제가 안되지만 생산량이 많을때는

코드의 길이까지 계산해 가면서 줄여야 할겁니다. 그리고 또다른 이점은

속도에서 차이가 납니다. 일반적으로 머쉰 코드가 1 바이트짜리라면

CPU는 롬을 한번 읽어서 처리를 합니다. 그러나 1 바이트 이상아면

CPU는 한 명령의 수행을 위해서 여러번 롬을 읽어야 하고 그만큼 속도는

느려질 수 있습니다. MCS-51은 특별하게 1 싸이클내에 2번의 롬을 읽을

수 있는 능력이 있습니다. 명령 실행의 최소 단위가 1 싸이클 이므로

80C31은 2 바이트의 머쉰 코드도 1바이트 머쉰 코드와 같이 1 싸이클에

수행할 수 있습니다. 아주 특별한 경우로 곱셈( MUL AB )와 나눗셈(

DIV AB )은 머쉰 코드는 1 바이트이지만 내부 수행과정이 복잡하고

시간이 오래 걸려 실행 시간은 명령어중 가장늦은 4 싸이클이나 됩니다.

마지막으로 한가지 기쁜 소식을 알려 드리겠습니다. ASM을 좀 아는

분들은 대충 이해를 하겠지만 ASM을 잘 모르시는 분들은 무슨 소리인지

감을 못잡을 수도 있겠군요. 하지만 대부분의 경우에 코드의 길이와

수행 속도는 큰 중요성이 없습니다. 위 내용은 ASM을 익히다 보면

자연히 알게 됩니다.

[23] 실제 어셈블링을 해보자. 12/11 19:08 74 line

실제 어셈블링을 해보자.

여기서는 간단한 어셈블러 쏘스를 작성하여 binary 화일까지 만들어보고

그 값을 확인해 보겠습니다.

다음 예제 화일 EX_1.ASM을 코딩( 키보드로 쳐넣다 )하여 어셈블을 시켜

보십다.

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

;

; EX1.ASM

NOP

END

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

어셈블러 화일의 작성은 일반 택스트 에디터면 아무거나 상관 없습니다.

edit, ne, brief, tc나 bc의 통합 환경에디터 등을 사용하셔도 되지만

세계적으로 프로그래머들이 가장 많이 사용하는 Q 에디터를 추천합니다.

그리고 한가지더 TEXT 에디터 외에 binary 에디터도 있어야 합니다. 저

개인적으로는 LS.EXE와 같이 공급되는 TBE.EXE를 사용합니다.

PCTOOL에도 들어 있고, 아래아 한글에 들어 있는 HV.EXE로도 값을 볼 수

있습니다. 롬에뮬레이터나 롬라이터 구동 프로그램 내에도 binary

에디팅 기능이 있습니다. C 언어를 하시는 분중에는 자신이 만들어 쓰는

분들도 많이 있을 겁니다. 단순히 binary 화일을 보는 프로그램은 몇

줄이면 되고, 기교를 부리지 않는다면 에디팅 기능을 넣더라도 2~3

페이지면 됩니다. 왜냐하면 binary 에디터에는 값을 도중에 끼워

넣거나(insert) 지우는( delete) 기능이 없어야 하기 때문 입니다.

쏘스를 코딩할때 좌측 10칸 정도는 띄우고 하십시요. 라벨이 들어갈

자리입니다.

EX1.ASM은 실행을 위해 만든 쏘스가 아닙니다. 실행이 안되지는 않지만

의미가 없습니다. 먼저 NOP는 No OPeration의 약자로 CPU에게 1 싸이클

동안 아무일도 하지 말라는 명령입니다. 머쉰 코드는 00 입니다. 아래는

Soft Mart. Inc의 X8051.EXE를 사용하여 어셈블한 리스트 입니다.

12- 2-95 8051 Assembler Page 1

File EX1.ASM

1 ;========================================================

2 ;

3 ; EX1.ASM

4

5 0000 00 NOP

6

7 0001 END

8

9 ;========================================================

0 Error(s) Detected

맨 좌측열의 1, 2, 3 ... 9는 줄 번호 입니다. 5번 줄의 0000은

(롬)번지 이고 00은 번역한 머쉰 코드 입니다. 7번줄은 번지만 있고

머쉰 코드는 없는데 이유는 END가 가짜명령(pseudo instruction)이기

때문 입니다. END는 번역을 마치라는 명령으로 어셈블러 자체에게

알려주는 것으로 Soft Mart, Inc의 X8051 어셈블러를 쓸때는 없어도

무방합니다.

어셈블후 만들어진 EX1.HEX 화일을 HEXBIN을 사용하여 EX1.BIN으로

만드십시요. EX1.BIN의 화일 크기를 보면 1 바이트 입니다. 그값은

당연히 NOP 명령을 번역한 00 입니다. binary 에디터로 확인해

보십시요.

이렇게 binary 화일은 순순한 머쉰 코드와 데이타 만을 가지고 있으며

롬에 바로 구울 수 있고, 다운 로딩하여 실행 시킬 수 있는 실행 화일

입니다.( EX1.BIN은 실행시키지 마십시요. )

어셈블러 사용법은 앞 강좌를 참고 하십시요.

[24] 실제 보드를 돌려보자. 12/11 19:09 254 line

실제 보드를 돌려보자.

이제부터는 정식으로 보드에서 돌아가는 ASM을 작성해 보겠습니다.

자작한 보드인 JSTEST 보드에서느 롬을 구워 넣거나 롬에뮬레이터를

사용하시고 JS8051A 보드에서는 시리얼 다운 로딩하여 동작을 확인

하십시요.

다음 프로그램(JS51P1_0.ASM)은 포트 1의 첫번째 비트, 즉 CPU의 1번

핀을 ON, OFF하는 프로그램입니다.( JS8051A 제공 디스켓 참조 )

; JUST ON/OFF P1.0 PIN

ORG 0000H

JMP START

ORG 0033H

START:

REP: SETB P1.0

CLR P1.0

JMP REP

END

커맨트는 세미콜론(;) 뒤에 쓰면 됩니다.

"ORG 0000H"에서 ORG는 ORiGin(원점)의 약자로 거짓 명령 입니다.

다음 줄부터 번역하는 코드는 0000H번지에 위치 시키라는 뜻을 가지고

있습니다. 따라서 "ORG 0033H"는 그 다음줄 부터의 OP CODE를

번역하여 0033H번지 부터 넣으라는 명령입니다. 아래 어셈블러 리스트를

보시면 코드가 놓인 번지를 확인 할 수 있습니다.

"JMP START"는 START 라벨의 위치로 점프하라는 명령 입니다.

"START:"는 라벨로 자신이 있는 위치( 절대 번지 )를 대표합니다. 뒤에

붙은 콜론(:)은 일부 어셈블러에서는 없어도 됩니다. 그리고 라벨은

8자 이상을 써도되지만 8자 까지만 인식합니다. 따라서 어셈블러는

'START123:'와 'START12345:'는 같은것으로 봅니다. 라벨은

"START:"에서와 같이 한줄 모두를 독립적으로 차지해도 되고 "REP:

SET P1.0" 에서와 같이 다른 OP CODE 앞에 와도 됩니다. 위의

예에서는 START와 REP가 같은 번지(위치)를 나타내고 있는데, 이와같이

같은 위치에 중복되게 정의 해도 됩니다.

"SETB P1.0"은 P1.0 비트를 1( high )로 만듭니다.

"CLR P1.0"은 P1.0 비트를 0( low )로 만듭니다.

"JMP REP"는 REP 라벨의 위치로 점프하라는 명령 입니다.

아래는 JS51P1_0.ASM의 어셈블러 리스트 입니다. 각자 스스로 어셈블을

한뒤 BIN 화일을 보드에 심어서 수행해 보십시요.

File JS51P1_0.ASM

1

2 ; JUST ON/OFF P1.0 PIN

3

4 0000 ORG 0000H

5 0000 020033 JMP START

6

7 0033 ORG 0033H

8 0033 START

9 0033 D290 REP SETB P1.0

10 0035 C290 CLR P1.0

11 0037 80FA JMP REP

12

13 0039 END

0 Error(s) Detected

어셈블러 리스트를 보시면 0000H에 점프 명령이 있습니다. 이것은 매우

중요한 의미가 있습니다. 80C31은 0000H에는 데이타 값이나 OP 코드의

두번째 또는 세번째 바이트가 아닌 첫번째 명령 코드가 있는것으로 보고

그값을 읽어와 읽어온 코드의 명령을 수행합니다. 0000H 번지의 명령이

1 바이트 짜리면 명령을 바로 실행을하고 그다음 0001H 번지의 값도

명령으로 간주를 하고 읽어와 수행을 합니다. 만약에 0000H 번지의

코드가 2 바이트 이상 값이 필요한 명령이면 0001H에는 명령이 아닌

코드의 나머지 부분이나 필요한 데이타 값이 들어 있게되고 CPU는

그것을 읽어와 데이타로 처리를 합니다. 다시 말하면 똑똑한 CPU는

0000H 번지의 값을 명령으로 인식을 하고 그 코드가 1 바이트 짜리면

0001H 번지에 다음 명령이 시작된다는 것을 압니다. 물론 2 바이트

짜리면 다음 명령이 0002H 번지에 있다는 것을 압니다. 그런식으로

CPU는 롬의 코드를 순차적으로 해석하고 수행해 나갑니다.

그렇다면 문제를 하나 내겠습니다. 롬의 5100H 번지에서부터 20,00,33,

D2,90... 이라는 값이 들어 있다고 하면은 이 코드만을 보고 프로그램

중에 무슨 일을 하는 부분인지 알 수 있습니까? 일반적으로는 알 수

없다가 정답 입니다. 왜냐하면 롬의 일부 값만을 보고는 그 값이 명령

코드인지 명령 코드라면 명령의 몇 번째 바이트의 코드인지 또는 상수

데이타 값인지 그것도 아니면 안쓰이는 공간에 있는 쓰레기 코드(

garbage code )인지 알 수가 없습니다. 그것을 알기 위해서는 0000H

번지부터 단추를 끼워봐야 합니다. 더군다나 내장롬 타입의 8051, 8751,

89C51 등의 CPU를 사용하였고 인위적으로 garbage code를 만들어

놓았다면 분석은 불가능합니다. 이렇게 롬의 값을 보고 명령 코드인지

데이타 값인지를 구분을 못하는 이유는 명령 코드의 한 바이트가 0 ~ FF

까지의 값을 갖고, 데이타의 한 바이트도 0 ~ FF 까지의 값을 갖기

때문입니다.

Z80이나 8088 계열을 하신분들은 좀 이상한 점을 느끼실 겁니다. 그런

분들은 위 코드에 값을 I/O 포트로 내보내는 명령이 없다고 이상하게

생각하겠지만 80C31에서는 내부 포트 레지스터의 값을 바꾸면 그 바꾼

값이 바로 외부의 포트 핀에 나타나게 됩니다. 따라서 "SETB P1.0"은

내부 SFR에 있는 포트 레지스터 P0의 최하위 비트(LSB)를 1로 만들고 그

레지스터의 출력은 외부로 핀이 나와있어 바로 출력이 되는 것입니다.

한가지 더, 혹시 "JMP"를 MCS-51 명령어 세트에서 찾아 보신 분들이

있을지 모르겠군요. 사실 "JMP"는 MCS-51 명령어 세트에 없습니다. 실제

코드는 SJMP, AJMP, LJMP에 해당하는 코드만이 존재합니다. JMP라고

쓰면 어셈블러가 번역할 때 알아서 세게 중에 적당한 코드로 바꿔

줍니다. SJMP와 AJMP는 둘 다 2 byte 2 cycle 명령이지만 내부 실행에는

많은 차이가 있습니다. 이 두개의 명령은 relocatable code 생성에

관계가 있습니다. LJMP는 절대 어드래스 점프로 64K Program Memory

Space 전체의 구간 중 아무대나 갈 수 있습니다. 위의 예

JS51P1_0.ASM에서는 JMP를 SJMP, AJMP, LJMP 중 아무 것으로나 바꿔도

무방합니다. 위의 리스트를 살펴 보면 어셈블러가 첫 번째 JMP는

LJMP로 바꾸고 두번째 JMP는 SJMP

꾼것을 볼 수 있습니다. 따라서

같은 ASM 쏘스를 가지고 다른 어셈블러로 binary 화일을 만들었다면

JMP에 해당하는 부분의 코드는 서로 다를 수 있습니다. 물론 실행에는

문제가 없습니다. 확실히 코드 길이를 설정해야 할때는 SJMP, AJMP,

LJMP를 직접 쓰시면 됩니다.




JS51P1_0.ASM은 P1.0을 빠른 속도로 ON, OFF 합니다. 따라서 정확히

보려면 오실로스코프를 사용하셔야 합니다.다음 JS51P1_1.ASM은 ON, OFF

사이에 지연( delay )를 넣은 것으로 TESTER나 LED를 사용하여 확인할

수 있습니다. 직접 해보십시요. 단 여기서는 P1.1을 ON, OFF 합니다. (

JS8051A 제공 디스켓 참조 )

; JUST ON/OFF P1.1 PIN

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

REP: SETB P1.1

CALL D_1S

CLR P1.1

CALL D_1S

JMP REP

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

;

; < DELAY >

;

; CLK = 11.0592 MHz

;

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

;;;;;;;;;;;;;;;;;;;;< 10 uS >;;;;;;;;;;;;;;;;;;;;

D_10US: ; 9*12/CLK

NOP ; = 10 uS

RET

;;;;;;;;;;;;;;;;;;;;< 100 uS >;;;;;;;;;;;;;;;;;;;;

D_100US: ; (13 + N * 2 )*12/CLK

PUSH PSW ; = 100 uS

PUSH R0

CLR RS1

CLR RS0

MOV R0,#36 ; N = 40

DJNZ R0,$

POP R0

POP PSW

RET

;;;;;;;;;;;;;;;;;;;;< 1 mS >;;;;;;;;;;;;;;;;;;;;

D_1MS:

PUSH PSW

PUSH R0

PUSH R1

CLR RS1

CLR RS0

MOV R0,#12

D_1MS_1:

MOV R1,#36

DJNZ R1,$

DJNZ R0,D_1MS_1

POP R1

POP R0

POP PSW

RET

;;;;;;;;;;;;;;;;;;;;< 10 mS >;;;;;;;;;;;;;;;;;;;;

D_10MS:

PUSH PSW

PUSH R0

PUSH R1

CLR RS1

CLR RS0

MOV R0,#70

D_10MS_1:

MOV R1,#63

DJNZ R1,$

DJNZ R0,D_10MS_1

POP R1

POP R0

POP PSW

RET

;;;;;;;;;;;;;;;;;;;;< 100 mS >;;;;;;;;;;;;;;;;;;;;

D_100MS:

PUSH PSW

PUSH R0

PUSH R1

CLR RS1

CLR RS0

MOV R0,#200

D_100MS_1:

MOV R1,#228

DJNZ R1,$

DJNZ R0,D_100MS_1

POP R1

POP R0

POP PSW

RET

;;;;;;;;;;;;;;;;;;;;< 1 S >;;;;;;;;;;;;;;;;;;;;

D_1S:

PUSH PSW

PUSH R0

CLR RS1

CLR RS0

MOV R0,#10

D_1S_1:

CALL D_100MS

DJNZ R0,D_1S_1

POP R0

POP PSW

RET

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

END

8051A 보드 판매처 12/11 19:10 19 line

JS8051-A 보드 판매처

마이크로로보트( <= 상점 이름 ) : 718-3182 ~ 3

용산 선인프라자 21동 1층 86호 :

신용산 역에서 가자면 전자 상가 쪽으로 용산 지하도 따라 가다가

지하도 거의 나갈때 쯤 우회전해서 계단을 올라가서 약 20 m 전진 후

바로 왼쪽 !?!?

지방분들은 통신판매도 된다고 하니 먼저 전화를...

추신) 테크니컬 질문은 그쪽으로 하지 마십시요. 여기에 올리거나

천리안, 하이텔 공히 maroboss로 메일을 주십시요.

세미나 참석 후 12/19 23:19 43 line

Intel 8051/251 개발 환경 세미나

먼저 아래 글은 전적으로 제 느낌 및 생각, 의견 임을 밝혀 둡니다.

전체적으로 세미나는 다른 세미나 보다 워낙 고가의 참가비( 3만원 )

를 받아서 그런지 강사진은 좀 좋았습니다. 기본적으로 8051에 대해서는

다 아는 분들이 모였다고 보고 진행된 어느 정도 수준있는 내용들

이었습니다. 상대적으로 마이크로 비젼에서 했던 세미나는 값은 싸지만

강사 수준이 낮고 너무 기초 수준만 다루는 경향이 있었습니다. 물론

듣는 사람의 수준에 따라 강좌의 평은 달라질 수 있지만...

제가 강좌에 참석한 목적은 역시 80C251에 대한 정보를 얻기 위한

것이었습니다. 251에 대한 자료는 95년 인텔 데이타 북에도 3장 밖에

안나와 있습니다. 앞에서도 간단히 소개를 한 것처럼 80251은 8051

가문에서 분가한 아들입니다. MCS51의 가족에 끼지 못하는 이유는

엄청나게 진보되고 개선된 내부 구조 때문입니다. 8비트 이지만 V40이나

8097 보다는 월씬 빠를 겁니다. 물론 몇 메가짜리 클럭을 쓰느냐에 따라

달라 지겠지만 80C196KC-20보다도 빠른 속도의 가족도 있습니다.(

당연히 전체 퍼포먼스를 따질때 빠르다는 예기임 ) 같은 클럭을

사용하는 8051보드에 꽂으면 5배의 속도 향상이 있고, 전용 명령을

사용하면 15배의 속도 향상이 됩니다. 40 MHz 제품도 선을 보인다니

기대가 되는 군요. 어드레스 공간은 페이징 기법을 사용하여 거품날

정도로 증대 시켰습니다. 속도 증가 기술은 여러가지가 사용 되었겠지만

일단 한 싸이클 내의 머쉰 싸이클을 줄인 것보다는 파이프 라인 구조를

사용한 것이 가장 핵심입니다. 80C251은 올해 처음 탄생했고 몇가지

제품만이 현재 출시되 있습니다. 12월에도 하나의 새 제품이 출시

예정이고, 내년, 후년 계속해서 251의 가족들이 출시 됩니다.( 여러분이

원하시는 40 pin DIP 타잎은 아직 안나왔습니다.) MDS 장비도 아직은

일부 회사에서만 나오고 C 컴파일러도 KEIL에서만 나오고 IAR에서는

아직 안나왔다고 들었습니다. 그리고 제가 볼때 국내에서 251을 제대로

돌리는 사람은 거의 없는것 같습니다. 어쩌면 아직 한명도 없을지 모릅니다.

아직 품종면이나 소프트웨어면, 지원 하드웨어면, 정보면에서 환경이

열약합니다. 하지만 인텔에서 야심차게 밀고 있으며 그 뛰어난 성능과 MCS51

binary 호환이라는 엄청난 메리트를 등에 업고 많은 이들의 관심을 끌 것은

확실하고, 제가 볼때는 후년(1997년) 정도 부터는 서서히 부상해서 후년 말

경에는 중저가(격)의 제어용 프로세서의 시장을 석권하리라 봅니다.

그렇다고 향후 2~3년 후에 MCS51의 시장이 쉽게 사라질 것이라고는 보지

않습니다. 그렇게 보는 이유에는 여러가지가 있지만 가장 큰 이유는 가격

입니다.

Port 1 입출력

앞 강좌에서는 Port 1의 각각의 한 비트를 ON, OFF 시키는 것을

배웠습니다. 이번에는 Port 1에 1 바이트 값을 출력시켜는 것을 알아

보겠습니다. 매우 간단합니다.( JS8051A 내장 디스켓 참조 JS51P1.ASM )

; JUST ON/OFF P1.0 ~ P1.6 ( DON,T CHANGE P1.7)

; THIS PROGRAM IS FOR RAM EXECUTION

ORG 0000H

JMP START

ORG 0033H

START:

NOP ;

NOP ; DON'T REMOVE

REP: MOV P1,#01111111B

MOV P1,#00000000B

JMP REP

END

JS51P1.ASM 예제에는 DELAY가 있지만 편의를 위해 뺐습니다. 너무

빨라서 볼 수가 없으신 분들은 앞 강좌를 보시고 DELAY를 넣어

주십시요.

위의 예에서는 한가지 이상한 점이 있습니다. 다른 비트들은 모두

0,1,0,1... 계속 변하지만 P1의 최상위 비트인 P1.7은 항상 0을

출력되게 했는데 그 이유는 더이상 설명하지 않아도 모두 잘 아실

겁니다. 그리고 위 프로그램의 커맨트를 보면 "이 프로그램은 램에

(다운 로딩하여) 실행해야 함"이라고 적혀 있는데 진짜로 JS8051A의

모니터 롬을 빼고 이 프로그램을 구워서 박어 넣고 돌리면 안 돌아

감니다. 롬에서 실행 시키기 위해서는 프로그램의 일부를 다음과 같이

바꿔주어야 합니다.




REP: MOV P1,#11111111B

MOV P1,#10000000B

JMP REP

자세히 보시면 P1.7 비트가 1로 유지되고 있음을 볼 수 있습니다.

JS8051A의 자장큰 장점 중에 하나는 램이 완전히 롬으로 변환된다는

것입니다. 차차 아시게 되겠지만 다른 보드에서 사용하는 방법은 리셋

후 시작 번지인 Program Space Memory의 0000 번지에는 롬이 할당되

있습니다. 따라서 프로그램의 절대번지 사용에 문제가 있으며 인터럽트

벡터 테이블도 사용자가 변경할 수 없습니다.(자세한 내용은 인터럽트

강좌에서..) 혹시 " JS8051A에서도 모니터롬이 0000 번지에 박혀 있지

안느냐 ?" 하고 반문을 하는 분이 있을지 모르겠군요. 그러나 JS8051A의

롬은 다운 로딩 직후 그 생명을 다하고 보드 상에서 어떠한 메모리

공간도 차지하지 않고 사라져 버립니다.(?) 따라서 JS8051에서는 자신이

0000 번지부터 시작하는 롬에다 프로그램을 짠다고 보시고 그냥

프로그램을 하시면 됩니다. 더욱이 아무런 변경 없이 그 프로그램을

롬으로 구워 JS8051A의 모니터 롬을 던져 버리고 그 곳에 꽂으면 돌아

갑니다. 그러나 한가지, P1.7은 예외 입니다.

어째튼 좋습니다. 앞에서 설명을 모두 드렸지만 그것을 사용자가 이해할

필요는 없습니다. 단지 P1.7을 건드리지 말라는 예기 입니다.

" 너무 억울하다. 술도 안먹고, 담배도 주서피워 가면서 거대한 잔돈

모아서 샀는데, 왜 P1.7을 못쓰게 하느냐. 그것도 한 바이트 단위로 쓸

수있는 Port 1 중에 한 비트를... 너무 억울해서 먹고있는 '왕꿈틀이'

맛을 느낄 수가 없다. 보상해라. 내 입맛 돌리도~, 내 인생 돌리도~ "

몇가지 방법을 제시합니다. 물론 아무 수정 없이 규정대로 쓰시는 것이

좋지만 정 P1.7을 원하신다면, 16V8의 9번 핀을 밖으로 약간 벌린 후

다시 소켓에 꽂으싶시요. 그러면 P1.7을 마음대로 쓸 수있습니다.

하지만 다운 로딩이 안됩니다. 롬을 구워서 쓰십시요.

" 롬을 굽는게 왼말이냐!, 더 억울하다. "

좋습니다. 그럼 이렇게 하십시요. 2개의 타이머 입력이나 2개의

인터럽트 입력 중에 하나를 포기하십시요.예를 들어 T1( CPU의 15번 핀

P3.5 )을 포기한다고 하시면 16V8의 9번을 밖으로 약간 벌려 꽂은 후

T1( JP5의 28번 핀 )을 16V8의 9번 핀과 연결하십시요. 그리고 모니터

롬의 쏘스 프로그램인 ROM.ASM에서 P1.7을 찾아 P3.5로 바꾼 후

어셈블링해서 새로운 모니터 롬을 만드십시요. 그다름 모니터 롬을 새로

만든 것으로 교체한 후 사용하십시요. 그러면 P1.7을 마음대로 쓸 수

있습니다.

" ???!!!... 약간 속은 느낌인데, 그래도 약간 억울한것 같기도 하다. "

그러면 이렇게 하십시요. 모니터 롬과 16V8 내용을 자신이 직접 짱구를

굴려 고치 십시요. 그러면 저는 우리 조카가 좋아하는 '왕꿈틀이'

사먹으러 갑니다~.


" 아~ 포트 1을 제어하기란 멀고도 험하구나."

6] HC574로 출력하기 12/19 23:23 135 line

HC574로 출력하기

HC574, HC541은 제가 개인적으로 가장 좋아하는 I/O 입니다. 리셋 직후

일정한 값을 가져야 할때는 HC273을 쓰고요, 그렇지 않으면 HC574를

씁니다. 무엇 보다도 입력과 출력 핀들이 깨끗하게 구분되어 있어 PCB

보드 설계시에나 땜질로 만들때 편하고 입출력 인에이블 신호도 쉽게

만들 수 있어서 좋아합니다. 여러분들이 좋아하시는 82C55도

좋아합니다. 나중에 I/O를 설계하실 경우 크기와 스피드, 팬아웃,

가격등을 고려하여 설계해야 합니다.

앞 강좌에서 80C31은 3개의 메모리 공간을 가진다고 말씀을 드렸습니다.

내부램, Program Memory Space(롬, 읽기 전용 영역), Data Memory

Space(램,I/O, 읽고 쓰기 가능 영역) 이렇게 3개의 메모리 공간이

있습니다. 제 강좌를 잘 따라 오신 분은 Program Memory Space에도 읽기

전용 I/O(예: HC541, HC540 )가 들어 갈 수 있다는 것을 아실 겁니다.

ASM에서는 이 세개의 메모리 공간을 읽는 명령이 각기 따로 준비되어

있습니다. 순서대로 MOV, MOVC, MOVX 입니다. MOVC에서 'C'는 Constant

Data 즉 롬을 의미하고 MOVX에서 'X'는 eXternal Data 즉 램을 의미

합니다. 아래 예는 각 메로리 공간의 30H번지를 A에 읽어 들이는 명령

입니다.

(내부램)

MOV A,30H

(롬)

MOV DPTR,#0030H

MOV A,#0

MOVC A,@A+DPTR

(램)

MOV DPTR,#0030H

MOVX A,@DPTR

다음은 각 30H 번지에 A값을 쓰는 예 입니다.

(내부램)

MOV 30H,A

(램)

MOV DPTR,#0030H

MOVX @DPTR,A

설마, 롬 공간에는 왜 쓰는 예가 없느냐고 묻는 분은 없겠지요.

골뱅이에 대하여.

ASM을 하시다 보면 골뱅이 '@'가 자주 보이 는데 이 표시는 '~에

있는'이라는 뜻인 영어 at 대신 쓰임니다. MCS-51 ASM에서는 레지스터

앞에 골뱅이가 붙으면 "그 레지스터 값의 번지"를 의미 합니다. 약간

어렵게 표현하면 '간접 어드레싱'을 나타낸다 라고 합니다.

MOV DPTR,#0030H

MOVX @DPTR,A

에서 DPTR에는 0030H라는 값이 들어가게 됩니다. 따라서 @DPTR의 뜻은 "

DPTR 값의 번지" = "0030H 번지"를 예기하게 됩니다." MOVX @DPTR,A"

는 0030H 번지에 A값을 넣으라는 뜻이 됩니다. 예를 하나 더

들겠습니다. 먼저 A에 무엇이 들어갈지 생각해 보십시요.

MOV 30H,#7 ; 30H번지에 숫자 7을 넣어라

MOV R0,#30H ; R0에 숫자 30H를 넣어라

MOV A,@R0 ; R0 내용 번지의 값을 A에

; 넣어라

좀 헤깔리겠군요. 답은 7 입니다. 점점 익숙해 질겁니다.

JS8051A에서는 HC574는 Data Memory Space F000H 번지에 위치합니다.

능력이 되는 분은 아래 JS51_574.ASM을 참고하지 말고 자신이 직접

HC574에 값을 출력하는 ASM 쏘스를 만들어 보십시요.

; JS51_574.ASM ( JS8051A 제공 디스켓 참조 )

; ON,OFF HC574 PORT

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

REP:

MOV DPTR,#0F000H

MOV A,#0FFH

MOVX @DPTR,A ; OUT A TO HC574

CALL D_1S

MOV A,#0H

MOVX @DPTR,A

CALL D_1S

JMP REP

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

D_1S:

MOV R0,#10

D_1S_1:

MOV R1,#10

D_1S_2:

MOV R2,#100

DJNZ R2,$

DJNZ R1,D_1S_2

DJNZ R0,D_1S_1

RET

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

END

예제 프로그램 안에 " DJNZ R2,$ "이 있는데 $는 현재 줄의 라벨을

대표합니다. 예를 들어 프로그램의 마지막에 무한 루프를 돌게 하려면

SELF: JMP SELF



라고 해도되고 다음과 같이 해도 같은 뜻이 됩니다.

JMP $

27] ASM 코딩시 유의사항 12/19 23:24 57 line

ASM 초보자들이 실수하기 쉬운 것들

MCS-51 ASM을 처음하시는 분들이 실수하기 쉬운것을 몇가지 적어

봤습니다.

.숫자 데이타 앞에 우물정 # 빼먹기

이 실수는 무지하게 자주 발생합니다. 중급자들도 가끔씩 실수 하는

사항 입니다. 숫자 앞에 #을 빠뜨려도 아무런 에러나 워닝(경고)이

나오지 않으므로 아주 주의 해야 합니다. 어셈블러 쏘스 라인이

길어지면 찾기가 쉽지 않습니다. #이 있을때는 숫자로 없을때는

내부램의 번지로 인식을 하니 이점 유의 하십시요.

MOV A,#3 ; A에 숫자 3을 넣는다.

MOV A,3 ; 내부램 3번지( 레지스터 뱅크 0의

; R2)의 값을 A로 복사.

.MOVX를 MOV로 쓰기

그다음 자주 발생하는 것이 MOVX를 써야 하는데 그냥 MOV로 쓰거나

MOVC를 써야 하는데 그냥 MOV로 쓰는 경우입니다. 이 경우에도 16비트

레지스터인 DPTR 이나 PC와 같이 쓸때는 어셈블러가 에러를 알려 주지만

Rr( r=0 ~ 7 )과 같이 쓸때는 알려주지 않고 원하지 않는 다른 동작을

해버립니다. 지금 잘 와닸지가 않겠지만 일단 염두해 두십시요.

MOVX @DPTR,A

MOV @DPTR,A ; 어셈블시 에러 표시

MOVX @R0,A

MOV @R0,A ; 전혀 다른 명령이 됩니다.

.골뱅이 빼먹기

골뱅이는 호프집에서나 빼먹어야 하는데 초보자들은 가끔씨 ASM 쏘스

작성시에 빼먹곤 합니다. 이 경우도 16비트 레지스터와 같이 쓸경우는

어셈블시 알려주지만 그렇지 않을 때는 주의 해야 합니다.

MOV @R0,A

MOV R0,A ; 전혀 다른 명령이 됩니다.

위에 3가지 외에도 주의 사항이 더 있습니다만, 일단 초보자들은 위의

3가지를 유의하십시요. 나머지는 중급자가 되면 말씀 드리겠습니다.

[28] PUSH SW 입력 12/19 23:25 119 line

PUSH SW 입력

JS8051A 보드에는 3개의 PUSH SW(스위치)가 있습니다.( JSTEST 보드에도

똑같은 위치에 있으므로 참고 하십시요. ) S1, S2, S3가 있는데 S1은

리셋 스위치로 쓰이고 S2, S3가 일반 용도로 사용 됩니다. 회로도를

보시면 S2와 S3가 각각 Port 1의 핀인 P1.2와 P1.3에 연결되어

있습니다. 그러나 P1.2와 P1..3 핀들은 스위치의 입력이 아니 일반

용도로도 사용 가능합니다. 다시 말하면 Port 1의 다른 핀들과 같이

입출력이 가능한 일반 핀 처럼 취급해도 됩니다. Port 1을 다 쓰고

싶은데 S2와 S3가 달려있어서 깨름찍한 분들이 있을까봐 노파심에서

말씀 드리는 겁니다.

일반적으로 어떠한 보드를 만들때 출력 확인 장치인 LED, PIEZO,

SEGMENT DISPLAY( FND라고도 함 ), LCD 중에 적어도 하나와, 2개 이상의

스위치 입력을 넣어서 설계해야 합니다. 최종 양산 제품에서는 용도에

따라 없어도 되지만 디버깅 과정및 개발과정에서는 거의 필수적 입니다.

훨씬 진보된 형태의 디버깅 툴이나 장비가 있다고 해도 가장 원시적인

스위치 입력과 출력 확인 장치들은 많은 도움을 줍니다.

JS8051A 보드에서 S2, S3 두개의 PUSH SW는 다운로딩을 하기 전까지는

보드 자체가 즉 모니터 롬이 관리를 합니다. S2는 다운 로딩을 시작하는

스위치로 사용을 합니다. 다운 로딩이 다 끝나면 자동으로 로딩된

프로그램이 실행됩니다. S3는 리셋후 이미 램에 로딩된 프로그램을 다시

시작하는데 사용됩니다. 프로그램을 실행하다 보면 처음 부터 다시

실행을 해야할 때가 많은데 이때는 다운로딩을 다시 하는 것이 아니고

리셋 스위치를 누른후 S3를 누르면 램에 있는 프로그램이 바로 실행

됩니다. 혹시 리셋을 걸면 램의 내용도 지워진단고 생각하시는 분들은

안게시겠지요.

일단 보드의 제어권이 사용자 프로그램으로 넘어가게 되면 , 다시말해

S2나 S3로 프로그램을 시작하게 되면 S2와 S3는 자유의 몸(?)이 됩니다.

사용자가 자신의 용도에 맞게 사용하면 됩니다.

제가 전에 말씀 드렸듯이 포트 핀을 입력으로 사용하기 위해서는 먼저

포트의 출력값을 1( HIGH )로 해주어야 합니다. 물론 이미 1이 들어가

있으면 다시 1을 써줄 필요는 없습니다. 포트의 원리에 대해 원래

강좌의 초안에서는 훨씬 더 내용이 길고 복잡한데 그 내용은 나중으로

미루겠습니다. 초보때 많이 실수 하는 것중에 하나가 포트의 값이 0을

출력하고 있을때 포트 핀을 읽는 경우가 많은데 이경우는 무조건 0이

입력됩니다. 따라서 좀 더 익숙해지기 전까지는 그 핀의 출력값이 0이든

1이든간에 무조건 입력 전에는 1을 먼저 쓰신후 읽으십시요.

아래 예제 프로그램은 S2의 값을 읽어 HC574의 모든 핀으로 출력하는

프로그램 입니다. 별 어려운 것은 없고 'JB' 라는 생소한 명령이

나오는데 이것은 " Jump if Bit is set"," 핀을 읽어 그값이 1(set)이면

점프 "라는 뜻의 명령입니다. 그 반대 명령어로는 'JNB', " Jump if Bit

is Not set "이 있습니다.

; ( JS8051A 내장 디스켓 JS51KEY.ASM 참조)

; READ USER KEY1(S2) AND WRITE TO HC574

HC574 EQU 0F000H

ORG 0000H

JMP START

ORG 0033H

START:

NOP ; DON'T REMOVE

NOP ; DON'T REMOVE( FOR TIMING )

MOV DPTR,#HC574

REP: JB P1.2,OUTHIGH

OUTLOW:

MOV A,#0H

MOVX @DPTR,A

JMP REP

OUTHIGH:

MOV A,#0FFH

MOVX @DPTR,A

JMP REP

END

예제중에 " HC574 EQU 0F000H "라는 선언문이 있는데 어셈블러는

이 문장을 만난 이후로 HC574는 0F000H로 무조건 바꿔서 해석합니다.

따라서

MOV DPTR,#HC574

MOV DPTR,#0F00H

로 알아 듯게 됩니다.

어느정도 이해를 하셨으면 문제를 몇개 풀어 보십시요.

문제 1) S2를 누르면 HC574의 출력이 모두 1이 되고 S3를 누르면 모두

0이 되게 프로그램을 작성하십시요.

문제 2) S2를 누르면 HC574의 출력이 반전되는 즉 누를때 마다 1 <--> 0

이 되도록 프로그램을 작성하십시요.

문제 3) HC574의 초기값이 0이 되게 하고 S2를 누르면 값이 하나씩 증가

되고 S3를 누르면 감소 되게 프로그램 하십시요.

수준 있는 분들을 위한 문제

문제 4 ) 문제 1, 2, 3 에서 모든 동작이 스위치를 땔때 동작 되게

하십시요.

문제 4 ) 문제 1, 2, 3 에서 모든 동작이 스위치를 누를때 한번 동작이

되고 스위치를 놓고 다시 눌러야 다음 동작이 되게 하십시요.

제가 가끔씩 드리는 문제는 반드시 풀어야 합니다. 못 풀겠으면 일단

생각이라도 해봐야 합니다. 그래야 빨리 배울 수가 있고 기초가 단단한

엔지니어가 됩니다. 눈으로만 하시는 분들은 절대로 없어야 합니다.

적어도 제 강좌를 아껴 주는 분이라면 분이라면

29] HC541 입력 12/22 15:44 92 line

HC541 입력

HC541은 3 상태( high, low, high-impedance 별도 설명*) 버퍼로 입력

또는 출력 I/O로 사용할 수 있는데 JS8051A에서는 외부의 데이타를

내부의 데이타 버스에 실기 위해서 즉 입력으로 사용했습니다. 입력

부분(핀)이 확장 해더(JP6)로 나와 있으니 사용자 확장보드에서 읽고

싶은 부분(핀)을 이곳에 연결하여 읽으면 됩니다. TTL 계열인 LS541을

사용할때는 필요가 없지만 CMOS 계열인 HC541이나 HCT541을 사용할때는

입력으로 쓰이지 않는 핀은 GND나 VCC에 바로 불리거나 풀업이나

풀다운을 해주십시요.

HC541을 읽는 방법은 HC574를 읽을때와 비슷합니다. 단지 MOVX 뒤에

쏘스와 데스터네이션인인 두개의 오퍼랜드를 바꾸면 됩니다.

(출력)

MOVX @DPTR,A ; A -> HC574

(입력)

MOVX A,@DPTR ; A <- HC541

아래 예제 프로그램은 HC541로 값을 읽어 HC574로 출력하는 프로그램

입니다. 별로 어려운 부분은 없습니다.

; (JS8051A 내장 디스켓 JS51IO.ASM 참조)

; HC541( INPUT ) => HC574 ( OUTPUT )

HC541 EQU 0F000H

HC574 EQU 0F000H ; WHEN WRITE

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

MOV SP,#70H

REP:

MOV DPTR,#HC541

MOVX A,@DPTR ; A <- HC541

MOV DPTR,#HC574

MOVX @DPTR,A ; HC574 <- A

JMP REP

END

* 3상태( 3-State) : 디지탈에서는 물리적으로 3가지의 상태가

있습니다. 0(Low)는 GND 전위를 가지며 1(High)은 Vcc(대부분이

5V) 전위를 가집니다. 나머지 하나는 0V와 5V의 중간인 어정쩡한

2.5V 상태가 아니라 high impedance 상태 입니다. 말 그대로

임피던스가 높은 상태 입니다. 임피던스라는 뜻은 깊은 뜻이 있지만

그냥 저항이라고 생각하시면 됩니다. " 그러니까 높은 저항 상태.

??? ". 그렇습니다. 다음 그림을 보아 주십시요.

_____ ______

|__ A __|

|__| | |__|

IC1 |__ | __| IC2

|__|----------------|__|

_____| |______

_____

|__

|__|

IC3 |__

|__|

_____|

신호가 A에서 들어와 IC2로 들어간다고 할때 IC1이 Low나 High를

출력하고 있다면 IC2로 들어가는 신호를 올바른 신호가 들어갈 수

없습니다. 따라서 IC1의 출력은 0 도 1 도 아니 끈어진 상태가

되어야 하는데 실제로는 완전히 끈어진 상태가 아니 IC1의 출력

저항이 매우 높은 상태( high impedance stage )가 됩니다. 높은

저항 상태가 왜 A의 입력에 영향을 안주는지 이해가 안되는 분은

IC3를 보아 주십시요. IC3의 출력 핀은 A와 전혀 연결되어 있지

않으므로 A의 입력에 전혀 지장이 없다는 것은 이해가 되지요.

그러나 전자 회로 적으로 IC3의 출력은 A와 무한대 옴의 저항이

연결되 있다고 볼 수 있습니다. 그러니까 무한대 옴과 비슷한 하이

임피던스 상태도 거의 영향을 주지 않는다고 보십시요.

괴변이라고 말하실지 모르지만 사실 입니다. 그래도 하이

임피던스 상태가 이해가 안되는 분은 그냥 아주 좋은 상태라고만

알아두십시요.---- 히히

롬 읽기

일반적으로 롬은 64K 바이트 Program Memory Space에 있습니다. 잘

아시다시피 Program Memory Space는 단지 읽을 수만 있는 공간이며

하드웨어적으로는 /PSEN 신호를 사용하여 읽습니다. 롬에는 명령 코드

외에 상수 데이타, 폰트 데이타, 테이블 데이타 등 여러가지 용도의

데이타 값이 들어갈 수 있습니다. 이러한 롬 데이타를 읽기 위해서는

" MOVC " 명령을 사용합니다. 아래 예제 프로그램은 롬의 0000 번지의

내용을 읽어 HC574로 출력하는 프로그램입니다. 별로 주의 할것을 없고

단지 읽는 번지가 DPTR과 A값을 합쳐서 결정된다는 것만 알아 두십시요.

DPTR외에 PC(Progrma Counter)를 사용하여 읽는 방법도 있습니다. 그건

나중에 배우지요.


; (JS8051A 내장 디스켓 JS51ROMR.ASM 참조)

; READ RAM(0000H) AND OUT TO HC574(maybe 02h)

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

MOV DPTR,#0000H ; READ 0000H(ROM)

CLR A

MOVC A,@A+DPTR

MOV DPTR,#0F000H ; OUT TO HC574

MOVX @DPTR,A

JMP $

END

알아두면 해깔리는 예기

사용자가 의식을 못하지만 JS8051A에서는 프로그램늘 다운로딩하여

실행하면 램이 롬의 역할까지 하므로 물리적으로 램의 0000 번지나 롬의

0000 번지가 같습니다. 따라서 위 프로그램에서는 " MOVC " 명령을

사용하여 롬을 읽지만 램을 읽는 다고도 말할 수 있지요. ???

물론 롬에 구워 넣어 실행하셨다면 롬을 읽는 것이 되고요.

-- 약간 걱정이 되는군요. 돌아버리는 사람이 없기를...

[31] 램 읽고 쓰기 12/22 15:48 87 line

램 읽고 쓰기

램은 64K 바이트의 Data Memory Space에 위치합니다. Data Memory

Space는 당연히 읽고 쓰기가 가능한 공간입니다. 하드웨어적으로

읽을때는 /RD 신호를 쓸때는 /WR신호를 사용합니다. 프로그램에서

램을 읽고쓰는 명령은 앞에서 배웠던 I/O를 읽고 쓰는 방법과

똑같습니다. " MOVX " 명령은 특정 칩을 읽거나 쓰는 명령이 아니고

Data Memory Space를 읽고 쓰는 명령 입니다. 따라서 CPU는 자신이

/RD와 /WR을 사용하여 읽고 쓰는 공간이 램인지 I/O인지 롬인지 전혀

모르로 수행을 합니다. 역으로 말하면 프로그램만 보아서는 " MOVX "로

읽거나 쓰는 대상 공간이 물리적으로 어떤 디바이스가 달려 있는지 알수

없다는 뜻입니다.

아래 예제는 램의 0000 번지를 읽어 HC574로 출력하는 간단한 프로그램

입니다.

; (JS8051A 내장 디스켓 JS51RAMR.ASM 참조 )

; READ RAM(0000H) AND OUT TO HC574( maybe 02h )

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

MOV DPTR,#0000H ; READ 0000H(RAM)

MOVX A,@DPTR

MOV DPTR,#0F000H ; OUT A

MOVX @DPTR,A

JMP $

END

위 예제에서는 램의 0 번지에 어떠한 값을 쓰는 부분이 없습니다.

따라서 읽은 값이 어떤 값이 될지는 알 수 없습니다. 단 다운로딩하여

실행하셨다면 그곳에는 " JMP START "에 해당하는 머쉰 코드인

02H가 들어 있을 겁니다.

아래 예제는 램의 0000 번지에 255를 쓰고 다시 읽어 읽은 값을 HC574에

출력하는 프로그램입니다.

; (JS8051A 내장 디스켓 JS51RAMW.ASM 참조 )

JUST WRITE 255 TO RAM(0000H) AND THEN READ IT

ORG 0000H

JMP START

ORG 0033H

START: NOP ;

NOP ; DON'T REMOVE

MOV DPTR,#0

MOV A,#255

MOVX @DPTR,A

MOVX A,@DPTR ; READ 0000H(RAM)

MOV DPTR,#0F000H

MOVX @DPTR,A ; OUT TO HC574

JMP $ ; JUMP SELF ADDRESS

END

희얀한 시스템 ( 왕초보 분들은 통과 )

일반적으로 명령 코드는 롬에 들어 있고 일단 구워진 코드를 바꾸기는

번거롭습니다. JS8051A를 아주 잘 이해하시는 분들( 지금 쯤이면

저보다도 더 JS8051A에 대해 날고 기는 분이 있을 것도 같은데...)은

위의 예제 프로그램이 진짜 골때리는 일을 하는 프로그램이라는 것을

알 겁니다. 위 프로그램에서 0000 번지에 255를 써넣었지만 실제로

다운로딩을 이용하였다면 램이 롬의 역할까지 하므로 램의 0000

번지에는 롬의 0000 번지와 같이 " JMP START "에 해당하는 머쉰

코드인 02H가 들어 있는데 이곳에 255 = FF ( = " MOV R7,A " 명령

코드에 해당 ) 값을 넣었으니 자신의 코드를 바꿔 버리는 일을 해버린

것이 됩니다. 따라서 사용자가 처음부터 프로그램을 다시 시작하기 위해

0000 번지로 JUMP를 하거나 리셋 후 S3 키를 눌렀다면 이미 0000 번지의

코드가 변경된 상태이므로 올바로 실행이 되지 않습니다. 이러한 특성과

외부 입력( SERIAL 또는 I/O ) 등을 잘 이용하면 리셋으로 재실행

시킬때마다 다른 행동을 하는 다시말해 스스로 명령 코드를 변화시키는

아주 이상한 프로그램이 가능하게 됩니다.