호야의 블로그
[IT] 마이크로 프로세서 자료 정리
정리
1장 마이크로 프로세서: 컴퓨터의 CPU를 단일 IC 칩에 집적시켜 만든 반도체 소자
8051 특징: 제어 목적에 적합하도록 설계된 8비트 마이크로 컨트롤러
- 100여 개 명령을 가짐, 불 연산 처리 - PC, 256바이트 내부 RAM, 64KB ROM, 64KB 외부 RAM
2장 메모리 공간
1. 64KB 프로그램 메모리(ROM): 4내부+60외부 1000H이상은 자동 외부(내부0000~0FFF, 외부1000~FFFF)
2. 256바이트 내부 데이터 메모리(RAM): 128바이트 데이터 RAM + 128 SFR(특수기능 레지스터)
# 하위 128바이트 구조(직접, 간접‘@’ 번지 지정 가능) //00H~7FH
① 32바이트: 0~3뱅크 4개의 레지스터 뱅크(00~1FH) 각 뱅크에 8개의 범용 레지스터(R0~R7) PSW비트 3, 4로 지정
② 16바이트: 비트단위로 어드레싱 가능한 비트 어드레스 영역(20~2FH) SETB 명령어
③ 80바이트: 스크래치 패드 영역, 사용자가 실제 이용가능한 공간이라고 볼 수 있음(30~7FH)
스택영역은 00H~FFH, CPU 리셋되면 스택 포인터 값이 07H로 초기화, 08H부터 스택 사용
# 상위 128바이트 구조(간접‘@’ 번지 지정 방식, 만약 직접 번지로 액세스하면 SFR로 동작) //80H~FFH
SFR(특수 기능 레지스터): SW제어 연산에 사용되는 R, 내장된 주변 기능을 제어하는 R(I/O 제어)
① 시스템 레지스터
- 누산기 A: 모든 산술 및 논리연산의 중심이 되는 레지스터, 누산기로 처리되는 명령에서 A로 표시
- B레지스터: 곱셈 나눗셈 명령에 사용
- 스택 포인터 SP: 00H~FFH 영역 내부 데이터 메모리(RAM)을 스택으로 사용(리셋 07H)
-PUSH, CALL 스택 포인터 값 증가, POP, RET 스택 포인터 값 감소
- 데이터 포인터 DPTR: 16비트 레지스터, 상위 DPH, 하위 DPL 2개의 8비트 범용 레지스터로 분리 사용
MOVC 외부 프로그램 메모리 번지 가리키는 포인터
MOVX 외부 데이터 메모리 번지 가리키는 포인터
- 상태레지스터(PSW): 프로그램의 명령을 실행 중 발생하는 상태 표시 비트와 CPU기능 제어하는 비트로 구성
② I/O 제어 레지스터 //IE, IP, 병렬 입출력 포트, 타이머, 직렬 포트 등
SFR의 나머지 레지스터들은 모두 I/O 디바이스들을 제어하거나 인터럽트를 제어하는데 사용되는 레지스터
3. 64KB 외부 데이터 메모리(RAM): MOVX로만 액세스 가능
4. 프로그램 카운터: 독립된 16비트 REG, ROM의 명령을 수행 제어하는 카운터, 다음 명령어 번지, 1000H set
#MOV는 내부 램 간의 이동 MOVX는 외부 램 간의 이동 MOVC는 ROM 간의 이동
3장 8051 명령어
가. 내부 데이터 메모리에서 데이터 전송
#이 있으면 데이터 값 그대로를 의미, #이 없으면 절대 번지
MOV R0 #33H; R0에 33을 넣음
MOV A 33H; A에 33번지 주소의 값을 넣음
#레지스터 간접 번지 지정: 데이터 메모리 어드레스를 범용 레지스터 R0, R1만을 사용해 지정
MOV R0 #40H R0=40 //간접 번지 지정은 앞에 @을 첨가(외부를 가리킴)
MOV A @R0 A=40번지 값 //R0가 가리키는 데이터 메모리 내용을 Acc로 전송
참고)16진 데이터 중 처음 데이터가 A~F로 시작하면 앞에 0을 첨가(라벨, 데이터 구분) @번지라고 생각
나. 외부 데이터 메모리와 데이터 전송. 외부 램 무조건 MOVX
-외부 데이터 메모리를 64KB까지 확장가능, Acc 레지스터, R0, R1 및 DPTR만 사용 가능
MOV DPTR #2000H //외부 메모리와 데이터 전송 명령은 MOVX
MOVX A @DPTR //DPTR이 지시하는 외부 메모리 내용이 Acc로 전송
MOV DPTR #2050H //간접 번지 지정만 사용, 직접 X, DPTR= 2050
MOVX @DPTR A //Acc내용이 DPTR이 가리키는 외부 램으로 전송, 2050번지는 A값
다. 프로그램 메모리(ROM)와 데이터 전송(형식: MOVC A @A+DPTR || @A+PC)
프로그램 메모리와 데이터 전송에 사용되는 레지스터는 Acc와 어드레스 포인터(DPTR, PC)만 사용 가능
MOVC A @A+DPTR //DPTR+A가 지시하는 번지 내용이 Acc로 전송(반대 불가)
#A는 인덱스 레지스터, DPTR, PC는 베이스 레지스터, PC는 현재 위치 주소 번지
MOV A #1 //Acc에 데이터 1 전송
MOV DPTR #1000H //DPTR에 데이터 16진수 1000H전송
MOVC A @A+DPTR //1001번지의 값을 A에 넣음
라. 데이터 교환 명령
XCH A <소스> //A와 소스의 내용을 변경, 직접번지 지정, #은 안 되고, 외부 @는 됨
XCHD A @R0 || R1 //뒤 부분 4비트만 바꿈 ex) A: 34 R0: 65 -> A: 35 R0: 64
1. PSW 16진수로 나오면 2진수로 번역. MOV PSW #00001000B //뱅크 1을 선택
PSW #18H(=0001 1000B) //뱅크 3을 선택
2. DPTR은 DEC명령어 불가, INC만 사용 가능
3. MUL시 곱셈 후 A의 저장범위 255를 넘기면 OV 1, DIV시 나눗셈 후 나머지 값은 B레지스터에 저장
4장 브랜치 명령과 루프
프로그램 실행은 PC가 가리키는 명령어를 패치하여 실행, 명령어 읽고 자동으로 +n(바이트 수)증가
PC의 값을 바꾸는 명령어(서브루틴 콜, 인터럽트)로 수행 순서 변경
1. 무조건 브랜치 명령
(1) 절대 어드레싱 모드(사용안함, 대신 라벨 사용 ex. LOOP: )
AJMP 코드 어드레스 ; ROM 어드레스 //2바이트 이내로만 브랜치 할 수 있다. (0~FFH)11111111 이상이면 에러
083F번지에서 AJMP 01D2H 사용하면 08+1, 코드 어드레스 끝 두 자리 D2만 가져와서 브랜치
(2) 롱 어드레싱 모드
LJMP 코드 어드레스 ; //3바이트(0~65535) 중 임의 번지로 브랜치 LJMP 0A3EH
(3) 레지스터 간접 번지 지정
JMP @A+DPTR ; A+DPTR번지로 점프
*NOP : CPU는 동작하지 않고 PC를 +1, 딜레이 루틴 및 스페이스 기능에 사용
(4) 상대 번지 지정★ 가장 많이 쓰임
SJMP <오프셋> 부호있는 8비트 값(PC와 더해서 브랜치 할 어드레스 지정) //PC+오프셋 값 번지로 이동
※실제로는 대체로 A/L/SJMP만 선택하고 어드레스 지정대신 라벨을 사용!
2. 조건 브랜치 명령: 테스트해서 조건에 따라서 브랜치 한다. 모두 오프셋 사용(상대 브랜치)
JC <변위> 캐리 플래그가 1이면 점프
JNC <변위> 캐리 플래그가 0이면 점프
JZ <변위> A가 0이면 점프
JNZ <변위> A가 0이 아니면 점프
3. 상대 브랜치 루프 명령: 똑같은 명령군 반복 실행을 위한 명령(뺀 값 저장)
DJNZ <목적지 오퍼랜드> <변위> 목적지 오퍼랜드 –1이 0이 아니면 변위 바이트로 점프, 0이면 다음 명령
4. 비교 브랜치 명령: 비교 명령과 브랜치 명령을 합함(Compare Jump Not equal) (명령 이후에도 데이터 변화 X)
CJNE <목적지 오퍼랜드> <소스 오퍼랜드> <변위 바이트> 목적지와 다르면 상대 점프, 같으면 다음 명령
5장 논리 연산 명령
AND, OR, XOR, CPL 및 로테이트 명령, 논리 연산은 Acc와 직접 번지 지정만 사용된다.(목적지가 A면 패리티에 영향)
ANL(AND) ORL(OR) XRL(XOR) CPL(CPL; 보수)
CLR(클리어) RL(왼쪽 시프트) RR(오른쪽 시프트) RLC(캐리 포함 왼쪽 시프트)
RRC(캐리 포함 오른쪽 시프트) SWAP(비트 좌우 변경): 37H -> 73H
6장 불 명령어(비트 조작 명령)
XRL비트 구현: MOV C 비트1 -> JNB 비트2 OVER -> CPL C -> OVER:
1비트 데이터에 대해 적용(16*8=128개의 20H~2FH, 비트 어드레싱 영역), C에 비트 저장, XRL명령어는 없음
<명령어> <C> <비트어드레스>: 27H.3 27번지의 3번째 비트, 그냥 33H이런 식이면 비트 표에서 찾아야 함
-비트 단위로 MOV도 가능함
-비트 단위로 조작 비료 명령도 가능함
JB: 비트가 1이면 브랜치 JNB: 비트가 1이 아니면 브랜치 JBC: 비트가 1이면 브랜치하고 0으로 클리어
7장 스택과 서브루틴
스택: 바이트 전송, 직접 번지 데이터 값만 저장, 리셋 시 BANK0의 R7(07H)
PUSH하면 SP+1, POP하면 SP-1 //PUSH | POP 00H, PUSH ACC, PUSH DPL | DPH(low | high)
서브루틴: CALL명령 다음 명령 어드레스를 스택에 푸시, 프로그램 제어를 서브루틴으로 이동, RET로 복귀
ACALL: 2KB내의 서브루틴만 콜 가능
PC 0842번지에서 ACALL 01D2H 사용하면 08+1, 코드 어드레스 끝 두 자리 D2만 가져와서 브랜치
LCALL: 0~65535번지
8장 IO포트
포트0: 입출력 기능 외에 외부 메모리를 인터페이스 할 경우 양방향성 포트의 기능을 가짐 1
포트1: 입출력 기능 유사 양방향성 0
포트2: 입출력 기능 및 외부 메모리를 인터페이스 할 경우 어드레스 상위 8비트를 공급함 11
포트3: 입출력 기능 및 복합 기능, 이중 입출력 기능 이중
포트실험: 누르면 0 on, 떼면 1 off
9장 인터럽트
인터럽트 외부 요인: 외부 인터럽트 0, 1 내부 요인: 타이머/카운터 0,1, 시리얼 포트
IE(Interrupt Enable): 인터럽트 발생 장치가 고장 시 인터럽트를 받을 건지
IP(인터럽트 우선순위): 인터럽트 제어를 위한 레지스터
인터럽트 벡터 어드레스: 절대 번지로서 인터럽트 발생 시 수행이 분기할 번지 0003H~002AH
1. 외부 인터럽트
TCON(Timer Control register)
D0(IT0), D2(IT1): 외부 인터럽트0,1 1이면 하강모서리에서 인터럽트, 0이면 L레벨에서 인터럽트
D1(IE0), D3(IE1): 외부 인터럽트 요구 플래그로 에지 트리거 모드로 프로그램 되어 있을 때만 하강에서 세트
점멸 실험 시 목적은 최종이 0(불 켜짐)이어야 함. 인터럽트 IE는 1(출력 0)이어야 함. on=0
10장 타이머/카운터
2개의 16비트 타이머/카운터 내장
타이머: 내부 시스템 클록으로 사이클
카운터: 외부 T0, T1에 입력되는 클록(이벤트 카운팅)
카운터 레지스터로 카운팅 함(TL, TH가 사용되며 레지스터가 오버플로 발생 시 TF카운트)
TMOD(타이머 모드 레지스터): 상위 4비트는 타이머 1, 하위 4비트는 타이머 0을 제어 ORG가 200BH
C/T=0 타이머, 1=카운터
TCON(타이머 컨트롤 레지스터): 상위 4비트만 사용, 하위 4비트는 외부 인터럽트 제어
TR0, 1(타이머 런): 타이머 1 동작, 0 정지(T/C 1이면 TR1)
TF0, 1(타이머 오버플로 플래그): 카운터 레지스터 TH, TL가 오버플로가 되면 세팅(T/C가 1이면 TF1)
#인터럽트가 인에이블 되어있으면, 요청 후 처리 루틴에서 자동 클리어
타이머 카운터 모드
모드0: 32분주 프리스케일러가 있는 8비트로서 동작
모드1: 모드0과 동작은 똑같음, 모드 중에 가장 긴 딜레이, TH와 TL을 사용한 16비트 카운터
모드2: TL을 8비트 카운터, 오버플로 시 TH값이 TL에 저장, TH값은 초기 값이 변하지 않음
모드3: T/C 0이면 8비트의 두 개의 독립된 타이머/카운터로 동작, 1이면 사용 불가
#ORG가 200BH면 타이머 0
11장 키보드 인터페이스
3*8매트릭스 키보드 입력
한가운데 LS121(one-shot Multivibrator)은 키 디바운스를 감지, 펄스를 딜레이 시켜 안정 상태를 만든다.
LS244는 MSB를 검사해서 키가 눌러졌는지 (0)을 감지
C000이 들어오면 LS74A에서 클리어 시킨다.(C000 클리어, C004 키보드, C008 디스플레이, C010 스피커 등)
키 입력 흐름: 시작 -> (A <- C004H) -> 플래그 온 -> (A <- 킷값) -> 클리어 -> 완료
#사운드 실험
디지털 회로에선 아날로그를 표현하기 힘들어서 주파수 폭을 차이를 준다. 넓은 폭 1, 좁은 폭 0
D7이 0이면 소리가 안남, 1이면 소리가 남(트랜지스터 on)
12장 도트 매트릭스 LED 디스플레이
y축: A(적색), B(녹색) x축: C 컨트롤 레지스터(C014H~17H): 80넣으면 출력
A와 B 둘 다 1로 설정 시 황색 출력 A가 01이면 00000001 제일 오른쪽 1자리만 출력(C가 0일 경우)
C는 0으로 출력 시 화면 점등(A나 B가 켜져있어도 C가 0이어야 함)
후기 및 정리
간단하게 정리된 마이크로 프로세서 자료입니다. 이론 위주라 읽기 힘드실테지만 힘내세요 다들.
조금의 도움이 되셨다면 로그인 없이도 가능한 댓글과
왼쪽 아래 ♥공감 버튼을 꾹 눌러주세요!
'IT > IT' 카테고리의 다른 글
정보처리기사 실기 요점 정리(1) - 데이터베이스 (0) | 2019.04.10 |
---|---|
개인 Github 블로그 공유 (0) | 2019.04.01 |
ideone으로 가볍게 컴파일링 (0) | 2018.11.12 |
마이크로프로세서 - MCU 8051 LED 신호등 제어기 (0) | 2018.11.08 |
Pixlr로 간단한 이미지 편집하기 (0) | 2018.10.18 |