Sistemas incorporados - Guia rápido

Sistema

Um sistema é um arranjo no qual todas as unidades montadas trabalham juntas de acordo com um conjunto de regras. Também pode ser definida como uma forma de trabalhar, organizar ou realizar uma ou várias tarefas de acordo com um plano fixo. Por exemplo, um relógio é um sistema de exibição das horas. Seus componentes seguem um conjunto de regras para mostrar o horário. Se uma de suas peças falhar, o relógio irá parar de funcionar. Portanto, podemos dizer que, em um sistema, todos os seus subcomponentes dependem uns dos outros.

Sistema Embutido

Como o nome sugere, Embedded significa algo que está ligado a outra coisa. Um sistema incorporado pode ser considerado um sistema de hardware de computador com software incorporado. Um sistema embarcado pode ser um sistema independente ou pode ser parte de um sistema grande. Um sistema embarcado é um microcontrolador ou sistema baseado em microprocessador que é projetado para executar uma tarefa específica. Por exemplo, um alarme de incêndio é um sistema embutido; sentirá apenas fumaça.

Um sistema embarcado tem três componentes -

  • Possui hardware.

  • Possui software de aplicação.

  • Possui sistema operacional em tempo real (RTOS) que supervisiona o software aplicativo e fornece mecanismo para permitir que o processador execute um processo conforme o agendamento seguindo um plano para controlar as latências. RTOS define a forma como o sistema funciona. Ele define as regras durante a execução do programa aplicativo. Um sistema embarcado de pequena escala pode não ter RTOS.

Portanto, podemos definir um sistema embarcado como um sistema de controle em tempo real baseado em microcontrolador, orientado por software, confiável e em tempo real.

Características de um sistema integrado

  • Single-functioned- Um sistema embarcado geralmente executa uma operação especializada e faz o mesmo repetidamente. Por exemplo: Um pager sempre funciona como um pager.

  • Tightly constrained- Todos os sistemas de computação têm restrições nas métricas de design, mas aquelas em um sistema embarcado podem ser especialmente restritas. As métricas de design são uma medida dos recursos de uma implementação, como custo, tamanho, potência e desempenho. Deve ter um tamanho que caiba em um único chip, deve executar rápido o suficiente para processar dados em tempo real e consumir energia mínima para estender a vida útil da bateria.

  • Reactive and Real time- Muitos sistemas embarcados devem reagir continuamente às mudanças no ambiente do sistema e devem computar certos resultados em tempo real sem qualquer atraso. Considere um exemplo de um controlador de cruzeiro de carro; ele monitora continuamente e reage aos sensores de velocidade e freio. Deve computar aceleração ou desaceleração repetidamente dentro de um tempo limitado; um cálculo atrasado pode resultar em falha de controle do carro.

  • Microprocessors based - Deve ser baseado em microprocessador ou microcontrolador.

  • Memory- Deve ter memória, pois seu software costuma embutir na ROM. Não precisa de nenhuma memória secundária no computador.

  • Connected - Deve ter periféricos conectados para conectar dispositivos de entrada e saída.

  • HW-SW systems- O software é usado para obter mais recursos e flexibilidade. O hardware é usado para desempenho e segurança.

Vantagens

  • Facilmente personalizável
  • Baixo consumo de energia
  • Baixo custo
  • Desempenho aprimorado

Desvantagens

  • Alto esforço de desenvolvimento
  • Maior tempo de comercialização

Estrutura Básica de um Sistema Embarcado

A ilustração a seguir mostra a estrutura básica de um sistema embarcado -

  • Sensor- Mede a grandeza física e a converte em um sinal elétrico que pode ser lido por um observador ou por qualquer instrumento eletrônico como um conversor A2D. Um sensor armazena a quantidade medida na memória.

  • A-D Converter - Um conversor analógico-digital converte o sinal analógico enviado pelo sensor em um sinal digital.

  • Processor & ASICs - Os processadores processam os dados para medir a saída e armazená-los na memória.

  • D-A Converter - Um conversor digital para analógico converte os dados digitais alimentados pelo processador em dados analógicos

  • Actuator - Um atuador compara a saída fornecida pelo conversor DA com a saída real (esperada) armazenada nele e armazena a saída aprovada.

O processador é o coração de um sistema embarcado. É a unidade básica que recebe entradas e produz uma saída após o processamento dos dados. Para um projetista de sistemas embarcados, é necessário ter conhecimento de microprocessadores e microcontroladores.

Processadores em um sistema

Um processador tem duas unidades essenciais -

  • Unidade de controle de fluxo do programa (CU)
  • Unidade de Execução (UE)

A UC inclui uma unidade de busca para buscar instruções da memória. A UE tem circuitos que implementam as instruções relativas à operação de transferência de dados e conversão de dados de uma forma para outra.

A EU inclui a Unidade Aritmética e Lógica (ALU) e também os circuitos que executam instruções para uma tarefa de controle de programa, como interromper ou saltar para outro conjunto de instruções.

Um processador executa os ciclos de busca e executa as instruções na mesma sequência em que são buscadas na memória.

Tipos de Processadores

Os processadores podem ser das seguintes categorias -

  • Processador de uso geral (GPP)

    • Microprocessor
    • Microcontroller
    • Processador Embutido
    • Processador de Sinal Digital
    • Processador de mídia
  • Processador de sistema específico de aplicativo (ASSP)

  • Processadores de instruções específicas de aplicativos (ASIPs)

  • Núcleo (s) GPP ou núcleo (s) ASIP em um Circuito Integrado Específico de Aplicativo (ASIC) ou um circuito de Integração em Escala Muito Grande (VLSI).

Microprocessador

Um microprocessador é um único chip VLSI com uma CPU. Além disso, ele também pode ter outras unidades, como treinadores, unidade aritmética de processamento de ponto flutuante e unidades de pipelining que ajudam no processamento mais rápido de instruções.

O ciclo de busca e execução dos microprocessadores da geração anterior era guiado por uma frequência de clock da ordem de ~ 1 MHz. Os processadores agora operam em uma frequência de clock de 2 GHz

Microcontrolador

Um microcontrolador é uma unidade VLSI de chip único (também chamada microcomputer) que, embora tendo capacidades computacionais limitadas, possui capacidade de entrada / saída aprimorada e uma série de unidades funcionais no chip.

CPU RAM ROM
Porta I / O Cronômetro Porta Serial COM

Microcontroladores são particularmente usados ​​em sistemas embarcados para aplicações de controle em tempo real com memória de programa e dispositivos no chip.

Microprocessador vs microcontrolador

Vamos agora dar uma olhada nas diferenças mais notáveis ​​entre um microprocessador e um microcontrolador.

Microprocessador Microcontrolador
Os microprocessadores são multitarefa por natureza. Pode realizar várias tarefas ao mesmo tempo. Por exemplo, no computador, podemos tocar música enquanto escrevemos um texto no editor de texto. Orientado para uma única tarefa. Por exemplo, uma máquina de lavar é projetada para lavar roupas apenas.
RAM, ROM, portas de E / S e temporizadores podem ser adicionados externamente e podem variar em números. RAM, ROM, portas de E / S e temporizadores não podem ser adicionados externamente. Esses componentes devem ser incorporados em um chip e fixados em números.
Os projetistas podem decidir o número de portas de memória ou de E / S necessárias. Número fixo para memória ou E / S torna um microcontrolador ideal para uma tarefa limitada, mas específica.
O suporte externo de memória externa e portas de E / S torna um sistema baseado em microprocessador mais pesado e caro. Os microcontroladores são leves e mais baratos do que um microprocessador.
Dispositivos externos requerem mais espaço e seu consumo de energia é maior. Um sistema baseado em microcontrolador consome menos energia e ocupa menos espaço.

Os microcontroladores 8051 funcionam com barramento de dados de 8 bits. Portanto, eles podem suportar memória de dados externa de até 64K e memória de programa externa de 64K, no máximo. Coletivamente, os microcontroladores 8051 podem endereçar 128k de memória externa.

Quando os dados e o código estão em diferentes blocos de memória, a arquitetura é referida como Harvard architecture. Caso os dados e o código estejam no mesmo bloco de memória, a arquitetura é referida comoVon Neumann architecture.

Arquitetura Von Neumann

A arquitetura de Von Neumann foi proposta pela primeira vez por um cientista da computação John von Neumann. Nesta arquitetura, existe um caminho ou barramento de dados para instrução e dados. Como resultado, a CPU realiza uma operação por vez. Ele busca uma instrução da memória ou executa a operação de leitura / gravação nos dados. Portanto, uma busca de instrução e uma operação de dados não podem ocorrer simultaneamente, compartilhando um barramento comum.

A arquitetura Von-Neumann suporta hardware simples. Permite o uso de uma única memória sequencial. As velocidades de processamento de hoje superam em muito os tempos de acesso à memória e empregamos uma quantidade muito rápida, mas pequena de memória (cache) local para o processador.

Arquitetura Harvard

A arquitetura Harvard oferece armazenamento separado e barramentos de sinal para instruções e dados. Esta arquitetura possui armazenamento de dados inteiramente contido na CPU, e não há acesso ao armazenamento de instruções como dados. Os computadores têm áreas de memória separadas para instruções de programa e dados usando barramentos de dados internos, permitindo acesso simultâneo a instruções e dados.

Os programas precisavam ser carregados por um operador; o processador não conseguiu inicializar sozinho. Em uma arquitetura de Harvard, não há necessidade de fazer as duas memórias compartilharem propriedades.

Arquitetura Von-Neumann vs Arquitetura Harvard

Os pontos a seguir distinguem a Arquitetura de Von Neumann da Arquitetura de Harvard.

Arquitetura Von-Neumann Arquitetura Harvard
Memória única a ser compartilhada por código e dados. Memórias separadas para código e dados.
O processador precisa buscar código em um ciclo de clock separado e dados em outro ciclo de clock. Portanto, requer dois ciclos de clock. Um único ciclo de clock é suficiente, pois barramentos separados são usados ​​para acessar o código e os dados.
Maior velocidade, portanto, menos demorado. Mais lento em velocidade, portanto, mais demorado.
Design simples. Complexo em design.

CISC e RISC

CISC é um computador com conjunto de instruções complexas. É um computador que pode endereçar um grande número de instruções.

No início da década de 1980, os projetistas de computadores recomendaram que os computadores usassem menos instruções com construções simples para que pudessem ser executados muito mais rápido na CPU sem a necessidade de usar memória. Esses computadores são classificados como Computador de conjunto de instruções reduzido ou RISC.

CISC vs RISC

Os seguintes pontos diferenciam um CISC de um RISC -

CISC RISC
Conjunto maior de instruções. Fácil de programar Conjunto menor de instruções. Difícil de programar.
Projeto mais simples de compilador, considerando um conjunto maior de instruções. Projeto complexo de compilador.
Muitos modos de endereçamento causando formatos de instrução complexos. Poucos modos de endereçamento, fixam o formato das instruções.
O comprimento da instrução é variável. A duração da instrução varia.
Ciclos de clock mais altos por segundo. Ciclo de clock baixo por segundo.
A ênfase está no hardware. A ênfase está no software.
A unidade de controle implementa um grande conjunto de instruções usando a unidade de micro-programa. Cada instrução deve ser executada por hardware.
Execução mais lenta, pois as instruções devem ser lidas da memória e decodificadas pela unidade decodificadora. Execução mais rápida, pois cada instrução deve ser executada por hardware.
O pipelining não é possível. O pipelining de instruções é possível, considerando um único ciclo de clock.

Compiladores e montadores

Compilador

Um compilador é um programa de computador (ou um conjunto de programas) que transforma o código-fonte escrito em uma linguagem de programação (a linguagem-fonte) em outra linguagem de computador (normalmente formato binário). O motivo mais comum para conversão é a criação de um programa executável. O nome "compilador" é usado principalmente para programas que traduzem o código-fonte de uma linguagem de programação de alto nível para uma linguagem de baixo nível (por exemplo, linguagem assembly ou código de máquina).

Cross-Compiler

Se o programa compilado puder ser executado em um computador com CPU ou sistema operacional diferente do computador no qual o compilador compilou o programa, esse compilador será conhecido como compilador cruzado.

Descompilador

Um programa que pode traduzir um programa de uma linguagem de baixo nível para uma linguagem de alto nível é chamado de descompilador.

Conversor de linguagem

Um programa que traduz programas escritos em diferentes idiomas de alto nível é normalmente chamado de tradutor de idioma, tradutor de fonte para fonte ou conversor de idioma.

É provável que um compilador execute as seguintes operações -

  • Preprocessing
  • Parsing
  • Análise Semântica (tradução direcionada pela sintaxe)
  • Geração de código
  • Otimização de código

Montadores

Um montador é um programa que pega instruções básicas do computador (chamadas de linguagem assembly) e as converte em um padrão de bits que o processador do computador pode usar para realizar suas operações básicas. Um montador cria código-objeto traduzindo mnemônicos de instrução de montagem em opcodes, resolvendo nomes simbólicos em localizações de memória. A linguagem assembly usa um mnemônico para representar cada operação da máquina de baixo nível (opcode).

Ferramentas de depuração em um sistema integrado

A depuração é um processo metódico para localizar e reduzir o número de bugs em um programa de computador ou em um hardware eletrônico, para que funcione conforme o esperado. A depuração é difícil quando os subsistemas estão fortemente acoplados, porque uma pequena mudança em um subsistema pode criar bugs em outro. As ferramentas de depuração usadas em sistemas embarcados diferem muito em termos de seu tempo de desenvolvimento e recursos de depuração. Discutiremos aqui as seguintes ferramentas de depuração -

  • Simulators
  • Kits iniciais de microcontrolador
  • Emulator

Simuladores

O código é testado para o MCU / sistema simulando-o no computador host usado para o desenvolvimento do código. Simuladores tentam modelar o comportamento do microcontrolador completo em software.

Funções de Simuladores

Um simulador executa as seguintes funções -

  • Define o processador ou família de dispositivos de processamento, bem como suas várias versões para o sistema de destino.

  • Monitora as informações detalhadas de uma parte do código-fonte com rótulos e argumentos simbólicos conforme a execução continua para cada etapa.

  • Fornece o status de RAM e portas simuladas do sistema de destino para cada execução de etapa única.

  • Monitora a resposta do sistema e determina o rendimento.

  • Fornece rastreamento da saída de conteúdo do contador do programa em relação aos registros do processador.

  • Fornece o significado detalhado do comando atual.

  • Monitora as informações detalhadas dos comandos do simulador à medida que são inseridos no teclado ou selecionados no menu.

  • Suporta as condições (até 8 ou 16 ou 32 condições) e pontos de interrupção incondicionais.

  • Fornece pontos de interrupção e o rastreamento que, juntos, são a ferramenta importante de teste e depuração.

  • Facilita a sincronização dos periféricos internos e atrasos.

Kit inicial de microcontrolador

Um kit inicial de microcontrolador consiste em -

  • Placa de hardware (placa de avaliação)
  • Programador no sistema
  • Algumas ferramentas de software como compilador, assembler, linker, etc.
  • Às vezes, um IDE e uma versão de avaliação limitada do tamanho do código de um compilador.

Uma grande vantagem desses kits em relação aos simuladores é que eles funcionam em tempo real e, portanto, permitem uma fácil verificação da funcionalidade de entrada / saída. Os kits iniciais, entretanto, são completamente suficientes e a opção mais barata para desenvolver projetos simples de microcontroladores.

Emuladores

Um emulador é um kit de hardware ou um programa de software ou pode ser ambos os quais emula as funções de um sistema de computador (o convidado) em outro sistema de computador (o host), diferente do primeiro, de modo que o comportamento emulado se assemelha bastante ao comportamento do sistema real (o convidado).

Emulação refere-se à capacidade de um programa de computador em um dispositivo eletrônico de emular (imitar) outro programa ou dispositivo. A emulação se concentra em recriar um ambiente de computador original. Os emuladores têm a capacidade de manter uma conexão mais estreita com a autenticidade do objeto digital. Um emulador ajuda o usuário a trabalhar em qualquer tipo de aplicativo ou sistema operacional em uma plataforma de maneira semelhante à execução do software em seu ambiente original.

Dispositivos Periféricos em Sistemas Embarcados

Os sistemas incorporados comunicam-se com o mundo exterior através dos seus periféricos, como os seguintes & mins;

  • Interfaces de comunicação serial (SCI) como RS-232, RS-422, RS-485, etc.
  • Interface de comunicação serial síncrona como I2C, SPI, SSC e ESSI
  • Barramento serial universal (USB)
  • Cartões multimídia (cartões SD, Compact Flash, etc.)
  • Redes como Ethernet, LonWorks, etc.
  • Fieldbuses como CAN-Bus, LIN-Bus, PROFIBUS, etc.
  • imers como PLL (s), Capture / Compare e Time Processing Units.
  • IO discreto, também conhecido como General Purpose Input / Output (GPIO)
  • Analógico para Digital / Digital para Analógico (ADC / DAC)
  • Depuração como JTAG, ISP, ICSP, porta BDM, BITP e portas DP9

Critérios para escolher o microcontrolador

Ao escolher um microcontrolador, certifique-se de que ele atenda à tarefa em questão e seja econômico. Devemos ver se um microcontrolador de 8, 16 ou 32 bits pode lidar melhor com as necessidades de computação de uma tarefa. Além disso, os seguintes pontos devem ser mantidos em mente ao escolher um microcontrolador -

  • Speed - Qual é a velocidade mais alta que o microcontrolador pode suportar?

  • Packaging- É DIP de 40 pinos (pacote duplo em linha) ou QFP (pacote plano Quad)? Isso é importante em termos de espaço, montagem e prototipagem do produto final.

  • Power Consumption - Este é um critério importante para produtos alimentados por bateria.

  • Amount of RAM and ROM no chip.

  • Count of I/O pins and Timers no chip.

  • Cost per Unit - Isso é importante em termos de custo final do produto no qual o microcontrolador será utilizado.

Além disso, certifique-se de ter ferramentas, como compiladores, depuradores e montadores, disponíveis com o microcontrolador. O mais importante de tudo, você deve comprar um microcontrolador de uma fonte confiável.

Breve História de 8051

O primeiro microprocessador 4004 foi inventado pela Intel Corporation. 8085 e 8086microprocessadores também foram inventados pela Intel. Em 1981, a Intel lançou um microcontrolador de 8 bits chamado de8051. Foi referido comosystem on a chipporque tinha 128 bytes de RAM, 4 K bytes de ROM on-chip, dois temporizadores, uma porta serial e 4 portas (largura de 8 bits), tudo em um único chip. Quando se tornou amplamente popular, a Intel permitiu que outros fabricantes fizessem e comercializassem diferentes sabores de 8051 com seu código compatível com 8051. Isso significa que se você escrever seu programa para um tipo de 8051, ele será executado em outros sabores também, independentemente do fabricante. Isso levou a várias versões com diferentes velocidades e quantidades de RAM no chip.

8051 Sabores / Membros

  • 8052 microcontroller- 8052 tem todos os recursos padrão do microcontrolador 8051, bem como 128 bytes extras de RAM e um temporizador extra. Ele também possui 8 K bytes de ROM de programa no chip em vez de 4 K bytes.

  • 8031 microcontroller- É outro membro da família 8051. Este chip é frequentemente referido como 8051 sem ROM, uma vez que tem 0K byte de ROM no chip. Você deve adicionar ROM externa a ele para usá-lo, que contém o programa a ser obtido e executado. Este programa pode ter até 64K bytes. Mas no processo de adição de ROM externa ao 8031, ele perdeu 2 portas de 4 portas. Para resolver este problema, podemos adicionar uma E / S externa ao 8031

Comparação entre 8051 membros da família

A tabela a seguir compara os recursos disponíveis em 8051, 8052 e 8031.

Característica 8051 8052 8031
ROM (bytes) 4K 8K 0K
RAM (bytes) 128 256 128
Cronômetros 2 3 2
Pinos de I / O 32 32 32
Porta serial 1 1 1
Fontes de interrupção 6 8 6

Características do microcontrolador 8051

Um microcontrolador 8051 vem com os seguintes recursos -

  • 4 KB bytes de memória de programa no chip (ROM)
  • 128 bytes de memória de dados no chip (RAM)
  • Quatro bancos de registro
  • 128 sinalizadores de software definidos pelo usuário
  • Barramento de dados bidirecional de 8 bits
  • Barramento de endereço unidirecional de 16 bits
  • 32 registros de uso geral, cada um de 8 bits
  • Timers de 16 bits (geralmente 2, mas podem ter mais ou menos)
  • Três interrupções internas e duas externas
  • Quatro portas de 8 bits (o modelo curto tem duas portas de 8 bits)
  • Contador de programa de 16 bits e ponteiro de dados
  • 8051 também pode ter uma série de recursos especiais, como UARTs, ADC, Op-amp, etc.

Diagrama de Bloco do Microcontrolador 8051

A ilustração a seguir mostra o diagrama de blocos de um microcontrolador 8051 -

No 8051, as operações de E / S são feitas usando quatro portas e 40 pinos. O diagrama de pinos a seguir mostra os detalhes dos 40 pinos. A porta de operação de E / S reserva 32 pinos, onde cada porta possui 8 pinos. Os outros 8 pinos são designados como V cc , GND, XTAL1, XTAL2, RST, EA (barra), ALE / PROG (barra) e PSEN (barra).

É um PDIP de 40 pinos (pacote em linha dupla de plástico)

Note- Em um pacote DIP, você pode reconhecer o primeiro pino e o último pino pelo corte no meio do IC. O primeiro pino está do lado esquerdo desta marca corte eo último pino (ou seja, a 40 ª pin neste caso) está à direita da marca de corte.

Portas de E / S e suas funções

As quatro portas P0, P1, P2 e P3, cada uma usa 8 pinos, tornando-as portas de 8 bits. Após o RESET, todas as portas são configuradas como entradas, prontas para serem utilizadas como portas de entrada. Quando o primeiro 0 é gravado em uma porta, ele se torna uma saída. Para reconfigurá-lo como uma entrada, um 1 deve ser enviado a uma porta.

Porta 0 (pino nº 32 - pino nº 39)

Possui 8 pinos (32 a 39). Ele pode ser usado para entrada ou saída. Ao contrário das portas P1, P2 e P3, normalmente conectamos resistores pull-up de P0 a 10K-ohm para usá-los como uma porta de entrada ou saída sendo um dreno aberto.

Ele também é designado como AD0-AD7, permitindo que seja usado como endereço e dados. No caso do 8031 ​​(ou seja, chip sem ROM), quando precisarmos acessar o ROM externo, P0 será usado para o endereço e o barramento de dados. ALE (Pino nº 31) indica se P0 possui endereço ou dados. Quando ALE = 0, fornece os dados D0-D7, mas quando ALE = 1, possui o endereço A0-A7. Caso nenhuma conexão de memória externa esteja disponível, P0 deve ser conectado externamente a um resistor pull-up de 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)

Porta 1 (pino 1 a 8)

É uma porta de 8 bits (pino 1 a 8) e pode ser usada como entrada ou saída. Não requer resistores pull-up porque eles já estão conectados internamente. Após a reinicialização, a porta 1 é configurada como uma porta de entrada. O código a seguir pode ser usado para enviar valores alternados de 55H e AAH para a porta 1.

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

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

Se a porta 1 estiver configurada para ser usada como uma porta de saída, então para usá-la como uma porta de entrada novamente, programe-a escrevendo 1 em todos os seus bits como no código a seguir.

;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

Porta 2 (pinos 21 a 28)

A porta 2 ocupa um total de 8 pinos (pinos 21 a 28) e pode ser usada para operações de entrada e saída. Assim como P1 (Porta 1), P2 também não requer resistores pull-up externos porque eles já estão conectados internamente. Deve ser usado junto com P0 para fornecer o endereço de 16 bits para a memória externa. Portanto, também é designado como (A0 – A7), conforme mostrado no diagrama de pinos. Quando o 8051 está conectado a uma memória externa, ele fornece um caminho para os 8 bits superiores do endereço de 16 bits e não pode ser usado como E / S. Após a reinicialização, a porta 2 é configurada como uma porta de entrada. O código a seguir pode ser usado para enviar valores alternados de 55H e AAH para a porta 2.

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

Se a porta 2 estiver configurada para ser usada como uma porta de saída, então para usá-la como uma porta de entrada novamente, programe-a escrevendo 1 em todos os seus bits como no código a seguir.

;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

Porta 3 (pinos 10 a 17)

Também é de 8 bits e pode ser usado como Entrada / Saída. Esta porta fornece alguns sinais extremamente importantes. P3.0 e P3.1 são RxD (receptor) e TxD (transmissor) respectivamente e são usados ​​coletivamente para comunicação serial. Os pinos P3.2 e P3.3 são usados ​​para interrupções externas. P3.4 e P3.5 são usados ​​para os temporizadores T0 e T1 respectivamente. P3.6 e P3.7 são pinos de gravação (WR) e leitura (RD). Estes são pinos baixos ativos, significa que eles estarão ativos quando 0 for dado a eles e estes são usados ​​para fornecer operações de leitura e gravação para ROM externa em sistemas baseados em 8031.

Bit P3 Função PIN
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < Complemento de INT0 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < Complemento de RD 17

Função dupla da porta 0 e porta 2

  • Dual role of Port 0- A porta 0 também é designada como AD0 – AD7, pois pode ser usada para tratamento de dados e endereço. Ao conectar um 8051 à memória externa, a porta 0 pode fornecer endereço e dados. O microcontrolador 8051 multiplexa a entrada como endereço ou dados para salvar os pinos.

  • Dual role of Port 2- Além de funcionar como I / O, a porta P2 também é usada para fornecer barramento de endereço de 16 bits para memória externa junto com a porta 0. A porta P2 também é designada como (A8– A15), enquanto a porta 0 fornece os 8 bits inferiores via A0 – A7. Em outras palavras, podemos dizer que quando um 8051 está conectado a uma memória externa (ROM) que pode ter no máximo até 64KB e isso é possível pelo barramento de endereço de 16 bits, pois sabemos 216 = 64KB. A Porta 2 é usada para os 8 bits superiores do endereço de 16 bits e não pode ser usada para E / S e é assim que qualquer código de programa de ROM externa é endereçado.

Conexão de Hardware de Pinos

  • Vcc - O pino 40 fornece alimentação para o chip e é +5 V.

  • Gnd - O pino 20 fornece aterramento para a referência.

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 tem oscilador no chip, mas requer relógio externo para rodá-lo. Um cristal de quartzo é conectado entre os pinos XTAL1 e XTAL2 do chip. Este cristal também precisa de dois capacitores de 30pF para gerar um sinal de frequência desejada. Um lado de cada capacitor é conectado ao aterramento. O 8051 IC está disponível em várias velocidades e tudo depende desse cristal de quartzo, por exemplo, um microcontrolador de 20 MHz requer um cristal com frequência não superior a 20 MHz.

  • RST (Pin No. 9)- É um pino de entrada e um pino alto ativo. Ao aplicar um pulso alto neste pino, ou seja, 1, o microcontrolador irá reiniciar e encerrar todas as atividades. Este processo é conhecido comoPower-On Reset. Ativar uma reinicialização na inicialização fará com que todos os valores no registro sejam perdidos. Isso definirá um contador de programa para todos os 0s. Para garantir uma entrada válida de Reset, o pulso alto deve ser alto por um mínimo de dois ciclos da máquina antes de poder diminuir, o que depende do valor do capacitor e da taxa na qual ele carrega. (Machine Cycle é a quantidade mínima de frequência que uma única instrução requer na execução).

  • EA or External Access (Pin No. 31)- É um pino de entrada. Este pino é um pino baixo ativo; ao aplicar um pulso baixo, ele é ativado. No caso do microcontrolador (8051/52) ter ROM on-chip, o pino EA (barra) é conectado a V cc . Mas em um microcontrolador 8031 ​​que não possui uma ROM no chip, o código é armazenado em uma ROM externa e, em seguida, buscado pelo microcontrolador. Neste caso, devemos conectar o (pino nº 31) EA ao Gnd para indicar que o código do programa está armazenado externamente.

  • PSEN or Program store Enable (Pin No 29)- Este também é um pino baixo ativo, ou seja, ele é ativado após a aplicação de um pulso baixo. É um pino de saída e usado junto com o pino EA em sistemas baseados em 8031 ​​(ou seja, ROMLESS) para permitir o armazenamento de código de programa em ROM externa.

  • ALE or (Address Latch Enable)- Este é um pino de saída e está ativo alto. É especialmente usado para 8031 ​​IC para conectá-lo à memória externa. Ele pode ser usado para decidir se os pinos P0 serão usados ​​como barramento de endereços ou barramento de dados. Quando ALE = 1, os pinos P0 funcionam como barramento de dados e quando ALE = 0, os pinos P0 funcionam como barramento de endereço.

Portas de E / S e endereçamento de bits

É um recurso mais amplamente usado do 8051 ao escrever código para o 8051. Às vezes, precisamos acessar apenas 1 ou 2 bits da porta em vez de todos os 8 bits. 8051 fornece a capacidade de acessar bits individuais das portas.

Ao acessar uma porta de maneira de bit único, usamos a sintaxe "SETB X. Y", em que X é o número da porta (0 a 3) e Y é um número de bit (0 a 7) para os bits de dados D0-D7 onde D0 é o LSB e D7 é o MSB. Por exemplo, "SETB P1.5" define o bit 5 alto da porta 1.

O código a seguir mostra como podemos alternar o bit P1.2 continuamente.

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

Instruções de bit único

Instruções Função
Bit SETB Defina o bit (bit = 1)
Bit CLR limpar o bit (bit = 0)
Bit CPL complemente o bit (bit = NÃO bit)
Bit JB, alvo pula para o alvo se bit = 1 (pula se bit)
Bit JNB, alvo pula para o alvo se bit = 0 (pula se nenhum bit)
Bit JBC, alvo saltar para o alvo se bit = 1, limpar bit (saltar se bit, depois limpar)

Contador de programa

O contador de programa é um registrador de 16 ou 32 bits que contém o endereço da próxima instrução a ser executada. O PC aumenta automaticamente para a próxima localização da memória sequencial sempre que uma instrução é obtida. As operações de desvio, salto e interrupção carregam o contador do programa com um endereço diferente da próxima localização sequencial.

Ativar uma reinicialização na inicialização fará com que todos os valores no registro sejam perdidos. Isso significa que o valor do PC (contador do programa) é 0 após a reinicialização, forçando a CPU a buscar o primeiro opcode da localização da memória ROM 0000. Isso significa que devemos colocar o primeiro byte do upcode na localização 0000 da ROM porque é onde o CPU espera encontrar a primeira instrução

Redefinir vetor

O significado do vetor de reinicialização é que ele aponta o processador para o endereço de memória que contém a primeira instrução do firmware. Sem o vetor de redefinição, o processador não saberia por onde começar a execução. Após a reinicialização, o processador carrega o contador de programa (PC) com o valor do vetor de reinicialização de um local de memória predefinido. Na arquitetura CPU08, isso está no local$FFFE:$FFFF.

Quando o vetor de redefinição não é necessário, os desenvolvedores normalmente o consideram garantido e não programam na imagem final. Como resultado, o processador não inicializa no produto final. É um erro comum que ocorre durante a fase de depuração.

Ponteiro de pilha

A pilha é implementada na RAM e um registro da CPU é usado para acessá-la, chamada de registro SP (Stack Pointer). O registro SP é um registro de 8 bits e pode endereçar endereços de memória no intervalo de 00h a FFh. Inicialmente, o registro SP contém o valor 07 para apontar para o local 08 como o primeiro local sendo usado para a pilha pelo 8051.

Quando o conteúdo de um registro da CPU é armazenado em uma pilha, isso é chamado de operação PUSH. Quando o conteúdo de uma pilha é armazenado em um registro da CPU, isso é chamado de operação POP. Em outras palavras, um registro é colocado na pilha para salvá-lo e retirado da pilha para recuperá-lo.

Loop infinito

Um loop infinito ou um loop infinito pode ser identificado como uma sequência de instruções em um programa de computador que executa infinitamente em um loop, devido às seguintes razões -

  • loop sem condição de terminação.
  • loop com uma condição de terminação que nunca pode ser atendida.
  • loop com uma condição de término que faz com que o loop seja reiniciado.

Esses loops infinitos normalmente faziam com que os sistemas operacionais mais antigos parassem de responder, pois um loop infinito consumia todo o tempo disponível do processador. As operações de E / S que aguardam entradas do usuário também são chamadas de "loops infinitos". Uma possível causa do "congelamento" de um computador é um loop infinito; outras causas incluemdeadlock e access violations.

Os sistemas embarcados, ao contrário de um PC, nunca "saem" de um aplicativo. Eles ficam ociosos em um loop infinito esperando que um evento ocorra na forma de uma interrupção, ou umpre-scheduled task. Para economizar energia, alguns processadores entramsleep ou wait modes em vez de ficar ocioso por meio de um loop infinito, mas eles sairão desse modo após um temporizador ou uma interrupção externa.

Interrupções

As interrupções são principalmente mecanismos de hardware que informam ao programa que ocorreu um evento. Eles podem ocorrer a qualquer momento e, portanto, são assíncronos ao fluxo do programa. Eles exigem tratamento especial pelo processador e, em última análise, são tratados por uma Rotina de Serviço de Interrupção (ISR) correspondente. As interrupções precisam ser tratadas rapidamente. Se você demorar muito para atender a uma interrupção, poderá perder outra interrupção.

Little Endian Vs Big Endian

Embora os números sejam sempre exibidos da mesma forma, eles não são armazenados da mesma forma na memória. As máquinas Big-Endian armazenam o byte de dados mais significativo no endereço de memória mais baixo. Uma máquina Big-Endian armazena 0x12345678 como -

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

As máquinas Little-Endian, por outro lado, armazenam o byte de dados menos significativo no endereço de memória mais baixo. Uma máquina Little-Endian armazena 0x12345678 como -

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

Linguagens assembly foram desenvolvidas para fornecer mnemonicsou símbolos para as instruções do código de nível de máquina. Os programas em linguagem assembly consistem em mnemônicos, portanto, devem ser traduzidos em código de máquina. Um programa responsável por esta conversão é conhecido comoassembler. A linguagem assembly é frequentemente denominada como linguagem de baixo nível porque trabalha diretamente com a estrutura interna da CPU. Para programar em linguagem assembly, o programador deve conhecer todos os registros da CPU.

Diferentes linguagens de programação, como C, C ++, Java e várias outras linguagens são chamadas de linguagens de alto nível porque não lidam com os detalhes internos de uma CPU. Em contraste, um assembler é usado para traduzir um programa de linguagem assembly em código de máquina (às vezes também chamadoobject code ou opcode) Da mesma forma, um compilador traduz uma linguagem de alto nível em código de máquina. Por exemplo, para escrever um programa em linguagem C, deve-se usar um compilador C para traduzir o programa em linguagem de máquina.

Estrutura da linguagem assembly

Um programa em linguagem assembly é uma série de instruções, que são instruções em linguagem assembly, como ADD e MOV, ou instruções chamadas directives.

A instruction diz à CPU o que fazer, enquanto um directive (também chamado pseudo-instructions) dá instruções ao montador. Por exemplo, as instruções ADD e MOV são comandos que a CPU executa, enquanto ORG e END são diretivas do montador. O montador coloca o opcode no local de memória 0 quando a diretiva ORG é usada, enquanto END indica o final do código-fonte. Uma instrução de idioma do programa consiste nos seguintes quatro campos -

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

Um colchete ([]) indica que o campo é opcional.

  • o label fieldpermite que o programa se refira a uma linha de código pelo nome. Os campos do rótulo não podem exceder um determinado número de caracteres.

  • o mnemonics e operands fieldsjuntos executam o trabalho real do programa e realizam as tarefas. Declarações como ADD A, C & MOV C, # 68 onde ADD e MOV são os mnemônicos, que produzem opcodes; "A, C" e "C, # 68" são operandos. Esses dois campos podem conter diretivas. As diretivas não geram código de máquina e são usadas apenas pelo montador, enquanto as instruções são traduzidas em código de máquina para a CPU executar.

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
  • o comment field começa com um ponto e vírgula, que é um indicador de comentário.

  • Observe o rótulo "AQUI" no programa. Qualquer rótulo que se refira a uma instrução deve ser seguido por dois pontos.

Montando e executando um programa 8051

Aqui, discutiremos sobre a forma básica de uma linguagem assembly. As etapas para criar, montar e executar um programa em linguagem assembly são as seguintes -

  • Primeiro, usamos um editor para digitar um programa semelhante ao programa acima. Editores como o programa MS-DOS EDIT que vem com todos os sistemas operacionais da Microsoft podem ser usados ​​para criar ou editar um programa. O Editor deve ser capaz de produzir um arquivo ASCII. A extensão "asm" para o arquivo de origem é usada por um montador na próxima etapa.

  • O arquivo de origem "asm" contém o código do programa criado na Etapa 1. Ele é enviado a um assembler 8051. O montador então converte as instruções da linguagem assembly em instruções de código de máquina e produz um.obj file (arquivo objeto) e um .lst file(arquivo de lista). Também é chamado desource file, é por isso que alguns montadores exigem que esse arquivo tenha as extensões "src". O arquivo "lst" é opcional. É muito útil para o programa porque lista todos os opcodes e endereços, bem como os erros que os montadores detectaram.

  • Os montadores requerem uma terceira etapa chamada linking. O programa de link pega um ou mais arquivos de objeto e produz um arquivo de objeto absoluto com a extensão "abs".

  • Em seguida, o arquivo "abs" é alimentado para um programa chamado "OH" (conversor de objeto para hex), que cria um arquivo com a extensão "hex" que está pronto para ser gravado na ROM.

Tipo de dados

O microcontrolador 8051 contém um único tipo de dados de 8 bits, e cada registro também tem 8 bits. O programador deve quebrar dados maiores que 8 bits (00 a FFH ou 255 em decimal) para que possam ser processados ​​pela CPU.

DB (Definir Byte)

A diretiva DB é a diretiva de dados mais amplamente usada no assembler. É usado para definir os dados de 8 bits. Também pode ser usado para definir dados de formatos decimais, binários, hexadecimais ou ASCII. Para decimal, o "D" após o número decimal é opcional, mas é obrigatório para "B" (binário) e "Hl" (hexadecimal).

Para indicar ASCII, basta colocar os caracteres entre aspas ('assim'). O montador gera código ASCII para os números / caracteres automaticamente. A diretiva DB é a única diretiva que pode ser usada para definir strings ASCII maiores que dois caracteres; portanto, deve ser usado para todas as definições de dados ASCII. Alguns exemplos de DB são fornecidos abaixo -

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

Aspas simples ou duplas podem ser usadas em strings ASCII. O banco de dados também é usado para alocar memória em blocos do tamanho de bytes.

Diretivas Assembler

Algumas das diretivas de 8051 são as seguintes -

  • ORG (origin)- A diretiva de origem é usada para indicar o início do endereço. Leva os números em formato hexa ou decimal. Se H for fornecido após o número, o número será tratado como hexa, caso contrário, decimal. O montador converte o número decimal em hexa.

  • EQU (equate)- É usado para definir uma constante sem ocupar um local de memória. EQU associa um valor constante a um rótulo de dados para que o rótulo apareça no programa, seu valor constante será substituído pelo rótulo. Durante a execução da instrução "MOV R3, #COUNT", o registro R3 será carregado com o valor 25 (observe o sinal #). A vantagem de usar EQU é que o programador pode alterá-lo uma vez e o montador irá alterar todas as suas ocorrências; o programador não precisa pesquisar todo o programa.

  • END directive- Indica o fim do arquivo de origem (asm). A diretiva END é a última linha do programa; qualquer coisa após a diretiva END é ignorada pelo montador.

Rótulos em linguagem assembly

Todas as etiquetas em linguagem assembly devem seguir as regras fornecidas abaixo -

  • Cada nome de rótulo deve ser exclusivo. Os nomes usados ​​para rótulos na programação de linguagem assembly consistem em letras alfabéticas em maiúsculas e minúsculas, números de 0 a 9 e caracteres especiais, como ponto de interrogação (?), Ponto (.), Na taxa @, sublinhado (_), e dólar ($).

  • O primeiro caractere deve ser em caracteres alfabéticos; não pode ser um número.

  • Palavras reservadas não podem ser usadas como um rótulo no programa. Por exemplo, palavras ADD e MOV são as palavras reservadas, uma vez que são mnemônicos de instrução.

Os registros são usados ​​na CPU para armazenar informações temporariamente, que podem ser dados a serem processados ​​ou um endereço que aponta para os dados que devem ser obtidos. Em 8051, existe um tipo de dados de 8 bits, desde o MSB (bit mais significativo) D7 até o LSB (bit menos significativo) D0. Com o tipo de dados de 8 bits, qualquer tipo de dados maior que 8 bits deve ser dividido em blocos de 8 bits antes de ser processado.

Os registros mais usados ​​do 8051 são A (acumulador), B, R0-R7, DPTR (ponteiro de dados) e PC (contador de programa). Todos esses registros são de 8 bits, exceto DPTR e PC.

Registros de armazenamento em 8051

Discutiremos os seguintes tipos de registros de armazenamento aqui -

  • Accumulator
  • Registro R
  • Registro B
  • Ponteiro de dados (DPTR)
  • Contador de programa (PC)
  • Stack Pointer (SP)

Acumulador

O acumulador, registro A, é usado para todas as operações aritméticas e lógicas. Se o acumulador não estiver presente, todos os resultados de cada cálculo (adição, multiplicação, deslocamento, etc.) devem ser armazenados na memória principal. O acesso à memória principal é mais lento do que o acesso a um registrador como o acumulador porque a tecnologia usada para a grande memória principal é mais lenta (mas mais barata) do que a usada para um registrador.

Os registros "R"

Os registros "R" são um conjunto de oito registros, a saber, R0, R1 a R7. Esses registros funcionam como registros auxiliares ou de armazenamento temporário em muitas operações. Considere um exemplo da soma de 10 e 20. Armazene uma variável 10 em um acumulador e outra variável 20 em, digamos, o registrador R4. Para processar a operação de adição, execute o seguinte comando -

ADD A,R4

Depois de executar esta instrução, o acumulador conterá o valor 30. Assim, os registros "R" são auxiliares muito importantes ou helper registers. O acumulador sozinho não seria muito útil se não fosse por esses registradores "R". Os registros "R" são destinados ao armazenamento temporário de valores.

Tomemos outro exemplo. Vamos somar os valores em R1 e R2 e então subtrair os valores de R3 e R4 do resultado.

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)

Como você pode ver, usamos R5 para reter temporariamente a soma de R3 e R4. Obviamente, esta não é a forma mais eficiente de calcular (R1 + R2) - (R3 + R4), mas ilustra o uso dos registradores "R" como forma de armazenar valores temporariamente.

O Registro "B"

O registrador "B" é muito semelhante ao acumulador no sentido de que pode conter um valor de 8 bits (1 byte). O registro "B" é usado apenas por duas instruções 8051:MUL AB e DIV AB. Para multiplicar ou dividir A por outro número de forma rápida e fácil, você pode armazenar o outro número em "B" e usar essas duas instruções. Além de usar as instruções MUL e DIV, o registrador "B" é freqüentemente usado como mais um registrador de armazenamento temporário, bem como um nono registrador R.

O Ponteiro de Dados

O Data Pointer (DPTR) é o único registro de 16 bits (2 bytes) acessível ao usuário do 8051. O Acumulador, os registradores R0 – R7 e o registrador B são registradores de valor de 1 byte. DPTR destina-se a apontar para dados. É usado pelo 8051 para acessar a memória externa usando o endereço indicado pelo DPTR. DPTR é o único registrador de 16 bits disponível e é freqüentemente usado para armazenar valores de 2 bytes.

O contador do programa

O contador de programa (PC) é um endereço de 2 bytes que informa ao 8051 onde a próxima instrução a ser executada pode ser encontrada na memória. O PC inicia em 0000h quando o 8051 é inicializado e é incrementado sempre que uma instrução é executada. O PC nem sempre é incrementado em 1. Algumas instruções podem exigir 2 ou 3 bytes; nesses casos, o PC será incrementado em 2 ou 3.

Branch, jump, e interruptas operações carregam o contador de programa com um endereço diferente do próximo local sequencial. Ativar uma reinicialização na inicialização fará com que todos os valores no registro sejam perdidos. Isso significa que o valor do PC é 0 na reinicialização, forçando a CPU a buscar o primeiro opcode da localização da ROM 0000. Isso significa que devemos colocar o primeiro byte do upcode na localização da ROM 0000 porque é onde a CPU espera encontrar o primeira instrução.

O Stack Pointer (SP)

O Stack Pointer, como todos os registradores, exceto DPTR e PC, pode conter um valor de 8 bits (1 byte). O ponteiro da pilha informa a localização de onde o próximo valor deve ser removido da pilha. Quando um valor é colocado na pilha, o valor de SP é incrementado e, em seguida, o valor é armazenado no local de memória resultante. Quando um valor é retirado da pilha, o valor é retornado do local da memória indicado por SP e, em seguida, o valor de SP é diminuído.

Essa ordem de operação é importante. O SP será inicializado às 07h quando o 8051 for inicializado. Se um valor for colocado na pilha ao mesmo tempo, o valor será armazenado no endereço de RAM interno 08h porque o 8051 irá primeiro incrementar o valor de SP (de 07h a 08h) e então armazenará o valor empurrado naquela memória endereço (08h). SP é modificado diretamente pelo 8051 por seis instruções: PUSH, POP, ACALL, LCALL, RET e RETI.

Espaço ROM em 8051

Alguns membros da família 8051 têm apenas 4 K bytes de ROM on-chip (por exemplo, 8751, AT8951); alguns têm ROM de 8K, como AT89C52, e há alguns membros da família com 32K bytes e 64K bytes de ROM no chip, como Dallas Semiconductor. O ponto a ser lembrado é que nenhum membro da família 8051 pode acessar mais de 64 K bytes de opcode, pois o contador de programa em 8051 é um registrador de 16 bits (endereço 0000 a FFFF).

A primeira localização da ROM do programa dentro do 8051 tem o endereço 0000H, enquanto a última localização pode ser diferente dependendo do tamanho da ROM no chip. Entre os membros da família 8051, AT8951 tem $ k bytes de ROM no chip com um endereço de memória de 0000 (primeira localização) a 0FFFH (última localização).

8051 Bits de bandeira e registro PSW

O registro da palavra de status do programa (PSW) é um registro de 8 bits, também conhecido como flag register. Tem 8 bits de largura, mas apenas 6 bits é usado. Os dois bits não utilizados sãouser-defined flags. Quatro das bandeiras são chamadasconditional flags, o que significa que eles indicam uma condição que resulta após a execução de uma instrução. Estes quatro sãoCY (Levar), AC (transporte auxiliar), P (paridade), e OV(transbordar). Os bits RS0 e RS1 são usados ​​para alterar os registros do banco. A figura a seguir mostra o registro da palavra de status do programa.

O registro PSW contém os bits de status que refletem o status atual da CPU.

CY CA F0 RS1 RS0 OV - P

CY PSW.7 Carregar bandeira
AC PSW.6 Bandeira de transporte auxiliar
F0 PSW.5 Sinalizador 0 disponível para o usuário para fins gerais.
RS1 PSW.4 Registro de banco seletor bit 1
RS0 PSW.3 Registro do seletor de banco bit 0
OV PSW.2 Sinalizador de estouro
- PSW.1 FLAG definível pelo usuário
P PSW.0 Paridade FLAG. Energizado / limpo pelo hardware durante o ciclo de instrução para indicar o número par / ímpar de 1 bit no acumulador.

Podemos selecionar o bit do banco de registro correspondente usando os bits RS0 e RS1.

RS1 RS2 Banco de registro Endereço
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH
  • CY, the carry flag- Este sinalizador de carry é definido (1) sempre que houver um carry out do bit D7. Ele é afetado após uma operação de adição ou subtração de 8 bits. Ele também pode ser redefinido para 1 ou 0 diretamente por uma instrução como "SETB C" e "CLR C", onde "SETB" significa set bit carry e "CLR" significa clear carry.

  • AC, auxiliary carry flag- Se houver um transporte de D3 e D4 durante uma operação ADD ou SUB, o bit AC é definido; caso contrário, ele é limpo. É usado para a instrução realizar aritmética decimal com codificação binária.

  • P, the parity flag- O sinalizador de paridade representa o número de 1s apenas no registro do acumulador. Se o registro A contém um número ímpar de 1's, então P = 1; e para o número par de 1s, P = 0.

  • OV, the overflow flag- Este sinalizador é definido sempre que o resultado de uma operação de número com sinal é muito grande, fazendo com que o bit de ordem superior transborde para o bit de sinal. É usado apenas para detectar erros em operações aritméticas assinadas.

Exemplo

Mostra o status dos sinalizadores CY, AC e P após a adição de 9CH e 64H na instrução a seguir.

MOV A, # 9CH

ADICIONE 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

O microcontrolador 8051 tem um total de 128 bytes de RAM. Discutiremos sobre a alocação desses 128 bytes de RAM e examinaremos seu uso como pilha e registro.

Alocação de espaço de memória RAM em 8051

Os 128 bytes de RAM dentro do 8051 são atribuídos aos endereços 00 a 7FH. Eles podem ser acessados ​​diretamente como locais de memória e são divididos em três grupos diferentes, como segue -

  • 32 bytes das localizações 00H a 1FH são reservados para bancos de registradores e pilha.

  • 16 bytes das localizações 20H a 2FH são reservados para memória de leitura / gravação endereçável por bit.

  • 80 bytes das localizações 30H a 7FH são usados ​​para armazenamento de leitura e gravação; é chamado descratch pad. Esses 80 locais de RAM são amplamente usados ​​com o propósito de armazenar dados e parâmetros por 8051 programadores.

Registre Bancos em 8051

Um total de 32 bytes de RAM são reservados para os bancos de registradores e a pilha. Esses 32 bytes são divididos em quatro bancos de registro, nos quais cada banco tem 8 registros, R0 – R7. As localizações de RAM de 0 a 7 são reservadas para o banco 0 de R0 – R7, onde R0 é a localização de RAM 0, R1 é a localização de RAM 1, R2 é a localização 2 e assim por diante, até a localização de memória 7, que pertence a R7 do banco 0

O segundo banco de registradores R0 – R7 começa na localização RAM 08 e vai para as localizações OFH. O terceiro banco de R0 – R7 começa no local de memória 10H e vai para o local 17H. Finalmente, as localizações de RAM 18H a 1FH são reservadas para o quarto banco de R0 – R7.

Banco de registro padrão

Se as localizações de RAM 00–1F forem reservadas para os quatro bancos de registros, a qual banco de registros de R0 – R7 temos acesso quando o 8051 é ligado? A resposta é registrar o banco 0; ou seja, os locais de RAM de 0 a 7 são acessados ​​com os nomes R0 a R7 ao programar o 8051. Porque é muito mais fácil referir-se a esses locais de RAM por nomes como R0 a R7, em vez de por seus locais de memória.

Como trocar de banco de registro

O banco de registro 0 é o padrão quando o 8051 é ligado. Podemos mudar para os outros bancos usando o registro PSW. Os bits D4 e D3 do PSW são utilizados para selecionar o banco de registradores desejado, uma vez que podem ser acessados ​​pelas instruções de bit endereçável SETB e CLR. Por exemplo, "SETB PSW.3" definirá PSW.3 = 1 e selecionará o registro do banco 1.

RS1 RS2 Banco Selecionado
0 0 Bank0
0 1 Banco1
1 0 Banco2
1 1 Bank3

Pilha e suas operações

Empilhar no 8051

A pilha é uma seção de uma RAM usada pela CPU para armazenar informações como dados ou endereço de memória temporariamente. A CPU precisa desta área de armazenamento considerando o número limitado de registros.

Como as pilhas são acessadas

Como a pilha é uma seção de uma RAM, existem registros dentro da CPU que apontam para ela. O registro usado para acessar a pilha é conhecido como o registro do ponteiro da pilha. O ponteiro da pilha no 8051 tem 8 bits de largura e pode levar um valor de 00 a FFH. Quando o 8051 é inicializado, o registro SP contém o valor 07H. Isso significa que o local 08 da RAM é o primeiro local usado para a pilha. A operação de armazenamento de um registro de CPU na pilha é conhecida comoPUSH, e obter o conteúdo da pilha de volta para um registro de CPU é chamado de POP.

Empurrando para a pilha

No 8051, o ponteiro da pilha (SP) aponta para o último local usado da pilha. Quando os dados são colocados na pilha, o ponteiro da pilha (SP) é incrementado em 1. Quando PUSH é executado, o conteúdo do registro é salvo na pilha e o SP é incrementado em 1. Para colocar os registros na pilha, nós devem usar seus endereços de RAM. Por exemplo, a instrução "PUSH 1" coloca o registrador R1 na pilha.

Saindo da pilha

Colocar o conteúdo da pilha de volta em um determinado registro é o oposto do processo de empurrar. Com cada operação pop, o byte superior da pilha é copiado para o registrador especificado pela instrução e o ponteiro da pilha é decrementado uma vez.

O fluxo do programa prossegue de maneira sequencial, de uma instrução para a próxima, a menos que uma instrução de transferência de controle seja executada. Os vários tipos de instrução de transferência de controle em linguagem assembly incluem saltos condicionais ou incondicionais e instruções de chamada.

Instruções de loop e salto

Looping no 8051

A repetição de uma sequência de instruções um certo número de vezes é chamada de loop. Uma instruçãoDJNZ reg, labelé usado para realizar uma operação de loop. Nesta instrução, um registro é decrementado em 1; se não for zero, 8051 salta para o endereço de destino referido pela etiqueta.

O registro é carregado com o contador do número de repetições antes do início do loop. Nesta instrução, tanto o decréscimo dos registradores quanto a decisão de pular são combinados em uma única instrução. Os registros podem ser qualquer um de R0 – R7. O contador também pode ser um local de RAM.

Exemplo

Multiply 25 by 10 using the technique of repeated addition.

Solution- A multiplicação pode ser obtida adicionando o multiplicando repetidamente, tantas vezes quanto o multiplicador. Por exemplo,

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 - Ação de loop com a instrução DJNZ Reg labelestá limitado a apenas 256 iterações. Se um salto condicional não for executado, a instrução após o salto será executada.

Loop dentro de um Loop

Quando usamos um loop dentro de outro loop, ele é chamado de nested loop. Dois registros são usados ​​para manter a contagem quando a contagem máxima é limitada a 256. Portanto, usamos esse método para repetir a ação mais de 256 vezes.

Example

Escreva um programa para -

  • Carregue o acumulador com o valor 55H.
  • Complemente o ACC 700 vezes.

Solution- Como 700 é maior que 255 (a capacidade máxima de qualquer registro), dois registros são usados ​​para manter a contagem. O código a seguir mostra como usar dois registradores, R2 e R3, para a contagem.

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

Outros saltos condicionais

A tabela a seguir lista os saltos condicionais usados ​​em 8051 -

Instrução Açao
JZ Pule se A = 0
JNZ Pula se A ≠ 0
DJNZ Decrementar e saltar se registrar ≠ 0
CJNE A, dados Pule se dados A ≠
CJNE reg, #data Saltar se byte ≠ dados
JC Pule se CY = 1
JNC Pula se CY ≠ 1
JB Pula se bit = 1
JNB Pula se bit = 0
JBC Saltar se bit = 1 e limpar o bit
  • JZ (jump if A = 0)- Nesta instrução, o conteúdo do acumulador é verificado. Se for zero, o 8051 salta para o endereço de destino. A instrução JZ pode ser usada apenas para o acumulador, não se aplica a nenhum outro registrador.

  • JNZ (jump if A is not equal to 0)- Nesta instrução, o conteúdo do acumulador é verificado para ser diferente de zero. Se não for zero, o 8051 salta para o endereço de destino.

  • JNC (Jump if no carry, jumps if CY = 0)- O bit de flag Carry no registrador de flag (ou PSW) é usado para tomar a decisão de saltar ou não "etiqueta JNC". A CPU olha para a bandeira de transporte para ver se ela está levantada (CY = 1). Se não for elevado, a CPU começa a buscar e executar instruções do endereço do rótulo. Se CY = 1, ele não saltará, mas executará a próxima instrução abaixo de JNC.

  • JC (Jump if carry, jumps if CY = 1) - Se CY = 1, ele salta para o endereço de destino.

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note - Deve-se notar que todos os saltos condicionais são saltos curtos, ou seja, o endereço do alvo deve estar entre –128 a +127 bytes do conteúdo do contador do programa.

Instruções de salto incondicional

Existem dois saltos incondicionais em 8051 -

  • LJMP (long jump)- LJMP é uma instrução de 3 bytes em que o primeiro byte representa o opcode e o segundo e o terceiro bytes representam o endereço de 16 bits do local de destino. O endereço de destino de 2 bytes permite um salto para qualquer local da memória de 0000 a FFFFH.

  • SJMP (short jump)- É uma instrução de 2 bytes em que o primeiro byte é o opcode e o segundo byte é o endereço relativo do local de destino. O endereço relativo varia de 00H a FFH, que é dividido em saltos para frente e para trás; isto é, dentro de –128 a +127 bytes de memória em relação ao endereço do PC atual (contador do programa). No caso de salto para a frente, o endereço de destino pode estar dentro de um espaço de 127 bytes do PC atual. Em caso de salto para trás, o endereço de destino pode estar dentro de –128 bytes do PC atual.

Calculando o endereço de salto curto

Todos os saltos condicionais (JNC, JZ e DJNZ) são saltos curtos porque são instruções de 2 bytes. Nessas instruções, o primeiro byte representa opcode e o segundo byte representa o endereço relativo. O endereço de destino é sempre relativo ao valor do contador do programa. Para calcular o endereço de destino, o segundo byte é adicionado ao PC da instrução imediatamente abaixo do salto. Dê uma olhada no programa abaixo -

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

Cálculo do endereço de destino de salto para trás

No caso de um salto para a frente, o valor de deslocamento é um número positivo entre 0 e 127 (00 a 7F em hexadecimal). No entanto, para um salto para trás, o deslocamento é um valor negativo de 0 a –128.

Instruções CALL

CALL é usado para chamar uma sub-rotina ou método. As sub-rotinas são usadas para realizar operações ou tarefas que precisam ser realizadas com frequência. Isso torna o programa mais estruturado e economiza espaço na memória. Existem duas instruções - LCALL e ACALL.

LCALL (chamada longa)

LCALL é uma instrução de 3 bytes em que o primeiro byte representa o opcode e o segundo e o terceiro bytes são usados ​​para fornecer o endereço da sub-rotina de destino. LCALL pode ser usado para chamar sub-rotinas que estão disponíveis no espaço de endereço de 64 K bytes do 8051.

Para fazer um retorno bem-sucedido ao ponto após a execução da sub-rotina chamada, a CPU salva o endereço da instrução imediatamente abaixo do LCALL na pilha. Assim, quando uma sub-rotina é chamada, o controle é transferido para essa sub-rotina e o processador salva o PC (contador do programa) na pilha e começa a buscar instruções do novo local. A instrução RET (retorno) transfere o controle de volta ao chamador após terminar a execução da sub-rotina. Cada sub-rotina usa RET como a última instrução.

ACALL (Chamada Absoluta)

ACALL é uma instrução de 2 bytes, em contraste com LCALL que tem 3 bytes. O endereço de destino da sub-rotina deve estar dentro de 2K bytes porque apenas 11 bits dos 2 bytes são usados ​​para o endereço. A diferença entre ACALL e LCALL é que o endereço de destino para LCALL pode estar em qualquer lugar dentro do espaço de endereço de 64K bytes do 8051, enquanto o endereço de destino de CALL está dentro de um intervalo de 2K bytes.

A addressing moderefere-se a como você está endereçando um determinado local de memória. Existem cinco maneiras diferentes ou cinco modos de endereçamento para executar esta instrução, que são os seguintes -

  • Modo de endereçamento imediato
  • Modo de endereçamento direto
  • Registrar modo de endereçamento direto
  • Registrar modo de endereçamento indireto
  • Modo de endereçamento indexado

Modo de endereçamento imediato

Vamos começar com um exemplo.

MOV A, #6AH

Em geral, podemos escrever,

MOV A, #data

É denominado como immediate porque os dados de 8 bits são transferidos imediatamente para o acumulador (operando de destino).

A ilustração a seguir descreve a instrução acima e sua execução. O opcode 74H é salvo no endereço 0202. Os dados 6AH são salvos no endereço 0203 na memória do programa. Depois de ler o opcode 74H, os dados no próximo endereço de memória de programa são transferidos para o acumulador A (E0H é o endereço do acumulador). Como a instrução é de 2 bytes e é executada em um ciclo, o contador do programa será incrementado em 2 e apontará para 0204 da memória do programa.

Note- O símbolo '#' antes de 6AH indica que o operando é um dado (8 bits). Na ausência de '#', o número hexadecimal seria considerado um endereço.

Modo de endereçamento direto

Essa é outra maneira de endereçar um operando. Aqui, o endereço dos dados (dados de origem) é fornecido como um operando. Vamos dar um exemplo.

MOV A, 04H

O banco de registros # 0 (4º registro) possui o endereço 04H. Quando a instrução MOV é executada, os dados armazenados no registro 04H são movidos para o acumulador. Como o registro 04H contém os dados 1FH, 1FH é movido para o acumulador.

Note- Não usamos '#' no modo de endereçamento direto, ao contrário do modo imediato. Se tivéssemos usado '#', o valor dos dados 04H teria sido transferido para o acumulador em vez de 1FH.

Agora, dê uma olhada na ilustração a seguir. Mostra como a instrução é executada.

Conforme mostrado na ilustração acima, esta é uma instrução de 2 bytes que requer 1 ciclo para ser concluída. O PC será incrementado em 2 e apontará para 0204. O opcode para a instrução MOV A, endereço é E5H. Quando a instrução em 0202 é executada (E5H), o acumulador fica ativo e pronto para receber dados. Então, o PC vai para o próximo endereço como 0203 e procura o endereço do local de 04H onde os dados de origem (a serem transferidos para o acumulador) estão localizados. Às 04H, o controle encontra os dados 1F e os transfere para o acumulador e, portanto, a execução é concluída.

Registrar modo de endereçamento direto

Neste modo de endereçamento, usamos o nome do registro diretamente (como operando de origem). Vamos tentar entender com a ajuda de um exemplo.

MOV A, R4

Por vez, os registros podem assumir valores de R0 a R7. Existem 32 desses registros. Para usar 32 registradores com apenas 8 variáveis ​​para endereçar registradores, são usados ​​bancos de registradores. Existem 4 bancos de registradores nomeados de 0 a 3. Cada banco compreende 8 registradores nomeados de R0 a R7.

Ao mesmo tempo, um único banco de registro pode ser selecionado. A seleção de um banco de registro é possível através de umSpecial Function Register (SFR) nomeado Processor Status Word(PSW). PSW é um SFR de 8 bits onde cada bit pode ser programado conforme necessário. Os bits são designados de PSW.0 a PSW.7. PSW.3 e PSW.4 são usados ​​para selecionar bancos de registro.

Agora, dê uma olhada na ilustração a seguir para obter uma compreensão clara de como funciona.

Opcode EC é usado para MOV A, R4. O opcode é armazenado no endereço 0202 e quando executado, o controle vai diretamente para R4 do banco de registros respeitado (que é selecionado no PSW). Se o banco de registro # 0 for selecionado, os dados de R4 do banco de registro # 0 serão movidos para o acumulador. Aqui, 2F é armazenado às 04H. 04H representa o endereço de R4 do banco de registro # 0.

O movimento de dados (2F) é destacado em negrito. 2F está sendo transferido para o acumulador da localização de memória de dados 0C H e é mostrado como uma linha pontilhada. 0CH é a localização do endereço do Registrador 4 (R4) do banco de registros # 1. A instrução acima tem 1 byte e requer 1 ciclo para execução completa. O que significa é que você pode economizar memória de programa usando o modo de endereçamento direto de registro.

Registrar modo de endereçamento indireto

Neste modo de endereçamento, o endereço dos dados é armazenado no registro como operando.

MOV A, @R0

Aqui, o valor dentro de R0 é considerado um endereço, que contém os dados a serem transferidos para o acumulador. Example: Se R0 tem o valor 20H, e os dados 2FH são armazenados no endereço 20H, então o valor 2FH será transferido para o acumulador após a execução desta instrução. Veja a ilustração a seguir.

Portanto, o opcode para MOV A, @R0é E6H. Assumindo que o banco de registro # 0 está selecionado, o R0 do banco de registro # 0 contém os dados 20H. O controle do programa se move para 20H, onde localiza os dados 2FH e transfere 2FH para o acumulador. Esta é uma instrução de 1 byte e o contador do programa é incrementado em 1 e passa para 0203 da memória do programa.

Note- Apenas R0 e R1 têm permissão para formar uma instrução de endereçamento indireto de registro. Em outras palavras, o programador pode criar uma instrução usando @ R0 ou @ R1. Todos os bancos de registro são permitidos.

Modo de endereçamento indexado

Tomaremos dois exemplos para entender o conceito de modo de endereçamento indexado. Dê uma olhada nas seguintes instruções -

MOVC A, @A+DPTR

e

MOVC A, @A+PC

onde DPTR é o ponteiro de dados e PC é o contador do programa (ambos são registradores de 16 bits). Considere o primeiro exemplo.

MOVC A, @A+DPTR

O operando de origem é @ A + DPTR. Ele contém os dados de origem deste local. Aqui estamos adicionando o conteúdo do DPTR com o conteúdo atual do acumulador. Essa adição fornecerá um novo endereço que é o endereço dos dados de origem. Os dados apontados por este endereço são então transferidos para o acumulador.

O opcode é 93H. DPTR tem o valor 01FE, onde 01 está localizado no DPH (8 bits mais altos) e FE está localizado no DPL (8 bits mais baixos). O acumulador tem o valor 02H. Em seguida, uma adição de 16 bits é realizada e 01FE H + 02H resulta em 0200 H. Os dados no local 0200H serão transferidos para o acumulador. O valor anterior dentro do acumulador (02H) será substituído pelos novos dados de 0200H. Os novos dados no acumulador são destacados na ilustração.

Esta é uma instrução de 1 byte com 2 ciclos necessários para a execução e o tempo de execução necessário para esta instrução é alto em comparação com as instruções anteriores (que eram todas de 1 ciclo cada).

O outro exemplo MOVC A, @A+PCfunciona da mesma maneira que o exemplo acima. Em vez de adicionar DPTR com o acumulador, aqui os dados dentro do contador do programa (PC) são adicionados com o acumulador para obter o endereço de destino.

Um registro de função especial (ou registro de propósito especial ou simplesmente registro especial) é um registro dentro de um microprocessador que controla ou monitora as várias funções de um microprocessador. Como os registradores especiais estão intimamente ligados a alguma função ou status especial do processador, eles podem não ser graváveis ​​diretamente por instruções normais (como adicionar, mover, etc.). Em vez disso, alguns registros especiais em algumas arquiteturas de processador requerem instruções especiais para modificá-los.

No 8051, os registradores A, B, DPTR e PSW fazem parte do grupo de registradores comumente referido como SFR (registradores de função especial). Um SFR pode ser acessado por seu nome ou por seu endereço.

A tabela a seguir mostra uma lista de SFRs e seus endereços.

Endereço de Byte Endereço de bit
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0 B
E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
B8 - - - AC 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 Não é endereçável por bits SBUF
98 9F 9E 9D 9C 9B 9A 99 98 SCON
90 97 96 95 94 93 92 91 90 P1
8D Não é endereçável por bits TH1
8C Não é endereçável por bits TH0
8B Não é endereçável por bits TL1
8A Não é endereçável por bits TL0
89 Não é endereçável por bits TMOD
88 8F 8E 8D 8C 8B 8A 89 88 TCON
87 Não é endereçável por bits PCON
83 Não é endereçável por bits DPH
82 Não é endereçável por bits DPL
81 Não é endereçável por bits SP
80 87 87 85 84 83 82 81 80 P0

Considere os dois pontos a seguir sobre os endereços SFR.

  • Um registro de função especial pode ter um endereço entre 80H e FFH. Esses endereços estão acima de 80H, pois os endereços de 00 a 7FH são os endereços da memória RAM dentro do 8051.

  • Nem todo o espaço de endereço de 80 a FF é usado pelo SFR. As localizações não utilizadas, 80H a FFH, são reservadas e não devem ser utilizadas pelo programador 8051.

CY PSW.7 Carregar bandeira
AC PSW.6 Bandeira de transporte auxiliar
F0 PSW.5 Sinalizador 0 disponível para o usuário para fins gerais.
RS1 PSW.4 Registro de banco seletor bit 1
RS0 PSW.3 Registro do seletor de banco bit 0
OV PSW.2 Sinalizador de estouro
- PSW.1 FLAG definível pelo usuário
P PSW.0 Paridade FLAG. Energizado / limpo pelo hardware durante o ciclo de instrução para indicar o número par / ímpar de 1 bit no acumulador.

No exemplo a seguir, os nomes dos registros SFR são substituídos por seus endereços.

CY AC F0 RS1 RS0 OV - P

Podemos selecionar o bit do banco de registro correspondente usando os bits RS0 e RS1.

RS1 RS2 Banco de registro Endereço
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH

A palavra de status do programa (PSW) contém bits de status para refletir o estado atual da CPU. As variantes do 8051 fornecem um registro de função especial, PSW, com essas informações de status. O 8251 fornece dois sinalizadores de status adicionais, Z e N, que estão disponíveis em um segundo registro de função especial chamado PSW1.

UMA timeré um tipo especializado de relógio usado para medir intervalos de tempo. Um cronômetro que conta de zero para cima para medir o tempo decorrido é freqüentemente chamado destopwatch. É um dispositivo que faz a contagem regressiva a partir de um intervalo de tempo especificado e usado para gerar um atraso de tempo, por exemplo, uma ampulheta é um cronômetro.

UMA counteré um dispositivo que armazena (e às vezes exibe) o número de vezes que um determinado evento ou processo ocorreu, em relação a um sinal de clock. É usado para contar os eventos que acontecem fora do microcontrolador. Em eletrônica, os contadores podem ser implementados facilmente usando circuitos do tipo registrador, como um flip-flop.

Diferença entre um cronômetro e um contador

Os pontos que diferenciam um cronômetro de um contador são os seguintes -

Cronômetro Contador
O registro é incrementado a cada ciclo da máquina. O registro é incrementado considerando a transição de 1 para 0 em seu correspondente a um pino de entrada externa (T0, T1).
A taxa máxima de contagem é 1/12 da frequência do oscilador. A taxa máxima de contagem é 1/24 da frequência do oscilador.
Um cronômetro usa a frequência do relógio interno e gera atraso. Um contador usa um sinal externo para contar os pulsos.

Timers de 8051 e seus registros associados

O 8051 tem dois temporizadores, Timer 0 e Timer 1. Eles podem ser usados ​​como temporizadores ou como contadores de eventos. Tanto o temporizador 0 quanto o temporizador 1 têm largura de 16 bits. Como o 8051 segue uma arquitetura de 8 bits, cada 16 bits é acessado como dois registradores separados de byte baixo e byte alto.

Registro do cronômetro 0

O registro de 16 bits do Timer 0 é acessado como byte alto e baixo. O registro de byte inferior é denominado TL0 (byte inferior do cronômetro 0) e o registro de byte superior é denominado TH0 (byte superior do cronômetro 0). Esses registros podem ser acessados ​​como qualquer outro registro. Por exemplo, a instruçãoMOV TL0, #4H move o valor para o byte inferior do Timer # 0.

Registro do cronômetro 1

O registro de 16 bits do Timer 1 é acessado como byte alto e baixo. O registro de byte baixo é chamado TL1 (byte baixo do temporizador 1) e o registro de byte alto é chamado TH1 (byte alto do temporizador 1). Esses registros podem ser acessados ​​como qualquer outro registro. Por exemplo, a instruçãoMOV TL1, #4H move o valor para o byte inferior do Timer 1.

Registro TMOD (modo temporizador)

Tanto o Timer 0 quanto o Timer 1 usam o mesmo registro para definir os vários modos de operação do timer. É um registro de 8 bits em que os 4 bits inferiores são separados para o Timer 0 e os quatro bits superiores para os Timers. Em cada caso, os 2 bits inferiores são usados ​​para definir o modo do temporizador antecipadamente e os 2 bits superiores são usados ​​para especificar a localização.

Gate - Quando definido, o cronômetro só funciona enquanto INT (0,1) está alto.

C/T - Bit de seleção do contador / temporizador.

M1 - Bit de modo 1.

M0 - Bit de modo 0.

PORTÃO

Cada cronômetro tem um meio de iniciar e parar. Alguns temporizadores fazem isso por software, alguns por hardware e alguns têm controles de software e hardware. Os temporizadores 8051 têm controles de software e hardware. O início e a parada de um cronômetro são controlados por software usando a instruçãoSETB TR1 e CLR TR1 para o temporizador 1, e SETB TR0 e CLR TR0 para o temporizador 0.

A instrução SETB é usada para iniciá-lo e é interrompida pela instrução CLR. Estas instruções iniciam e param os temporizadores enquanto GATE = 0 no registro TMOD. Os temporizadores podem ser iniciados e interrompidos por uma fonte externa fazendo GATE = 1 no registro TMOD.

C / T (RELÓGIO / TEMPORIZADOR)

Este bit no registro TMOD é usado para decidir se um temporizador é usado como um delay generator ou um event manager. Se C / T = 0, é usado como um temporizador para geração de atraso do temporizador. A fonte do relógio para criar o retardo de tempo é a frequência do cristal do 8051. Se C / T = 0, a frequência do cristal conectada ao 8051 também decide a velocidade na qual o temporizador do 8051 tique em um intervalo regular.

A frequência do temporizador é sempre 1/12 da frequência do cristal ligado ao 8051. Embora vários sistemas baseados no 8051 tenham uma frequência XTAL de 10 MHz a 40 MHz, normalmente trabalhamos com a frequência XTAL de 11,0592 MHz. É porque a taxa de transmissão para comunicação serial do 8051.XTAL = 11,0592 permite que o sistema 8051 se comunique com o PC sem erros.

M1 / M2

M1 M2 Modo
0 0 Modo de cronômetro de 13 bits.
0 1 Modo de temporizador de 16 bits.
1 0 Modo de recarga automática de 8 bits.
1 1 Modo derramado.

Diferentes modos de temporizadores

Modo 0 (modo temporizador de 13 bits)

Tanto o Timer 1 quanto o Timer 0 no Modo 0 operam como contadores de 8 bits (com um prescaler dividido por 32). O registro do temporizador é configurado como um registro de 13 bits que consiste em todos os 8 bits de TH1 e os 5 bits inferiores de TL1. Os 3 bits superiores de TL1 são indeterminados e devem ser ignorados. Definir o sinalizador de execução (TR1) não limpa o registro. O sinalizador de interrupção do temporizador TF1 é definido quando a contagem passa de todos os 1s para todos os 0s. A operação do modo 0 é igual para o temporizador 0 e para o temporizador 1.

Modo 1 (modo temporizador de 16 bits)

O modo de temporizador "1" é um temporizador de 16 bits e é um modo comumente usado. Ele funciona da mesma maneira que o modo de 13 bits, exceto que todos os 16 bits são usados. TLx é incrementado começando de 0 a um máximo de 255. Uma vez que o valor 255 é alcançado, TLx é redefinido para 0 e então THx é incrementado em 1. Como sendo um temporizador de 16 bits completo, o temporizador pode conter até 65536 valores distintos e irá estourar de volta para 0 após 65.536 ciclos da máquina.

Modo 2 (recarga automática de 8 bits)

Ambos os registros do temporizador são configurados como contadores de 8 bits (TL1 e TL0) com recarga automática. O estouro de TL1 (TL0) define TF1 (TF0) e também recarrega TL1 (TL0) com o conteúdo de Th1 (TH0), que é predefinido pelo software. A recarga deixa TH1 (TH0) inalterado.

A vantagem do modo de recarregamento automático é que você pode fazer com que o cronômetro sempre contenha um valor de 200 a 255. Se você usar o modo 0 ou 1, terá que verificar o código para ver o estouro e, nesse caso, reajuste o cronômetro para 200. Nesse caso, instruções preciosas verificam o valor e / ou são recarregadas. No modo 2, o microcontrolador cuida disso. Depois de configurar um cronômetro no modo 2, você não precisa se preocupar em verificar se o cronômetro transbordou, nem se preocupar em redefinir o valor porque o hardware do microcontrolador fará tudo para você. O modo de recarga automática é usado para estabelecer uma taxa de transmissão comum.

Modo 3 (modo Split Timer)

O modo temporizador "3" é conhecido como split-timer mode. Quando o temporizador 0 é colocado no modo 3, ele se torna dois temporizadores de 8 bits separados. O temporizador 0 é TL0 e o temporizador 1 é TH0. Ambos os temporizadores contam de 0 a 255 e em caso de estouro, redefinir para 0. Todos os bits que são do temporizador 1 agora serão vinculados a TH0.

Quando o Timer 0 está no modo dividido, o Timer 1 real (ou seja, TH1 e TL1) pode ser definido nos modos 0, 1 ou 2, mas não pode ser iniciado / interrompido porque os bits que o fazem agora estão vinculados a TH0. O cronômetro real 1 será incrementado a cada ciclo da máquina.

Inicializando um cronômetro

Decida o modo do temporizador. Considere um cronômetro de 16 bits que funciona continuamente e é independente de quaisquer pinos externos.

Inicialize o TMOD SFR. Use os 4 bits mais baixos do TMOD e considere o Timer 0. Mantenha os dois bits, GATE 0 e C / T 0, como 0, pois queremos que o timer seja independente dos pinos externos. Como o modo de 16 bits é o modo do temporizador 1, limpe T0M1 e defina T0M0. Efetivamente, o único bit a ligar é o bit 0 do TMOD. Agora execute a seguinte instrução -

MOV TMOD,#01h

Agora, o cronômetro 0 está no modo de cronômetro de 16 bits, mas não está funcionando. Para iniciar o temporizador no modo de execução, defina o bit TR0 executando a seguinte instrução -

SETB TR0

Agora, o Timer 0 começará a contar imediatamente, sendo incrementado uma vez a cada ciclo da máquina.

Lendo um cronômetro

Um cronômetro de 16 bits pode ser lido de duas maneiras. Leia o valor real do cronômetro como um número de 16 bits ou detecte quando o cronômetro estourou.

Detectando Estouro do Timer

Quando um temporizador ultrapassa seu valor mais alto para 0, o microcontrolador define automaticamente o bit TFx no registro TCON. Portanto, em vez de verificar o valor exato do temporizador, o bit TFx pode ser verificado. Se TF0 estiver definido, o temporizador 0 estourou; se TF1 estiver definido, o temporizador 1 transbordou.

Uma interrupção é um sinal para o processador emitido por hardware ou software, indicando um evento que requer atenção imediata. Sempre que ocorre uma interrupção, o controlador completa a execução da instrução atual e inicia a execução de umInterrupt Service Routine (ISR) ou Interrupt Handler. ISR diz ao processador ou controlador o que fazer quando a interrupção ocorrer. As interrupções podem ser interrupções de hardware ou interrupções de software.

Interrupção de Hardware

Uma interrupção de hardware é um sinal de alerta eletrônico enviado ao processador de um dispositivo externo, como um controlador de disco ou um periférico externo. Por exemplo, quando pressionamos uma tecla no teclado ou movemos o mouse, eles acionam interrupções de hardware que fazem com que o processador leia o pressionamento de tecla ou a posição do mouse.

Interrupção de software

Uma interrupção de software é causada por uma condição excepcional ou por uma instrução especial no conjunto de instruções que causa uma interrupção quando é executada pelo processador. Por exemplo, se a unidade lógica aritmética do processador executa um comando para dividir um número por zero, para causar uma exceção de divisão por zero, fazendo com que o computador abandone o cálculo ou exiba uma mensagem de erro. As instruções de interrupção de software funcionam de maneira semelhante às chamadas de sub-rotina.

O que é votação?

O estado de monitoramento contínuo é conhecido como polling. O microcontrolador verifica continuamente o status de outros dispositivos; e, ao fazer isso, não realiza nenhuma outra operação e consome todo o seu tempo de processamento para monitoramento. Este problema pode ser resolvido usando interrupções.

No método de interrupção, o controlador responde apenas quando ocorre uma interrupção. Assim, o controlador não é obrigado a monitorar regularmente o status (sinalizadores, sinais, etc.) dos dispositivos de interface e embutidos.

Interrompe a sondagem v / s

Aqui está uma analogia que diferencia uma interrupção de votação -

Interromper Votação
Uma interrupção é como um shopkeeper. Se alguém precisa de um serviço ou produto, ele vai até ele e o informa de suas necessidades. Em caso de interrupções, quando os sinalizadores ou sinais são recebidos, eles notificam o controlador de que precisam de manutenção. O método de votação é como um salesperson. O vendedor vai de porta em porta enquanto solicita a compra de um produto ou serviço. Da mesma forma, o controlador continua monitorando os sinalizadores ou sinais um por um para todos os dispositivos e fornece serviço para qualquer componente que precise de seu serviço.

Interromper a rotina de serviço

Para cada interrupção, deve haver uma rotina de serviço de interrupção (ISR), ou interrupt handler. Quando ocorre uma interrupção, o microcontrolador executa a rotina de serviço de interrupção. Para cada interrupção, há um local fixo na memória que contém o endereço de sua rotina de serviço de interrupção, ISR. A tabela de localizações de memória separada para conter os endereços de ISRs é chamada de Tabela de Vetor de Interrupção.

Tabela de vetores de interrupção

Existem seis interrupções, incluindo RESET em 8051.

Interrupções Localização ROM (Hex) PIN
Interrupções Localização ROM (HEX)
Serial COM (RI e TI) 0023
Interrupções do temporizador 1 (TF1) 001B
Interrupção HW externa 1 (INT1) 0013 P3.3 (13)
Interrupção HW externa 0 (INT0) 0003 P3.2 (12)
Temporizador 0 (TF0) 000B
Redefinir 0000 9
  • Quando o pino de redefinição é ativado, o 8051 salta para a localização de endereço 0000. Esta é a redefinição de inicialização.

  • Duas interrupções são reservadas para os temporizadores: uma para o temporizador 0 e outra para o temporizador 1. As localizações de memória são 000BH e 001BH respectivamente na tabela de vetor de interrupção.

  • Duas interrupções são reservadas para interrupções externas de hardware. Pin no. 12 e pino no. 13 na porta 3 são para as interrupções de hardware externo INT0 e INT1, respectivamente. As localizações de memória são 0003H e 0013H respectivamente na tabela de vetores de interrupção.

  • A comunicação serial possui uma única interrupção que pertence tanto à recepção quanto à transmissão. O local de memória 0023H pertence a esta interrupção.

Etapas para executar uma interrupção

Quando uma interrupção fica ativa, o microcontrolador segue as seguintes etapas -

  • O microcontrolador fecha a instrução atualmente em execução e salva o endereço da próxima instrução (PC) na pilha.

  • Ele também salva o status atual de todas as interrupções internamente (ou seja, não na pilha).

  • Ele salta para o local da memória da tabela de vetores de interrupção que contém o endereço da rotina de serviço de interrupções.

  • O microcontrolador obtém o endereço do ISR da tabela de vetores de interrupção e salta para ele. Começa a executar a sub-rotina do serviço de interrupção, que é RETI (retorno da interrupção).

  • Ao executar a instrução RETI, o microcontrolador retorna ao local onde foi interrompido. Primeiro, ele obtém o endereço do contador do programa (PC) da pilha, colocando os bytes superiores da pilha no PC. Então, ele começa a ser executado a partir desse endereço.

Edge Triggering vs. Level Triggering

Os módulos de interrupção são de dois tipos - disparados por nível ou disparados por borda.

Nível acionado Edge Triggered
Um módulo de interrupção disparado por nível sempre gera uma interrupção sempre que o nível da fonte de interrupção é declarado. Um módulo de interrupção disparado por borda gera uma interrupção apenas quando detecta uma borda de afirmação da fonte de interrupção. A borda é detectada quando o nível da fonte de interrupção realmente muda. Também pode ser detectado por amostragem periódica e detecção de um nível declarado quando a amostra anterior foi retirada.
Se a fonte de interrupção ainda é afirmada quando o manipulador de interrupção do firmware trata a interrupção, o módulo de interrupção irá regenerar a interrupção, fazendo com que o manipulador de interrupção seja invocado novamente. Módulos de interrupção acionados por borda podem ser acionados imediatamente, não importa como a fonte de interrupção se comporte.
As interrupções disparadas por nível são complicadas para o firmware. As interrupções acionadas por borda mantêm a complexidade do código do firmware baixa, reduzem o número de condições para o firmware e fornecem mais flexibilidade quando as interrupções são tratadas.

Habilitando e desabilitando uma interrupção

Após a reinicialização, todas as interrupções são desativadas, mesmo se estiverem ativadas. As interrupções devem ser habilitadas por software para que o microcontrolador responda a essas interrupções.

O registro do IE (ativação de interrupção) é responsável por ativar e desativar a interrupção. O IE é um registro bitaddressable

Interromper Habilitar Registro

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA - Ativação / desativação global.

  • - - Indefinido.

  • ET2 - Habilite a interrupção do Timer 2.

  • ES - Habilite a interrupção da porta serial.

  • ET1 - Habilite a interrupção do Timer 1.

  • EX1 - Habilite a interrupção externa 1.

  • ET0 - Habilite a interrupção do Timer 0.

  • EX0 - Habilite a interrupção 0 externa.

Para habilitar uma interrupção, tomamos as seguintes etapas -

  • O bit D7 do registro IE (EA) deve ser alto para permitir que o restante do registro tenha efeito.

  • Se EA = 1, as interrupções serão habilitadas e respondidas, se seus bits correspondentes no IE forem altos. Se EA = 0, nenhuma interrupção responderá, mesmo se seus pinos associados no registro IE estiverem altos.

Interromper prioridade em 8051

Podemos alterar a prioridade de interrupção atribuindo a prioridade mais alta a qualquer uma das interrupções. Isso é feito programando um registro chamadoIP (prioridade de interrupção).

A figura a seguir mostra os bits do registro IP. Após a reinicialização, o registro IP contém todos os 0s. Para dar uma prioridade mais alta a qualquer uma das interrupções, tornamos o bit correspondente no registro IP alto.

- - - - PT1 PX1 PT0 PX0

- IP.7 Não implementado.
- IP.6 Não implementado.
- IP.5 Não implementado.
- IP.4 Não implementado.
PT1 IP.3 Define o nível de prioridade de interrupção do Timer 1.
PX1 IP.2 Define o nível de prioridade da Interrupção externa 1.
PT0 IP.1 Define o nível de prioridade de interrupção do Timer 0.
PX0 IP.0 Define o nível de prioridade de interrupção 0 externa.

Interromper dentro da interrupção

O que acontece se o 8051 estiver executando um ISR que pertence a uma interrupção e outro ficar ativo? Em tais casos, uma interrupção de alta prioridade pode interromper uma interrupção de baixa prioridade. Isso é conhecido comointerrupt inside interrupt. No 8051, uma interrupção de baixa prioridade pode ser interrompida por uma interrupção de alta prioridade, mas não por qualquer outra interrupção de baixa prioridade.

Disparando uma interrupção por software

Há momentos em que precisamos testar um ISR por meio de simulação. Isso pode ser feito com as instruções simples para definir a interrupção alta e, assim, fazer com que o 8051 salte para a tabela de vetores de interrupção. Por exemplo, defina o bit IE como 1 para o temporizador 1. Uma instruçãoSETB TF1 interromperá o 8051 em tudo o que estiver fazendo e o forçará a pular para a tabela de vetores de interrupção.