|
|
AT89C52 |
AT89C51 |
AT89C2051 |
AT891051 |
플래시 메모리(Byte) |
8K |
4K |
2K |
1K |
RAM(Byte) |
256 |
128 |
128 |
64 |
I/O |
32 |
32 |
15 |
15 |
전원(V) |
4.0-6.0 |
4.0-6.0 |
2.7-6.0 |
2.7-6.0 |
동작 주파수(MHz) |
24 |
24 |
24 |
24 |
2. 외부 구조
<그림 1.2.1> 80C32의 외부 구조
3. 내부 구조
(1) CPU 코어 부분
- 내부 또는 외부의 프로그램 메모리에서 명령을 인출하여 이를 해독하고 실행
- 외부와 연결된 어드레스 및 데이터 버스, 명령 레지스터, 명령 해독 및 실행부, 누산기, 상태 레지스터,
ALU, 프로그램 카운터, 스택 포인터
-명령 디코더(CU : Control Unit ): CPU의 명령 디코더는 명령을 해독해서 실행하여 완료할 때까지 필요한 CPU 내부신호를 만들어 주어진 기능을
완료시키는 부분이다. CPU 내부신호로는 소스/목적지 오퍼랜드를 제어하는 신호와 산술논리 연산장치의 동작을 제어하는 신호 등이 있다.
- 프로그램 카운터(PC: Program Counter ) : 프로그램 매모리에 저장되어있는 명령의 실행순서를 정하는 16비트 레지스터로서 실행시킬 명령이 기억되어있는
프로그램 메모리의 번지를 가리키고 있다.프로그램 카운터는 처음 리셋되면 0000H로 세트되며, 점프/콜 등의 명령을 사용해서 변경시킬 수 있다.
-ALU (Arithmatic Logic Unit )
1.캐리없는 덧셈, 캐리있는 덧셈/뺄셈
2. 8비트/16비트 +1 증가, 8비트 -1 감소
3. BCD(Binary Coded Decimal) 10진 조정
4. 곱셈/나눗셈
5. AND, OR, XOR, Rotate
6. 바이트 컴플리먼트(1의 보수), 비트 컴플리먼트
7. 니블단위의 데이터 교환 및 바이트 단위의 데이트 교환
8. 조건 브랜치
(2) 메모리 부분
- 내부 데이터 RAM : 8051 시리즈에서 128바이트, 8052 시리즈에서는 256바이트
레지스터 간접 지정으로 액세스(하위 128바이트는 특별히 직접 지정으로 액세스 가능)
- 내부 프로그램 메모리 : 80C5X에는 없고, 83C5X는 ROM을 가지며, 87C5X는 EPROM 또는 OTP ROM
Atmel사의 AT89C5X 모델에서는 이 대신에 플래시 메모리
(3) I/O 콘트롤러 부분
- 기본적으로 내장된 4개의 병렬 I/O 포트
- 3개의 타이머
- 1개의 직렬 포트
- 이것들을 제어하기 위한 여러가지의 SFR(Special Function Register)
<그림 1.2.2> 80C32의 내부 구조
<그림 1.2.3> 80C32의 개략적인 내부 블록도
▣ 병렬 I/O 포트
- 4개의 8비트 I/O 포트
- 모두 양방향 입출력이 가능
- 포트0이 오픈 드레인(open-drain)형인 것을 제외하고는 모두 내부적으로 약하게 풀업(pull-up)
- 포트0 : 오픈 드레인형의 입출력 포트
외부 메모리를 접속할 경우에는 강하게 풀업되어 시분할 다중화된 어드레스/데이터 버스로 사용
- 포트2 : 내부적으로 약하게 풀업된 양방향 입출력 포트
외부 메모리를 접속할 경우에는 강하게 풀업되어 어드레스 버스로 사용
- 포트1과 포트3 : 모두 내부적으로 약하게 풀업된 양방향 입출력 포트
포트3은 다기능 I/O 포트로서 시스템 콘트롤 신호나 주변장치에 관련된 입출력 신호로도 사용
▣ 직렬통신 포트
- UART(Universal Asynchronous Receiver and Transmitter)
- 반이중(half duplex)의 통신만 가능한 1가지의 동기 모드(모드0)
- 전이중(full duplex)의 직렬통신이 가능한 3가지의 비동기 모드(모드1, 2, 3)
- 수신측은 2중 버퍼 구조로 되어 있어서 첫번째의 수신 바이트를 읽기 전에 두번째의 바이트가 수신되기 시작하더라도 오버런 에러(overrun error)가 발생하지 않음
- 송신측도 2중 버퍼로 되어 있어서 연속적인 데이터의 전송이 가능
▣ 타이머
- 80C31에는 타이머0과 타이머1 등 2개의 16비트 증가형 타이머/카운터를 가짐
타이머0과 타이머1에는 각각 4가지의 동작모드
- 80C32에는 여기에 타이머2가 추가
타이머2에는 3가지의 동작모드
- "타이머(timer)"로 동작하는 경우에는 1개의 머신 사이클 즉 12개의 시스템 클럭 주기에 한번씩 증가
- "카운터(counter)"로 동작하는 경우에는 클럭 입력단자 T0∼T2에서의 하강 에지를 검출하여 카운터가 증가
- 80C31에서는 타이머1이 직렬통신 포트의 보레이트 발생기(baud rate generator)로 사용될 수 있음
80C32에서는 타이머1 또는 타이머2를 보레이트 발생기로 사용할 수 있음
4. 메모리 구조
① 프로그램 메모리
- 프로그램 메모리는 명령의 실행 코드가 저장되는 메모리(주로 ROM)
- 64KB 용량
- 항상 8비트 단위로 읽을 수만 있다.
- 기본적으로 80C32의 외부에 있으나,
83C5X나 87C5X 모델에서는 하위번지 영역의 4KB나 8KB가 CPU의 내부에 들어있고 그 이상은 외부에 설치
② 데이터 메모리
- 데이터 메모리는 데이터를 읽고 쓸 수 있는 RAM 메모리
- 외부에 64KB를 설치할 수 있고, 이와 별도로 CPU 내부에도 128바이트 또는 256바이트
- 내부의 메모리는 직접번지 지정이나 레지스터 간접번지 지정으로 8비트 어드레스를 사용하여 빠르게 액세스
하위 128바이트(00H∼7FH 번지)는 특별히 직접번지 지정이 가능
20H∼2FH 번지는 비트 어드레싱이 가능
- 외부 데이터 메모리는 DPTR에 의하여 16비트로 액세스하므로 처리속도는 늦으나 큰 용량까지 사용
<그림 1.2.4> 80C32의 전체 메모리 구성도
(1) 프로그램 메모리
- 명령의 실행 코드가 저장되는 메모리
- 0000H∼FFFFH의 64KB(CODE 영역)
- 항상 8비트 단위로 읽을 수만 있다.
- 80C32의 경우 프로그램 메모리는 CPU의 외부에 있으나, 83C5X나 87C5X 모델에서는 하위번지 영역의 4KB(8051 시리즈)나 8KB(8052 시리즈)가 CPU의 내부에 ROM이나 EPROM, OTP ROM으로 설치되며 그 이상은 외부에 설치된 메모리를 사용할 수 있다.
- 외부에 있는 프로그램 메모리를 리드하는 경우에는 리드 스트로브 신호로서 이 발생
내부 프로그램 메모리를 읽거나 데이터 메모리를 액세스할 때는
- 프로그램 메모리에서 명령의 실행 코드를 읽어들이는 것은 프로그램 카운터(program counter)에 의해 제어
그러나, 프로그램 메모리 영역에 DB(Define Byte), DW(Define Word), DD(Define Double Word) 등의 지시어를 사용하여 선언한 상수를 액세스할 때는 반드시 MOVC A,@A+DPTR 또는 MOVC A,@A+PC 명령을 사용해야 한다.
- CPU는 리셋 직후에 무조건 0000H 번지부터 프로그램을 실행
으로 하면 외부에 접속된 메모리의 0000H 번지부터 프로그램이 시작
로 하면 내부의 ROM의 0000H 번지부터 프로그램이 시작
내부 프로그램 메모리가 0000H∼0FFFH 번지(8051 시리즈)나 0000H∼1FFFH 번지(8052 시리즈)
- 프로그램 메모리의 0000H 번지부터 일정한 영역은 인터럽트 서비스 루틴(interrupt service routine) 영역
만약, 시스템에서 인터럽트를 사용하지 않는다면 이 영역을 일반적인 프로그램 영역으로 사용
<그림 1.2.5> 프로그램 메모리의 인터럽트 영역
(2) 데이터 메모리
- 데이터를 읽고 쓸 수 있는 RAM 메모리
- 외부 데이터 메모리는 0000H∼FFFFH 영역의 64KB(XDATA 영역)
- 이를 액세스하기 위해서는 반드시 MOVX 명령을 사용
이중에서 MOVX A,@Ri나 MOVX @Ri,A 명령을 사용하면 외부 어드레스는 하위 8비트만 사용
MOVX A,@DPTR이나 MOVX @DPTR,A 명령을 사용하면 외부 어드레스는 16비트가 사용
- 내부 데이터 메모리는 00H∼7FH 영역의 하위 128바이트와 80H∼FFH 영역의 상위 128바이트(IDATA 영역)
- 하위 128바이트 영역은 직접번지 지정(DATA 영역)이나 간접번지 지정 방식을 모두 사용
상위 128바이트 영역은 간접번지 지정 방식으로만 액세스
상위 128바이트를 직접번지 지정으로 액세스하면 SFR로 동작
상위 128바이트 영역은 8051 시리즈에는 없으며, 8052 시리즈에만 존재
- 내부 데이터 메모리의 하위 128바이트는 명령에서 8비트 번지로 직접 지정하므로 명령의 실행속도가 빠르다.
00H∼1FH 영역은 R0∼R7 레지스터가 4개의 뱅크로 구분되어 사용
20H∼2FH 영역은 바이트 단위가 아니라 비트 단위로 어드레싱이 가능한 특별한 영역
- 80C32의 스택 포인터(stack pointer)는 8비트 레지스터
스택영역은 스택 포인터 SP에 의하여 간접지정이 가능한 내부 데이터 메모리, 즉 00H∼FFH 영역
CPU가 리셋되면 스택 포인터의 값이 07H로 지정되므로 08H 번지부터 그 이상의 메모리를 스택으로 사용
<그림 1.2.6> 데이터 메모리의 구성
<그림 1.2.7> 내부 데이터 메모리의 하위 128바이트 영역
<그림 1.2.8> 내부의 하위 데이터 메모리에서 비트 어드레스
(3) SFR
- 내부 데이터 메모리의 상위 128바이트인 80H∼FFH 영역을 직접번지 지정으로 액세스
- SFR(Special Function Register)에는
누산기 A, B 레지스터, 상태 레지스터 PSW, 스택 포인터 SP, DPTR 레지스터 등과 같은 시스템 레지스터
인터럽트에 관한 IE 및 IP, IPH 레지스터, 병렬 입출력 포트, 타이머, 직렬 포트 등의 I/O 제어 레지스터
<그림 1.2.9> SFR의 구성 및 비트 어드레스
- SFR의 가장 왼쪽 열의 레지스터 즉, 80H, 88H, 90H, 98H, ... , F0H, F8H 등은 모두 비트 어드레싱이 가능
- SFR에서 타이머2에 관계되는 T2CON, T2MOD, RCAP2L, RCAP2H, TL2, TH2 및 IPH 등은 8052에만 존재
- 리셋 직후에 SFR의 각 레지스터들의 초기값은 스택 포인터 SP가 07H이고 병렬포트 P0∼P3가 FFH
기타 모든 레지스터는 유효 비트들이 0으로 된다.
<표 1.2.2> 리셋 직후 SFR의 초기값
레지스터 |
초기값 |
레지스터 |
초기값 |
PC |
0000H |
TCON, TMOD |
00H |
ACC |
00H |
TH0, TL0, TH1, TL1 |
00H |
B |
00H |
T2CON |
00H |
PSW |
00H |
T2MOD |
XXXXXX00B |
SP |
07H |
TH2, TL2 |
00H |
DPTR |
0000H |
RCAP2H, RCAP2L |
00H |
IPH |
XX000000B |
SCON |
00H |
IP |
XX000000B |
SADDR, SADEN |
00H |
IE |
00000000B |
SBUF |
XXXXXXXXB |
P0, P1, P2, P3 |
FFH |
PCON |
00000000B |
▣ 누산기 A(Accumulator)
- 모든 산술연산 및 논리연산의 중심이 되는 레지스터
- 누산기로 처리되는 명령(accumulator-specific instruction)에서는 A로 표시
직접번지 지정으로 처리되는 명령에서는 ACC로 표기(SFR로 취급)
* PUSH와 POP 명령은 direct addressing mode만 지원한다. 따라서
PUSH A ; (×)
POP A ; (×)
PUSH ACC ; (○)
POP ACC ; (○)
▣ B 레지스터
- 곱셈 명령 및 나눗셈 명령에서 특별한 용도로 사용
기타 다른 명령에서는 범용 레지스터로 사용
- 곱셈 명령에서 A와 B 레지스터를 곱한 16비트 결과의 하위 바이트는 A, 상위 바이트는 B 레지스터에 저장
- 나눗셈 명령에서는 A를 B 레지스터로 나눈 후에 그 몫은 A, 나머지는 B 레지스터에 저장
<그림 1.2.10> PSW 레지스터의 비트 구성
▣ 상태 레지스터 PSW(Program Status Word)
- 프로그램의 명령을 실행하는 동안에 발생하는 상태를 표시하는 비트와 CPU의 기능을 제어하는 비트로 구성
- PSW.0 비트인 P는 패리티 플랙(parity flag) 비트
누산기 A에서 1의 개수가 짝수이면 0이 되고, 1의 개수가 홀수이면 1이 되는 우수 패리티(even parity) 방식
- PSW.1과 PSW.5는 각각 특별한 용도가 지정되지 않아 사용자가 임의로 사용할 수 있다.
- PSW.2의 OV는 산술연산 후의 상태를 나타내는 오버플로우 플랙(overflow flag) 비트
2의 보수로 표현되는 부호있는 수의 덧셈이나 뺄셈에서 연산 결과가 -128∼+127의 범위를 초과하면 세트
곱셈 명령 MUL AB에서 결과가 FFH를 넘으면 세트되며, 나눗셈 명령 DIV AB에서 제수가 0인 경우에도 세트
- PSW.6의 AC는 산술연산 후에 그 상태를 나타내는 보조 캐리 플랙(auxiliary carry flag) 비트
누산기의 비트3에서 자리올림이나 자리내림이 발생한 것을 표시
자리올림은 덧셈 연산에서 발생할 수 있으며, 자리 내림은 뺄셈 연산에서 발생할 수 있다.
- PSW.7의 CY는 산술연산 후에 그 상태를 나타내는 캐리 플랙(carry flag) 비트
누산기의 비트7에서 자리올림(carry)이나 자리내림(borrow)이 발생한 것을 표시
비트 회전(rotate) 명령에 의하여 세트되거나 리셋될 수 있다.
캐리 플랙을 직접 조작하는 명령 CLR C, SETB C, CPL C 등에 의하여 값이 달라질 수 있다.
- 80C32의 상태 레지스터에는 일반적인 경우처럼 제로 플랙(zero flag)이나 부호 플랙(sign flag)이 없다.
80C32는 산술연산 및 데이터 비교 기능이나 연산후에 조건에 따라서 프로그램을 처리하는 기능이 취약
누산기의 값을 조사하여 그것이 0인지의 여부에 따라 분기하는 JZ 또는 JNZ 명령이나
CJNE와 같은 데이터 비교후 분기명령에 의하여 상당히 보완되고 있다.
- 레지스터 뱅크 선택 비트 RS1, RS0는 범용 레지스터 R0∼R7이 위치하는 메모리 뱅크를 지정
RS1/RS0 = 00 ; 00H∼07H 번지의 뱅크 0(default)
RS1/RS0 = 01 ; 08H∼0FH 번지의 뱅크 1
RS1/RS0 = 10 ; 10H∼17H 번지의 뱅크 2
RS1/RS0 = 11 ; 18H∼1FH 번지의 뱅크 3
▣ 스택 포인터 SP(Stack Pointer)
- 80C32의 스택 포인터는 8비트로 되어 있어서 00H∼FFH 영역의 내부 데이터 메모리만을 스택으로 사용
- 리셋 직후에 스택 포인터의 값은 07H로 지정되므로 08H 이후의 내부 데이터 메모리가 스택으로 사용
- 만약 필요하다면 사용자 프로그램의 서두에서 스택 포인터의 값을 새로 지정해야 한다.
- PUSH나 CALL 명령을 사용하여 스택에 데이터가 저장될 때는 먼저 스택 포인터 값이 증가(pre-increment)
POP이나 RET 명령에 의하여 스택에서 데이터가 꺼내지고 나면 스택 포인터 값이 감소(post-decrement)
◀참고▶ OK-8051 키트의 모니터 프로그램에서는 80C32를 사용하는 경우 내부 데이터 메모리의 상위 128바이트인 80H∼FFH 번지를 스택으로 사용한다. 이 때문에 모니터 프로그램의 서두에서 SP를 7FH로 지정한다. 이 영역은 직접번지 지정이 불가능하고 간접번지 지정으로만 액세스할 수 있으므로 스택으로 사용하는 용도 이외에는 그다지 장점을 가지지 않는다. 그러나, 만약 OK-8051 키트에서 80C31을 사용하고자 한다면 모니터 프로그램에서 스택으로 50H∼7FH 번지를 사용하도록 SP를 4FH로 수정하여 사용해야 한다. |
▣ 데이터 포인터 DPTR(Data Pointer)
- 80C32의 중요한 특징을 나타내는 16비트 레지스터
- 주로 MOVC 명령에서 외부 프로그램 메모리의 번지를 가리키는 포인터로 사용
또는 MOVX 명령에서 외부 데이터 메모리의 번지를 가리키는 포인터로 사용
- 범용 레지스터로 사용되는 경우에는 16비트 데이터를 취급
상위 바이트 DPH와 하위 바이트 DPL 등 2개의 8비트 범용 레지스터로 분리되어 사용되기도 한다.
- SFR의 나머지 레지스터들은 모두 I/O 디바이스들을 제어하거나 인터럽트를 제어하는데 사용되는 레지스터
◀참고▶ MCS-51 계열의 모든 마이크로콘트롤러들은 여기에 내장된 내부 데이터 메모리의 용량이나 I/O의 종류 및 SFR의 구조가 약간씩 다르다. MCS-51이나 기타 대부분의 마이크로콘트롤러가 계열내에 많은 모델들을 가지고 있는 이유가 바로 이러한 특징과 차이점을 가지도록하여 사용자의 선택폭을 넓혀주기 위함이다. 예를 들어 80C31은 2개의 타이머를 가지는데 비하여 80C32는 3개의 타이머를 가지고 있다. 더구나, MCS-51은 인텔 제품 이외에도 전세계의 반도체 회사에서 매우 많은 호환제품을 내놓고 있기 때문에 그 종류와 특성들도 매우 다양하다. 그러면 이러한 모델의 차이가 있을 때마다 어셈블러나 C 컴파일러와 같은 소프트웨어 개발툴도 다른 것을 사용해야 하는가? 반드시 그렇지는 않다. 인텔 제품이든 호환제품이든 대부분의 MCS-51 모델들은 동일한 코어를 사용하여 명령세트가 같다. 따라서, 다른 모델이나 새로운 모델을 지원하기 위하여 어셈블러나 C 컴파일러가 달라질 필요는 없으며, SFR이 달라지거나 추가되는데 따른 레지스터의 직접번지, 비트 어드레스, 예약어들이 달라지게 되므로 이들을 처리하기 위한 인클루드 파일(include file)이나 헤더파일(header file) 등을 지원한다. 따라서, 어느 소프트웨어 툴을 사용하든지 프로그래머는 자신이 사용하는 마이크로콘트롤러 모델에 따라 그에 적합한 인클루드 파일이나 헤더파일을 사용하는 것으로 대부분의 문제가 해결된다. |
(4) 외부 메모리 및 I/O의 인터페이스
- 외부 프로그램 메모리에서 실행 명령은 항상 프로그램 카운터 PC에 의하여 액세스
- 데이터 상수는 PC 또는 데이터 포인터 DPTR에 의하여 액세스 (MOVC A,@A+PC / MOVC A,@A+DPTR)
- 반드시 16비트 어드레스 및 8비트의 데이터 버스가 사용
- 하위 어드레스 A0∼A7가 데이터 버스 D0∼D7과 포트0을 공유하므로 ALE 신호를 사용하여 분리
- 어드레스를 적절히 디코딩하여 ROM의 단자에 접속
외부 프로그램 메모리의 리드 동작을 나타내는 신호는 ROM의 단자에 접속
<그림 1.2.11> 외부 프로그램 메모리의 인터페이스 방법
- 외부 데이터 메모리를 액세스하는 명령에서 번지를 지정하는 것은
DPTR을 이용하여 간접지정하는 방식 - 16비트 어드레스 사용, 최대 64KB
R0나 R1 레지스터를 이용하여 간접지정하는 방식 - 8비트 어드레스 사용, 256바이트, 뱅크 셀렉트로 확장
1) MOVX A,@DPTR ; 16비트 외부 어드레스 사용
MOVX @DPTR,A
2) MOVX A,@Ri ; 8비트 외부 어드레스 사용
MOVX @Ri,A
(a) 16비트 어드레스를 사용하는 경우 (b) 8비트 어드레스를 사용하는 경우
<그림 1.2.12> 외부 데이터 메모리의 인터페이스 방법
(5) OK-8051 키트에서의 메모리 사용
- 내부 메모리에서 00H∼1FH 번지를 레지스터 뱅크 영역이므로 모니터 프로그램에서 사용하지 않고 비워둠
- 20H∼2FH 영역은 비트 어드레싱 영역으로서 마지막 번지인 2FH를 제외하고는 역시 사용하지 않음
- 30H∼4FH 번지의 영역은 모니터 프로그램에서 각종 데이터 변수로 사용
- 50H∼7FH 번지 영역은 사용자 프로그램에서 이용할 수 있도록 비워둠
- 80C32의 80H∼FFH 번지의 상위 128바이트 데이터 메모리를 스택으로 사용
만약 CPU로 80C31을 사용한다면 이 영역이 존재하지 않으므로 50H∼7FH 번지 영역을 스택으로 사용
<그림 1.2.13> OK-8051 키트에서의 메모리 사용
- 일반적으로 트레이닝 키트(training kit)에서는 퍼스널컴퓨터에서 작성한 사용자 프로그램을 다운로드하여 실행
- 사용자 프로그램이 다운로드될 때 이 프로그램이 저장되는 영역은 데이터 메모리의 성격(당연히 RAM)
및 신호에 의해 제어
- 다운로드되고 나서 실행될 때는 프로그램 메모리의 성격
신호에 의하여 제어
- 따라서 사용자 프로그램을 위한 메모리는 RAM이지만 데이터 메모리와 프로그램 메모리의 성격을 모두 가지도록 설계
어드레스 디코더에서 만들어진 칩선택 신호를 RAM의 단자에 접속
신호를 RAM의 단자에 접속
와 신호를 부논리로 OR시켜서 RAM의 단자에 접속
- OK-8051 키트에서는 8000H∼FFFFH 영역을 사용자 프로그램 메모리로 사용
32KB 용량의 SRAM인 62256을 사용
- 아랫쪽의 0000H∼7FFFH 영역에서는 프로그램 메모리와 데이터 메모리를 엄격히 구분
일 때는 프로그램 메모리 영역의 모니터 프로그램용 EPROM인 27C256이 선택
일 때는 데이터 메모리 영역의 I/O 디바이스들이 선택(82C54나 82C55A 등)
5. OK-8051 키트의 CPU 주변회로 및 메모리 회로
<그림 1.2.14> OK-8051 키트의 CPU 주변회로 및 메모리 관련 회로
(1) 리셋 회로
- 모든 마이크로프로세서에서 리셋회로는 전원 투입후에 CPU를 특정한 상태에서 동작이 시작되도록 지정
- 80C32의 경우에는 클럭 발진이 시작되고 나서 적어도 2개 이상의 머신 사이클동안 RST 신호가 H로 입력
전원이 투입되고 나서 클럭발생 회로가 안정된 동작을 수행하는데는 보통 수[ms]가 소요
- 리셋 회로에는 이밖에도 시스템의 오동작시에 이를 강제로 리셋시킬 수 있도록 리셋 스위치 회로를 포함
- 보통 저항값은 수십[kΩ] 이상, 콘덴서는 수[μF] 이상
<그림 1.2.15> 리셋회로 및 그 동작 파형
- 슈미트 트리거 기능이 있는 인버터 소자 74LS14
이 기능이 없는 인버터 소자 74LS04
<그림 1.2.16> 74LS04와 74LS14의 동작 비교
(2) 클럭발생 회로
- 내부에 시스템 클럭을 위한 발진회로를 내장
- 외부에서 구형파의 클럭신호를 인가할 수도 있다.
- <그림 1.2.17>에서 콘덴서 C1, C2의 값은 정확할 필요는 없고 약 30[pF]±10[pF] 정도면 좋다.
- OK-8051 키트에서는 12MHz의 수정발진 모듈을 사용
74LS93 4비트 카운터에 의해 적절히 분주되어 80C54 타이머와 ADC0809 A/D 컨버터에도 공급
(a) 회로 구조 (b) 수정발진자를 사용 (c) 수정발진 모듈을 사용
<그림 1.2.17> 80C32의 클럭발생 회로
(3) I/O 어드레스 디코더 회로
<그림 1.2.18> OK-8051 키트의 I/O 어드레스 디코더 회로
<표 1.2.3> OK-8051 키트의 메모리 및 I/O 어드레스 맵
어드레스 범위 |
소 자 |
기 능 |
비 고 | |
1000H∼107FH |
|
DS12C887 RTC |
배터리 백업형 실시간 시계 |
I/O 영역 (데이터 메모리 영역) |
1100H∼1103H |
|
82C54 PIT |
3채널 16비트 타이머 | |
1200H∼1203H |
|
82C55A PPI |
8비트 3포트 병렬 입출력 인터페이스 | |
1300H∼1303H |
|
16×2 LCD 모듈 |
문자표시 출력장치 | |
1400H∼1407H |
|
ADC0809 |
8채널 8비트 A/D 컨버터 채널 선택 | |
1500H |
|
A/D 변환 시작 | ||
1600H |
|
A/D 변환 결과 리드 | ||
1700H |
|
DAC0800 |
1채널 8비트 D/A 컨버터 | |
0000H∼7FFFH |
|
27C256 EPROM |
모니터 프로그램 ROM |
프로그램 메모리 영역 |
8000H∼FFFFH |
|
62256 SRAM |
사용자 프로그램 및 데이터 저장 |
프로그램/ 데이터 메모리 영역 |
◀참고▶ 80C32와 같이 Intel사의 대부분의 마이크로콘트롤러 모델들은 어드레스와 데이터 버스가 동일한 핀을 사용하여 시분할 다중화되어 있으므로 이 어드레스 버스 및 데이터 버스를 분리하려면 외부에서 반드시 74LS373이나 74LS573과 같은 8비트 래치를 사용하여야 한다. 예전에는 74LS373을 주로 사용하였으나 이보다는 74LS573이 핀배열이 사용하기 편리하므로 요즈음에는 74LS573이 선호된다.
(a) 8비트 래치 (b) 8비트 D형 플립플롭
<그림 1.2.19> 8비트 래치와 8비트 D형 플립플롭의 동작 비교
<표 1.2.4> TTL의 8비트 래치와 8비트 D형 플립플롭 소자의 요약
모델명 |
기 능 |
출력 특징 |
비 고 |
74LS363 74LS373 74LS533 |
8비트 래치 8비트 래치 8비트 래치 |
정논리, 3상태 정논리, 3상태 부논리, 3상태 |
출력 "H"레벨이 3.65V로 높다. 입출력 인접 핀배열형. 74LS373의 출력 반전형. |
74LS563 74LS573 74ALS580 |
8비트 래치 8비트 래치 8비트 래치 |
부논리, 3상태 정논리, 3상태 부논리, 3상태 |
74LS533의 입출력 대향 핀배열형. 74LS373의 입출력 대향 핀배열형. 74LS563과 기능적으로 동일. |
74LS364 74LS374 74LS534 |
8비트 D형 플립플롭 8비트 D형 플립플롭 8비트 D형 플립플롭 |
정논리, 3상태 정논리, 3상태 부논리, 3상태 |
출력 "H"레벨이 3.65V로 높다. 입출력 인접 핀배열형. 74LS374의 출력 반전형. |
74LS564 74LS574 74ALS576 |
8비트 D형 플립플롭 8비트 D형 플립플롭 8비트 D형 플립플롭 |
부논리, 3상태 정논리, 3상태 부논리, 3상태 |
74LS534의 입출력 대향 핀배열형. 74LS374의 입출력 대향 핀배열형. 74LS564와 기능적으로 동일. |
74ALS575 74ALS577 |
8비트 D형 플립플롭 8비트 D형 플립플롭 |
정논리, 3상태, 클리어 부논리, 3상태, 클리어 |
74LS574에 동기 클리어 추가. 74LS576에 동기 클리어 추가. |
◀휴게실▶ Memory-mapped I/O와 I/O-mapped I/O
CPU의 외부에 메모리나 입출력 장치들을 인터페이스하는 방식에는 memory-mapped I/O 방식과 I/O-mapped I/O 방식의 2가지가 있는데, 이것들은 서로 특징이 매우 대조적으로서 이를 각각 요약하여 정리하면 다음과 같다.
(1) Memory-mapped I/O ① 메모리와 I/O가 하나의 연속된 어드레스 영역에 할당된다. 8비트 마이크로프로세서의 경우에 일반적으로 이 영역은 64KB이다. ② 따라서 I/O가 차지하는 만큼 메모리 용량은 감소한다. ③ CPU의 입장에서는 메모리와 I/O가 동일한 외부기기로 간주되므로 이들을 액세스하기 위한 제어신호는 (read)와 (write) 신호뿐이다. ④ 소프트웨어적으로도 메모리에 대한 데이터의 액세스나 I/O에 대한 데이터의 입출력이 동일한 것으로 간주되므로 load나 store 명령에 의해 수행된다. ⑤ Motorola 계열의 마이크로프로세서들은 모두 이 방식을 채용하고 있다. 그러나, Intel에서도 8051이나 80C196KC와 같은 대부분의 마이크로콘트롤러에서는 이 방식을 사용한다.
(2) I/O-mapped I/O (또는 Isolated I/O) ① 메모리와 I/O가 별개의 어드레스 영역에 할당된다. 8비트 마이크로프로세서의 경우에 일반적으로 메모리 영역은 64KB이고 I/O 영역은 256 port이다. ② 따라서 I/O를 사용하더라도 메모리 용량은 감소하지 않는다. ③ CPU의 입장에서는 메모리와 I/O 구분하여 취급해야 하므로, 이들을 액세스하기 위한 제어신호는 (read)와 (write) 신호 이외에 (memory request)나 (I/O request) 등과 같은 구분신호가 필요하다. ④ 소프트웨어적으로도 메모리에 대한 데이터의 액세스와 I/O에 대한 데이터의 입출력이 서로 다른 것으로 간주되므로, 메모리의 액세스는 load나 store 명령에 의해 수행되고 I/O의 입출력은 input이나 output 명령에 의해 수행된다. ⑤ Intel과 Zilog 계열의 범용 마이크로프로세서들은 대부분 이 방식을 채용하고 있다.
단, I/O-mapped I/O 방식의 CPU에서는 이를 무시하고 메모리와 I/O를 모두 메모리 영역에 할당하는 것도 가능하다. 이 경우에는 memory-mapped I/O에서처럼 I/O에서의 데이터 입출력도 load나 store 명령을 사용하여 처리해야 하며, 하드웨어 시스템 설계시에 관련 제어신호의 타이밍에 유의하여야 한다. |
6. 동작 타이밍
- 80C32에서 1개의 머신 사이클(machine cycle) = S1∼S6의 6개 스테이트(state)로 구성 = 12 클럭 주기
각 스테이트는 2개의 클럭 주기로 구성
각 스테이트를 구성하는 2개 클럭의 앞쪽에 있는 1주기를 위상1(phase 1), 뒤쪽 1주기를 위상2(phase 2)
- 결과적으로 12MHz의 클럭을 사용한다면 1 머신 사이클은 1[μs]
(1) 명령 인출 및 실행 동작 타이밍
- 80C32는 기본적으로 각 머신 사이클동안 무조건 2회씩의 프로그램 명령 페치 동작을 수행
만약 명령이 1바이트로 구성되어 2번째의 페치가 필요없다면 CPU는 더미 리드(dummy read)를 수행
- 그림의 (a), (b)처럼
1사이클에 실행되는 명령은 스테이트1에서 명령이 시작되어 읽혀진 명령이 명령 레지스터에 저장
2번째의 페치는 스테이트4에 시작되는데 1바이트 명령에서는 이것이 더미 리드이며, 스테이트6에서 이 명령의 실행이 모두 완료
- 그림의 (c)에서와 같이 1바이트 명령이면서 2개의 머신 사이클에 실행되는 명령에서는
전체적으로 4회의 명령 코드 페치가 수행되며 이중에서 뒤의 3차례에 걸쳐서 읽은 코드는 모두 더미 리드
- 그림의 (d)에서와 같이 MOVX 명령은 첫번째 ALE 신호에서 명령 코드를 읽은 후에 두번째 ALE 신호에서는 이 명령이 액세스할 데이터 메모리의 번지를 출력
2번째 머신 사이클에서 전반부에는 이 명령을 실행하는 데이터 메모리를 액세스
<그림 1.2.21> 80C32의 명령코드 페치와 실행 동작 타이밍
<그림 1.2.22> 80C32의 명령코드 페치와 실행 동작 타이밍
(2) 프로그램 메모리의 리드 동작 타이밍
- 외부의 프로그램 메모리를 액세스할 때는 ALE 신호와 신호를 사용
신호는 데이터 메모리를 액세스하는 경우의 처럼 프로그램 메모리에 대하여 리드 스트로브 기능
이 때문에 프로그램 메모리에 실제로 명령코드가 읽혀지는 것은 신호의 상승 에지 부근
- 이와 같이 실제로 프로그램 메모리가 읽혀지는 동작은 신호에 의하여 수행되기 때문에 예상보다 1클럭 주기만큼 늦게 수행되는데 주의하라. 즉, 하나의 머신 사이클에서 전반부의 리드 동작은 S3P2가 아니라 S4P1에 수행되며, 후반부의 리드 동작은 S6P2가 아니라 다음 사이클의 첫번째 클럭인 S1P1에 수행된다.
<그림 1.2.23> 80C32의 외부 프로그램 메모리 리드 동작 타이밍
(3) 데이터 메모리의 리드/라이트 동작 타이밍
- 외부 데이터 메모리를 리드하는 동작은 신호에 의하여 제어
- 앞 사이클의 S3∼S6 동안에 ALE 신호에 의하여 외부 데이터 메모리의 어드레스가 래치
두번째 사이클의 S1∼S3 동안에 신호가 L상태로 되어 S3P1 동안에 CPU에 의하여 데이터 리드
- 외부 데이터 메모리를 라이트하는 동작 타이밍은 신호에 대신에 신호에 의하여 제어
(a) 리드 동작
(b) 라이트 동작
<그림 1.2.24> 80C32의 외부 데이터 메모리 리드/라이트 동작 타이밍
(4) 포트의 동작 타이밍
- 80C32에서 주변장치와 관련된 여러가지 신호들은 각 머신 사이클의 지정된 순간에 한번씩만 샘플링
포트0∼3에서 입력되는 데이터는 S5P1에서 샘플링
직렬포트의 모드0에서 동기 클럭 신호는 각 머신 사이클의 S5P2에서 샘플링
<그림 1.2.25> 80C32의 포트 동작 타이밍
7. 소비전력 절약 모드
- 80C32에는 2가지의 소비전력 절약 모드
사용자가 PCON 레지스터를 사용하여 소프트웨어적으로 설정
<그림 1.2.27> 80C32의 파워 절약 모드를 위한 내부 하드웨어 구조
(1) 아이들 모드
- 아이들 모드(idle mode)는 사용자가 PCON.0 = 1로 설정
- 으로 되어 CPU 코어로 공급되는 시스템 클럭을 차단하므로 CPU 코어의 모든 동작이 금지
인터럽트 처리부, 직렬 포트, 타이머 등의 주변장치에는 정상적으로 클럭이 공급
- 인터럽트나 리셋에 의해서만 이를 해제
(2) 파워 다운 모드
- 파워 다운 모드(power down mode)는 사용자가 PCON.1 = 1로 설정
- 으로 되어 시스템 클럭의 발생을 금지시키므로 80C32 내부의 모든 동작이 금지
아이들 모드보다 더욱 소비전력을 절감
- 외부 인터럽트나 리셋에 의해서만 이를 해제
<그림 1.2.28> PCON 레지스터(Power Control Register)
- POF(Power Off Flag) 비트는 전원 Vcc가 0에서 5V로 상승되면 셋트
소프트웨어에 의해서도 셋트 또는 리셋.
cold start reset과 warm start reset을 구분하는데 사용