임베디드 시스템-퀵 가이드

체계

시스템은 모든 단위 조립이 일련의 규칙에 따라 함께 작동하는 배열입니다. 또한 고정 된 계획에 따라 하나 또는 여러 작업을 작업, 구성 또는 수행하는 방법으로 정의 할 수 있습니다. 예를 들어 시계는 시간 표시 시스템입니다. 구성 요소는 시간을 표시하기 위해 일련의 규칙을 따릅니다. 부품 중 하나가 고장 나면 시계가 작동을 멈 춥니 다. 따라서 시스템에서 모든 하위 구성 요소가 서로 의존한다고 말할 수 있습니다.

임베디드 시스템

이름에서 알 수 있듯이 Embedded는 다른 것에 연결된 것을 의미합니다. 임베디드 시스템은 소프트웨어가 내장 된 컴퓨터 하드웨어 시스템으로 생각할 수 있습니다. 임베디드 시스템은 독립적 인 시스템 일 수도 있고 대규모 시스템의 일부일 수도 있습니다. 임베디드 시스템은 특정 작업을 수행하도록 설계된 마이크로 컨트롤러 또는 마이크로 프로세서 기반 시스템입니다. 예를 들어, 화재 경보기는 내장 된 시스템입니다. 연기 만 감지합니다.

임베디드 시스템에는 세 가지 구성 요소가 있습니다.

  • 하드웨어가 있습니다.

  • 응용 소프트웨어가 있습니다.

  • 애플리케이션 소프트웨어를 감독하고 대기 시간을 제어하는 ​​계획에 따라 프로세서가 스케줄링에 따라 프로세스를 실행할 수있는 메커니즘을 제공하는 실시간 운영 체제 (RTOS)가 있습니다. RTOS는 시스템이 작동하는 방식을 정의합니다. 응용 프로그램 실행시 규칙을 설정합니다. 소규모 임베디드 시스템에는 RTOS가 없을 수 있습니다.

따라서 임베디드 시스템을 마이크로 컨트롤러 기반의 소프트웨어 기반의 안정적인 실시간 제어 시스템으로 정의 할 수 있습니다.

임베디드 시스템의 특성

  • Single-functioned− 임베디드 시스템은 일반적으로 특수 작업을 수행하고 동일한 작업을 반복적으로 수행합니다. 예 : 호출기는 항상 호출기로 작동합니다.

  • Tightly constrained− 모든 컴퓨팅 시스템은 설계 메트릭에 대한 제약이 있지만 임베디드 시스템의 경우 특히 엄격 할 수 있습니다. 디자인 메트릭은 비용, 크기, 전력 및 성능과 같은 구현 기능의 척도입니다. 단일 칩에 들어갈 수있는 크기 여야하며, 실시간으로 데이터를 처리 할 수있을만큼 빠르게 수행되어야하며 배터리 수명을 연장하기 위해 최소 전력을 소비해야합니다.

  • Reactive and Real time− 많은 임베디드 시스템은 시스템 환경의 변화에 ​​지속적으로 반응해야하며 지연없이 특정 결과를 실시간으로 계산해야합니다. 자동차 크루즈 컨트롤러의 예를 고려하십시오. 속도 및 브레이크 센서를 지속적으로 모니터링하고 반응합니다. 제한된 시간 내에 반복적으로 가속 또는 감속을 계산해야합니다. 계산이 지연되면 차량 제어에 실패 할 수 있습니다.

  • Microprocessors based − 마이크로 프로세서 또는 마이크로 컨트롤러 기반이어야합니다.

  • Memory− 소프트웨어는 일반적으로 ROM에 내장되므로 메모리가 있어야합니다. 컴퓨터에 보조 메모리가 필요하지 않습니다.

  • Connected − 입력 및 출력 장치를 연결하려면 주변 장치가 연결되어 있어야합니다.

  • HW-SW systems− 소프트웨어는 더 많은 기능과 유연성을 위해 사용됩니다. 하드웨어는 성능과 보안을 위해 사용됩니다.

장점

  • 쉽게 사용자 정의 가능
  • 저전력 소비
  • 저렴한 비용
  • 향상된 성능

단점

  • 높은 개발 노력
  • 시장 출시 시간 단축

임베디드 시스템의 기본 구조

다음 그림은 임베디드 시스템의 기본 구조를 보여줍니다.

  • Sensor− 물리량을 측정하여 관찰 자나 A2D 변환기와 같은 전자 기기에서 읽을 수있는 전기 신호로 변환합니다. 센서는 측정 된 양을 메모리에 저장합니다.

  • A-D Converter − 아날로그-디지털 변환기는 센서에서 보낸 아날로그 신호를 디지털 신호로 변환합니다.

  • Processor & ASICs − 프로세서는 데이터를 처리하여 출력을 측정하고 메모리에 저장합니다.

  • D-A Converter − 디지털-아날로그 변환기는 프로세서가 공급하는 디지털 데이터를 아날로그 데이터로 변환합니다.

  • Actuator − 액추에이터는 DA 컨버터가 제공하는 출력을 저장된 실제 (예상) 출력과 비교하고 승인 된 출력을 저장합니다.

프로세서는 임베디드 시스템의 핵심입니다. 데이터를 처리 한 후 입력을 받아 출력을 생성하는 기본 단위입니다. 임베디드 시스템 설계자에게는 마이크로 프로세서와 마이크로 컨트롤러에 대한 지식이 필요합니다.

시스템의 프로세서

프로세서에는 두 가지 필수 장치가 있습니다.

  • 프로그램 흐름 제어 장치 (CU)
  • 실행 단위 (EU)

CU는 메모리에서 명령을 가져 오기위한 가져 오기 장치를 포함합니다. EU에는 데이터 전송 작업 및 한 형식에서 다른 형식으로의 데이터 변환과 관련된 명령을 구현하는 회로가 있습니다.

EU에는 ALU (산술 및 논리 장치)와 인터럽트와 같은 프로그램 제어 작업을위한 명령을 실행하거나 다른 명령 세트로 점프하는 회로도 포함됩니다.

프로세서는 페치주기를 실행하고 메모리에서 페치 된 것과 동일한 순서로 명령어를 실행합니다.

프로세서 유형

프로세서는 다음 범주에 속할 수 있습니다.

  • 범용 프로세서 (GPP)

    • Microprocessor
    • Microcontroller
    • 임베디드 프로세서
    • 디지털 신호 프로세서
    • 미디어 프로세서
  • ASSP (Application Specific System Processor)

  • ASIP (Application Specific Instruction Processor)

  • ASIC (Application Specific Integrated Circuit) 또는 VLSI (Very Large Scale Integration) 회로의 GPP 코어 또는 ASIP 코어.

마이크로 프로세서

마이크로 프로세서는 CPU가있는 단일 VLSI 칩입니다. 또한 Coach, 부동 소수점 처리 산술 단위 및 명령의 빠른 처리를 돕는 파이프 라이닝 단위와 같은 다른 단위도있을 수 있습니다.

이전 세대 마이크로 프로세서의 가져 오기 및 실행주기는 ~ 1MHz 정도의 클럭 주파수로 안내되었습니다. 프로세서는 이제 2GHz의 클럭 주파수에서 작동합니다.

마이크로 컨트롤러

마이크로 컨트롤러는 단일 칩 VLSI 장치 (또는 microcomputer) 계산 능력은 제한적이지만 향상된 입력 / 출력 능력과 다수의 온칩 기능 유닛을 보유합니다.

CPU ROM
I / O 포트 시간제 노동자 직렬 COM 포트

마이크로 컨트롤러는 특히 온칩 프로그램 메모리 및 장치가있는 실시간 제어 애플리케이션을위한 임베디드 시스템에 사용됩니다.

마이크로 프로세서 대 마이크로 컨트롤러

이제 마이크로 프로세서와 마이크로 컨트롤러의 가장 두드러진 차이점을 살펴 보겠습니다.

마이크로 프로세서 마이크로 컨트롤러
마이크로 프로세서는 본질적으로 멀티 태스킹입니다. 한 번에 여러 작업을 수행 할 수 있습니다. 예를 들어 컴퓨터에서는 텍스트 편집기에서 텍스트를 작성하면서 음악을 재생할 수 있습니다. 단일 작업 지향. 예를 들어, 세탁기는 옷 세탁 전용으로 설계되었습니다.
RAM, ROM, I / O 포트 및 타이머는 외부에서 추가 할 수 있으며 숫자가 다를 수 있습니다. RAM, ROM, I / O 포트 및 타이머는 외부에서 추가 할 수 없습니다. 이러한 구성 요소는 칩에 함께 내장되고 숫자로 고정됩니다.
설계자는 필요한 메모리 또는 I / O 포트 수를 결정할 수 있습니다. 메모리 또는 I / O에 대한 고정 된 숫자는 마이크로 컨트롤러가 제한적이지만 특정 작업에 이상적입니다.
외부 메모리 및 I / O 포트의 외부 지원은 마이크로 프로세서 기반 시스템을 더 무겁고 더 비싸게 만듭니다. 마이크로 컨트롤러는 마이크로 프로세서보다 가볍고 저렴합니다.
외부 장치는 더 많은 공간을 필요로하며 전력 소비량이 더 높습니다. 마이크로 컨트롤러 기반 시스템은 전력을 덜 소비하고 공간을 덜 차지합니다.

8051 마이크로 컨트롤러는 8 비트 데이터 버스와 함께 작동합니다. 따라서 최대 64K의 외부 데이터 메모리와 기껏해야 64k의 외부 프로그램 메모리를 지원할 수 있습니다. 전체적으로 8051 마이크로 컨트롤러는 128k의 외부 메모리를 처리 할 수 ​​있습니다.

데이터와 코드가 서로 다른 메모리 블록에있을 때 아키텍처는 Harvard architecture. 데이터와 코드가 동일한 메모리 블록에있는 경우 아키텍처는Von Neumann architecture.

폰 노이만 아키텍처

Von Neumann 아키텍처는 컴퓨터 과학자 John von Neumann이 처음 제안했습니다. 이 아키텍처에서는 명령과 데이터 모두에 대해 하나의 데이터 경로 또는 버스가 존재합니다. 결과적으로 CPU는 한 번에 하나의 작업을 수행합니다. 메모리에서 명령을 가져 오거나 데이터에 대한 읽기 / 쓰기 작업을 수행합니다. 따라서 명령 페치와 데이터 작업이 동시에 발생할 수 없으며 공통 버스를 공유합니다.

Von-Neumann 아키텍처는 간단한 하드웨어를 지원합니다. 단일 순차 메모리를 사용할 수 있습니다. 오늘날의 처리 속도는 메모리 액세스 시간을 크게 앞지르며 매우 빠르지 만 프로세서에 로컬 인 적은 양의 메모리 (캐시)를 사용합니다.

하버드 아키텍처

Harvard 아키텍처는 지침 및 데이터를위한 별도의 저장소 및 신호 버스를 제공합니다. 이 아키텍처는 CPU 내에 완전히 포함 된 데이터 저장소를 가지며 명령 저장소에 데이터로 액세스 할 수 없습니다. 컴퓨터에는 내부 데이터 버스를 사용하는 프로그램 명령 및 데이터를위한 별도의 메모리 영역이있어 명령과 데이터에 동시에 액세스 할 수 있습니다.

운영자가로드해야하는 프로그램 프로세서는 스스로 부팅 할 수 없습니다. Harvard 아키텍처에서는 두 메모리가 속성을 공유하도록 만들 필요가 없습니다.

Von-Neumann 아키텍처 vs 하버드 아키텍처

다음 사항은 Von Neumann 아키텍처와 하버드 아키텍처를 구별합니다.

Von-Neumann 아키텍처 하버드 아키텍처
코드와 데이터 모두에서 공유 할 단일 메모리. 코드와 데이터를위한 별도의 메모리.
프로세서는 별도의 클록주기에있는 코드와 다른 클록주기에있는 데이터를 가져와야합니다. 따라서 두 개의 클록 사이클이 필요합니다. 코드와 데이터에 액세스하는 데 별도의 버스가 사용되므로 단일 클록 사이클이면 충분합니다.
속도가 빨라서 시간이 덜 걸립니다. 속도가 느리므로 시간이 많이 걸립니다.
디자인이 간단합니다. 디자인이 복잡합니다.

CISC 및 RISC

CISC는 복잡한 명령어 세트 컴퓨터입니다. 많은 명령을 처리 할 수있는 컴퓨터입니다.

1980 년대 초 컴퓨터 설계자들은 컴퓨터가 메모리를 사용하지 않고도 CPU 내에서 훨씬 빠르게 실행될 수 있도록 간단한 구조로 더 적은 명령을 사용하도록 권장했습니다. 이러한 컴퓨터는 축소 명령 집합 컴퓨터 또는 RISC로 분류됩니다.

CISC 대 RISC

다음 포인트는 RISC와 CISC를 구별합니다-

CISC RISC
더 큰 지침 세트. 쉬운 프로그래밍 더 작은 지침 세트. 프로그래밍이 어렵습니다.
더 많은 명령어 세트를 고려하여 컴파일러 설계가 더 간단 해졌습니다. 컴파일러의 복잡한 디자인.
복잡한 명령어 형식을 유발하는 많은 주소 지정 모드. 주소 지정 모드가 적고 명령 형식을 수정합니다.
명령어 길이는 가변적입니다. 명령어 길이는 다양합니다.
초당 더 높은 클럭주기. 초당 낮은 클럭주기.
하드웨어에 중점을 둡니다. 소프트웨어에 중점을 둡니다.
제어 장치는 마이크로 프로그램 장치를 사용하여 대규모 명령 세트를 구현합니다. 각 명령은 하드웨어에 의해 실행됩니다.
메모리에서 명령어를 읽고 디코더 장치에서 디코딩하므로 실행 속도가 느립니다. 각 명령이 하드웨어에 의해 실행되므로 더 빠른 실행.
파이프 라이닝이 불가능합니다. 단일 클록 사이클을 고려하여 명령의 파이프 라이닝이 가능합니다.

컴파일러 및 어셈블러

컴파일러

컴파일러는 프로그래밍 언어 (소스 언어)로 작성된 소스 코드를 다른 컴퓨터 언어 (일반적으로 이진 형식)로 변환하는 컴퓨터 프로그램 (또는 프로그램 집합)입니다. 변환의 가장 일반적인 이유는 실행 가능한 프로그램을 만드는 것입니다. "컴파일러"라는 이름은 주로 소스 코드를 고수준 프로그래밍 언어에서 저수준 언어 (예 : 어셈블리 언어 또는 기계 코드)로 변환하는 프로그램에 사용됩니다.

크로스 컴파일러

컴파일 된 프로그램이 컴파일러가 프로그램을 컴파일 한 컴퓨터와 다른 CPU 또는 운영 체제를 가진 컴퓨터에서 실행될 수있는 경우 해당 컴파일러를 크로스 컴파일러라고합니다.

디 컴파일러

프로그램을 저수준 언어에서 고수준 언어로 번역 할 수있는 프로그램을 디 컴파일러라고합니다.

언어 변환기

다른 고급 언어로 작성된 프로그램을 번역하는 프로그램을 일반적으로 언어 번역기, 소스 대 소스 번역기 또는 언어 변환기라고합니다.

컴파일러는 다음 작업을 수행 할 가능성이 있습니다.

  • Preprocessing
  • Parsing
  • 의미 분석 (구문 지시 번역)
  • 코드 생성
  • 코드 최적화

어셈블러

어셈블러는 기본 컴퓨터 명령어 (어셈블리 언어라고 함)를 사용하여 컴퓨터의 프로세서가 기본 작업을 수행하는 데 사용할 수있는 비트 패턴으로 변환하는 프로그램입니다. 어셈블러는 어셈블리 명령어 니모닉을 opcode로 변환하고 기호 이름을 메모리 위치로 확인하여 객체 코드를 생성합니다. 어셈블리 언어는 니모닉을 사용하여 각 하위 수준 기계 작업 (opcode)을 나타냅니다.

임베디드 시스템의 디버깅 도구

디버깅은 컴퓨터 프로그램이나 전자 하드웨어에서 버그 수를 찾아서 줄여서 예상대로 작동하도록하는 체계적인 프로세스입니다. 한 하위 시스템의 작은 변경으로 다른 하위 시스템에 버그가 발생할 수 있으므로 하위 시스템이 긴밀하게 결합되어 있으면 디버깅이 어렵습니다. 임베디드 시스템에서 사용되는 디버깅 도구는 개발 시간과 디버깅 기능이 크게 다릅니다. 여기서는 다음 디버깅 도구에 대해 설명합니다.

  • Simulators
  • 마이크로 컨트롤러 스타터 키트
  • Emulator

시뮬레이터

코드 개발에 사용되는 호스트 컴퓨터에서 코드를 시뮬레이션하여 MCU / 시스템에 대해 코드를 테스트합니다. 시뮬레이터는 소프트웨어에서 전체 마이크로 컨트롤러의 동작을 모델링하려고합니다.

시뮬레이터의 기능

시뮬레이터는 다음 기능을 수행합니다.

  • 프로세서 또는 처리 장치 제품군과 대상 시스템에 대한 다양한 버전을 정의합니다.

  • 각 단일 단계에 대해 실행이 진행됨에 따라 레이블 및 기호 인수를 사용하여 소스 코드 부분의 세부 정보를 모니터링합니다.

  • 각 단일 단계 실행에 대해 RAM 상태 및 대상 시스템의 시뮬레이션 된 포트를 제공합니다.

  • 시스템 응답을 모니터링하고 처리량을 결정합니다.

  • 프로그램 카운터의 내용과 프로세서 레지스터의 출력 추적을 제공합니다.

  • 현재 명령의 자세한 의미를 제공합니다.

  • 키보드에서 입력하거나 메뉴에서 선택하면 시뮬레이터 명령에 대한 자세한 정보를 모니터링합니다.

  • 조건 (최대 8 개 또는 16 개 또는 32 개 조건) 및 무조건 중단 점을 지원합니다.

  • 중요한 테스트 및 디버깅 도구 인 중단 점과 추적을 제공합니다.

  • 내부 주변 장치 및 지연 동기화를 용이하게합니다.

마이크로 컨트롤러 스타터 키트

마이크로 컨트롤러 스타터 키트는 다음으로 구성됩니다.

  • 하드웨어 보드 (평가 보드)
  • 시스템 내 프로그래머
  • 컴파일러, 어셈블러, 링커 등과 같은 일부 소프트웨어 도구
  • 때로는 IDE 및 코드 크기가 컴파일러의 평가 버전을 제한합니다.

시뮬레이터에 비해 이러한 키트의 큰 장점은 실시간으로 작동하므로 입력 / 출력 기능을 쉽게 확인할 수 있다는 것입니다. 그러나 스타터 키트만으로도 충분하며 간단한 마이크로 컨트롤러 프로젝트를 개발하는 데 가장 저렴한 옵션입니다.

에뮬레이터

에뮬레이터는 하드웨어 키트 또는 소프트웨어 프로그램이거나 첫 번째 시스템과 다른 다른 컴퓨터 시스템 (호스트)에서 한 컴퓨터 시스템 (게스트)의 기능을 에뮬레이트하여 에뮬레이트 된 동작이 동작과 매우 유사하도록 둘 다일 수 있습니다. 실제 시스템 (게스트)의.

에뮬레이션은 전자 장치의 컴퓨터 프로그램이 다른 프로그램이나 장치를 에뮬레이션 (모방)하는 기능을 나타냅니다. 에뮬레이션은 원래 컴퓨터 환경을 재현하는 데 중점을 둡니다. 에뮬레이터는 디지털 객체의 진위성에 더 가깝게 연결을 유지할 수 있습니다. 에뮬레이터는 소프트웨어가 원래 환경에서 실행되는 것과 유사한 방식으로 사용자가 플랫폼에서 모든 종류의 애플리케이션 또는 운영 체제에서 작업 할 수 있도록 도와줍니다.

임베디드 시스템의 주변 장치

임베디드 시스템은 다음과 같은 주변 장치를 통해 외부 세계와 통신합니다.

  • RS-232, RS-422, RS-485 등과 같은 SCI (직렬 통신 인터페이스)
  • I2C, SPI, SSC 및 ESSI와 같은 동기 직렬 통신 인터페이스
  • 범용 직렬 버스 (USB)
  • 멀티 미디어 카드 (SD 카드, 컴팩트 플래시 등)
  • 이더넷, LonWorks 등과 같은 네트워크
  • CAN-Bus, LIN-Bus, PROFIBUS 등과 같은 필드 버스
  • PLL (s), 캡처 / 비교 및 ​​시간 처리 장치와 같은 imers.
  • 개별 IO 일명 GPIO (범용 입 / 출력)
  • 아날로그-디지털 / 디지털-아날로그 (ADC / DAC)
  • JTAG, ISP, ICSP, BDM 포트, BITP 및 DP9 포트와 같은 디버깅

마이크로 컨트롤러 선택 기준

마이크로 컨트롤러를 선택할 때 당면한 작업을 충족하고 비용 효율적인지 확인하십시오. 8 비트, 16 비트 또는 32 비트 마이크로 컨트롤러가 작업의 컴퓨팅 요구 사항을 가장 잘 처리 할 수 ​​있는지 확인해야합니다. 또한 마이크로 컨트롤러를 선택할 때 다음 사항을 염두에 두어야합니다.

  • Speed − 마이크로 컨트롤러가 지원할 수있는 최고 속도는 얼마입니까?

  • Packaging− 40 핀 DIP (듀얼 인라인 패키지) 또는 QFP (쿼드 플랫 패키지)입니까? 이는 최종 제품의 공간, 조립 및 프로토 타이핑 측면에서 중요합니다.

  • Power Consumption − 이것은 배터리 구동 제품에 대한 중요한 기준입니다.

  • Amount of RAM and ROM 칩에.

  • Count of I/O pins and Timers 칩에.

  • Cost per Unit − 이는 마이크로 컨트롤러를 사용할 제품의 최종 비용 측면에서 중요합니다.

또한 마이크로 컨트롤러와 함께 사용할 수있는 컴파일러, 디버거 및 어셈블러와 같은 도구가 있는지 확인하십시오. 가장 중요한 것은 신뢰할 수있는 소스에서 마이크로 컨트롤러를 구입해야한다는 것입니다.

8051의 간략한 역사

최초의 마이크로 프로세서 4004 인텔사에 의해 발명되었습니다. 80858086마이크로 프로세서도 인텔에서 발명했습니다. 1981 년에 인텔은 8 비트 마이크로 컨트롤러를 출시했습니다.8051. 그것은system on a chip128 바이트의 RAM, 4K 바이트의 온칩 ROM, 2 개의 타이머, 1 개의 직렬 포트 및 4 개의 포트 (8 비트 너비)가 모두 단일 칩에 있기 때문입니다. 널리 보급되었을 때 인텔은 다른 제조업체가 8051과 호환되는 코드를 사용하여 8051의 다른 버전을 만들고 판매 할 수 있도록 허용했습니다. 즉, 8051의 한 버전에 대해 프로그램을 작성하면 다른 버전에서도 실행됩니다. 제조업체. 이로 인해 온칩 RAM의 속도와 양이 다른 여러 버전이 만들어졌습니다.

8051 맛 / 회원

  • 8052 microcontroller− 8052는 8051 마이크로 컨트롤러의 모든 표준 기능과 추가 128 바이트 RAM 및 추가 타이머를 갖추고 있습니다. 또한 4K 바이트 대신 8K 바이트 온칩 프로그램 ROM이 있습니다.

  • 8031 microcontroller− 8051 제품군의 또 다른 구성원입니다. 이 칩은 0K 바이트의 온칩 ROM을 가지고 있기 때문에 종종 ROM-less 8051이라고합니다. 가져 와서 실행할 프로그램이 포함 된 외부 ROM을 사용하려면 외부 ROM을 추가해야합니다. 이 프로그램은 64K 바이트까지 가능합니다. 그러나 8031에 외부 ROM을 추가하는 과정에서 4 포트 중 2 포트가 손실되었습니다. 이 문제를 해결하기 위해 8031에 외부 I / O를 추가 할 수 있습니다.

8051 가족 구성원 간의 비교

다음 표는 8051, 8052 및 8031에서 사용할 수있는 기능을 비교합니다.

특색 8051 8052 8031
ROM (바이트) 4K 8K 0K
RAM (바이트) 128 256 128
타이머 2 2
I / O 핀 32 32 32
직렬 포트 1 1 1
인터럽트 소스 6 8 6

8051 마이크로 컨트롤러의 특징

8051 마이크로 컨트롤러에는 다음 기능이 번들로 제공됩니다.

  • 4KB 바이트 온칩 프로그램 메모리 (ROM)
  • 128 바이트 온칩 데이터 메모리 (RAM)
  • 4 개의 레지스터 뱅크
  • 128 개의 사용자 정의 소프트웨어 플래그
  • 8 비트 양방향 데이터 버스
  • 16 비트 단방향 주소 버스
  • 8 비트 각각 32 개의 범용 레지스터
  • 16 비트 타이머 (일반적으로 2 개이지만 더 많거나 적을 수 있음)
  • 3 개의 내부 인터럽트 및 2 개의 외부 인터럽트
  • 4 개의 8 비트 포트 (짧은 모델에는 2 개의 8 비트 포트가 있음)
  • 16 비트 프로그램 카운터 및 데이터 포인터
  • 8051에는 UART, ADC, Op-amp 등과 같은 여러 특수 기능이있을 수도 있습니다.

8051 마이크로 컨트롤러의 블록 다이어그램

다음 그림은 8051 마이크로 컨트롤러의 블록 다이어그램을 보여줍니다.

8051에서는 4 개의 포트와 40 개의 핀을 사용하여 I / O 작업이 수행됩니다. 다음 핀 다이어그램은 40 핀의 세부 정보를 보여줍니다. I / O 작동 포트는 각 포트에 8 개의 핀이있는 32 개의 핀을 예약합니다. 다른 8 개의 핀은 V cc , GND, XTAL1, XTAL2, RST, EA (bar), ALE / PROG (bar) 및 PSEN (bar)으로 지정됩니다.

40 핀 PDIP (플라스틱 듀얼 인라인 패키지)입니다.

Note− DIP 패키지에서는 IC 중간을 잘라서 첫 번째 핀과 마지막 핀을 인식 할 수 있습니다. 첫 번째 핀은이 절단 표시의 왼쪽에 있고 마지막 핀 ( 이 경우 40 번째 핀)은 절단 표시의 오른쪽에 있습니다.

I / O 포트 및 기능

4 개의 포트 P0, P1, P2 및 P3은 각각 8 개의 핀을 사용하여 8 비트 포트가됩니다. RESET시 모든 포트가 입력으로 구성되어 입력 포트로 사용할 준비가됩니다. 처음 0이 포트에 기록되면 출력이됩니다. 입력으로 재구성하려면 1을 포트로 보내야합니다.

포트 0 (핀 번호 32 – 핀 번호 39)

핀은 8 개 (32 ~ 39)입니다. 입력 또는 출력에 사용할 수 있습니다. P1, P2 및 P3 포트와 달리, 우리는 일반적으로 P0을 10K-ohm 풀업 저항에 연결하여 개방 드레인 인 입력 또는 출력 포트로 사용합니다.

또한 AD0-AD7로 지정되어 주소와 데이터로 모두 사용할 수 있습니다. 8031 (즉 ROMless 칩)의 경우 외부 ROM에 액세스해야 할 때 주소 및 데이터 버스 모두에 P0이 사용됩니다. ALE (핀 번호 31)는 P0에 주소 또는 데이터가 있는지 여부를 나타냅니다. ALE = 0이면 데이터 D0-D7을 제공하지만 ALE = 1이면 주소 A0-A7을 갖습니다. 외부 메모리 연결을 사용할 수없는 경우 P0은 10K-ohm 풀업 저항에 외부 적으로 연결해야합니다.

MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)  

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

포트 1 (핀 1 ~ 8)

8 비트 포트 (핀 1 ~ 8)이며 입력 또는 출력으로 사용할 수 있습니다. 풀업 저항은 이미 내부적으로 연결되어 있기 때문에 필요하지 않습니다. 재설정시 포트 1이 입력 포트로 구성됩니다. 다음 코드는 55H 및 AAH 값을 번갈아 포트 1로 전송하는 데 사용할 수 있습니다.

;Toggle all bits of continuously 
MOV     A,#55 
BACK:    

MOV     P2,A 
ACALL   DELAY 
CPL     A      ;complement(invert) reg. A 
SJMP    BACK

포트 1이 출력 포트로 사용되도록 구성된 경우 다시 입력 포트로 사용하려면 다음 코드와 같이 모든 비트에 1을 써서 프로그래밍합니다.

;Toggle all bits of continuously 

MOV     A ,#0FFH    ;A = FF hex 
MOV     P1,A        ;Make P1 an input port                     
MOV     A,P1        ;get data from P1 
MOV     R7,A        ;save it in Reg R7 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R6,A        ;save it in R6 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R5,A        ;save it in R5

포트 2 (핀 21 ~ 28)

포트 2는 총 8 개의 핀 (핀 21 ~ 28)을 차지하며 입력 및 출력 작업 모두에 사용할 수 있습니다. P1 (포트 1)과 마찬가지로 P2도 이미 내부적으로 연결되어 있으므로 외부 풀업 저항이 필요하지 않습니다. 외부 메모리에 16 비트 주소를 제공하려면 P0과 함께 사용해야합니다. 따라서 핀 다이어그램과 같이 (A0–A7)로도 지정됩니다. 8051이 외부 메모리에 연결되면 16 비트 주소의 상위 8 비트에 대한 경로를 제공하며 I / O로 사용할 수 없습니다. 재설정시 포트 2는 입력 포트로 구성됩니다. 다음 코드는 55H 및 AAH 값을 번갈아 포트 2로 전송하는 데 사용할 수 있습니다.

;Toggle all bits of continuously 
MOV     A,#55 
BACK: 
MOV     P2,A 
ACALL   DELAY 
CPL     A         ; complement(invert) reg. A 
SJMP    BACK

포트 2를 출력 포트로 사용하도록 구성한 경우 다시 입력 포트로 사용하려면 다음 코드와 같이 모든 비트에 1을 써서 프로그래밍합니다.

;Get a byte from P2 and send it to P1 
MOV    A,#0FFH    ;A = FF hex 
MOV    P2,A       ;make P2 an input port 
BACK: 
MOV    A,P2       ;get data from P2 
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

포트 3 (핀 10 ~ 17)

또한 8 비트이며 입력 / 출력으로 사용할 수 있습니다. 이 포트는 매우 중요한 신호를 제공합니다. P3.0 및 P3.1은 각각 RxD (수신기) 및 TxD (송신기)이며 직렬 통신에 집합 적으로 사용됩니다. P3.2 및 P3.3 핀은 외부 인터럽트에 사용됩니다. P3.4 및 P3.5는 각각 타이머 T0 및 T1에 사용됩니다. P3.6 및 P3.7은 쓰기 (WR) 및 읽기 (RD) 핀입니다. 이것은 액티브 로우 핀으로, 0이 주어지면 활성화되며 8031 ​​기반 시스템에서 외부 ROM에 읽기 및 쓰기 작업을 제공하는 데 사용됩니다.

P3 비트 함수
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < INT0의 보완 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < RD 보완 17

포트 0 및 포트 2의 이중 역할

  • Dual role of Port 0− 포트 0은 데이터 및 주소 처리에 모두 사용할 수 있으므로 AD0–AD7로도 지정됩니다. 8051을 외부 메모리에 연결하는 동안 포트 0은 주소와 데이터를 모두 제공 할 수 있습니다. 그런 다음 8051 마이크로 컨트롤러는 핀을 저장하기 위해 입력을 주소 또는 데이터로 다중화합니다.

  • Dual role of Port 2− I / O로 작동하는 것 외에도 포트 P2는 포트 0과 함께 외부 메모리 용 16 비트 주소 버스를 제공하는 데 사용됩니다. 포트 P2는 (A8– A15)로도 지정되고 포트 0은 다음을 통해 하위 8 비트를 제공합니다. A0–A7. 즉, 8051이 최대 64KB까지 가능한 외부 메모리 (ROM)에 연결될 때 216 = 64KB를 알기 때문에 16 비트 주소 버스로 가능하다고 말할 수 있습니다. Port2는 16 비트 주소의 상위 8 비트에 사용되며 I / O에 사용할 수 없으며 외부 ROM의 프로그램 코드가 주소 지정되는 방식입니다.

핀의 하드웨어 연결

  • Vcc − 핀 40은 칩에 전원을 공급하며 + 5V입니다.

  • Gnd − 20 번 핀은 레퍼런스에 접지를 제공합니다.

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19)− 8051에는 온칩 발진기가 있지만이를 실행하려면 외부 클럭이 필요합니다. 수정은 칩의 XTAL1과 XTAL2 핀 사이에 연결됩니다. 이 크리스탈은 원하는 주파수의 신호를 생성하기 위해 30pF의 두 개의 커패시터가 필요합니다. 각 커패시터의 한쪽은 접지에 연결됩니다. 8051 IC는 다양한 속도로 제공되며 모든 것이이 Quartz 크리스탈에 의존합니다. 예를 들어 20MHz 마이크로 컨트롤러에는 20MHz 이하의 주파수를 가진 크리스탈이 필요합니다.

  • RST (Pin No. 9)− 입력 핀과 활성 High 핀입니다. 이 핀에 높은 펄스, 즉 1을 적용하면 마이크로 컨트롤러가 모든 활동을 재설정하고 종료합니다. 이 프로세스는Power-On Reset. 파워 온 리셋을 활성화하면 레지스터의 모든 값이 손실됩니다. 프로그램 카운터를 모두 0으로 설정합니다. 리셋의 유효한 입력을 보장하려면 하이 펄스가 낮아 지도록 허용되기 전에 최소 2 개의 기계 사이클 동안 하이 펄스가 높아야하며 이는 커패시터 값과 충전 속도에 따라 달라집니다. (Machine Cycle 단일 명령어 실행에 필요한 최소 주파수입니다.)

  • EA or External Access (Pin No. 31)− 입력 핀입니다. 이 핀은 액티브 로우 핀입니다. 낮은 펄스를 적용하면 활성화됩니다. 온칩 ROM이있는 마이크로 컨트롤러 (8051/52)의 경우 EA (bar) 핀은 V cc에 연결됩니다 . 그러나 온칩 ROM이없는 8031 ​​마이크로 컨트롤러에서는 코드가 외부 ROM에 저장된 다음 마이크로 컨트롤러가 가져옵니다. 이 경우 (핀 번호 31) EA를 Gnd에 연결하여 프로그램 코드가 외부에 저장되었음을 나타내야합니다.

  • PSEN or Program store Enable (Pin No 29)− 이것은 또한 활성 로우 핀입니다. 즉, 로우 펄스를 적용한 후 활성화됩니다. 이것은 출력 핀이며 8031 ​​기반 (즉, ROMLESS) 시스템에서 EA 핀과 함께 사용되어 외부 ROM에 프로그램 코드를 저장할 수 있습니다.

  • ALE or (Address Latch Enable)− 이것은 출력 핀이며 액티브 하이입니다. 특히 8031 ​​IC에서 외부 메모리에 연결하는 데 사용됩니다. P0 핀을 주소 버스 또는 데이터 버스로 사용할지 여부를 결정하는 동안 사용할 수 있습니다. ALE = 1이면 P0 핀이 데이터 버스로 작동하고 ALE = 0이면 P0 핀이 주소 버스로 작동합니다.

I / O 포트 및 비트 주소 지정 기능

8051 용 코드를 작성하는 동안 8051의 가장 널리 사용되는 기능입니다. 때로는 전체 8 비트 대신 포트의 1 비트 또는 2 비트에만 액세스해야합니다. 8051은 포트의 개별 비트에 액세스하는 기능을 제공합니다.

단일 비트 방식으로 포트에 액세스하는 동안 "SETB X. Y"구문을 사용합니다. 여기서 X는 포트 번호 (0 ~ 3)이고 Y는 데이터 비트 D0 ~ D7에 대한 비트 번호 (0 ~ 7)입니다. 여기서 D0은 LSB이고 D7은 MSB입니다. 예를 들어 "SETB P1.5"는 포트 1의 상위 비트 5를 설정합니다.

다음 코드는 비트 P1.2를 지속적으로 토글 할 수있는 방법을 보여줍니다.

AGAIN: 
SETB    P1.2
ACALL   DELAY    
CLR     P1.2      
ACALL   DELAY 
SJMP    AGAIN

단일 비트 지침

명령 함수
SETB 비트 비트 설정 (비트 = 1)
CLR 비트 비트 지우기 (비트 = 0)
CPL 비트 비트 보완 (비트 = NOT 비트)
JB 비트, 대상 비트 = 1 인 경우 대상으로 이동 (비트 인 경우 점프)
JNB 비트, 타겟 비트가 0이면 대상으로 이동 (비트가 없으면 점프)
JBC 비트, 대상 비트 = 1이면 대상으로 점프, 비트 지우기 (비트이면 점프 한 다음 지우기)

프로그램 카운터

프로그램 카운터는 실행할 다음 명령어의 주소를 포함하는 16 비트 또는 32 비트 레지스터입니다. PC는 명령어를 가져올 때마다 자동으로 다음 순차 메모리 위치로 증가합니다. 분기, 점프 및 인터럽트 작업은 다음 순차 위치가 아닌 주소로 프로그램 카운터를로드합니다.

파워 온 리셋을 활성화하면 레지스터의 모든 값이 손실됩니다. 이는 리셋시 PC (프로그램 카운터)의 값이 0이라는 것을 의미하며, CPU가 ROM 메모리 위치 0000에서 첫 번째 opcode를 가져 오도록합니다. 즉, ROM 위치 0000에 업 코드의 첫 번째 바이트를 배치해야합니다. CPU는 첫 번째 명령을 찾을 것으로 예상합니다.

벡터 재설정

리셋 벡터의 중요성은 프로세서가 펌웨어의 첫 번째 명령어를 포함하는 메모리 주소를 가리 킵니다. 리셋 벡터가 없으면 프로세서는 어디에서 실행을 시작할지 알 수 없습니다. 리셋시 프로세서는 미리 정의 된 메모리 위치에서 리셋 벡터 값과 함께 프로그램 카운터 (PC)를로드합니다. CPU08 아키텍처에서 이것은 위치에 있습니다.$FFFE:$FFFF.

재설정 벡터가 필요하지 않은 경우 개발자는 일반적으로이를 당연한 것으로 여기고 최종 이미지로 프로그래밍하지 않습니다. 결과적으로 프로세서는 최종 제품에서 시작되지 않습니다. 디버그 단계에서 발생하는 일반적인 실수입니다.

스택 포인터

스택은 RAM에서 구현되고 CPU 레지스터는 SP (Stack Pointer) 레지스터라고하는 액세스에 사용됩니다. SP 레지스터는 8 비트 레지스터이며 00h ~ FFh 범위의 메모리 주소를 지정할 수 있습니다. 처음에 SP 레지스터는 8051에서 스택에 사용되는 첫 번째 위치로 위치 08을 가리키는 값 07을 포함합니다.

CPU 레지스터의 내용이 스택에 저장 될 때이를 PUSH 연산이라고합니다. 스택의 내용이 CPU 레지스터에 저장되는 것을 POP 연산이라고합니다. 즉, 레지스터를 스택에 푸시하여 저장하고 스택에서 팝하여 검색합니다.

무한 루프

무한 루프 또는 무한 루프는 다음과 같은 이유로 루프에서 끝없이 실행되는 컴퓨터 프로그램의 명령 시퀀스로 식별 될 수 있습니다.

  • 종료 조건이없는 루프.
  • 충족 될 수없는 종료 조건이있는 루프.
  • 루프가 다시 시작되도록하는 종료 조건이있는 루프.

이러한 무한 루프는 일반적으로 무한 루프가 사용 가능한 모든 프로세서 시간을 소비하므로 이전 운영 체제가 응답하지 않게되었습니다. 사용자 입력을 기다리는 I / O 작업을 "무한 루프"라고도합니다. 컴퓨터 "멈춤"의 한 가지 가능한 원인은 무한 루프입니다. 다른 원인은 다음과 같습니다.deadlockaccess violations.

PC와 달리 임베디드 시스템은 응용 프로그램을 "종료"하지 않습니다. 인터럽트의 형태로 이벤트가 발생하기를 기다리는 무한 루프를 통해 유휴 상태이거나pre-scheduled task. 전력을 절약하기 위해 일부 프로세서는 특별sleep 또는 wait modes 무한 루프를 통해 유휴 상태가 아닌 타이머 또는 외부 인터럽트시이 모드에서 나옵니다.

인터럽트

인터럽트는 대부분 이벤트가 발생했음을 프로그램에 지시하는 하드웨어 메커니즘입니다. 이는 언제든지 발생할 수 있으므로 프로그램 흐름과 비동기 적입니다. 프로세서의 특수 처리가 필요하며 궁극적으로 해당 ISR (Interrupt Service Routine)에 의해 처리됩니다. 인터럽트는 신속하게 처리해야합니다. 인터럽트를 처리하는 데 너무 많은 시간이 걸리면 다른 인터럽트를 놓칠 수 있습니다.

리틀 엔디안 대 빅 엔디안

숫자는 항상 같은 방식으로 표시되지만 메모리에 같은 방식으로 저장되지는 ​​않습니다. Big-Endian 머신은 가장 낮은 메모리 주소에 가장 중요한 데이터 바이트를 저장합니다. Big-Endian 기계는 0x12345678을 다음과 같이 저장합니다.

ADD+0: 0x12 
ADD+1: 0x34 
ADD+2: 0x56 
ADD+3: 0x78

반면에 Little-Endian 기계는 최하위 메모리 주소에 최하위 데이터 바이트를 저장합니다. Little-Endian 기계는 0x12345678을 다음과 같이 저장합니다.

ADD+0: 0x78 
ADD+1: 0x56 
ADD+2: 0x34 
ADD+3: 0x12

어셈블리 언어는 다음을 제공하기 위해 개발되었습니다. mnemonics또는 기계 레벨 코드 명령에 대한 기호. 어셈블리 언어 프로그램은 니모닉으로 구성되어 있으므로 기계 코드로 번역해야합니다. 이 변환을 담당하는 프로그램은assembler. 어셈블리 언어는 CPU의 내부 구조와 직접적으로 작동하기 때문에 종종 저수준 언어로 불립니다. 어셈블리 언어로 프로그래밍하려면 프로그래머는 CPU의 모든 레지스터를 알아야합니다.

C, C ++, Java 및 기타 다양한 언어와 같은 다른 프로그래밍 언어는 CPU의 내부 세부 사항을 처리하지 않기 때문에 고급 언어라고합니다. 반대로 어셈블러는 어셈블리 언어 프로그램을 기계어 코드로 변환하는 데 사용됩니다 (때로는object code 또는 opcode). 마찬가지로 컴파일러는 고급 언어를 기계 코드로 변환합니다. 예를 들어, C 언어로 프로그램을 작성하려면 C 컴파일러를 사용하여 프로그램을 기계어로 번역해야합니다.

어셈블리 언어의 구조

어셈블리 언어 프로그램은 ADD 및 MOV와 같은 어셈블리 언어 명령어이거나 호출 된 문인 일련의 문입니다. directives.

instruction CPU에 무엇을해야하는지 알려주고 directive (또는 pseudo-instructions)는 어셈블러에 지침을 제공합니다. 예를 들어 ADD 및 MOV 명령어는 CPU가 실행하는 명령이고 ORG 및 END는 어셈블러 지시문입니다. 어셈블러는 ORG 지시문이 사용될 때 메모리 위치 0에 opcode를 배치하고 END는 소스 코드의 끝을 나타냅니다. 프로그램 언어 명령은 다음 네 개의 필드로 구성됩니다.

[ label: ]   mnemonics  [ operands ]   [;comment ]

대괄호 ([])는 필드가 선택 사항임을 나타냅니다.

  • 그만큼 label field프로그램이 이름으로 코드 줄을 참조 할 수 있습니다. 레이블 필드는 특정 문자 수를 초과 할 수 없습니다.

  • 그만큼 mnemonicsoperands fields함께 프로그램의 실제 작업을 수행하고 작업을 수행합니다. ADD A, C & MOV C, # 68과 같은 문 여기서 ADD 및 MOV는 opcode를 생성하는 니모닉입니다. "A, C"및 "C, # 68"은 피연산자입니다. 이 두 필드에는 지시문이 포함될 수 있습니다. 지시문은 기계어 코드를 생성하지 않고 어셈블러에서만 사용되는 반면 명령은 CPU가 실행할 기계어 코드로 변환됩니다.

1.0000         ORG  0H            ;start (origin) at location 0 
2 0000 7D25    MOV  R5,#25H       ;load 25H into R5 
3.0002 7F34    MOV  R7,#34H       ;load 34H into  R7 
4.0004 7400    MOV  A,#0          ;load 0 into A 
5.0006 2D      ADD  A,R5          ;add contents of R5 to A 
6.0007 2F      ADD  A,R7          ;add contents of R7 to A
7.0008 2412    ADD  A,#12H        ;add to A value 12 H 
8.000A 80FE    HERE: SJMP HERE    ;stay in this loop 
9.000C END                        ;end of asm source file
  • 그만큼 comment field 주석 표시기 인 세미콜론으로 시작합니다.

  • 프로그램에서 "HERE"레이블을 확인하십시오. 명령을 참조하는 모든 레이블 뒤에는 콜론이 와야합니다.

8051 프로그램 조립 및 실행

여기서 우리는 어셈블리 언어의 기본 형태에 대해 논의 할 것입니다. 어셈블리 언어 프로그램을 생성, 어셈블 및 실행하는 단계는 다음과 같습니다.

  • 먼저 편집기를 사용하여 위 프로그램과 유사한 프로그램을 입력합니다. 모든 Microsoft 운영 체제와 함께 제공되는 MS-DOS EDIT 프로그램과 같은 편집기를 사용하여 프로그램을 만들거나 편집 할 수 있습니다. 편집기는 ASCII 파일을 생성 할 수 있어야합니다. 소스 파일의 "asm"확장자는 다음 단계에서 어셈블러에서 사용됩니다.

  • "asm"소스 파일에는 1 단계에서 만든 프로그램 코드가 포함되어 있습니다.이 코드는 8051 어셈블러에 제공됩니다. 그런 다음 어셈블러는 어셈블리 언어 명령어를 기계어 코드 명령어로 변환하고.obj file (개체 파일) 및 .lst file(목록 파일). 그것은 또한source file, 이것이 일부 어셈블러에서이 파일에 "src"확장자가 있어야하는 이유입니다. "lst"파일은 선택 사항입니다. 어셈블러가 감지 한 오류뿐만 아니라 모든 opcode와 주소를 나열하므로 프로그램에 매우 유용합니다.

  • 어셈블러에는 다음과 같은 세 번째 단계가 필요합니다. linking. 링크 프로그램은 하나 이상의 오브젝트 파일을 가져 와서 "abs"확장자를 가진 절대 오브젝트 파일을 생성합니다.

  • 다음으로 "abs"파일은 "OH"(object to hex converter)라는 프로그램에 공급되어 ROM에 구울 준비가 된 "hex"확장자를 가진 파일을 생성합니다.

데이터 형식

8051 마이크로 컨트롤러에는 8 비트의 단일 데이터 유형이 포함되어 있으며 각 레지스터도 8 비트 크기입니다. 프로그래머는 CPU에서 처리 할 수 ​​있도록 8 비트 (00 ~ FFH 또는 십진수 255)보다 큰 데이터를 분해해야합니다.

DB (바이트 정의)

DB 지시문은 어셈블러에서 가장 널리 사용되는 데이터 지시문입니다. 8 비트 데이터를 정의하는 데 사용됩니다. 10 진수, 2 진, 16 진 또는 ASCII 형식 데이터를 정의하는데도 사용할 수 있습니다. 10 진수의 경우 10 진수 뒤의 "D"는 선택 사항이지만 "B"(이진수) 및 "Hl"(16 진수)에는 필수입니다.

ASCII를 나타내려면 문자를 따옴표로 묶으십시오 ( 'like this'). 어셈블러는 숫자 / 문자에 대한 ASCII 코드를 자동으로 생성합니다. DB 지시문은 두 문자보다 큰 ASCII 문자열을 정의하는 데 사용할 수있는 유일한 지시문입니다. 따라서 모든 ASCII 데이터 정의에 사용해야합니다. DB의 몇 가지 예는 다음과 같습니다.

ORG  500H 
DATA1:  DB   28                     ;DECIMAL (1C in hex) 
DATA2:  DB   00110101B              ;BINARY  (35 in hex) 
DATA3:  DB   39H                    ;HEX 
        ORG  510H 
DATA4:  DB   "2591"                 ;ASCII  NUMBERS 
        ORG  520H                         
DATA6:  DA   "MY NAME IS Michael"   ;ASCII CHARACTERS

ASCII 문자열 주위에 작은 따옴표 또는 큰 따옴표를 사용할 수 있습니다. DB는 또한 바이트 크기의 청크로 메모리를 할당하는 데 사용됩니다.

어셈블러 지시어

8051의 일부 지침은 다음과 같습니다.

  • ORG (origin)− origin 지시문은 주소의 시작을 나타내는 데 사용됩니다. 16 진수 또는 10 진수 형식의 숫자를 사용합니다. 숫자 뒤에 H가 제공되면 숫자는 16 진수로 처리되고 그렇지 않으면 10 진수로 처리됩니다. 어셈블러는 십진수를 헥사로 변환합니다.

  • EQU (equate)− 메모리 위치를 차지하지 않고 상수를 정의하는 데 사용됩니다. EQU는 레이블이 프로그램에 나타나도록 상수 값을 데이터 레이블과 연결하고 해당 상수 값이 레이블을 대체합니다. "MOV R3, #COUNT"명령을 실행하는 동안 레지스터 R3은 값 25로로드됩니다 (# 기호 참고). EQU 사용의 장점은 프로그래머가 한 번만 변경할 수 있고 어셈블러가 모든 항목을 변경할 수 있다는 것입니다. 프로그래머는 전체 프로그램을 검색 할 필요가 없습니다.

  • END directive− 소스 (asm) 파일의 끝을 나타냅니다. END 지시문은 프로그램의 마지막 줄입니다. END 지시문 이후의 모든 것은 어셈블러에서 무시됩니다.

어셈블리 언어의 레이블

어셈블리 언어의 모든 라벨은 아래에 주어진 규칙을 따라야합니다.

  • 각 레이블 이름은 고유해야합니다. 어셈블리 언어 프로그래밍에서 레이블에 사용되는 이름은 대문자와 소문자, 숫자 0에서 9까지의 알파벳 문자와 @, 밑줄 (_) 비율의 물음표 (?), 마침표 (.)와 같은 특수 문자로 구성됩니다. 및 달러 ($).

  • 첫 번째 문자는 알파벳 문자 여야합니다. 숫자 일 수 없습니다.

  • 예약어는 프로그램에서 라벨로 사용할 수 없습니다. 예를 들어 ADD 및 MOV 단어는 명령어 니모닉이므로 예약어입니다.

레지스터는 CPU에서 처리 할 데이터 또는 가져올 데이터를 가리키는 주소 일 수있는 정보를 일시적으로 저장하는 데 사용됩니다. 8051에는 MSB (최상위 비트) D7에서 LSB (최하위 비트) D0까지 8 비트 데이터 유형이 하나 있습니다. 8 비트 데이터 유형의 경우 8 비트보다 큰 데이터 유형은 처리되기 전에 8 비트 청크로 분할되어야합니다.

8051에서 가장 널리 사용되는 레지스터는 A (누산기), B, R0-R7, DPTR (데이터 포인터) 및 PC (프로그램 카운터)입니다. 이 모든 레지스터는 DPTR과 PC를 제외한 8 비트입니다.

8051의 저장 레지스터

여기서는 다음 유형의 저장 레지스터에 대해 설명합니다.

  • Accumulator
  • R 레지스터
  • B 레지스터
  • 데이터 포인터 (DPTR)
  • 프로그램 카운터 (PC)
  • 스택 포인터 (SP)

어큐뮬레이터

누산기 레지스터 A는 모든 산술 및 논리 연산에 사용됩니다. 누산기가 없으면 각 계산의 모든 결과 (덧셈, 곱셈, 시프트 등)가 주 메모리에 저장됩니다. 주 메모리에 대한 액세스는 누산기와 같은 레지스터에 대한 액세스보다 느립니다. 큰 주 메모리에 사용되는 기술은 레지스터에 사용되는 기술보다 느리지 만 저렴하기 때문입니다.

"R"레지스터

"R"레지스터는 R0, R1 ~ R7의 8 개 레지스터 세트입니다. 이러한 레지스터는 많은 작업에서 보조 또는 임시 저장 레지스터로 작동합니다. 10과 20의 합의 예를 고려하십시오. 변수 10을 누산기에 저장하고 다른 변수 20을 레지스터 R4에 저장하십시오. 추가 작업을 처리하려면 다음 명령을 실행하십시오.

ADD A,R4

이 명령어를 실행하면 누산기에 값 30이 포함됩니다. 따라서 "R"레지스터는 매우 중요한 보조 또는 helper registers. 이러한 "R"레지스터가 아니라면 누산기만으로는 유용하지 않습니다. "R"레지스터는 값의 임시 저장을 의미합니다.

다른 예를 들어 보겠습니다. R1과 R2의 값을 더한 다음 결과에서 R3과 R4의 값을 뺍니다.

MOV A,R3   ;Move the value of R3 into the accumulator 
ADD A,R4   ;Add the value of R4 
MOV R5,A   ;Store the resulting value temporarily in R5 
MOV A,R1   ;Move the value of R1 into the accumulator 
ADD A,R2   ;Add the value of R2 
SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)

보시다시피 R5를 사용하여 R3과 R4의 합을 일시적으로 유지했습니다. 물론 이것은 (R1 + R2) – (R3 + R4)를 계산하는 가장 효율적인 방법은 아니지만 값을 임시로 저장하는 방법으로 "R"레지스터를 사용하는 방법을 보여줍니다.

"B"레지스터

"B"레지스터는 8 비트 (1 바이트) 값을 보유 할 수 있다는 점에서 누산기와 매우 유사합니다. "B"레지스터는 두 개의 8051 명령어에서만 사용됩니다.MUL ABDIV AB. A를 다른 숫자로 빠르고 쉽게 곱하거나 나누려면 다른 숫자를 "B"에 저장하고이 두 가지 지침을 사용할 수 있습니다. MUL 및 DIV 명령어를 사용하는 것 외에도 "B"레지스터는 9 번째 R 레지스터처럼 또 다른 임시 저장 레지스터로 자주 사용됩니다.

데이터 포인터

DPTR (Data Pointer)은 8051에서 사용자가 액세스 할 수있는 유일한 16 비트 (2 바이트) 레지스터입니다. 누산기, R0–R7 레지스터 및 B 레지스터는 1 바이트 값 레지스터입니다. DPTR은 데이터를 가리키는 데 사용됩니다. 8051에서 DPTR로 표시된 주소를 사용하여 외부 메모리에 액세스하는 데 사용됩니다. DPTR은 사용 가능한 유일한 16 비트 레지스터이며 2 바이트 값을 저장하는 데 자주 사용됩니다.

프로그램 카운터

프로그램 카운터 (PC)는 메모리에서 실행할 다음 명령을 찾을 수있는 위치를 8051에 알려주는 2 바이트 주소입니다. PC는 8051이 초기화 될 때 0000h에 시작하고 명령이 실행 된 후 매번 증가합니다. PC가 항상 1 씩 증가하는 것은 아닙니다. 일부 명령어는 2 바이트 또는 3 바이트가 필요할 수 있습니다. 이 경우 PC는 2 또는 3 씩 증가합니다.

Branch, jump, 및 interrupt연산은 다음 순차 위치가 아닌 주소로 프로그램 카운터를로드합니다. 파워 온 리셋을 활성화하면 레지스터의 모든 값이 손실됩니다. 이는 리셋시 PC의 값이 0이라는 것을 의미하며, CPU가 ROM 위치 0000에서 첫 번째 opcode를 가져 오도록합니다. 이는 CPU가 0000 위치를 찾을 것으로 예상하기 때문에 ROM 위치 0000에 업 코드의 첫 번째 바이트를 배치해야 함을 의미합니다. 첫 번째 지시.

스택 포인터 (SP)

DPTR 및 PC를 제외한 모든 레지스터와 마찬가지로 스택 포인터는 8 비트 (1 바이트) 값을 보유 할 수 있습니다. 스택 포인터는 스택에서 다음 값이 제거 될 위치를 알려줍니다. 값이 스택으로 푸시되면 SP 값이 증가한 다음 결과 메모리 위치에 값이 저장됩니다. 값이 스택에서 튀어 나오면 SP에 표시된 메모리 위치에서 값이 반환되고 SP 값이 감소합니다.

이 작동 순서는 중요합니다. SP는 8051이 초기화되면 07h로 초기화됩니다. 값이 동시에 스택에 푸시되면 8051이 먼저 SP 값 (07h에서 08h로)을 증가시킨 다음 푸시 된 값을 해당 메모리에 저장하기 때문에 값이 내부 RAM 주소 08h에 저장됩니다. 주소 (08h). SP는 PUSH, POP, ACALL, LCALL, RET 및 RETI의 6 가지 명령에 의해 8051에 의해 직접 수정됩니다.

8051의 ROM 공간

8051의 일부 제품군에는 4K 바이트의 온칩 ROM (예 : 8751, AT8951) 만 있습니다. 일부는 AT89C52와 같은 8K ROM을 가지고 있으며 Dallas Semiconductor와 같은 32K 바이트 및 64K 바이트 온칩 ROM을 가진 일부 제품군이 있습니다. 기억해야 할 점은 8051의 프로그램 카운터가 16 비트 레지스터 (0000 ~ FFFF 주소)이기 때문에 8051 제품군의 어떤 구성원도 64K 바이트 이상의 opcode에 액세스 할 수 없다는 것입니다.

8051 내부의 프로그램 ROM의 첫 번째 위치는 0000H의 주소를 갖지만 마지막 위치는 칩의 ROM 크기에 따라 다를 수 있습니다. 8051 제품군 중 AT8951에는 메모리 주소가 0000 (첫 번째 위치)에서 0FFFH (마지막 위치)까지 인 $ k 바이트의 온칩 ROM이 있습니다.

8051 플래그 비트 및 PSW 레지스터

PSW (프로그램 상태 어) 레지스터는 8 비트 레지스터입니다. flag register. 8 비트 폭이지만 6 비트 만 사용됩니다. 사용되지 않은 두 비트는user-defined flags. 4 개의 플래그가 호출됩니다.conditional flags, 이는 명령어가 실행 된 후 발생하는 조건을 나타냅니다. 이 4 개는CY (나르다), AC (보조 캐리), P (패리티) 및 OV(과다). RS0 및 RS1 비트는 뱅크 레지스터를 변경하는 데 사용됩니다. 다음 그림은 프로그램 상태 워드 레지스터를 보여줍니다.

PSW 레지스터에는 CPU의 현재 상태를 반영하는 상태 비트가 포함되어 있습니다.

CY CA F0 RS1 RS0 OV -

CY PSW.7 캐리 플래그
AC PSW.6 보조 캐리 플래그
F0 PSW.5 일반 용도로 사용자가 플래그 0을 사용할 수 있습니다.
RS1 PSW.4 뱅크 선택기 비트 1 등록
RS0 PSW.3 뱅크 선택기 비트 0 등록
OV PSW.2 오버플로 플래그
- PSW.1 사용자 정의 가능한 FLAG
PSW.0 패리티 플래그. 누산기에서 1 비트의 짝수 / 홀수를 나타 내기 위해 명령주기 동안 하드웨어에 의해 설정 / 삭제됩니다.

RS0 및 RS1 비트를 사용하여 해당 레지스터 뱅크 비트를 선택할 수 있습니다.

RS1 RS2 은행 등록 주소
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 18H-1FH
  • CY, the carry flag−이 캐리 플래그는 D7 비트에서 수행 될 때마다 설정됩니다 (1). 8 비트 더하기 또는 빼기 작업 후에 영향을받습니다. 또한 "SETB C"및 "CLR C"와 같은 명령에 의해 직접 1 또는 0으로 재설정 할 수 있습니다. 여기서 "SETB"는 세트 비트 캐리를 나타내고 "CLR"은 클리어 캐리를 나타냅니다.

  • AC, auxiliary carry flag− ADD 또는 SUB 작동 중에 D3 및 D4에서 캐리가 발생하면 AC 비트가 설정됩니다. 그렇지 않으면 지워집니다. 이진 코드 십진 산술을 수행하는 명령어에 사용됩니다.

  • P, the parity flag− 패리티 플래그는 누산기 레지스터에서만 1의 수를 나타냅니다. A 레지스터에 홀수의 1이 포함되어 있으면 P = 1입니다. 1이 짝수 인 경우 P = 0입니다.

  • OV, the overflow flag−이 플래그는 부호있는 숫자 연산의 결과가 너무 커서 상위 비트가 부호 비트로 넘칠 때마다 설정됩니다. 부호있는 산술 연산에서 오류를 감지하는 데만 사용됩니다.

다음 명령어에서 9CH 및 64H를 추가 한 후 CY, AC 및 P 플래그의 상태를 표시합니다.

MOV A, # 9CH

A, # 64H 추가

Solution:  9C   10011100 
          +64   01100100 
          100   00000000 
			 
CY = 1 since there is a carry beyond D7 bit  
AC = 0 since there is a carry from D3 to D4 
P  = 0 because the accumulator has even number of 1's

8051 마이크로 컨트롤러에는 총 128 바이트의 RAM이 있습니다. 128 바이트의 RAM 할당에 대해 논의하고 스택 및 레지스터로서의 사용량을 조사합니다.

8051의 RAM 메모리 공간 할당

8051 내부의 128 바이트 RAM에는 00-7FH 주소가 할당됩니다. 메모리 위치로 직접 액세스 할 수 있으며 다음과 같이 세 가지 그룹으로 나뉩니다.

  • 00H에서 1FH 위치까지 32 바이트는 레지스터 뱅크와 스택 용으로 따로 설정됩니다.

  • 20H ~ 2FH 위치에서 16 바이트는 비트 주소 지정 가능 읽기 / 쓰기 메모리 용으로 따로 설정됩니다.

  • 30H ~ 7FH 위치에서 80 바이트는 읽기 및 쓰기 스토리지에 사용됩니다. 그것은 다음과 같이 불린다scratch pad. 이 80 개 위치의 RAM은 8051 프로그래머가 데이터 및 매개 변수를 저장하기 위해 널리 사용됩니다.

8051에 은행 등록

레지스터 뱅크와 스택을 위해 총 32 바이트의 RAM이 따로 설정됩니다. 이러한 32 바이트는 각 뱅크에 8 개의 레지스터 R0–R7이있는 4 개의 레지스터 뱅크로 나뉩니다. 0에서 7까지의 RAM 위치는 R0–R7의 뱅크 0에 대해 따로 설정됩니다. 여기서 R0은 RAM 위치 0, R1은 RAM 위치 1, R2는 위치 2 등으로 뱅크의 R7에 속하는 메모리 위치 7까지 계속됩니다. 0.

레지스터 R0–R7의 두 번째 뱅크는 RAM 위치 08에서 시작하여 OFH 위치로 이동합니다. R0–R7의 세 번째 뱅크는 메모리 위치 10H에서 시작하여 17H 위치로 이동합니다. 마지막으로 RAM 위치 18H ~ 1FH는 R0–R7의 네 번째 뱅크를 위해 따로 설정됩니다.

기본 등록 은행

RAM 위치 00–1F가 네 개의 레지스터 뱅크에 대해 따로 설정되어 있으면 8051의 전원이 켜질 때 R0–R7의 어떤 레지스터 뱅크에 액세스 할 수 있습니까? 대답은 레지스터 뱅크 0입니다. 즉, 8051을 프로그래밍 할 때 0에서 7까지의 RAM 위치는 R0에서 R7이라는 이름으로 액세스됩니다. 이러한 RAM 위치를 메모리 위치가 아닌 R0에서 R7과 같은 이름으로 참조하는 것이 훨씬 쉽기 때문입니다.

레지스터 뱅크 전환 방법

레지스터 뱅크 0은 8051의 전원이 켜질 때 기본값입니다. PSW 레지스터를 사용하여 다른 뱅크로 전환 할 수 있습니다. PSW의 D4 및 D3 비트는 비트 주소 지정 명령 SETB 및 CLR에 의해 액세스 될 수 있기 때문에 원하는 레지스터 뱅크를 선택하는 데 사용됩니다. 예를 들어 "SETB PSW.3"은 PSW.3 = 1로 설정하고 뱅크 레지스터 1을 선택합니다.

RS1 RS2 은행 선택
0 0 뱅크 0
0 1 뱅크 1
1 0 Bank2
1 1 뱅크 3

스택 및 운영

8051에 스택

스택은 CPU가 데이터 또는 메모리 주소와 같은 정보를 임시로 저장하는 데 사용하는 RAM의 섹션입니다. CPU는 제한된 수의 레지스터를 고려하여이 저장 영역이 필요합니다.

스택에 액세스하는 방법

스택은 RAM의 한 부분이므로 CPU 내부에이를 가리키는 레지스터가 있습니다. 스택에 액세스하는 데 사용되는 레지스터를 스택 포인터 레지스터라고합니다. 8051의 스택 포인터는 8 비트 폭이며 00에서 FFH까지의 값을 가질 수 있습니다. 8051이 초기화되면 SP 레지스터에는 07H 값이 포함됩니다. 이는 RAM 위치 08이 스택에 사용되는 첫 번째 위치임을 의미합니다. 스택에있는 CPU 레지스터의 저장 작업을PUSH, 스택의 내용을 CPU 레지스터로 다시 가져 오는 것을 POP.

스택에 밀어 넣기

8051에서 SP (스택 포인터)는 스택의 마지막으로 사용 된 위치를 가리 킵니다. 데이터가 스택에 푸시되면 스택 포인터 (SP)가 1 씩 증가합니다. PUSH가 실행되면 레지스터의 내용이 스택에 저장되고 SP가 1 씩 증가합니다. 레지스터를 스택에 푸시하려면 RAM 주소를 사용해야합니다. 예를 들어 "PUSH 1"명령은 레지스터 R1을 스택에 푸시합니다.

스택에서 팝

스택의 내용을 주어진 레지스터로 다시 팝하는 것은 푸시 프로세스와 반대입니다. 모든 팝 작업에서 스택의 최상위 바이트는 명령어에 지정된 레지스터에 복사되고 스택 포인터는 한 번 감소합니다.

프로그램의 흐름은 제어 전송 명령이 실행되지 않는 한 한 명령에서 다음 명령으로 순차적으로 진행됩니다. 어셈블리 언어의 다양한 유형의 제어 전송 명령에는 조건부 또는 무조건 점프 및 호출 명령이 포함됩니다.

루프 및 점프 지침

8051에서 반복

일련의 명령을 특정 횟수만큼 반복하는 것을 loop. 지침DJNZ reg, label루프 작업을 수행하는 데 사용됩니다. 이 명령어에서 레지스터는 1 씩 감소합니다. 0이 아니면 8051은 레이블이 참조하는 대상 주소로 점프합니다.

레지스터는 루프가 시작되기 전에 반복 횟수에 대한 카운터와 함께로드됩니다. 이 명령어에서는 레지스터 감소와 점프 결정이 모두 단일 명령어로 결합됩니다. 레지스터는 R0–R7 중 하나 일 수 있습니다. 카운터는 RAM 위치가 될 수도 있습니다.

Multiply 25 by 10 using the technique of repeated addition.

Solution− 곱셈기만큼 곱셈을 반복적으로 더하여 곱셈을 수행 할 수 있습니다. 예를 들면

25 * 10 = 250 (FAH)

25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250

MOV A,#0             ;A = 0,clean ACC 
   MOV R2,#10           ; the multiplier is replaced in R2 
   Add A,#25            ;add the multiplicand to the ACC 
	
AGAIN:DJNZ R2, 
AGAIN:repeat  until R2 = 0 (10 times) 

   MOV R5 , A           ;save A in R5 ;R5 (FAH)

Drawback in 8051 − 명령어를 사용한 반복 동작 DJNZ Reg label256 반복으로 만 제한됩니다. 조건부 점프가 수행되지 않으면 점프 다음의 명령이 실행됩니다.

루프 내부에서 반복

다른 루프 내부에서 루프를 사용하면 nested loop. 최대 개수가 256 개로 제한 될 때 개수를 유지하기 위해 두 개의 레지스터가 사용됩니다. 따라서이 방법을 사용하여 256 회 이상 동작을 반복합니다.

Example

프로그램 작성-

  • 55H 값으로 어큐뮬레이터를로드합니다.
  • ACC를 700 번 보완합니다.

Solution− 700은 255 (모든 레지스터의 최대 용량)보다 크므로 2 개의 레지스터가 카운트를 유지하는 데 사용됩니다. 다음 코드는 카운트에 두 개의 레지스터 R2와 R3을 사용하는 방법을 보여줍니다.

MOV A,#55H            ;A = 55H 
	
NEXT: MOV R3,#10         ;R3 the outer loop counter 
AGAIN:MOV R2,#70         ;R2 the inner loop counter 

   CPL A                 ;complement

기타 조건부 점프

다음 표는 8051에서 사용 된 조건부 점프를 나열합니다.

교수 동작
JZ A = 0이면 점프
JNZ A ≠ 0이면 점프
DJNZ 레지스터 ≠ 0 인 경우 감소 및 점프
CJNE A, 데이터 A ≠ 데이터이면 점프
CJNE reg, #data 바이트 ≠ 데이터이면 점프
JC CY = 1이면 점프
JNC CY ≠ 1이면 점프
JB 비트 = 1이면 점프
JNB 비트 = 0이면 점프
JBC 비트 = 1이면 점프하고 비트를 지 웁니다.
  • JZ (jump if A = 0)−이 지침에서는 누산기의 내용을 확인합니다. 0이면 8051은 대상 주소로 점프합니다. JZ 명령어는 누산기에만 사용할 수 있으며 다른 레지스터에는 적용되지 않습니다.

  • JNZ (jump if A is not equal to 0)−이 명령어에서 누산기의 내용이 0이 아닌지 확인합니다. 0이 아니면 8051은 대상 주소로 점프합니다.

  • JNC (Jump if no carry, jumps if CY = 0)− 플래그 (또는 PSW) 레지스터의 Carry 플래그 비트는 "JNC 레이블"점프 여부를 결정하는 데 사용됩니다. CPU는 캐리 플래그가 올라 갔는지 확인합니다 (CY = 1). 올라가지 않으면 CPU는 레이블 주소에서 명령을 가져와 실행하기 시작합니다. CY = 1이면 점프하지 않고 JNC 아래의 다음 명령을 실행합니다.

  • JC (Jump if carry, jumps if CY = 1) − CY = 1이면 대상 주소로 점프합니다.

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note − 모든 조건부 점프는 짧은 점프라는 점에 유의해야합니다. 즉, 대상 주소는 프로그램 카운터 내용의 –128 ~ +127 바이트 내에 있어야합니다.

무조건 점프 지침

8051에는 두 가지 무조건 점프가 있습니다.

  • LJMP (long jump)− LJMP는 첫 번째 바이트가 opcode를 나타내고 두 번째 및 세 번째 바이트가 대상 위치의 16 비트 주소를 나타내는 3 바이트 명령어입니다. 2 바이트 대상 주소는 0000에서 FFFFH까지 모든 메모리 위치로 점프 할 수 있도록하는 것입니다.

  • SJMP (short jump)− 첫 번째 바이트가 opcode이고 두 번째 바이트가 대상 위치의 상대 주소 인 2 바이트 명령어입니다. 상대 주소의 범위는 00H에서 FFH까지이며 앞뒤 점프로 나뉩니다. 즉, 현재 PC의 주소 (프로그램 카운터)에 상대적인 메모리 –128 ~ +127 바이트 이내입니다. 순방향 점프의 경우 대상 주소는 현재 PC에서 127 바이트의 공간 내에있을 수 있습니다. 역방향 점프의 경우 대상 주소는 현재 PC에서 –128 바이트 이내 일 수 있습니다.

짧은 점프 주소 계산

모든 조건부 점프 (JNC, JZ 및 DJNZ)는 2 바이트 명령어이기 때문에 짧은 점프입니다. 이 명령어에서 첫 번째 바이트는 opcode를 나타내고 두 번째 바이트는 상대 주소를 나타냅니다. 대상 주소는 항상 프로그램 카운터 값에 상대적입니다. 대상 주소를 계산하기 위해 두 번째 바이트가 점프 바로 아래의 명령어 PC에 추가됩니다. 아래에 주어진 프로그램을보세요-

Line   PC    Op-code   Mnemonic   Operand 
1      0000               ORG       0000 
2      0000  7800         MOV       R0,#003  
3      0002  7455         MOV       A,#55H0 
4      0004  6003         JZ        NEXT 
5      0006  08           INC       R0 
6      0007  04   AGAIN:  INC       A 
7      0008  04           INC       A 
8      0009  2477 NEXT:   ADD       A, #77h 
9      000B  5005         JNC       OVER 
10     000D  E4           CLR       A
11     000E  F8           MOV       R0, A 
12     000F  F9           MOV       R1, A 
13     0010  FA          MOV       R2, A 
14     0011  FB           MOV       R3, A 
15     0012  2B   OVER:   ADD       A, R3 
16     0013  50F2         JNC       AGAIN 
17     0015  80FE HERE:   SJMP      HERE 
18     0017             END

역방향 점프 대상 주소 계산

전진 점프의 경우 변위 값은 0에서 127 (16 진수로 00에서 7F) 사이의 양수입니다. 그러나 뒤로 점프하는 경우 변위는 0에서 -128 사이의 음수 값입니다.

통화 지침

CALL은 서브 루틴 또는 메소드를 호출하는 데 사용됩니다. 서브 루틴은 자주 수행해야하는 작업이나 작업을 수행하는 데 사용됩니다. 이것은 프로그램을 더 구조화하고 메모리 공간을 절약합니다. LCALL과 ACALL의 두 가지 명령이 있습니다.

LCALL (긴 전화)

LCALL은 첫 번째 바이트가 opcode를 나타내고 두 번째 및 세 번째 바이트가 대상 서브 루틴의 주소를 제공하는 데 사용되는 3 바이트 명령어입니다. LCALL은 8051의 64K 바이트 주소 공간 내에서 사용 가능한 서브 루틴을 호출하는 데 사용할 수 있습니다.

호출 된 서브 루틴 실행 후 지점으로 성공적으로 복귀하기 위해 CPU는 스택의 LCALL 바로 아래에 명령어 주소를 저장합니다. 따라서 서브 루틴이 호출되면 제어가 해당 서브 루틴으로 전송되고 프로세서는 PC (프로그램 카운터)를 스택에 저장하고 새 위치에서 명령을 가져 오기 시작합니다. RET (return) 명령은 서브 루틴 실행을 마친 후 제어를 호출자에게 다시 전송합니다. 모든 서브 루틴은 RET를 마지막 명령어로 사용합니다.

ACALL (절대 호출)

ACALL은 3 바이트 인 LCALL과 달리 2 바이트 명령어입니다. 2 바이트 중 11 비트 만 주소로 사용되기 때문에 서브 루틴의 대상 주소는 2K 바이트 내에 있어야합니다. ACALL과 LCALL의 차이점은 LCALL의 대상 주소는 8051의 64K 바이트 주소 공간 내에있을 수 있고 CALL의 대상 주소는 2K 바이트 범위 내에 있다는 것입니다.

addressing mode주어진 메모리 위치를 지정하는 방법을 나타냅니다. 다음과 같이이 명령어를 실행하는 다섯 가지 방법 또는 다섯 가지 주소 지정 모드가 있습니다.

  • 즉시 주소 지정 모드
  • 직접 주소 지정 모드
  • 직접 주소 지정 모드 등록
  • 간접 주소 지정 모드 등록
  • 인덱싱 된 주소 지정 모드

즉시 주소 지정 모드

예를 들어 보겠습니다.

MOV A, #6AH

일반적으로 다음과 같이 쓸 수 있습니다.

MOV A, #data

그것은 다음과 같이 불립니다. immediate 8 비트 데이터가 누산기 (대상 피연산자)로 즉시 전송되기 때문입니다.

다음 그림은 위의 명령어와 그 실행을 설명합니다. opcode 74H는 0202 주소에 저장됩니다. 데이터 6AH는 프로그램 메모리의 0203 주소에 저장됩니다. opcode 74H를 읽은 후, 다음 프로그램 메모리 주소의 데이터는 누산기 A로 전송됩니다 (E0H는 누산기의 주소입니다). 명령어는 2 바이트이고 한 사이클로 실행되므로 프로그램 카운터는 2 씩 증가하고 프로그램 메모리의 0204를 가리 킵니다.

Note− 6AH 앞의 '#'기호는 피연산자가 데이터 (8 비트)임을 나타냅니다. '#'이 없으면 16 진수가 주소로 사용됩니다.

직접 주소 지정 모드

이것은 피연산자를 지정하는 또 다른 방법입니다. 여기서 데이터 (소스 데이터)의 주소는 피연산자로 지정됩니다. 예를 들어 보겠습니다.

MOV A, 04H

레지스터 뱅크 # 0 (4 번째 레지스터)의 주소는 04H입니다. MOV 명령이 실행되면 레지스터 04H에 저장된 데이터가 누산기로 이동됩니다. 레지스터 04H가 데이터 1FH를 보유하므로 1FH는 누산기로 이동됩니다.

Note− 즉시 모드와 달리 직접 주소 지정 모드에서는 '#'을 사용하지 않았습니다. '#'을 사용했다면 데이터 값 04H가 1FH 대신 누산기로 전송되었을 것입니다.

이제 다음 그림을 살펴보십시오. 명령이 어떻게 실행되는지 보여줍니다.

위의 그림에 표시된대로 완료하는 데 1주기가 필요한 2 바이트 명령어입니다. PC는 2 씩 증가하고 0204를 가리 킵니다. 명령 MOV A, 주소의 opcode는 E5H입니다. 0202에서 명령이 실행되면 (E5H) 누산기가 활성화되고 데이터를 수신 할 준비가됩니다. 그러면 PC는 다음 주소 인 0203으로 이동하여 소스 데이터 (누산기로 전송 될)가있는 04H의 위치 주소를 조회합니다. 04H에서 컨트롤은 데이터 1F를 찾아서 누산기로 전송하므로 실행이 완료됩니다.

직접 주소 지정 모드 등록

이 주소 지정 모드에서는 레지스터 이름을 직접 (소스 피연산자로) 사용합니다. 예를 들어 이해하려고 노력합시다.

MOV A, R4

한 번에 레지스터는 R0에서 R7까지의 값을 가질 수 있습니다. 32 개의 레지스터가 있습니다. 레지스터 주소 지정을 위해 8 개의 변수로 32 개의 레지스터를 사용하기 위해 레지스터 뱅크가 사용됩니다. 0에서 3까지 이름이 지정된 4 개의 레지스터 뱅크가 있습니다. 각 뱅크는 R0에서 R7까지 이름이 지정된 8 개의 레지스터로 구성됩니다.

한 번에 단일 레지스터 뱅크를 선택할 수 있습니다. 등록 은행 선택은Special Function Register (SFR) 명명 Processor Status Word(PSW). PSW는 필요에 따라 각 비트를 프로그래밍 할 수있는 8 비트 SFR입니다. 비트는 PSW.0에서 PSW.7까지 지정됩니다. PSW.3 및 PSW.4는 레지스터 뱅크를 선택하는 데 사용됩니다.

이제 다음 그림을보고 작동 방식을 명확하게 이해하십시오.

Opcode EC는 MOV A, R4에 사용됩니다. opcode는 주소 0202에 저장되며 실행될 때 제어는 해당 레지스터 뱅크 (PSW에서 선택됨)의 R4로 직접 이동합니다. 레지스터 뱅크 # 0을 선택하면 레지스터 뱅크 # 0의 R4 데이터가 누산기로 이동됩니다. 여기서 2F는 04H에 저장됩니다. 04H는 레지스터 뱅크 # 0의 R4 주소를 나타냅니다.

데이터 (2F) 이동은 굵게 강조 표시됩니다. 2F는 데이터 메모리 위치 0CH에서 누산기로 전송되고 점선으로 표시됩니다. 0CH는 레지스터 뱅크 # 1의 레지스터 4 (R4)의 주소 위치입니다. 위 명령어는 1 바이트이며 완전한 실행을 위해 1 사이클이 필요합니다. 즉, 레지스터 직접 주소 지정 모드를 사용하여 프로그램 메모리를 절약 할 수 있습니다.

간접 주소 지정 모드 등록

이 주소 지정 모드에서 데이터의 주소는 레지스터에 피연산자로 저장됩니다.

MOV A, @R0

여기서 R0 내부의 값은 누산기로 전송 될 데이터를 보유하는 주소로 간주됩니다. Example: R0의 값이 20H이고 데이터 2FH가 주소 20H에 저장되면이 명령을 실행 한 후 값 2FH가 누산기로 전송됩니다. 다음 그림을 참조하십시오.

그래서 opcode는 MOV A, @R0E6H입니다. 레지스터 뱅크 # 0이 선택되었다고 가정하면 레지스터 뱅크 # 0의 R0은 데이터 20H를 보유합니다. 프로그램 제어는 20H로 이동하여 데이터 2FH를 찾고 2FH를 누산기로 전송합니다. 이것은 1 바이트 명령어이며 프로그램 카운터는 1 씩 증가하고 프로그램 메모리의 0203으로 이동합니다.

Note− R0 및 R1 만 레지스터 간접 주소 지정 명령어를 구성 할 수 있습니다. 즉, 프로그래머는 @ R0 또는 @ R1을 사용하여 명령어를 만들 수 있습니다. 모든 등록 은행이 허용됩니다.

인덱싱 된 주소 지정 모드

색인화 된 주소 지정 모드의 개념을 이해하기 위해 두 가지 예를 살펴 보겠습니다. 다음 지침을 살펴보십시오-

MOVC A, @A+DPTR

MOVC A, @A+PC

여기서 DPTR은 데이터 포인터이고 PC는 프로그램 카운터입니다 (둘 다 16 비트 레지스터 임). 첫 번째 예를 고려하십시오.

MOVC A, @A+DPTR

소스 피연산자는 @ A + DPTR입니다. 여기에는이 위치의 소스 데이터가 포함됩니다. 여기서 우리는 누산기의 현재 내용과 함께 DPTR의 내용을 추가합니다. 이 추가는 소스 데이터의 주소 인 새 주소를 제공합니다. 이 주소가 가리키는 데이터는 누산기로 전송됩니다.

opcode는 93H입니다. DPTR의 값은 01FE입니다. 여기서 01은 DPH (상위 8 비트)에 있고 FE는 DPL (하위 8 비트)에 있습니다. 누산기 값은 02H입니다. 그런 다음 16 비트 추가가 수행되고 01FE H + 02H는 0200 H가됩니다. 0200H 위치의 데이터는 누산기로 전송됩니다. 누산기 (02H) 내부의 이전 값이 0200H의 새 데이터로 대체됩니다. 누산기의 새 데이터는 그림에서 강조 표시됩니다.

이것은 실행에 2 사이클이 필요한 1 바이트 명령어이며이 명령어에 필요한 실행 시간은 이전 명령어 (모두 각각 1 사이클 임)에 비해 높습니다.

다른 예 MOVC A, @A+PC위의 예와 동일한 방식으로 작동합니다. 누산기로 DPTR을 추가하는 대신 여기에서 프로그램 카운터 (PC) 내부의 데이터가 누산기와 함께 추가되어 대상 주소를 얻습니다.

특수 기능 레지스터 (또는 특수 목적 레지스터 또는 단순히 특수 레지스터)는 마이크로 프로세서의 다양한 기능을 제어하거나 모니터링하는 마이크로 프로세서 내의 레지스터입니다. 특수 레지스터는 프로세서의 일부 특수 기능 또는 상태와 밀접하게 관련되어 있으므로 일반 명령 (예 : 추가, 이동 등)으로 직접 쓸 수 없습니다. 대신, 일부 프로세서 아키텍처의 일부 특수 레지스터는이를 수정하기위한 특수 명령이 필요합니다.

8051에서 레지스터 A, B, DPTR 및 PSW는 일반적으로 SFR (특수 기능 레지스터)이라고하는 레지스터 그룹의 일부입니다. SFR은 이름이나 주소로 액세스 할 수 있습니다.

다음 표는 SFR 및 해당 주소 목록을 보여줍니다.

바이트 주소 비트 주소
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0
E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
B8 - - - 기원전 BB BA B9 B8 IP
B0 B7 B6 B5 B4 B3 B2 B1 B0 P3
A2 AF - - AC AB AA A9 A8 IE
A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
99 비트 주소 지정 불가 SBUF
98 9F 9E 9D 9C 9B 9A 99 98 SCON
90 97 96 95 94 93 92 91 90 P1
8D 비트 주소 지정 불가 TH1
8C 비트 주소 지정 불가 TH0
8B 비트 주소 지정 불가 TL1
8A 비트 주소 지정 불가 TL0
89 비트 주소 지정 불가 TMOD
88 8F 8E 8D 8C 8B 8A 89 88 TCON
87 비트 주소 지정 불가 PCON
83 비트 주소 지정 불가 DPH
82 비트 주소 지정 불가 DPL
81 비트 주소 지정 불가 SP
80 87 87 85 84 83 82 81 80 P0

SFR 주소에 대해 다음 두 가지 사항을 고려하십시오.

  • 특수 기능 레지스터는 80H에서 FFH 사이의 주소를 가질 수 있습니다. 이 주소는 00에서 7FH까지의 주소가 8051 내부의 RAM 메모리 주소이므로 80H 이상입니다.

  • 80에서 FF까지의 모든 주소 공간이 SFR에서 사용되는 것은 아닙니다. 사용하지 않는 위치 (80H ~ FFH)는 예약되어 있으며 8051 프로그래머가 사용해서는 안됩니다.

CY PSW.7 캐리 플래그
AC PSW.6 보조 캐리 플래그
F0 PSW.5 일반 용도로 사용자가 플래그 0을 사용할 수 있습니다.
RS1 PSW.4 뱅크 선택기 비트 1 등록
RS0 PSW.3 뱅크 선택기 비트 0 등록
OV PSW.2 오버플로 플래그
- PSW.1 사용자 정의 가능한 FLAG
PSW.0 패리티 플래그. 누산기에서 1 비트의 짝수 / 홀수를 나타 내기 위해 명령주기 동안 하드웨어에 의해 설정 / 삭제됩니다.

다음 예에서 SFR 레지스터의 이름은 주소로 대체됩니다.

CY AC F0 RS1 RS0 OV -

RS0 및 RS1 비트를 사용하여 해당 레지스터 뱅크 비트를 선택할 수 있습니다.

RS1 RS2 은행 등록 주소
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 18H-1FH

PSW (Program Status Word)에는 CPU의 현재 상태를 반영하는 상태 비트가 포함되어 있습니다. 8051 변형은이 상태 정보와 함께 하나의 특수 기능 레지스터 PSW를 제공합니다. 8251은 PSW1이라는 두 번째 특수 기능 레지스터에서 사용할 수있는 두 개의 추가 상태 플래그 Z 및 N을 제공합니다.

timer시간 간격을 측정하는 데 사용되는 특수 유형의 시계입니다. 경과 시간을 측정하기 위해 0부터 위로 카운트하는 타이머를 종종stopwatch. 지정된 시간 간격부터 카운트 다운하고 시간 지연을 생성하는 데 사용되는 장치입니다. 예를 들어 모래 시계는 타이머입니다.

counter클럭 신호와 관련하여 특정 이벤트 또는 프로세스가 발생한 횟수를 저장 (때로는 표시)하는 장치입니다. 마이크로 컨트롤러 외부에서 발생하는 이벤트를 계산하는 데 사용됩니다. 전자 제품에서 카운터는 플립 플롭과 같은 레지스터 유형 회로를 사용하여 매우 쉽게 구현할 수 있습니다.

타이머와 카운터의 차이점

타이머와 카운터를 구별하는 포인트는 다음과 같습니다.

시간제 노동자 카운터
레지스터는 모든 기계주기마다 증가합니다. 레지스터는 외부 입력 핀 (T0, T1)에 해당하는 1에서 0으로의 전환을 고려하여 증가합니다.
최대 카운트 속도는 오실레이터 주파수의 1/12입니다. 최대 카운트 속도는 오실레이터 주파수의 1/24입니다.
타이머는 내부 클록의 주파수를 사용하고 지연을 생성합니다. 카운터는 외부 신호를 사용하여 펄스를 계산합니다.

8051의 타이머 및 관련 레지스터

8051에는 타이머 0과 타이머 1의 두 가지 타이머가 있습니다. 이들은 타이머 또는 이벤트 카운터로 사용할 수 있습니다. Timer 0과 Timer 1은 모두 16 비트입니다. 8051은 8 비트 아키텍처를 따르기 때문에 각 16 비트는 하위 바이트와 상위 바이트의 두 개의 개별 레지스터로 액세스됩니다.

타이머 0 레지스터

Timer 0의 16 비트 레지스터는 하위 및 상위 바이트로 액세스됩니다. 하위 바이트 레지스터를 TL0 (타이머 0 하위 바이트)이라고하고 상위 바이트 레지스터를 TH0 (타이머 0 상위 바이트)이라고합니다. 이 레지스터는 다른 레지스터처럼 액세스 할 수 있습니다. 예를 들어, 지침MOV TL0, #4H 값을 Timer # 0의 하위 바이트로 이동합니다.

타이머 1 레지스터

Timer 1의 16 비트 레지스터는 하위 및 상위 바이트로 액세스됩니다. 하위 바이트 레지스터를 TL1 (타이머 1 하위 바이트)이라고하고 상위 바이트 레지스터를 TH1 (타이머 1 상위 바이트)이라고합니다. 이 레지스터는 다른 레지스터처럼 액세스 할 수 있습니다. 예를 들어, 지침MOV TL1, #4H 값을 Timer 1의 하위 바이트로 이동합니다.

TMOD (타이머 모드) 레지스터

Timer 0과 Timer 1은 모두 동일한 레지스터를 사용하여 다양한 타이머 작동 모드를 설정합니다. 타이머 0에는 하위 4 비트를, 타이머에는 상위 4 비트를 따로 설정하는 8 비트 레지스터입니다. 각각의 경우 하위 2 비트는 미리 타이머 모드를 설정하는 데 사용되고 상위 2 비트는 위치를 지정하는 데 사용됩니다.

Gate − 설정되면 INT (0,1)이 높은 동안에 만 타이머가 실행됩니다.

C/T − 카운터 / 타이머 선택 비트.

M1 − 모드 비트 1

M0 − 모드 비트 0.

모든 타이머에는 시작 및 중지 수단이 있습니다. 일부 타이머는 소프트웨어로, 일부는 하드웨어로, 일부는 소프트웨어 및 하드웨어 제어가 모두 있습니다. 8051 타이머에는 소프트웨어 및 하드웨어 컨트롤이 모두 있습니다. 타이머의 시작 및 중지는 명령을 사용하여 소프트웨어로 제어됩니다.SETB TR1CLR TR1 타이머 1의 경우 SETB TR0CLR TR0 타이머 0.

SETB 명령어는이를 시작하는 데 사용되며 CLR 명령어에 의해 중지됩니다. 이러한 명령어는 TMOD 레지스터에서 GATE = 0 인 동안 타이머를 시작하고 중지합니다. 타이머는 TMOD 레지스터에서 GATE = 1로 만들어 외부 소스에 의해 시작 및 중지 될 수 있습니다.

C / T (시계 / 타이머)

TMOD 레지스터의이 비트는 타이머가 delay generator 또는 event manager. C / T = 0이면 타이머 지연 생성을위한 타이머로 사용됩니다. 시간 지연을 생성하는 클럭 소스는 8051의 수정 주파수입니다. C / T = 0이면 8051에 연결된 수정 주파수는 8051 타이머가 일정한 간격으로 틱하는 속도도 결정합니다.

타이머 주파수는 항상 8051에 부착 된 크리스털 주파수의 1/12입니다. 다양한 8051 기반 시스템의 XTAL 주파수는 10MHz ~ 40MHz이지만 일반적으로 XTAL 주파수는 11.0592MHz로 작업합니다. 8051.XTAL = 11.0592의 직렬 통신을위한 전송 속도는 8051 시스템이 오류없이 PC와 통신 할 수 있도록하기 때문입니다.

M1 / M2

M1 M2 방법
0 0 13 비트 타이머 모드.
0 1 16 비트 타이머 모드.
1 0 8 비트 자동 재 장전 모드.
1 1 유출 모드.

타이머의 다른 모드

모드 0 (13 비트 타이머 모드)

모드 0의 타이머 1과 타이머 0은 모두 8 비트 카운터로 작동합니다 (32로 나누기 프리스케일러 사용). 타이머 레지스터는 TH1의 8 비트와 TL1의 하위 5 비트로 구성된 13 비트 레지스터로 구성됩니다. TL1의 상위 3 비트는 확정되지 않으며 무시해야합니다. 실행 플래그 (TR1)를 설정해도 레지스터는 지워지지 않습니다. 타이머 인터럽트 플래그 TF1은 카운트가 모두 1에서 모두 0으로 롤오버 될 때 설정됩니다. 모드 0 작동은 타이머 1과 동일합니다.

모드 1 (16 비트 타이머 모드)

타이머 모드 "1"은 16 비트 타이머이며 일반적으로 사용되는 모드입니다. 16 비트가 모두 사용된다는 점을 제외하면 13 비트 모드와 동일한 방식으로 작동합니다. TLx는 0부터 최대 255까지 증가합니다. 값 255에 도달하면 TLx는 0으로 재설정되고 THx는 1 씩 증가합니다. 전체 16 비트 타이머이므로 타이머는 최대 65536 개의 고유 값을 포함 할 수 있습니다. 65,536 기계 사이클 후에 다시 0으로 오버플로됩니다.

모드 2 (8 비트 자동 다시로드)

두 타이머 레지스터 모두 자동 재로드 기능이있는 8 비트 카운터 (TL1 및 TL0)로 구성됩니다. TL1 (TL0)의 오버플로는 TF1 (TF0)을 설정하고 소프트웨어에 의해 사전 설정된 Th1 (TH0)의 내용으로 TL1 (TL0)을 다시로드합니다. 다시로드하면 TH1 (TH0)이 변경되지 않습니다.

자동 새로 고침 모드의 장점은 타이머가 항상 200에서 255 사이의 값을 포함하도록 할 수 있다는 것입니다. 모드 0 또는 1을 사용하는 경우 코드에서 오버플로를 확인해야하며이 경우에는 타이머를 200으로 재설정하십시오.이 경우 귀중한 지침이 값을 확인하거나 다시로드됩니다. 모드 2에서는 마이크로 컨트롤러가이를 처리합니다. 모드 2에서 타이머를 구성한 후에는 타이머가 오버플로되었는지 확인하는 것에 대해 걱정할 필요가 없으며 마이크로 컨트롤러 하드웨어가 모든 작업을 수행하므로 값 재설정에 대해 걱정할 필요가 없습니다. 자동 다시로드 모드는 공통 전송 속도를 설정하는 데 사용됩니다.

모드 3 (분할 타이머 모드)

타이머 모드 "3"은 split-timer mode. 타이머 0이 모드 3에 배치되면 두 개의 개별 8 비트 타이머가됩니다. 타이머 0은 TL0이고 타이머 1은 TH0입니다. 두 타이머는 모두 0에서 255까지 계산되며 오버플로의 경우 다시 0으로 재설정됩니다. 타이머 1의 모든 비트는 이제 TH0에 연결됩니다.

타이머 0이 분할 모드에있을 때 실시간 타이머 1 (즉, TH1 및 TL1)은 모드 0, 1 또는 2에서 설정할 수 있지만,이를 수행하는 비트가 이제 TH0에 연결되어 있으므로 시작 / 중지 할 수 없습니다. 실제 타이머 1은 기계주기마다 증가합니다.

타이머 초기화

타이머 모드를 결정합니다. 지속적으로 실행되고 외부 핀과 독립적 인 16 비트 타이머를 고려하십시오.

TMOD SFR을 초기화하십시오. TMOD의 최하위 4 비트를 사용하고 Timer 0을 고려합니다. 타이머가 외부 핀과 독립적이되기를 원하므로 2 비트 GATE 0 및 C / T 0을 0으로 유지합니다. 16 비트 모드는 타이머 모드 1이므로 T0M1을 지우고 T0M0을 설정합니다. 실제로 켜는 유일한 비트는 TMOD의 비트 0입니다. 이제 다음 명령을 실행하십시오-

MOV TMOD,#01h

이제 타이머 0은 16 비트 타이머 모드이지만 타이머는 실행되지 않습니다. 실행 모드에서 타이머를 시작하려면 다음 명령을 실행하여 TR0 비트를 설정하십시오.

SETB TR0

이제 타이머 0은 즉시 계산을 시작하고 기계 사이클마다 한 번씩 증가합니다.

타이머 읽기

16 비트 타이머는 두 가지 방법으로 읽을 수 있습니다. 타이머의 실제 값을 16 비트 숫자로 읽거나 타이머가 오버플로 된시기를 감지합니다.

타이머 오버플로 감지

타이머가 가장 높은 값에서 0으로 오버플로되면 마이크로 컨트롤러는 TCON 레지스터에서 TFx 비트를 자동으로 설정합니다. 따라서 타이머의 정확한 값을 확인하는 대신 TFx 비트를 확인할 수 있습니다. TF0이 설정되면 타이머 0이 오버플로 된 것입니다. TF1이 설정되어 있으면 타이머 1이 오버플로 된 것입니다.

인터럽트는 즉각적인주의가 필요한 이벤트를 나타내는 하드웨어 또는 소프트웨어에 의해 방출되는 프로세서에 대한 신호입니다. 인터럽트가 발생할 때마다 컨트롤러는 현재 명령의 실행을 완료하고Interrupt Service Routine (ISR) 또는 Interrupt Handler. ISR은 프로세서 또는 컨트롤러에 인터럽트가 발생할 때 수행 할 작업을 알려줍니다. 인터럽트는 하드웨어 인터럽트 또는 소프트웨어 인터럽트 일 수 있습니다.

하드웨어 인터럽트

하드웨어 인터럽트는 디스크 컨트롤러 또는 외부 주변 장치와 같은 외부 장치에서 프로세서로 전송되는 전자 경고 신호입니다. 예를 들어, 키보드의 키를 누르거나 마우스를 움직이면 프로세서가 키 입력이나 마우스 위치를 읽도록하는 하드웨어 인터럽트가 트리거됩니다.

소프트웨어 인터럽트

소프트웨어 인터럽트는 프로세서에 의해 실행될 때 인터럽트를 발생시키는 예외적 인 조건 또는 명령 세트의 특수 명령에 의해 발생합니다. 예를 들어, 프로세서의 산술 논리 장치가 숫자를 0으로 나누는 명령을 실행하면 0으로 나누기 예외가 발생하여 컴퓨터가 계산을 중단하거나 오류 메시지를 표시하게됩니다. 소프트웨어 인터럽트 명령은 서브 루틴 호출과 유사하게 작동합니다.

폴링이란 무엇입니까?

지속적인 모니터링 상태는 다음과 같이 알려져 있습니다. polling. 마이크로 컨트롤러는 다른 장치의 상태를 계속 확인합니다. 그렇게하는 동안 다른 작업을 수행하지 않고 모니터링을 위해 모든 처리 시간을 소비합니다. 이 문제는 인터럽트를 사용하여 해결할 수 있습니다.

인터럽트 방식에서 컨트롤러는 인터럽트가 발생한 경우에만 응답합니다. 따라서 컨트롤러는 인터페이스 및 내장 장치의 상태 (플래그, 신호 등)를 정기적으로 모니터링 할 필요가 없습니다.

인터럽트 대 폴링

다음은 폴링과 인터럽트를 구별하는 비유입니다.

일시 정지 투표
인터럽트는 shopkeeper. 서비스 나 제품이 필요하면 그에게 가서 자신의 필요 사항을 알립니다. 인터럽트의 경우 플래그 또는 신호가 수신되면 컨트롤러에 서비스가 필요함을 알립니다. 폴링 방법은 salesperson. 판매원은 제품이나 서비스 구매를 요청하면서 집집마다 방문합니다. 마찬가지로 컨트롤러는 모든 장치에 대해 하나씩 플래그 또는 신호를 계속 모니터링하고 서비스가 필요한 구성 요소에 서비스를 제공합니다.

인터럽트 서비스 루틴

모든 인터럽트에 대해 ISR (인터럽트 서비스 루틴)이 있어야합니다. interrupt handler. 인터럽트가 발생하면 마이크로 컨트롤러는 인터럽트 서비스 루틴을 실행합니다. 모든 인터럽트에 대해 인터럽트 서비스 루틴 ISR의 주소를 보유하는 고정 된 위치가 메모리에 있습니다. ISR의 주소를 보관하기 위해 따로 설정 한 메모리 위치 테이블을 인터럽트 벡터 테이블이라고합니다.

인터럽트 벡터 테이블

8051의 RESET을 포함하여 6 개의 인터럽트가 있습니다.

인터럽트 ROM 위치 (16 진수)
인터럽트 ROM 위치 (HEX)
직렬 COM (RI 및 TI) 0023
타이머 1 인터럽트 (TF1) 001B
외부 HW 인터럽트 1 (INT1) 0013 P3.3 (13)
외부 HW 인터럽트 0 (INT0) 0003 P3.2 (12)
타이머 0 (TF0) 000B
초기화 0000 9
  • 리셋 핀이 활성화되면 8051은 주소 위치 0000으로 점프합니다. 이것은 파워 업 리셋입니다.

  • 두 개의 인터럽트가 타이머에 대해 따로 설정됩니다. 하나는 타이머 0 용이고 다른 하나는 타이머 1 용입니다. 메모리 위치는 인터럽트 벡터 테이블에서 각각 000BH 및 001BH입니다.

  • 하드웨어 외부 인터럽트를 위해 두 개의 인터럽트가 따로 설정됩니다. 핀 번호 12 및 핀 번호. 포트 3의 13은 각각 외부 하드웨어 인터럽트 INT0 및 INT1 용입니다. 메모리 위치는 인터럽트 벡터 테이블에서 각각 0003H 및 0013H입니다.

  • 직렬 통신에는 수신 및 전송 모두에 속하는 단일 인터럽트가 있습니다. 메모리 위치 0023H는이 인터럽트에 속합니다.

인터럽트를 실행하는 단계

인터럽트가 활성화되면 마이크로 컨트롤러는 다음 단계를 거칩니다.

  • 마이크로 컨트롤러는 현재 실행중인 명령어를 닫고 스택에 다음 명령어 (PC)의 주소를 저장합니다.

  • 또한 모든 인터럽트의 현재 상태를 내부적으로 (즉, 스택이 아님) 저장합니다.

  • 인터럽트 서비스 루틴의 주소를 보유하는 인터럽트 벡터 테이블의 메모리 위치로 점프합니다.

  • 마이크로 컨트롤러는 인터럽트 벡터 테이블에서 ISR의 주소를 가져 와서 점프합니다. 인터럽트 서비스 서브 루틴 인 RETI (인터럽트에서 복귀)를 실행하기 시작합니다.

  • RETI 명령을 실행하면 마이크로 컨트롤러는 중단 된 위치로 돌아갑니다. 첫째, 스택의 최상위 바이트를 PC로 팝하여 스택에서 프로그램 카운터 (PC) 주소를 가져옵니다. 그런 다음 해당 주소에서 실행을 시작합니다.

에지 트리거링과 레벨 트리거링

인터럽트 모듈은 레벨 트리거 또는 에지 트리거의 두 가지 유형입니다.

트리거 된 레벨 에지 트리거
레벨 트리거 인터럽트 모듈은 인터럽트 소스의 레벨이 어설 션 될 때마다 항상 인터럽트를 생성합니다. 에지 트리거 인터럽트 모듈은 인터럽트 소스의 어설 션 에지를 감지 할 때만 인터럽트를 생성합니다. 인터럽트 소스 레벨이 실제로 변경 될 때 에지가 감지됩니다. 또한 주기적 샘플링을 통해 감지 할 수 있으며 이전 샘플이 어설 션 해제되었을 때 어설 션 된 레벨을 감지 할 수 있습니다.
펌웨어 인터럽트 처리기가 인터럽트를 처리 할 때 인터럽트 소스가 여전히 어설 션되면 인터럽트 모듈이 인터럽트를 다시 생성하여 인터럽트 처리기가 다시 호출되도록합니다. 에지 트리거 인터럽트 모듈은 인터럽트 소스의 작동 방식에 관계없이 즉시 작동 할 수 있습니다.
레벨 트리거 인터럽트는 펌웨어에서 번거 롭습니다. 에지 트리거 인터럽트는 펌웨어의 코드 복잡성을 낮게 유지하고 펌웨어 조건 수를 줄이며 인터럽트 처리시 더 많은 유연성을 제공합니다.

인터럽트 활성화 및 비활성화

재설정시 모든 인터럽트는 활성화 된 경우에도 비활성화됩니다. 마이크로 컨트롤러가 인터럽트에 응답하려면 소프트웨어를 사용하여 인터럽트를 활성화해야합니다.

IE (인터럽트 활성화) 레지스터는 인터럽트 활성화 및 비활성화를 담당합니다. IE는 비트 주소 지정이 가능한 레지스터입니다.

인터럽트 활성화 레지스터

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA − 전역 활성화 / 비활성화.

  • - − 정의되지 않음.

  • ET2 − 타이머 2 인터럽트를 활성화합니다.

  • ES − 직렬 포트 인터럽트를 활성화합니다.

  • ET1 − 타이머 1 인터럽트를 활성화합니다.

  • EX1 − 외부 1 인터럽트를 활성화합니다.

  • ET0 − 타이머 0 인터럽트를 활성화합니다.

  • EX0 − 외부 0 인터럽트를 활성화합니다.

인터럽트를 활성화하려면 다음 단계를 따릅니다.

  • 나머지 레지스터를 적용하려면 IE 레지스터 (EA)의 비트 D7이 높아야합니다.

  • EA = 1이면 IE의 해당 비트가 높으면 인터럽트가 활성화되고 이에 응답합니다. EA = 0이면 IE 레지스터의 관련 핀이 높은 경우에도 인터럽트가 응답하지 않습니다.

8051의 인터럽트 우선 순위

인터럽트 중 하나에 더 높은 우선 순위를 할당하여 인터럽트 우선 순위를 변경할 수 있습니다. 이것은 레지스터를 프로그래밍하여 수행됩니다.IP (인터럽트 우선 순위).

다음 그림은 IP 레지스터의 비트를 보여줍니다. 재설정시 IP 레지스터에는 모두 0이 포함됩니다. 인터럽트에 더 높은 우선 순위를 부여하기 위해 IP 레지스터의 해당 비트를 높게 만듭니다.

- - - - PT1 PX1 PT0 PX0

- IP.7 구현되지 않았습니다.
- IP.6 구현되지 않았습니다.
- IP.5 구현되지 않았습니다.
- IP.4 구현되지 않았습니다.
PT1 IP.3 타이머 1 인터럽트 우선 순위 레벨을 정의합니다.
PX1 IP.2 외부 인터럽트 1 우선 순위 수준을 정의합니다.
PT0 IP.1 타이머 0 인터럽트 우선 순위 레벨을 정의합니다.
PX0 IP.0 외부 인터럽트 0 우선 순위 수준을 정의합니다.

인터럽트 내부 인터럽트

8051이 인터럽트에 속하는 ISR을 실행하고 다른 ISR이 활성화되면 어떻게됩니까? 이러한 경우 높은 우선 순위 인터럽트는 낮은 우선 순위 인터럽트를 인터럽트 할 수 있습니다. 이것은interrupt inside interrupt. 8051에서 낮은 우선 순위 인터럽트는 높은 우선 순위 인터럽트에 의해 인터럽트 될 수 있지만 다른 낮은 우선 순위 인터럽트에 의해 인터럽트 될 수 없습니다.

소프트웨어에 의한 인터럽트 트리거

시뮬레이션을 통해 ISR을 테스트해야하는 경우가 있습니다. 이것은 인터럽트를 high로 설정하는 간단한 명령으로 수행 할 수 있으며, 따라서 8051이 인터럽트 벡터 테이블로 점프하게합니다. 예를 들어, 타이머 1에 대해 IE 비트를 1로 설정합니다.SETB TF1 무엇을하든 8051을 인터럽트하고 강제로 인터럽트 벡터 테이블로 점프합니다.