Preview only show first 10 pages with watermark. For full document please download

Instrução Assembler - Microcontrolador Pic

Instruções da família PIC - Microchip de 8 bits com exemplos da técnica de aplicação e resultados obtidos - esta versão substitui anteriormente publicada.

   EMBED


Share

Transcript

INSTRUÇÕES ASSEMBLER PIC - Microchip Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 1/103 INSTRUÇÕES ASSEMBLER Introdução Através das Instruções o código-fonte pode executar as funções determinadas pelo programador para controlar o sistema externo de acordo com o projeto. A Instrução Assembler é formada por uma série de palavras (mnemônicos) que traduzem a função a ser realizada. Normalmente, cada fabricante desenvolve seu próprio conjunto de instruções que tem aplicação exclusiva nos seus componentes, sem nenhuma compatibilidade com outros fabricantes. Para o programador, cabe estudar cada instrução no seu formato, função e aplicação de acordo com o controlador empregado no projeto. É claro que, se existem vários projetos de aplicação desenvolvidos por uma única empresa, esta optará pelo uso de um só fabricante de controlador por uma simples questão de custo/investimento na educação dos programadores para a linguagem de programação (conjunto de instruções) e características de intercambio de programas ou trechos de programas em aplicações diversas. No geral, entre os diversos controladores existentes no mercado, a função que se deseja realizar com uma instrução em qualquer dispositivo não altera, apenas o nome da instrução (mnemônico) é que sofre uma alteração. Para o nosso caso, serão utilizadas as instruções da família PIC – Microchip, que reúne um conjunto de 37 instruções aplicadas em controladores de 8 bits (Mid Range MCU). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 2/103 Índice de Instruções As instruções são agrupadas em três categorias básicas de aplicação: INSTRUÇÃO ORIENTADA A BYTE (BYTE-ORIENTED OPERATION) MNEMONICO DESCRIÇÃO CM STATUS PÁG. ADDWF Soma o valor contido em W com valor contido em F 1 C, DC, Z * ANDWF Operação AND (E) entre o valor contido em W e valor contido em F 1 Z * CLRF Coloca valor 0 (zero) no registro F 1 Z * CLRW Coloca valor 0 (zero) no registro W 1 Z * COMF “Complemento de 1” (1’s complement) do valor contido em F 1 Z DECF 1 Z IORWF Decrementa uma unidade do valor contido em F Decrementa uma unidade do valor contido em F e salta a instrução seguinte se o resultado for 0 (zero) Incrementa uma unidade no valor contido em F Incrementa uma unidade no valor contido em F e salta a instrução seguinte se o resultao for 0 (zero) Operação OR (OU) entre o valor contido em W e valor contido em F 1 Z * MOVF Mover o valor contido no registro F para o destino especificado 1 Z * MOVWF Mover o valor contido em W para o registro F 1 * NOP Nenhuma operação (No Operation) 1 * RLF Rotaciona valor contido em F à esquerda através do bit CARRY 1 C RRF Rotaciona valor contido em F à direita através do bit CARRY 1 C SUBWF Subtrai o valor contido em W do valor contido em F 1 C, DC, Z SWAPF Troca NIB_LO com NIB_HI no registro F Operação EXCLUSIVE OR (OU EXCLUSIVO) entre o valor contido em W e valor contido em F 1 DECFSZ INCF INCFSZ XORWF 1 (2) 1 * Z 1 (2) 1 * * * * * Z * INSTRUÇÃO ORIENTADA A BIT (BIT-ORIENTED OPERATION) MNEMONICO DESCRIÇÃO CM BCF Coloca valor ‘0’ (clear) no bit F BSF Coloca valor ‘1’ (set) no bit F 1 Testa o valor (nível lógico) do bit F e salta a instrução seguinte se valor do 1 (2) bit for igual a ‘0’ (clear) Testa o valor (nível lógico) do bit F e salta a instrução seguinte se valor do 1 (2) bit for igual a ‘1’ (set) BTFSC BTFSS 1 STATUS PÁG. * * * * Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 3/103 INSTRUÇÃO LITERAL E CONTROLE (LITERAL AND CONTROL OPERATION) MNEMONICO DESCRIÇÃO CM STATUS PÁG. ADDLW Soma valor literal ao valor contido em W 1 C, DC, Z * ANDLW Operação AND (E) entre o valor literal e valor contido em W 1 Z * CALL Chama sub-rotina 2 /TO, /PD * CLRWDT Coloca valor zero no registro WDT (Watchdog Timer) 1 GOTO Vá para (o endereço indicado) 2 IORLW Operação OR (OU) entre o valor literal e valor contido em W 1 MOVLW Mover o valor literal para o registro W 1 * RETFIE Retorna do Tratamento das Interrupções 2 * RETLW Retorna o valor literal no registro W 2 RETURN Retorna de uma sub-rotina 2 SLEEP Vai para modo baixo consumo 1 /TO, /PD SUBLW Subtrai valor literal do valor contido em W Operação EXCLUSIVE OR (OU EXCLUSIVO) entre o valor literal e valor contido em W 1 C, DC, Z 1 Z XORLW * Z * * * Interpretando as Informações Cada instrução se apresenta como um capítulo onde é descrita em sua função com os detalhes necessários para a compreensão de sua operação, incluídos exemplos de aplicação com amostra da sintaxe no código_fonte e como ocorre o comportamento dos bits e registros quando a instrução é executada. Quadro Demonstrativo Contém as informações básicas para consulta de aplicação indicando a função e o uso a instrução. MNEMÔNICO Forma contraída da instrução - normalmente formado pelas iniciais da frase que descreve a operação - o compilador dispões dos códigos de conversão adequados para esta forma. INSTRUÇÃO Frase que descreve a operação realizada pela instrução reproduzindo o texto na língua de origem (ingles). SINTAXE Forma que as instruções devem ser escritas no código_fonte para que o compilador interprete corretamente a conversão para código de máquina. DESCRIÇÃO Descreve a operação da instrução com detalhes. Quantidade de Ciclos de Máquina necessários para que a instrução seja executada CICLO MÁQUINA completamente - tempo de execução da instrução, dependente da frequencia do clock do dispositivo aplicado. STATUS Bit do registro STATUS que sofre alteração quando a execução da instrução resulta em situação definida pelo fabricante (ver quadro descritivo do registro STATUS). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 4/103 Organização do Registro Lembrar que todos os sistemas processados tem como base as Técnicas Digitais fundamentais logo, a estrutura do registro onde a informação é armazenada segue todos os padrões habituais de formato, nomes, localização de bit etc., etc., etc.. Para a exposição do funcionamento das instruções e seu emprego, os exemplos serão sempre baseados nos elementos identificados como mostra a figura abaixo: ┌───────────────────────> [ posição bit ] ───> 6 │ │ ┌────────> [ nome bit ] ─────> BOTAO │ │ 7 6 5 4 3 2 1 0 1 0 1 0 1 0 0 1 PORTA MSB LSB │ └─────> Bit menos significativo │ LSB - Least Significant Bit │ └──────────────────────────> Bit mais significativo MSB - Most Significant Bit Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 5/103 Vocabulário [ posição bit ] - número inteiro, no intervalo de 0 a 7, que identifica a posição do bit em um registro, contado sempre da direita para a esquerda, começando no bit 0 (LSB - bit menos significativo). BTFSC [ nome registro ],[ posição bit ] ; VERIFICA O ESTADO DO BIT [ ; REG. [ nome registro ] BTFSC PORTA,6 ; VERIFICA O ESTADO DO BIT 6 DO REG. PORTA ┌──────> [ posição bit ] ───> 6 │ │ │ 7 6 5 4 3 2 1 0 1 0 1 0 1 0 0 1 MSB posição bit ] DO PORTA LSB _______________________________________________________________________________________ [ nome bit ] - nome que identifica o bit dentro do registro em substituição do número que identifica a [ posição bit ] - o nome do bit pode ser estabelecido pelo fabricante (Registros de Funções Especiais - SFR): BCF [ nome registro ],[ nome bit ] ; DESLIGA O BIT [ nome bit ] NO REGISTRO ; [ nome registro ] BCF INTCON,PEIE ; DESLIGA BIT PEIE NO REGISTRO INTCON ┌──> PEIE │ │ 0 0 0 0 0 0 0 0 INTCON Ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na área de Diretivas. BCF [ nome bit ] ; DESLIGA O BIT [ nome bit ] BCF F_CONT ; DESLIGA BIT F_CONT ┌──> F_CONT │ │ 0 0 0 0 0 0 0 0 FLAG Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 6/103 [ nome registro ] - identifica um registro na memória (Ram ou Programa) a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funções Especiais SFR): 0 1 0 0 0 0 0 0 TMR0 Ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na área de Diretivas: [ endereço ] [ nome registro ] CBLOCK ; REGISTRO USO GERAL ENDC CBLOCK 0x20 FLAG ENDC ; REGISTRO PARA FLAGS DE CONTROLE 0 1 0 0 0 0 0 0 FLAG _______________________________________________________________________________________ [ registro origem ] - identifica o registro de origem do valor a ser empregado pela instrução a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funções Especiais - SFR), ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na área de Diretivas. ADDWF [ registro origem ],[ registro destino ] ; SOMAR O VALOR DO [ registro origem ; COM O VALOR DO [ registro destino ] E COLOCAR O ; RESULTADO DA OPERAÇÃO NO [ registro destino ] ADDWF CONT,W ] ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W _______________________________________________________________________________________ [ registro destino ] - identifica o registro de destino do valor resultado da execução da instrução a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funções Especiais - SFR), ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na área de Diretivas. SUBWF [ registro origem ],[ registro destino ] ; SOMAR O VALOR DO [ registro origem ; COM O VALOR DO [ registro destino ] E COLOCAR O ; RESULTADO DA OPERAÇÃO NO [ registro destino ] SUBWF CONT,W ] ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 7/103 [ nome literal ] - identifica um valor numérico (constante) a partir de um nome estabelecido pelo programador e devidamente declarado na área de Diretivas. A utilização do valor numérico (constante) no programa se faz utilizando sempre o nome dado. O compilador se encarrega de realizar a substituição do nome pelo valor no registro. [ nome literal ] EQU .XXX ; RELACIONA O NOME [ nome ; VALOR NUMÉRICO XXX REFERENCIA EQU .133 ; RELACIONA O NOME ‘REFERENCIA’ AO ; VALOR NUMÉRICO 133 MOVLW [ nome literal ] ; MOVER [ MOVLW REFERENCIA ; MOVER ‘REFERENCIA’ PARA REG. W literal ] AO nome literal ] PARA REG. W _______________________________________________________________________________________ [ endereço ] - identifica o destino de um desvio originado no código_fonte - o programador pode utilizar nomes para identificar os diversos endereços. O compilador se encarrega de realizara a substituição do nome pela posição numérica na memória. Não tem necessidade de se declarar os nomes dos endereços na área de Diretivas. CALL [ endereço ] ; DESVIA PARA SUB-ROTINA [ endereço ] CALL SINALIZACAO ; DESVIA PARA SUB-ROTINA DE SINALIZAÇÃO GOTO [ endereço ] ; VAI PARA O ENDEREÇO [ GOTO DESLIGA_LED ; VAI PARA O ENDEREÇO DESLIGA_LED endereço ] _______________________________________________________________________________________ [ valor ] - valor numérico diretamente declarado na instrução dentro do código_fonte - o programador não identificou o valor através de um nome declarado na área de Diretivas. MOVLW [ valor ] ; MOVER [ valor ] PARA REG. W MOVLW B'10000011' ; MOVER LITERAL PARA REG. W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 8/103 STATUS O registro STATUS dispõe de 6 bits de flag (sinalização) reagindo ao resultado das operações realizadas por diversas instruções. A tabela descreve apenas os bits relacionados às funções afetadas. R/W 7 R/W 6 R/W 5 IRP RP1 RP0 R /TO 4 R /PD 3 R/W 2 Z R/W 1 DC MSB BIT OPER INÍCIO 7 6:5 4 3 2 1 0 R/W R/W R R R/W R/W R/W 0 0 1 1 X X X R/W 0 C LSB NOME FUNÇÃO IRP Seleção da Página de Memória (usado para endereçamento indireto) 1 = Ativa Páginas de Memória 2 e 3 (Bank2 e Bank3) 0 = Ativa Páginas de Memória 0 e 1 (Bank0 e Bank1) RP1:RP0 Seleção da Página de Memória (usado para endereçamento direto) /TO /PD Z DC C 11 = Ativa Página de Memória 3 (Bank3) 10 = Ativa Página de Memória 2 (Bank2) 01 = Ativa Página de Memória 1 (Bank1) 00 = Ativa Página de Memória 0 (Bank0) Time-Out - Tempo esgotado – a CPU informa as seguintes ocorrências neste bit: 1 = após energização do controlador ou ocorrência da instrução CLRWDT ou ocorrência da instrução SLEEP 0 = tempo esgotado para ocorrência da instrução WDT (o programa está parado em um loop infinito) Power Down – Queda Alimentação/Redução de Consumo - a CPU informa as seguintes ocorrências neste bit: 1 = após energização do controlador ou ocorrência da instrução SLEEP 0 = execução da instrução SLEEP Zero - a CPU informa as seguintes ocorrências neste bit: 1 = o resultado da última operação aritmética/lógica foi zero 0 = o resultado da última operação aritmética/lógica não foi zero Digit Carry/Borrow - Dígito de Transporte/Empréstimo - a CPU informa as seguintes ocorrências neste bit: 1 = o resultado da última operação aritmética/lógica não excedeu os 4 bits menos significativos do registro. 0 = o resultado da última operação aritmética/lógica excedeu os 4 bits menos significativos do registro. Carry/Borrow - Transporte/Empréstimo - a CPU informa as seguintes ocorrências neste bit: 1 = o resultado da última operação aritmética/lógica não excedeu o valor 255. 0 = o resultado da última operação aritmética/lógica excedeu o valor 255. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 9/103 BCF MNEMÔNICO BCF INSTRUÇÃO Bit Clear F SINTAXE BCF BCF BCF DESCRIÇÃO Coloca o valor (nível lógico) ‘0’ (clear) no bit identificado por [ nome bit ] [ nome bit ] – bit pertence a Registro de Uso Geral [ nome registro ],[ nome bit ] – bit pertence a Registro Especial [ nome registro ],[ posição bit ] – uso geral CICLO MÁQUINA 1 STATUS Nenhum Esta instrução coloca o nível lógico ‘0’ (zero - clear) no bit específico em um determinado registro. Só afeta o bit considerado dentro do registro. A sintaxe da instrução depende do tipo de registro em que o bit está localizado: Bit em Registro de Uso Geral: BCF [ nome bit ] O programador indica o nome do Bit e relaciona ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte, usar o nome do Bit após a instrução. Bit em Registro Especial: BCF [ nome registro ],[ nome bit ] O nome do Bit já existe (o fabricante estabelece no arquivo de inclusão) mas não tem relacionamento entre ele e os Registros Especiais (o fabricante não coloca este relacionamento no arquivo de inclusão) – no código_fonte o programador deve identificar o Registro Especial e o nome do Bit. Uso Geral: BCF [ nome registro ],[ posição bit ] O Registro Especial não possui nomes para os Bits (por exemplo: registros PORT) – no código_fonte, o programador indica o nome do registro (definido na área de Diretivas) e a posição do Bit. EXEMPLOS: Bit em Registro de Uso Geral Operação: → BCF [ nome bit ] Desligar o bit F_CONT * Definir o nome do bit na área de diretivas identificando qual o registro e qual a posição do bit no registro: #DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME ‘F_CONT’ O BIT 6 DO ; REGISTRO FLAG Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 10/103 * Valor contido no bit 6 (F_CONT) do registro FLAG antes da execução da instrução: ┌──> F_CONT │ │ 0 1 0 0 0 0 0 0 FLAG * Instrução BCF [ nome bit ] ; DESLIGA [ nome bit ] BCF F_CONT ; DESLIGA FLAG F_CONT * Valor contido no bit 6 (F_CONT) do registro FLAG depois da execução da instrução: ┌──> F_CONT │ │ 0 0 0 Bit em Registro Especial Operação: 0 → 0 0 0 0 FLAG BCF [ nome registro ],[ nome bit ] Desligar a interrupção do TMR0 no registro INTCON * Valor contido no bit 5 (T0IE) do registro INTCON antes da execução da instrução: ┌──> T0IE │ │ 1 0 1 0 0 0 0 0 INTCON * Instrução BCF [ nome registro ],[ nome bit ] ; DESLIGA [ nome registro ],[ nome bit ] BCF INTCON,T0IE ; DESLIGA INTERRUPÇÃO TMR0 * Valor contido no bit 5 (T0IE) do registro INTCON depois da execução da instrução: ┌──> T0IE │ │ 1 Uso Geral Operação: → 0 0 0 0 0 0 0 INTCON BCF [ nome registro ],[ posição bit ] Desligar o bit relacionado a um Led (apagar o Led elétricamente ligado a uma saída) * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA antes da execução da instrução (o estado do bit indica que o Led está ligado): ┌──> LED │ │ 0 1 0 0 0 0 0 0 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 11/103 * Instrução BCF [ nome registro ],[ posição bit ] ; DESLIGA [ nome registro ],[ posição bit ] BCF PORTA,6 ; DESLIGA O BIT 6 DO REGISTRO PORTA * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA depois da execução da instrução (o estado do bit indica que o Led está desligado): ┌──> LED │ │ 0 0 0 0 0 0 0 0 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 12/103 BSF MNEMÔNICO BSF INSTRUÇÃO Bit Set F SINTAXE BSF BSF BSF DESCRIÇÃO Coloca o valor (nível lógico) ‘1’ (set) no bit identificado por [ nome bit ] [ nome bit ] – bit pertence a Registro de Uso Geral [ nome registro ],[ nome bit ] – bit pertence a Registro Especial [ nome registro ],[ posição bit ] – uso geral CICLO MÁQUINA 1 STATUS Nenhum Esta instrução coloca o nível lógico (valor) ‘1’ (set) no bit específico em um determinado registro. Só afeta o bit considerado dentro do registro. A sintaxe da instrução depende do tipo de registro em que está localizado: Bit em Registro de Uso Geral: BSF [ nome bit ] O programador indica o nome do Bit e relaciona ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte, usar o nome do Bit após a instrução Bit em Registro Especial: BSF [ nome registro ],[ nome bit ] O nome do Bit já existe (o fabricante estabelece no arquivo de inclusão) mas não tem relacionamento entre ele e os Registros Especiais (o fabricante não coloca este relacionamento no arquivo de inclusão) – no código_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BSF [ nome registro ],[ posição bit ] O Registro Especial não possui nomes para os Bits (por exemplo: registros PORT) – no código_fonte, o programador indica o nome do registro (definido na área de Diretivas) e a posição do Bit. EXEMPLOS: Bit em Registro de Uso Geral Operação: → BSF [ nome bit ] Ligar o bit F_CONT * Definir o nome do bit na área de diretivas identificando qual o registro e qual a posição do bit no registro: #DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME ‘F_CONT’ O BIT 6 DO ; REGISTRO FLAG Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 13/103 * Valor contido no bit 6 (F_CONT) do registro FLAG antes da execução da instrução: ┌──> F_CONT │ │ 0 0 0 0 0 0 0 0 FLAG * Instrução BSF [ nome bit ] ; LIGA [ nome bit ] BSF F_CONT ; LIGA FLAG F_CONT * Valor contido no bit 6 (F_CONT) do registro FLAG depois da execução da instrução: ┌──> F_CONT │ │ 0 1 0 Bit em Registro Especial Operação: 0 → 0 0 BSF 0 0 FLAG [ nome registro ],[ posição bit ] Ligar a interrupção do TMR0 no registro INTCON * Valor contido no bit 5 (T0IE) do registro INTCON antes da execução da instrução: ┌──> T0IE │ │ 1 0 0 0 0 0 0 0 INTCON * Instrução BSF [ nome registro ],[ nome bit ] ; LIGA [ nome registro ],[ nome bit ] BSF INTCON,T0IE ; LIGA INTERRUPÇÃO TMR0 * Valor contido no bit 5 (T0IE) do registro INTCON depois da execução da instrução: ┌──> T0IE │ │ 1 Uso Geral Operação: → 0 1 BSF 0 0 0 0 0 INTCON [ nome registro ],[ posição bit ] Ligar o bit relacionado a um Led (acender o Led ligado a uma saída) * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA antes da execução da instrução (o estado do bit indica que o Led está desligado): ┌──> LED │ │ 0 0 0 0 0 0 0 0 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 14/103 * Instrução BSF [ nome registro ],[ posição bit ] ; LIGA [ nome registro ],[ posição bit ] BSF PORTA,6 ; LIGA BIT 6 NO REGISTRO PORTA * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA depois da execução da instrução (o estado do bit indica que o Led está ligado): ┌──> LED │ │ 0 1 0 0 0 0 0 0 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 15/103 BTFSC MNEMÔNICO BTFSC INSTRUÇÃO Bit Test F, Skip if Clear BTFSC [ nome bit ] – uso geral BTFSC [ nome registro ],[ nome bit ] – bit pertence a Registro Especial BTFSC [ nome registro ],[ posição bit ] - bit pertence a Reg de Uso Geral Testa o valor (nível lógico) do bit identificado por [ nome bit ] e salta a instrução DESCRIÇÃO seguinte se valor do bit for igual a ‘0’ (clear) 2 CM se valor do bit = ‘0’ (clear) – executa uma NOP CICLO MÁQUINA 1 CM se valor do bit = ‘1’ (set) SINTAXE STATUS Nenhum Esta instrução verifica o nível lógico (valor) de um bit específico em um determinado registro: - se o bit = ‘1’ (set) → executa a instrução seguinte (no caso um GOTO). - se o bit = ‘0’ (clear) → salta a instrução seguinte e executa as demais instruções. Atenção: a execução da instrução (teste de um bit) não altera o valor contido no bit. A sintaxe da instrução depende do tipo de registro em que está localizado: Bit em Registro de Uso Geral: BTFSC [ nome bit ] O programador indica o nome do Bit e relaciona ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte, usar o nome do Bit após a instrução Bit em Registro Especial: BTFSC [ nome registro ], [ nome bit ] O nome do Bit já existe (o fabricante estabelece no arquivo de inclusão) mas não tem relacionamento entre ele e os Registros Especiais (o fabricante não coloca este relacionamento no arquivo de inclusão) – no código_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BTFSC [ nome registro ], [ posição bit ] O Registro Especial não possui nomes para os Bits (por exemplo: registros PORT) – no código_fonte, o programador indica o nome do registro (declarado na área de Diretivas) e a posição do Bit. Nos EXEMPLOS DE SINTAXE podemos ver como a instrução deve ser escrita no código_fonte nas suas diversas formas, mas não explica como a instrução funciona. No EXEMPLO DE APLICAÇÃO utiliza-se um código_fonte funcional completo para explicar como a instrução opera com detalhe. EXEMPLOS DE SINTAXE: Bit em Registro de Uso Geral Operação: → BTFSC [ nome bit ] Testar o valor do bit F_CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 16/103 * Definir o nome do bit na área de diretivas identificando qual o registro e qual a posição do bit no registro: #DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME ‘F_CONT’ O BIT 6 DO ; REGISTRO FLAG * Valor contido no bit 6 (F_CONT) do registro FLAG: ┌──> F_CONT │ │ 0 0 0 0 0 0 0 0 FLAG * Instrução BTFSC [ nome bit ] ; VERIFICA ESTADO [ nome bit ] BTFSC F_CONT ; VERIFICA ESTADO FLAG F_CONT Bit em Registro Especial Operação: → BTFSC [ nome registro ],[ posição bit ] Verificar se a interrupção do TMR0 (no registro INTCON) está habilitada * Valor contido no bit 5 (T0IE) do registro INTCON: ┌──> T0IE │ │ 1 0 0 0 0 0 0 0 INTCON * Instrução BTFSC [ nome registro ],[ nome bit ] ; VERIFICA ESTADO [ nome registro ],[ nome bit ] BTFSC INTCON,T0IE ; VERIFICA ESTADO T0IE - INTERRUPÇÃO TMR0 Uso Geral Operação: → BTFSC [ nome registro ],[ posição bit ] Verificar o bit relacionado a um Led (verificar se o Led está ligado) * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA (o estado do bit indica que o Led está desligado): ┌──> LED │ │ 0 0 0 0 0 0 0 0 PORT A * Instrução BTFSC [ nome registro ],[ posição bit ] ; VERIFICA ESTADO [ nome registro ],[ posição bit ] BTFSC PORTA,6 ; VERIFCA ESTADO DO BIT 6 NO REGISTRO PORTA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 17/103 EXEMPLO DE APLICAÇÃO: Para estudar a maneira como a instrução funciona dentro de um código_fonte, vamos desenvolver uma aplicação simples onde possamos verificar detalhadamente o comportamento dos bits controlados . Consideremos o diagrama funcional: VDD R1 MCU RA0 RA6 R2 B1 L1 VSS A operação proposta é bastante simples: - Aperta o botão B1, acende o led L1. - Solta o botão B1, apaga o led L1. Os estados lógicos que os componentes B1 e L1 podem apresentar para a operação proposta: B1 Livre Pressionado 1 0 L1 Apagado Aceso 0 1 Agora podemos elaborar o fluxograma representativo do funcionamento do sistema: INICIO = 1 B1 (B1 livre) L1 = 0 =0 (B1 pressionado) L1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 18/103 No exemplo de aplicação vamos empregar a sintaxe da instrução: Bit em Registro de Uso Geral → BTFSC [ nome bit ] O programador deve indicar o nome do Bit e relacionar ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte será usado o nome do Bit após a instrução * Definir o nome dos bits de entrada e saída na área de diretivas relacionando o nome ao registro e à posição do bit no registro: #DEFINE B1 PORTA,0 #DEFINE L1 PORTA,6 ; RELACIONANDO O NOME ‘B1’ AO BIT 0 DO ; REGISTRO PORTA ; RELACIONANDO O NOME ‘L1’ O BIT 6 DO ; REGISTRO PORTA ┌──> L1 → bit 6 │ │ 0 0 0 0 0 ┌──> B1 → bit 0 │ 0 0 1 PORT A Baseado no fluxograma, o código_fonte pode ser escrito como: INICIO BTFSC GOTO BSF GOTO B1 DESLIGA_L1 L1 INICIO ; VERIFICA O ESTADO DO BIT QUE REPRESENTA B1 ; B1 = 1 > VAI PARA DESLIGA_L1 ; B1 = 0 > LIGA L1 ; RETORNA PARA INICIO L1 INICIO ; DESLIGA L1 ; RETORNA PARA INICIO DESLIGA_L1 BCF GOTO A execução do código começa em INICIO, verifica o nível lógico (valor) do bit representado pelo nome B1 e adota uma das duas possibilidades que a instrução oferece, como o código_fonte indica abaixo: ┌──>INICIO │ ┌─┬ BTFSC B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =0 =1 ──> VALORES QUE B1 PODE ASSUMIR │ │ │ │ │ └> GOTO DESLIGA_L1 ┐ ; B1 = 1 > VAI PARA DESLIGA_L1 │ └──> BSF L1 │ ; B1 = 0 > LIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO DESLIGA_L1) │ ┌────────────────────────┘ │ DESLIGA_L1 │ └──> BCF L1 ; DESLIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 19/103 Analisando as opções da instrução: * Se B1 = ‘1’ (set) - B1 livre → realiza a instrução seguinte (no caso, um GOTO). O fluxograma mostra o caminho que o código_fonte realiza para esta condição: INICIO =1 B1 L1 = 0 (B1 livre) =0 (B1 pressionado) L1 = 1 A sequencia do código_fonte é realizada na forma indicada (em vermelho, também): ┌──>INICIO │ ┌─┬ BTFSC B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =0 =1 ──> VALOR B1 = 1 │ │ │ │ │ └> GOTO DESLIGA_L1 ┐ ; B1 = 1 > VAI PARA DESLIGA_L1 │ └──> BSF L1 │ ; B1 = 0 > LIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO DESLIGA_L1) │ ┌────────────────────────┘ │ DESLIGA_L1 │ └──> BCF L1 ; DESLIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Analisando o comportamento dos bits envolvidos nas instruções dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execução da instrução BTFSC: ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A * Instrução - durante a execução do código_fonte, somente as instruções envolvidas são consideradas, as demais são completamente ignoradas - não existem - portanto, o controlador vai ver o código_fonte da seguinte forma: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 20/103 ┌──>INICIO │ ┬ BTFSC B1 ; VERIFICA O ESTADO DE B1 │ │ │ =1 │ │ │ └> GOTO DESLIGA_L1 ┐ ; B1 = 1 > VAI PARA DESLIGA_L1 │ │ │ │ │ (BUSCA ENDEREÇO DESLIGA_L1) │ ┌────────────────────────┘ │ DESLIGA_L1 │ └──> BCF L1 ; DESLIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ * Valor contido no bit 0 (B1) do registro PORTA depois da execução da instrução BTFSC - o valor contido no bit 0 (B1) não se altera com a execução da instrução; a execução da instrução BCF impõe o valor 0 (zero) no bit 6 (L1). ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A * Se B1 = ‘0’ (clear) - B1 pressionado → salta a instrução seguinte e executa a instrução encontrada (no caso, um BSF). O fluxograma mostra o caminho que o código_fonte realiza para esta condição: INICIO =1 B1 (B1 livre) L1 = 0 =0 (B1 pressionado) L1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 21/103 A sequencia do código_fonte é realizada na forma indicada (em vermelho, também): ┌──>INICIO │ ┌─┬ BTFSC B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =0 =1 ──> VALOR B1 = 0 │ │ │ │ │ └> GOTO DESLIGA_L1 ┐ ; B1 = 1 > VAI PARA DESLIGA_L1 │ └──> BSF L1 │ ; B1 = 0 > LIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO DESLIGA_L1) │ ┌────────────────────────┘ │ DESLIGA_L1 │ └──> BCF L1 ; DESLIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Analisando o comportamento dos bits envolvidos nas instruções dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execução da instrução BTFSC: ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 0 PORT A * Instrução - durante a execução do código_fonte, somente as instruções envolvidas são consideradas, as demais são completamente ignoradas - não existem - portanto, o controlador vai ver o código_fonte da seguinte forma: ┌──>INICIO │ ┌─┬ BTFSC B1 │ │ │ =0 │ │ │ └──> BSF L1 │ GOTO INICIO ┐ │ │ │ (BUSCA ENDEREÇO INICIO) │<───────────────────────┘ ; VERIFICA O ESTADO DE B1 ; B1 = 0 > LIGA L1 ; RETORNA PARA INICIO * Valor contido no bit 0 (B1) do registro PORTA depois da execução da instrução BTFSC - o valor contido no bit 0 (B1) não se altera com a execução da instrução; a execução da instrução BSF impõe o valor 1 (um) no bit 6 (L1). ┌──> L1 │ │ 0 1 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 22/103 BTFSS MNEMÔNICO BTFSS INSTRUÇÃO Bit Test F, Skip if Set BTFSS [ nome bit ] – uso geral BTFSS [ nome registro ],[ nome bit ] – bit pertence a Registro Especial BTFSS [ nome registro ],[ posição bit ] - bit pertence a Reg de Uso Geral Testa o valor (nível lógico) do bit identificado por F [ nome bit ] e salta a instrução DESCRIÇÃO seguinte se valor do bit for igual a ‘1’ (set) 2 CM se valor do bit = ‘1’ (set) – executa uma NOP CICLO MÁQUINA 1 CM se valor do bit = ‘0’ (clear) SINTAXE STATUS Nenhum Esta instrução verifica o nível lógico (valor) de um bit específico em um determinado registro: - se o bit = ‘0’ (clear) → executa a instrução seguinte (no caso um GOTO). - se o bit = ‘1’ (set) → salta a instrução seguinte e executa as demais instruções. Atenção: a execução da instrução (teste de um bit) não altera o valor contido no bit. A sintaxe da instrução depende do tipo de registro em que está localizado: Bit em Registro de Uso Geral: BTFSS [ nome bit ] O programador indica o nome do Bit e relaciona ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte, usar o nome do Bit após a instrução Bit em Registro Especial: BTFSS [ nome registro ],[ nome bit ] O nome do Bit já existe (o fabricante estabelece no arquivo de inclusão) mas não tem relacionamento entre ele e os Registros Especiais (o fabricante não coloca este relacionamento no arquivo de inclusão) – no código_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BTFSS [ nome registro ],[ posição bit ] O Registro Especial não possui nomes para os Bits (por exemplo: registros PORT) – no código_fonte, o programador indica o nome do registro (declarado na área de Diretivas) e a posição do Bit. Nos EXEMPLOS DE SINTAXE podemos ver como a instrução deve ser escrita no código_fonte nas suas diversas formas, mas não explica como a instrução funciona. No EXEMPLO DE APLICAÇÃO utiliza-se um código_fonte funcional completo para explicar como a instrução opera com detalhe. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 23/103 EXEMPLOS DE SINTAXE: Bit em Registro de Uso Geral Operação: → BTFSS [ nome bit ] Testar o valor do bit F_CONT * Definir o nome do bit na área de diretivas identificando qual o registro e qual a posição do bit no registro: #DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME ‘F_CONT’ O BIT 6 DO ; REGISTRO FLAG * Valor contido no bit 6 (F_CONT) do registro FLAG: ┌──> F_CONT │ │ 0 0 0 0 0 0 0 0 FLAG * Instrução BTFSS [ nome bit ] ; VERIFICA ESTADO [ nome bit ] BTFSS F_CONT ; VERIFICA ESTADO FLAG F_CONT Bit em Registro Especial Operação: → BTFSS [ nome registro ],[ posição bit ] Verificar se a interrupção do TMR0 (no registro INTCON) está habilitada * Valor contido no bit 5 (T0IE) do registro INTCON: ┌──> T0IE │ │ 1 0 0 0 0 0 0 0 INTCON * Instrução BTFSS [ nome registro ],[ nome bit ] ; VERIFICA ESTADO [ nome registro ],[ nome bit ] BTFSS INTCON,T0IE ; VERIFICA ESTADO T0IE - INTERRUPÇÃO TMR0 Uso Geral Operação: → BTFSS [ nome registro ],[ posição bit ] Verificar o bit relacionado a um Led (verificar se o Led está ligado) * Valor contido no bit 6 (elétricamente ligado a um Led) do registro PORTA (o estado do bit indica que o Led está desligado): ┌──> LED │ │ 0 0 0 0 0 0 0 0 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 24/103 * Instrução BTFSS [ nome registro ],[ posição bit ] ; VERIFICA ESTADO [ nome registro ],[ posição bit ] BTFSS PORTA,6 ; VERIFCA ESTADO DO BIT 6 NO REGISTRO PORTA EXEMPLO DE APLICAÇÃO: Para estudar a maneira como a instrução funciona dentro de um código_fonte, vamos desenvolver uma aplicação simples onde possamos verificar detalhadamente o comportamento dos bits controlados . Consideremos o diagrama funcional: VDD R1 MCU RA0 RA6 R2 B1 L1 VSS A operação proposta é bastante simples: - Aperta o botão B1, acende o led L1. - Solta o botão B1, apaga o led L1. Os estados lógicos que os componentes B1 e L1 podem apresentar para a operação proposta: B1 Livre Pressionado 1 0 L1 Apagado Aceso 0 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 25/103 Agora podemos elaborar o fluxograma representativo do funcionamento do sistema: INICIO = 1 B1 L1 = 0 (B1 livre) =0 (B1 pressionado) L1 = 1 No exemplo de aplicação vamos empregar a sintaxe da instrução: Bit em Registro de Uso Geral → BTFSS [ nome bit ] O programador deve indicar o nome do Bit e relacionar ao nome do Registro de Uso Geral na área de Diretivas – no código_fonte será usado o nome do Bit após a instrução * Definir o nome dos bits de entrada e saída na área de diretivas relacionando o nome ao registro e à posição do bit no registro: #DEFINE B1 PORTA,0 #DEFINE L1 PORTA,6 ; RELACIONANDO O NOME ‘B1’ AO BIT 0 DO ; REGISTRO PORTA ; RELACIONANDO O NOME ‘L1’ O BIT 6 DO ; REGISTRO PORTA ┌──> L1 → bit 6 │ │ 0 0 0 0 0 ┌──> B1 → bit 0 │ 0 0 1 PORT A Baseado no fluxograma, o código_fonte pode ser escrito como: INICIO BTFSS GOTO BCF GOTO B1 LIGA_L1 L1 INICIO ; VERIFICA O ESTADO DO BIT QUE REPRESENTA B1 ; B1 = 0 > VAI PARA LIGA_L1 ; B1 = 1 > DESLIGA L1 ; RETORNA PARA INICIO L1 INICIO ; LIGA L1 ; RETORNA PARA INICIO LIGA_L1 BSF GOTO A execução do código começa em INICIO, verifica o nível lógico (valor) do bit representado pelo nome B1 e adota uma das duas possibilidades que a instrução oferece, como o código_fonte indica abaixo: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 26/103 ┌──>INICIO │ ┌─┬ BTFSS B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =1 =0 ──> VALORES QUE B1 PODE ASSUMIR │ │ │ │ │ └> GOTO LIGA_L1 ┐ ; B1 = 0 > VAI PARA LIGA_L1 │ └──> BCF L1 │ ; B1 = 1 > DESLIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO LIGA_L1) │ ┌────────────────────────┘ │ LIGA_L1 │ └──> BSF L1 ; LIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Analisando as opções da instrução: * Se B1 = ‘1’ (set) - B1 livre → salta a instrução seguinte e executa a instrução encontrada (BCF). O fluxograma mostra o caminho que o código_fonte realiza para esta condição: INICIO =1 B1 (B1 livre) L1 = 0 =0 (B1 pressionado) L1 = 1 A sequencia do código_fonte é realizada na forma indicada (em vermelho, também): ┌──>INICIO │ ┌─┬ BTFSS B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =1 =0 ──> VALOR B1 = 1 │ │ │ │ │ └> GOTO LIGA_L1 ┐ ; B1 = 0 > VAI PARA LIGA_L1 │ └──> BCF L1 │ ; B1 = 1 > DESLIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO LIGA_L1) │ ┌────────────────────────┘ │ LIGA_L1 │ └──> BSF L1 ; LIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 27/103 Analisando o comportamento dos bits envolvidos nas instruções dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execução da instrução BTFSS: ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A * Instrução - durante a execução do código_fonte, somente as instruções envolvidas são consideradas, as demais são completamente ignoradas - não existem - portanto, o controlador vai ver o código_fonte da seguinte forma: ┌──>INICIO │ ┌─┬ BTFSS B1 │ │ │ =1 │ │ │ └──> BCF L1 │ GOTO INICIO ┐ │ │ │ (BUSCA ENDEREÇO INICIO) │<───────────────────────┘ ; VERIFICA O ESTADO DE B1 ; B1 = 1 > DESLIGA L1 ; RETORNA PARA INICIO * Valor contido no bit 0 (B1) do registro PORTA depois da execução da instrução BTFSS - o valor contido no bit 0 (B1) não se altera com a execução da instrução; a execução da instrução BCF impõe o valor 0 (zero) no bit 6 (L1). ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A * Se B1 = ‘0’ (clear) - B1 pressionado → realiza a instrução seguinte (GOTO). O fluxograma mostra o caminho que o código_fonte realiza para esta condição: INICIO =1 B1 (B1 livre) L1 = 0 =0 (B1 pressionado) L1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 28/103 A sequencia do código_fonte é realizada na forma indicada (em vermelho, também): ┌──>INICIO │ ┌─┬ BTFSS B1 ; VERIFICA O ESTADO DE B1 │ │ │ │ =1 =0 ──> VALOR B1 = 0 │ │ │ │ │ └> GOTO LIGA_L1 ┐ ; B1 = 0 > VAI PARA LIGA_L1 │ └──> BCF L1 │ ; B1 = 1 > DESLIGA L1 │ GOTO INICIO ┐ │ ; RETORNA PARA INICIO │ │ │ │ (BUSCA ENDEREÇO INICIO) │ │<───────────────────────┘ │ │ │ │ (BUSCA ENDEREÇO LIGA_L1) │ ┌────────────────────────┘ │ LIGA_L1 │ └──> BSF L1 ; LIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ Analisando o comportamento dos bits envolvidos nas instruções dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execução da instrução BTFSS: ┌──> L1 │ │ 0 0 0 ┌──> B1 │ │ 0 0 0 0 0 PORT A * Instrução - durante a execução do código_fonte, somente as instruções envolvidas são consideradas, as demais são completamente ignoradas - não existem - portanto, o controlador vai ver o código_fonte da seguinte forma: ┌──>INICIO │ ┬ BTFSS B1 ; VERIFICA O ESTADO DE B1 │ │ │ =0 │ │ │ └> GOTO LIGA_L1 ┐ ; B1 = 0 > VAI PARA LIGA_L1 │ │ │ │ │ (BUSCA ENDEREÇO LIGA_L1) │ ┌────────────────────────┘ │ LIGA_L1 │ └──> BSF L1 ; LIGA L1 │ GOTO INICIO ┐ ; RETORNA PARA INICIO │ │ │ (BUSCA ENDEREÇO INICIO) └────────────────────────┘ * Valor contido no bit 0 (B1) do registro PORTA depois da execução da instrução BTFSS - o valor contido no bit 0 (B1) não se altera com a execução da instrução; a execução da instrução BSF impõe o valor 1 (um) no bit 6 (L1). ┌──> L1 │ │ 0 1 0 ┌──> B1 │ │ 0 0 0 0 1 PORT A Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 29/103 CALL MNEMÔNICO CALL INSTRUÇÃO Call Subroutine SINTAXE CALL DESCRIÇÃO Desvia o programa para uma sub-rotina (sequencia de instruções pré-definida) identificada por [ endereço ] [ endereço ] CICLO MÁQUINA 2 STATUS Nenhum Esta instrução desvia o programa para o endereço indicado em [ nome subrotina ] e executa a sequencia de instruções indicada. A sequencia de instruções do desvio deve ser encerrada com a instrução RETURN, que retorna à posição imediatamente seguinte à da instrução CALL. EXEMPLO: CALL SINALIZACAO ┐ ; DESVIA PARA SUB-ROTINA DE “SINALIZACAO” ┌──> ┌ │ │ │• │ ; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO │ │• │ ; NORMAL DO PROGRAMA │ │• │ │ └ │ │ │ │ (BUSCA ENDEREÇO SINALIZACAO) │ ┌────────────────────┘ │ SINALIZACAO │ ┌ │ │• ; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO │ │• ; DA SUB-ROTINA “SINALIZACAO” │ │• │ └ │ RETURN┐ ; SAÍDA DA SUB-ROTINA “SINALIZACAO” │ │ │ │ │ (BUSCA ENDEREÇO DE RETORNO - linha seguinte à da instrução CALL) └──────────┘ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 30/103 CLRF MNEMÔNICO CLRF INSTRUÇÃO Clear F SINTAXE CLRF DESCRIÇÃO Coloca o valor ‘0’ (clear) dentro do registro identificado por [ nome registro ] [ nome registro ] CICLO MÁQUINA 1 STATUS Z Esta instrução substitui todos os valores de cada bit de um registro pelo valor ‘0’ (clear). Atenção: colocar valor ‘0’ (zero) em todos os bits de um registro não significa apagar o valor contido anteriormente neste registro, uma vez que o número “zero” é representado por um registro com todos os bits com valor ‘0’ (zero). EXEMPLO: * Valor contido no registro PORTA antes da execução da instrução: 1 0 1 0 1 0 0 1 PORTA * Instrução CLRF PORTA ;COLOCA VALOR ZERO NO REGISTRO PORTA * Valor contido no registro PORTA depois da execução da instrução: 0 0 0 0 0 0 0 0 PORTA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 31/103 CLRW MNEMÔNICO CLRW INSTRUÇÃO Clear W SINTAXE CLRW DESCRIÇÃO Coloca o valor ‘0’ (clear) dentro do registro W CICLO MÁQUINA 1 STATUS Z Esta instrução substitui todos os valores de cada bit do registro W pelo valor ‘0’ (clear). Atenção: colocar valor ‘0’ (zero) em todos os bits de um registro não significa apagar o valor contido anteriormente neste registro, uma vez que o número “zero” é representado por um registro com todos os bits com valor ‘0’ (zero). EXEMPLO: * Valor contido no registro W antes da execução da instrução: 1 0 1 0 1 0 0 1 W * Instrução CLRW ; COLOCA VALOR ZERO NO REGISTRO W * Valor contido no registro W depois da execução da instrução: 0 0 0 0 0 0 0 0 W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 32/103 DECF MNEMÔNICO DECF INSTRUÇÃO Decrement F SINTAXE DECF DESCRIÇÃO Decrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] CICLO MÁQUINA 1 STATUS Z [ nome registro ] Esta instrução subtrai uma unidade ( 1 ) do registro. Se o resultado da subtração do registro resultar em valor zero (nulo), o bit Z do registro STATUS altera o valor para ‘1’. É necessário que o registro seja definido como variável nas diretivas. EXEMPLO: * Definir o registro como variável nas diretivas: CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR * Valor contido no registro CONT antes da execução da instrução: 0 0 0 0 0 0 1 0 2 CONT * Instrução DECF CONT ; DECREMENTA UMA UNIDADE O REG. CONT 0 0 0 0 0 0 1 0 2 CONT − − 0 0 0 0 0 0 0 1 1 CONT − 1 0 0 0 0 0 0 0 1 1 CONT * Valor contido no registro CONT depois da execução da instrução DECF: 0 0 0 0 0 0 0 1 1 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 33/103 DECFSZ MNEMÔNICO DECFSZ INSTRUÇÃO Decrement F, Skip if Zero SINTAXE DECFSZ [ nome registro ] Decrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] e salta a instrução seguine se o resultado da operação for zero. 2 CM se valor do registro for igual a zero – executa uma NOP CICLO MÁQUINA 1 CM se valor do registro for diferente de zero DESCRIÇÃO STATUS Nenhum Esta instrução subtrai uma unidade ( 1 ) do registro e verifica se o resultado da operação é zero (nulo): - se o resultado da operação = ‘0’ (igual a zero) → salta a instrução seguinte e executa as demais instruções. - se o resultado da operação ≠ ‘0’ (diferente de zero) → executa a instrução seguinte (no caso um GOTO). É necessário que o registro seja definido como variável nas diretivas. EXEMPLO: * Definir o registro como variável nas diretivas: CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR Vamos considerar o código abaixo: INICIO DECFSZ GOTO BSF ┌ │• │• │• └ CONT INICIO FLAG ; DECREMENTA UMA UNIDADE O REG. CONT ; RESULTADO ≠ 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA A execução do código começa em INICIO, subtrai uma unidade do registro CONT,verifica se o resultado da operação é zero e deve adotar uma das duas possibilidades que a instrução oferece: * Resultado da operação ≠ ‘0’ (diferente de zero) → executa a instrução seguinte (no caso um GOTO). * Valor contido no registro CONT antes da execução da instrução: 0 0 0 0 0 0 1 0 2 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 34/103 * Instrução DECFSZ CONT ; DECREMENTA UMA UNIDADE O REG. CONT 0 0 0 0 0 0 1 0 2 CONT − − 0 0 0 0 0 0 0 1 1 CONT − 1 0 0 0 0 0 0 0 1 1 CONT * Valor contido no registro CONT depois da execução da instrução DECFSZ: 0 0 0 0 0 0 0 1 1 CONT * Instrução seguinte GOTO INICIO ; RESULTADO ≠ 0 > VAI PARA INICIO * Resultado da operação = ‘0’ (clear) → salta a instrução seguinte e executa as demais instruções. * Valor contido no registro CONT antes da execução da instrução: 0 0 0 0 0 0 0 1 1 CONT * Instrução DECFSZ CONT ; DECREMENTA UMA UNIDADE O REG. CONT 0 0 0 0 0 0 0 1 1 CONT − − 0 0 0 0 0 0 0 1 1 CONT − 1 0 0 0 0 0 0 0 0 0 CONT * Valor contido no registro CONT depois da execução da instrução DECFSZ: 0 0 0 0 0 0 0 0 0 CONT * Instrução seguinte BSF ┌ │• │• │• └ FLAG ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 35/103 Observando o código completo com as indicações de caminhos a serem seguidos em funçãodo resultado da operação INCFSZ, podemos notar que, uma vez escolhido o caminho de execução, as demais possbilidades são ignoradas: ┌───────────────────┐ │ (BUSCA ENDEREÇO) INICIO ┌─┬ DECFSZ =0 ≠0 │ └> GOTO └──> BSF ┌ │• │• │• └ │ CONT │ │ INICIO ┘ FLAG ; DECREMENTA UMA UNIDADE O REG. CONT ; RESULTADO ≠ 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 36/103 GOTO MNEMÔNICO GOTO INSTRUÇÃO Go To SINTAXE GOTO DESCRIÇÃO Desvia para o [ endereço ] indicado [ endereço ] CICLO MÁQUINA 2 STATUS Nenhum Esta instrução cria um desvio incondicional para qualquer outra parte do programa de acordo com o nome do endereço indicado. Este desvio não tem retorno e não depende de condições internas ou externas ao programa. EXEMPLO: * Instrução GOTO DESLIGA_LED ┐ │ ; VAI PARA O ENDEREÇO DESLIGA_LED (BUSCA ENDEREÇO DESLIGA_LED) ┌────────────────────────┘ DESLIGA_LED │ └──> BCF LED ; DESLIGA LED Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 37/103 INCF MNEMÔNICO INCF INSTRUÇÃO Increment F SINTAXE INCF DESCRIÇÃO Incrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] [ nome registro ] CICLO MÁQUINA 1 STATUS Z Esta instrução adiciona uma unidade ( 1 ) ao registro. Se o resultado da adição ao registro resultar em valor zero (nulo), o bit Z do registro STATUS altera o valor para ‘1’. É necessário que o registro seja definido como variável nas diretivas. EXEMPLO: * Definir o registro como variável nas diretivas: CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR * Valor contido no registro CONT antes da execução da instrução: 1 1 1 1 1 1 1 0 254 CONT * Instrução INCF CONT ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 1 1 1 1 1 0 254 CONT + + 0 0 0 0 0 0 0 1 1 CONT + 1 1 1 1 1 1 1 1 1 255 CONT * Valor contido no registro CONT depois da execução da instrução INCF: 1 1 1 1 1 1 1 1 255 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 38/103 INCFSZ MNEMÔNICO INCFSZ INSTRUÇÃO Increment F, Skip if Zero SINTAXE INCFSZ [ nome registro ] Incrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] e salta a instrução seguine se o resultado da operação for zero. 2 CM se valor do registro for igual a zero – executa uma NOP CICLO MÁQUINA 1 CM se valor do registro for diferente de zero DESCRIÇÃO STATUS Nenhum Esta instrução adiciona uma unidade ( 1 ) ao registro e verifica se o resultado da operação é zero (nulo): - se o resultado da operação = ‘0’ (igual a zero) → salta a instrução seguinte e executa as demais instruções. - se o resultado da operação ≠ ‘0’ (diferente de zero) → executa a instrução seguinte (no caso um GOTO). É necessário que o registro seja definido como variável nas diretivas. EXEMPLO: * Definir o registro como variável nas diretivas: CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR Vamos considerar o código abaixo: INICIO INCFSZ GOTO BSF ┌ │• │• │• └ CONT INICIO FLAG ; INCREMENTA UMA UNIDADE O REG. CONT ; RESULTADO ≠ 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA A execução do código começa em INICIO, adiciona uma unidade ao registro CONT,verifica se o resultado da operação é zero e deve adotar uma das duas possibilidades que a instrução oferece: * Resultado da operação ≠ ‘0’ (diferente de zero) → executa a instrução seguinte (no caso um GOTO). * Valor contido no registro CONT antes da execução da instrução: 1 1 1 1 1 1 1 0 254 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 39/103 * Instrução INCFSZ CONT ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 1 1 1 1 1 0 254 CONT + + 0 0 0 0 0 0 0 1 1 CONT + 1 1 1 1 1 1 1 1 1 255 CONT * Valor contido no registro CONT depois da execução da instrução INCFSZ: 1 1 1 1 1 1 1 1 255 CONT * Instrução seguinte GOTO INICIO ; RESULTADO ≠ 0 > VAI PARA INICIO * Resultado da operação = ‘0’ (igual a zero) → salta a instrução seguinte e executa as demais instruções. * Valor contido no registro CONT antes da execução da instrução: 1 1 1 1 1 1 1 1 255 CONT * Instrução INCFSZ CONT ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 1 1 1 1 1 1 255 CONT + + 0 0 0 0 0 0 0 1 1 CONT + 1 0 0 0 0 0 0 0 0 0 CONT * Valor contido no registro CONT depois da execução da instrução INCFSZ: 0 0 0 0 0 0 0 0 0 CONT * Instrução seguinte BSF ┌ │• │• │• └ FLAG ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 40/103 Observando o código completo com as indicações de caminhos a serem seguidos em funçãodo resultado da operação INCFSZ, podemos notar que, uma vez escolhido o caminho de execução, as demais possbilidades são ignoradas: ┌───────────────────┐ │ (BUSCA ENDEREÇO) INICIO ┌─┬ INCFSZ =0 ≠0 │ └> GOTO └──> BSF ┌ │• │• │• └ │ CONT │ │ INICIO ┘ FLAG ; INCREMENTA UMA UNIDADE O REG. CONT ; RESULTADO ≠ 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA ‘1’ NO BIT FLAG ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 41/103 MOVLW MNEMÔNICO MOVLW INSTRUÇÃO Move Literal to W SINTAXE DESCRIÇÃO MOVLW [ nome literal ] MOVLW [ valor ] Mover o valor do literal identificado por [ nome literal ] ou [ valor ] para o registro W CICLO MÁQUINA 1 STATUS Nenhum Esta instrução é usada para copiar o valor de um número ou constante (literal) armazenado em um registro da memória de programa, para o registro W. Observar que não importa a forma que o valor é declarado (binário, decimal ou hexa) no programa, o valor que será colocado no registro W será sempre em binário. O valor do literal pode ser expresso de duas formas: - Nome Literal: o valor do literal é relacionado a um nome estabelecido pelo programador e declarado dentro das diretivas. - Valor: o valor do literal é declarado diretamente na forma numérica dentro da própria instrução. EXEMPLOS: - Nome Literal * Relacionar a constante a um nome e declarar o valor na área de diretivas: CT_TEMPO EQU .125 ; CONSTANTE DE TEMPO * Valor contido no registro W antes da execução da instrução: 0 0 0 0 0 0 0 0 W * Instrução MOVLW CT_TEMPO ; MOVER LITERAL PARA REG. W * Valor contido no registro W depois da execução da instrução: 0 1 1 1 1 1 0 1 W - Valor em binário * Valor contido no registro W antes da execução da instrução: 0 0 0 0 0 0 0 0 W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 42/103 * Instrução MOVLW B'10000011' ; MOVER LITERAL PARA REG. W * Valor contido no registro W depois da execução da instrução: 1 0 0 0 0 0 1 1 W - Valor em decimal * Valor contido no registro W antes da execução da instrução: 0 0 0 0 0 0 0 0 W * Instrução MOVLW .123 ; MOVER LITERAL PARA REG. W * Valor contido no registro W depois da execução da instrução: 0 1 1 1 1 0 1 1 W - Valor em hexadecimal * Valor contido no registro W antes da execução da instrução: 0 0 0 0 0 0 0 0 W * Instrução MOVLW 0x4F ; MOVER LITERAL PARA REG. W * Valor contido no registro W depois da execução da instrução: 0 1 0 0 1 1 1 1 W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 43/103 MOVF MNEMÔNICO MOVF INSTRUÇÃO Move F SINTAXE MOVF DESCRIÇÃO Mover o valor contido no registro F identificado em [registro origem] para o registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS Z (ver observação) Esta instrução é usada para copiar o valor contido no registro F [registro origem] para o registro F identificado em [registro destino] da seguinte maneira: - se o registro de origem for o registro W, o registro de destino será sempre o registro W. - se o registro de origem for o registro F, o registro de destino será o registro F ou o registro W. - não é possível mover do registro de origem W para o registro de destino F. Observação: se o valor contido no registro de origem F for nulo (todos os bits contém o valor ‘0’), a execução da instrução MOVF muda o estado do bit Z do registro STATUS de 0 → 1, indicando que o resultado da operação foi nulo. O programador pode utilizar este evento para testar se o registro de origem F é nulo ou não. EXEMPLO: - Mover valor do registro de origem W para o registro de destino W * Valor contido no registro W antes da execução da instrução: 1 0 1 0 1 0 0 1 W * Instrução MOVF W,W ; MOVER O VALOR CONTIDO NO REG. W PARA O REG. W * Valor contido no registro W depois da execução da instrução: 1 0 1 0 1 0 0 1 W - Mover valor do registro de origem F (INTCON) para o registro de destino F (INTCON). * Valor contido no registro INTCON antes da execução da instrução: 1 0 1 0 1 1 1 1 INTCON * Instrução MOVF INTCON,F ; MOVER O VALOR CONTIDO NO REG. INTCON PARA ; O REG. INTCON Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 44/103 * Valor contido no registro INTCON depois da execução da instrução: 1 0 1 0 1 0 0 1 INTCON - Mover valor do registro de origem F (INTCON) para o registro de destino W * Valores contidos nos registros INTCON e W antes da execução da instrução: 1 0 1 0 1 0 0 1 INTCON 0 0 0 0 0 0 0 0 W * Instrução MOVF INTCON,W ; MOVER O VALOR CONTIDO NO REG. INTCON PARA ; O REG. W * Valores contidos nos registros INTCON e W depois da execução da instrução: 1 0 1 0 1 0 0 1 INTCON 1 0 1 0 1 0 0 1 W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 45/103 MOVWF MNEMÔNICO MOVFW INSTRUÇÃO Move W to F SINTAXE MOVWF DESCRIÇÃO Mover o valor contido no registro W para o registro F identificado em [ nome registro ] [ nome registro ] CICLO MÁQUINA 1 STATUS Nenhum Esta instrução é usada para copiar o valor contido no registro W para o registro F identificado em [ nome registro ] EXEMPLO: Vamos realizar o exemplo com uma sequencia de instruções bastante comum nos programas, colocando o valor de um literal no registro W e, na sequencia, colocar o valor contido no registro W no registro INTCON (já existente na memória RAM – área SFR). A sequencia de instruções fica como abaixo: MOVLW MOVWF B'10100000' INTCON ; GIE HABILITADO (INTERRUPÇÕES LIGADAS) ; INTERRUPÇÃO TMR0 HABILITADA Os valores dentro dos registros modificam-se de acordo com a sequencia de instruções: * Valores contidos nos registros W e INTCON antes da execução da instrução: 0 0 0 0 0 0 0 0 W 0 0 0 0 0 0 0 0 INTCON * Instrução MOVLW B'10100000' * Valores contidos nos registros W e INTCON depois da execução da instrução MOVLW: 1 0 1 0 0 0 0 0 W 0 0 0 0 0 0 0 0 INTCON * Instrução MOVWF INTCON ; GIE HABILITADO (INTERRUPÇÕES LIGADAS) ; INTERRUPÇÃO TMR0 HABILITADA * Valores contidos nos registros W e INTCON depois da execução da instrução MOVWF: 1 0 1 0 0 0 0 0 W 1 0 1 0 0 0 0 0 INTCON Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 46/103 NOP MNEMÔNICO NOP INSTRUÇÃO No Operation SINTAXE NOP DESCRIÇÃO Não executa nenhuma operação CICLO MÁQUINA 1 STATUS Nenhum Esta instrução não executa nenhuma operação específica em um código ou programa. A execução da instrução NOP consome 1 CM (um ciclo de máquina) que pode ser empregado para produzir um atraso equivalente. EXEMPLO: Vamos considerar o código abaixo: INICIO BTFSC GOTO BSF NOP NOP NOP GOTO BOTAO DESLIGA_LED LED INICIO ; VERIFICA O ESTADO DO BIT QUE REPRESENTA BOTAO ; BOTAO = 0 > VAI PARA DESLIGA_LED ; BOTAO = 1 > LIGA LED ; ; AGUARDA 3 CM ANTES DA INSTRUÇÃO GOTO ; ; RETORNA PARA INICIO Entre a instrução BSF e a instrução GOTO existem tres instruções NOP, isto é, o programa consome 3 CM sem realizar nenhuma operação. O número de vezes que a instrução NOP pode ser utilizada (sem sequencia ou não) não tem limite. Depende exclusivamente da necessidade de uso no programa. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 47/103 RETFIE MNEMÔNICO RETFIE INSTRUÇÃO Return From Interrupt Enable SINTAXE RETFIE DESCRIÇÃO Retorno de uma Interrupção CICLO MÁQUINA 2 STATUS Nenhum Esta instrução é empregada somente para retorno de interrupção (qualquer tipo). Para melhor visualização da aplicação da instrução, vamos considerar o código abaixo como uma sequencia padrão para tratamento de interrupções: ORG ┌ │• │• │• └ 0X04 ┌ │• │• │• └ GOTO SAI_INT ┌ │• │• │• └ RETFIE ; ENDEREÇO DO VETOR DE INTERRUPÇÃO ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA ; PARA PRESERVAR CONTEXTO (REGISTROS ; IMPORTANTES) ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA ; PARA DETERMINAR QUAL INTERRUPÇÃO ; FOI ATIVADA PARA TRATAMENTO SAI_INT ; VAI PARA ROTINA DE SAÍDA INTERRUPÇÃO ; QUANDO O TRATAMENTO TERMINAR ; SEQUENCIA DE INSTRUÇÕES DO PROGRAMA ; PARA RECUPERAR CONTEXTO (REGISTROS ; IMPORTANTES SALVOS) ; SAÍDA DO TRATAMENTO DE INTERRUPÇÃO Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 48/103 RETURN MNEMÔNICO RETURN INSTRUÇÃO Return SINTAXE RETURN DESCRIÇÃO Retorna de uma sub-rotina (sequencia de instruções pré-definida) executada completamente. CICLO MÁQUINA 2 STATUS Nenhum Esta instrução retorna ao programa após a execução das instruções de uma sub-rotina iniciada pela instrução CALL. EXEMPLO: CALL SINALIZACAO ┐ ; DESVIA PARA SUB-ROTINA DE “SINALIZACAO” ┌──> ┌ │ │ │• │ ; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO │ │• │ ; NORMAL DO PROGRAMA │ │• │ │ └ │ │ │ │ (BUSCA ENDEREÇO SINALIZACAO) │ ┌────────────────────┘ │ SINALIZACAO │ ┌ │ │• ; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO │ │• ; DA SUB-ROTINA “SINALIZACAO” │ │• │ └ │ RETURN┐ ; SAÍDA DA SUB-ROTINA “SINALIZACAO” │ │ │ │ │ (BUSCA ENDEREÇO DE RETORNO - linha seguinte à da instrução CALL) └──────────┘ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 49/103 SWAPF MNEMÔNICO SWAPF INSTRUÇÃO Swap Nibbles in F SINTAXE SWAPF DESCRIÇÃO Troca de posição o Nibble Alto (NIB_HI) com o Nibble Baixo (NIB_LO) do registro F identificado em [registro origem] e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS Nenhum Esta instrução troca de posição os quatro bits menos significativos (Nibble Baixo (NIB_LO)) com os quatro bits mais significativos (Nibble Alto (NIB_HI)) do registro. 0 0 0 0 NIBBLE ALTO (NIB_HI) 1 1 1 1 Registro NIBBLE BAIXO (NIB_LO) O resultado da operação pode ser direcionado para um registro de destino da seguinte maneira: - se o registro de origem for o registro W, o registro de destino será sempre o registro W. - se o registro de origem for o registro F, o registro de destino será o registro F ou o registro W. Observação: quando a instrução for empregada no registro de origem F e o resultado da operação for colocado no registro de destino W, a instrução troca o Nibble Alto (NIB_HI) com o Nibble Baixo (NIB_LO) somente no registro de destino W, preservando a posição original no registro de origem F. EXEMPLO: - Trocar a posição no registro de origem W e colocar o resultado no registro de destino W * Valor contido no registro W antes da execução da instrução: 0 0 0 0 1 1 1 1 W * Instrução SWAPF W,W ; TROCA O NIB_HI COM O NIB_LO DO REG. W ; E COLOCA O RESULTADO DA OPERAÇÃO ; NO REG. W * Valor contido no registro W depois da execução da instrução: 1 1 1 1 0 0 0 0 W - Trocar a posição do registro de origem F (INTCON) e colocar o resultado no registro de destino F (INTCON). * Valor contido no registro INTCON antes da execução da instrução: 0 0 0 0 1 1 1 1 INTCON Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 50/103 * Instrução SWAPF INTCON,F ; TROCA O NIB_HI COM O NIB_LO DO REG. INTCON ; E COLOCA O RESULTADO DA OPERAÇÃO ; NO REG. INTCON * Valor contido no registro INTCON depois da execução da instrução: 1 1 1 1 0 0 0 0 INTCON - Trocar a posição no registro de origem F (INTCON) e colocar o resultado no registro de destino W * Valores contidos nos registros INTCON e W antes da execução da instrução: 0 0 0 0 1 1 1 1 INTCON 0 0 0 0 0 0 0 0 W * Instrução SWAPF INTCON,W ; TROCA O NIB_HI COM O NIB_LO DO REG. INTCON ; E COLOCA O RESULTADO DA OPERAÇÃO ; NO REG. W * Valores contidos nos registros INTCON e W depois da execução da instrução: 0 0 0 0 1 1 1 1 INTCON 1 1 1 1 0 0 0 0 W Observação: notar que a instrução foi empregada no registro de origem INTCON e o resultado da operação foi colocado no registro de destino W, enquanto a troca do Nibble Alto (NIB_HI) com o Nibble Baixo (NIB_LO) ocorreu somente no registro de destino W, preservando a posição original no registro de origem INTCON. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 51/103 IORWF MNEMÔNICO IORWF INSTRUÇÃO W logic OR with F SINTAXE IORWF DESCRIÇÃO Realiza a operação lógica OR (ou) entre o valor contido no registro W e o valor contido no registro F identificado em [registro origem], e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica OR (ou), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expressão booleana: - registro de destino W → - registro de destino F → W =W + F F =W + F A tabela verdade da lógica OR (ou) é representada abaixo para todas as possíveis combinações de W e F: W F 0 0 0 0 1 1 1 0 1 1 1 1 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro de destino (W ou F), onde o sinal “+” representa a operação lógica “ou”: Bit W F 0 0 + 0 = 0 1 0 + 1 = 1 2 1 + 0 = 1 3 1 + 1 = 1 4 0 + 0 = 0 5 0 + 1 = 1 6 1 + 0 = 1 7 1 + 1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 52/103 EXEMPLO: - Realizar a lógica OR (ou) entre o registro W e o registro CONT e colocar o resultado no registro W * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT * Instrução IORWF CONT,W ; LÓGICA OR ENTRE O REG. W E O REG. CONT COLOCAR O ; RESULTADO DA OPERAÇÃO NO REG. W 0 1 1 1 0 0 0 1 W + + + + + + + + (OR) + 0 1 1 0 1 0 0 0 CONT 0 1 1 1 1 0 0 1 W Atenção: o sinal “+” representa a operação lógica “ou”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 1 0 0 1 W 0 1 1 0 1 0 0 0 CONT Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). - Realizar a lógica OR (ou) entre o registro W e o registro CONT e colocar o resultado no registro CONT * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 53/103 * Instrução IORWF CONT,F ; LÓGICA OR ENTRE O REG. W E O REG. CONT - COLOCAR ; O RESULTADO DA OPERAÇÃO NO REG. CONT 0 1 1 1 0 0 0 1 W + + + + + + + + (OR) + 0 1 1 0 1 0 0 0 CONT 0 1 1 1 1 0 0 1 CONT Atenção: o sinal “+” representa a operação lógica “ou”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 0 0 1 CONT Observação: notar que o valor contido no registro CONT sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 54/103 ANDWF MNEMÔNICO ANDWF INSTRUÇÃO W logic AND with F SINTAXE ANDWF DESCRIÇÃO Realiza a operação lógica AND (e) entre o valor contido no registro W e o valor contido no registro F identificado em [registro origem], e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica AND (e), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expressão booleana: - registro de destino W → - registro de destino F → W =W •F F =W •F A tabela verdade da lógica AND (e) é representada abaixo para todas as possíveis combinações de W e F: W F 0 0 0 0 1 0 1 0 0 1 1 1 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro de destino (W ou F), onde o sinal “ • ” representa a operação lógica “e”: Bit W F 0 0 • 0 = 0 1 0 • 1 = 0 2 1 • 0 = 0 3 1 • 1 = 1 4 0 • 0 = 0 5 0 • 1 = 0 6 1 • 0 = 0 7 1 • 1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 55/103 EXEMPLO: - Realizar a lógica AND (e) entre o registro W e o registro CONT e colocar o resultado no registro W * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT * Instrução ANDWF CONT,W ; LÓGICA AND ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG W 0 1 1 1 0 0 0 1 W • • • • • • • • 0 1 1 0 1 0 0 0 CONT 0 1 1 0 0 0 0 0 W (AND) • Atenção: o sinal “ • ” representa a operação lógica “e”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 0 0 0 0 0 W 0 1 1 0 1 0 0 0 CONT Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). - Realizar a lógica AND (e) entre o registro W e o registro CONT e colocar o resultado no registro CONT * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 56/103 * Instrução ANDWF CONT,F ; LÓGICA AND ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG W 0 1 1 1 0 0 0 1 W • • • • • • • • 0 1 1 0 1 0 0 0 CONT 0 1 1 0 0 0 0 0 CONT (AND) • Atenção: o sinal “ • ” representa a operação lógica “e”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 0 0 0 0 CONT Observação: notar que o valor contido no registro CONT sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 57/103 XORWF MNEMÔNICO XORWF INSTRUÇÃO W logic EXCLUSIVE-OR with F SINTAXE XORWF DESCRIÇÃO Realiza a operação lógica EXCLUSIVE-OR (ou-exclusivo) entre o valor contido no registro W e o valor contido no registro F identificado em [registro origem], e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica AND (e), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expressão booleana: - registro de destino W → - registro de destino F → W =W ⊕ F F =W ⊕ F A tabela verdade da lógica EXCLUSIVE-OR (ou-exclusivo) é representada abaixo para todas as possíveis combinações de W e F: W F 0 0 0 0 1 1 1 0 1 1 1 0 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro de destino (W ou F), onde o sinal “ ⊕ ” representa a operação lógica “exclusive-or”: Bit W F 0 0 ⊕ 0 = 0 1 0 ⊕ 1 = 1 2 1 ⊕ 0 = 1 3 1 ⊕ 1 = 1 4 0 ⊕ 0 = 0 5 0 ⊕ 1 = 1 6 1 ⊕ 0 = 1 7 1 ⊕ 1 = 0 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 58/103 EXEMPLO: - Realizar a lógica EXCLUSIVE-OR (ou-exclusivo) entre o registro W e o registro CONT e colocar o resultado no registro W * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT * Instrução XORWF CONT,W ; LÓGICA EXCLUSIVE-OR ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG W 0 1 1 1 0 0 0 1 W ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ 0 1 1 0 1 0 0 0 CONT 0 0 0 1 1 0 0 1 W Atenção: o sinal “ ⊕ ” representa a operação lógica “ou-exclusivo”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 0 0 1 1 0 0 1 W 0 1 1 0 1 0 0 0 CONT Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). - Realizar a lógica EXCLUSIVE-OR (ou-exclusivo) entre o registro W e o registro CONT e colocar o resultado no registro CONT * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 0 1 0 0 0 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 59/103 * Instrução XORWF CONT,F ; LÓGICA EXCLUSIVE-OR ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG W 0 1 1 1 0 0 0 1 W ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ 0 1 1 0 1 0 0 0 CONT 0 0 0 1 1 0 0 1 CONT Atenção: o sinal “ ⊕ ” representa a operação lógica “ou-exclusivo”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 W 0 0 0 1 1 0 0 1 CONT Observação: notar que o valor contido no registro CONT sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 60/103 ANDLW MNEMÔNICO ANDLW INSTRUÇÃO Literal logic AND with W SINTAXE ANDLW DESCRIÇÃO Realiza a operação lógica AND (e) entre o valor do literal identificado em [ nome literal ] e o valor contido no registro W; o resultado da operação será colocado no registro W. [ nome literal ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica AND (e), bit a bit, entre o valor de um número ou constante (literal) e o valor contido no registro W de acordo com a expressão booleana: W = Literal • W O valor do literal deve ser relacionado a um nome estabelecido pelo programador e declarado dentro das diretivas. A tabela verdade da lógica AND (e) é representada abaixo para todas as possíveis combinações do literal e W: Literal W 0 0 0 0 1 0 1 0 0 1 1 1 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro W, onde o sinal “ • ” representa a operação lógica “e”: Bit Literal W 0 0 • 0 = 0 1 0 • 1 = 0 2 1 • 0 = 0 3 1 • 1 = 1 4 0 • 0 = 0 5 0 • 1 = 0 6 1 • 0 = 0 7 1 • 1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 61/103 EXEMPLO: - Realizar a lógica AND (e) entre o literal SOMA_REF e o registro W e colocar o resultado no registro W * Relacionar o literal (ou constante) a um nome e declarar o valor na área de diretivas: SOMA_REF EQU .125 ; VALOR DE REFERENCIA DA SOMA * Valores contidos nos registros W e SOMA_REF antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF * Instrução ANDLW SOMA_REF,W ; LÓGICA AND ENTRE O LITERAL SOMA_REF E O REG. W ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG W 0 1 1 1 0 0 0 1 W • • • • • • • • (AND) 0 1 1 1 1 1 0 1 SOMA_REF 0 1 1 1 0 0 0 1 W • Atenção: o sinal “ • ” representa a operação lógica “e”. * Valores contidos nos registros W e SOMA_REF depois da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro SOMA_REF permanece inalterado (o valor do literal não sofre alteração). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 62/103 IORLW MNEMÔNICO IORLW INSTRUÇÃO Literal logic OR with W SINTAXE IORLW DESCRIÇÃO Realiza a operação lógica OR (ou) entre o valor do literal identificado em [ nome literal ] e o valor contido no registro W; o resultado da operação será colocado no registro W. [ nome literal ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica OR (ou), bit a bit, entre o valor de um número ou constante (literal) e o valor contido no registro W de acordo com a expressão booleana: W = Literal + W O valor do literal deve ser relacionado a um nome estabelecido pelo programador e declarado dentro das diretivas. A tabela verdade da lógica OR (ou) é representada abaixo para todas as possíveis combinações de W e F: W F 0 0 0 0 1 1 1 0 1 1 1 1 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro W, onde o sinal “+” representa a operação lógica “ou”: Bit Literal W 0 0 + 0 = 0 1 0 + 1 = 1 2 1 + 0 = 1 3 1 + 1 = 1 4 0 + 0 = 0 5 0 + 1 = 1 6 1 + 0 = 1 7 1 + 1 = 1 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 63/103 EXEMPLO: - Realizar a lógica OR (ou) entre o literal SOMA_REF e o registro W e colocar o resultado no registro W * Relacionar o literal (ou constante) a um nome e declarar o valor na área de diretivas: SOMA_REF EQU .125 ; VALOR DE REFERENCIA DA SOMA * Valores contidos nos registros W e SOMA_REF antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF IORLWSOMA_REF,W ; LÓGICA OR ENTRE O LITERAL SOMA_REF E O REG. W ; COLOCAR O RESULTADO DA OPERAÇÃO NO REG. W 0 1 1 1 0 0 0 1 W + + + + + + + + (OR) + 0 1 1 1 1 1 0 1 SOMA_REF 0 1 1 1 1 1 0 1 W Atenção: o sinal “+” representa a operação lógica “ou”. * Valores contidos nos registros W e SOMA_REF depois da execução da instrução: 0 1 1 1 1 1 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro SOMA_REF permanece inalterado (o valor do literal não sofre alteração). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 64/103 XORLW MNEMÔNICO XORLW INSTRUÇÃO Literal logic EXCLUSIVE-OR with W SINTAXE XORLW DESCRIÇÃO Realiza a operação lógica EXCLUSIVE-OR (ou-exclusivo) entre o valor do literal identificado em [ nome literal ] e o valor contido no registro W; e coloca o resultado da operação no registro W. [ nome literal ] CICLO MÁQUINA 1 STATUS Z Esta instrução realiza a operação lógica AND (e), bit a bit, entre o valor de um número ou constante (literal) e o valor contido no registro W de acordo com a expressão booleana: W = Literal ⊕ W A tabela verdade da lógica EXCLUSIVE-OR (ou-exclusivo) é representada abaixo para todas as possíveis combinações de W e F: W F 0 0 0 0 1 1 1 0 1 1 1 0 A Unidade Lógica do processador realiza a operação em cada bit dos registros individualmente, colocando o resultado da operação no bit correspondente do registro de destino (W ou F), onde o sinal “ ⊕ ” representa a operação lógica “exclusive-or”: Bit Literal F 0 0 ⊕ 0 = 0 1 0 ⊕ 1 = 1 2 1 ⊕ 0 = 1 3 1 ⊕ 1 = 1 4 0 ⊕ 0 = 0 5 0 ⊕ 1 = 1 6 1 ⊕ 0 = 1 7 1 ⊕ 1 = 0 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 65/103 EXEMPLO: - Realizar a lógica EXCLUSIVE-OR (ou-exclusivo) entre o literal SOMA_REF e o registro W e colocar o resultado no registro W * Relacionar o literal (ou constante) a um nome e declarar o valor na área de diretivas: SOMA_REF EQU .125 ; VALOR DE REFERENCIA DA SOMA * Valores contidos nos registros W e SOMA_REF antes da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF * Instrução XORLW SOMA_REF,W 0 ; LÓGICA EXCLUSIVE-OR ENTRE O LITERAL SOMA_REF ; E O O REG. W - COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG W 1 1 1 0 0 0 1 W ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ ⊕ 0 1 1 1 1 1 0 1 SOMA_REF 0 0 0 1 1 1 0 0 W Atenção: o sinal “ ⊕ ” representa a operação lógica “ou-exclusivo”. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 W 0 1 1 1 1 1 0 1 SOMA_REF Observação: notar que o valor contido no registro W sofreu modificação (apresenta o resultado da operação após a execução da instrução), enquanto o registro SOMA_REF permanece inalterado (o valor do literal não sofre alteração). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 66/103 ADDWF MNEMÔNICO ADDWF INSTRUÇÃO Add W to F SINTAXE ADDWF DESCRIÇÃO Soma o valor contido no registro W com o valor contido no registro F identificado em [registro origem], e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS C, Z Esta instrução realiza a operação aritmética da adição, bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expressão algébrica: - registro de destino W → - registro de destino F → W =W + F F =W + F O processo aritmético de soma com números binários segue o procedimento: 0 1 + 0 + 1 + + 0 0 1 1 0 1 1 10 A operação aritmética de adição deve atender aos limites impostos pelo tamanho do registro (8 bits), isto é, o resultado final da operação deve ser necessáriamente menor ou igual a 255. Com operações onde o valor do resultado é maior que 255, a sinalização é feita através do bit (flag) C no registro STATUS, que muda de 0 (zero) para 1 (um) indicando a ocorrencia de resultado da operação com valor maior que 255 (overflow): ┌───> flag sinalização resultado operação >255 │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB Observação: 1. o valor “x” representa valor irrelevante (não influencia o resultado). 2. o retorno a 0 (zero) do flag é feito automaticamente pela Unidade Lógica. 3. uma vez indicada a ocorrencia de “overflow” (excesso) da operação, o flag C pode permanecer com valor 1 (um) por vários ciclos de máquina - a Unidade Lógica retorna o flag a 0 (zero) no ciclo imediatamente anterior a uma nova operação aritmética. O programador deve estabelecer procedimentos para determinar a ocorrencia de “overflow” (excesso) nas operações de adição previstas no código_fonte. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 67/103 EXEMPLO: W =W + F → - Registro de destino W - Somar o valor contido no registro W com o valor contido no registro CONT e colocar o resultado no registro W a) Resultado da operação menor ou igual a 255 * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 0 1 0 0 0 104 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução ADDWF CONT,W ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W 0 1 1 1 0 0 0 1 113 W + + + + + + + + + (SOMA) + 0 1 1 0 1 0 0 0 104 CONT 1 1 0 1 1 0 0 1 217 W Atenção: o sinal “+” representa a operação aritmética da adição. * Valores contidos nos registros W e CONT depois da execução da instrução: 1 1 0 1 1 0 0 1 217 W 0 1 1 0 1 0 0 0 104 CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução, enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 68/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação foi um número menor que 255 logo, o flag de sinalização permanece igual a 0 (zero). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB b) Resultado da operação maior que 255 (uso do flag CARRY do registro STATUS) * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 0 1 0 0 0 1 113 W 1 0 0 1 0 0 0 1 145 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução ADDWF CONT,W ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W 0 1 1 1 0 0 0 1 113 W + + + + + + + + + (SOMA) + 1 0 0 1 0 0 0 1 145 CONT 0 0 0 0 0 0 1 0 2 W Atenção: o sinal “+” representa a operação aritmética da adição. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 0 0 0 0 0 1 0 2 W 1 0 0 1 0 0 0 1 145 CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução, enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 69/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de adição foi um número maior que 255 logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. Fizemos uma operação de adição entre dois valores (113 e 145) que deve apresentar o resultado esperado de 258 (maior que 255): 113 + 145 258 A resposta do flag C no registro STATUS aconteceu da forma esperada, isto é, mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255: IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 MSB STATUS LSB Porém, o resultado apresentado no registro W não corresponde ao valor esperado (258), mas apresentou o valor 2: 0 0 0 0 0 0 1 0 2 W O valor 258 não cabe em 8 bits. Para representá-lo são necessários pelo menos 9 bits e, como pode ser observado, os 8 bits menos significativos representam o valor 2. ┌───> nono bit - inexistente - peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 W Como toda a estrutura do microcontrolador é baseada em 8 bits, o flag C do registro STATUS representa o nono bit necessário para a composição de valores maiores do que 255. ┌───> flag C do registro STATUS - representa o nono bit com peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 CONT └┬┘ └─────────┬─────────┘ │ │ │ └────────> 2 │ + └─────────────────────> 256 ─ ── 258 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 70/103 F =W + F → - Registro de destino F - Somar o valor contido no registro W com o valor contido no registro CONT e colocar o resultado no registro CONT a) Resultado da operação menor ou igual a 255 * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 0 1 0 0 0 104 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução ADDWF CONT,F ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 W + + + + + + + + + (SOMA) + 0 1 1 0 1 0 0 0 104 CONT 1 1 0 1 1 0 0 1 217 CONT Atenção: o sinal “+” representa a operação aritmética da adição. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 113 W 1 1 0 1 1 0 0 1 217 CONT Observação: notar que o valor contido no registro CONT apresenta o resultado da operação após a execução da instrução, enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 71/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação foi um número menor que 255 logo, o flag de sinalização permanece igual a 0 (zero). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB b) Resultado da operação maior que 255 (uso do flag CARRY do registro STATUS) * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 0 1 0 0 0 1 113 W 1 0 0 1 0 0 0 1 145 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução ADDWF CONT,F ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 W + + + + + + + + + (SOMA) + 1 0 0 1 0 0 0 1 145 CONT 0 0 0 0 0 0 1 0 2 CONT Atenção: o sinal “+” representa a operação aritmética da adição. * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 0 0 0 0 0 1 0 2 CONT Observação: notar que o valor contido no registro CONT apresenta o resultado da operação após a execução da instrução, enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 72/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de adição foi um número maior que 255 logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. Fizemos uma operação de adição entre dois valores (113 e 145) que deve apresentar o resultado esperado de 258 (maior que 255): 113 + 145 258 A resposta do flag C no registro STATUS aconteceu da forma esperada, isto é, mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255: IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 MSB STATUS LSB Porém, o resultado apresentado no registro CONT não corresponde ao valor esperado (258), mas apresentou o valor 2: 0 0 0 0 0 0 1 0 2 CONT O valor 258 não cabe em 8 bits. Para representá-lo são necessários pelo menos 9 bits e, como pode ser observado, os 8 bits menos significativos representam o valor 2. ┌───> nono bit - inexistente - peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 CONT └────────┬─────────┘ │ └────────────> 2 - 8 bits menos significativos Como toda a estrutura do microcontrolador é baseada em 8 bits, o flag C do registro STATUS “representa” o nono bit necessário para a composição de valores maiores do que 255. ┌───> flag C do registro STATUS - representa o nono bit com peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 CONT └┬┘ └─────────┬─────────┘ │ │ │ └────────> 2 │ + └─────────────────────> 256 ─ ── 258 Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 73/103 O programador deve prever técnicas de avaliação dos resultados da operação dentro do código_fonte para interpretar os resultados obtidos nas operações aritméticas realizadas e, se necessário, acrescentar um novo registro para representar valores com mais de 8 bits. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 74/103 ADDLW MNEMÔNICO ADDLW INSTRUÇÃO Add Literal to F SINTAXE ADDLW DESCRIÇÃO Soma o valor contido no registro W com o valor do literal identificado em [ nome literal] - o resultado da operação é sempre colocado no registro W. [ nome literal ] CICLO MÁQUINA 1 STATUS C, DC, Z Esta instrução realiza a operação aritmética da adição, bit a bit, entre e o valor de um número ou constante (literal) e o valor contido no registro W de acordo com a expressão algébrica: W = Literal + W O processo aritmético de soma com números binários segue o procedimento: 0 1 + 0 + 1 + + 0 0 1 1 0 1 1 10 A operação aritmética de adição deve atender aos limites impostos pelo tamanho do registro (8 bits), isto é, o resultado final da operação deve ser necessáriamente menor ou igual a 255. Com operações onde o valor do resultado é maior que 255, a sinalização é feita através do bit (flag) C no registro STATUS, que muda de 0 (zero) para 1 (um) indicando a ocorrencia de resultado da operação com valor maior que 255 (overflow): ┌───> flag sinalização resultado operação >255 │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB Observação: 1. o valor “x” representa valor irrelevante (não influencia o resultado). 2. o retorno a 0 (zero) do flag é feito automaticamente pela Unidade Lógica. 3. uma vez indicada a ocorrencia de “overflow” (excesso) da operação, o flag C pode permanecer com valor 1 (um) por vários ciclos de máquina - a Unidade Lógica retorna o flag a 0 (zero) no ciclo imediatamente anterior a uma nova operação aritmética. O programador deve estabelecer procedimentos para determinar a ocorrencia de “overflow” (excesso) nas operações de adição previstas no código_fonte. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 75/103 EXEMPLO: - Somar o valor contido no registro W com o valor do literal CTE_CONT - o resultado será sempre colocado no registro W a) Resultado da operação menor ou igual a 255 * Relacionar o literal (ou constante) a um nome e declarar o valor na área de diretivas: CTE_CONT EQU .104 ; VALOR DA CONSTANTE DE INÍCIO DO REG CONTADOR Atenção: valores numéricos declarados na área de diretivas são armazenados dentro da memória de programa - não é possível fazer alterações de valor através do código_fonte. * Valores contidos nos registros W e CTE_CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 0 1 0 0 0 104 CTE_CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução ADDLW CTE_CONT ; SOMAR O VALOR DO REG. W COM O VALOR DO LITERAL ; CTE_CONT - O RESULTADO DA OPERAÇÃO SERÁ ; COLOCADO NO REG. W 0 1 1 1 0 0 0 1 113 W + + + + + + + + + (SOMA) + 0 1 1 0 1 0 0 0 104 CTE_CONT 1 1 0 1 1 0 0 1 217 W Atenção: o sinal “+” representa a operação aritmética da adição. * Valores contidos nos registros W e CTE_CONT depois da execução da instrução: 1 1 0 1 1 0 0 1 217 W 0 1 1 0 1 0 0 0 104 CTE_CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução. O registro CTE_CONT permanece inalterado. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 76/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação foi um número menor que 255 logo, o flag de sinalização permanece igual a 0 (zero). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x X x x 0 STATUS MSB LSB b) Resultado da operação maior que 255 (uso do flag CARRY do registro STATUS) * Relacionar o literal (ou constante) a um nome e declarar o valor na área de diretivas: CTE_CONT EQU .104 ; VALOR DA CONSTANTE DE INÍCIO DO REG CONTADOR Atenção: valores numéricos declarados na área de diretivas são armazenados dentro da memória de programa - não é possível fazer alterações de valor através do código_fonte. * Valores contidos nos registros W e CTE_CONT antes da execução da instrução: 1 0 0 1 1 0 1 0 154 W 0 1 1 0 1 0 0 0 104 CTE_CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x X x x 0 STATUS MSB LSB * Instrução ADDLW CTE_CONT ; SOMAR O VALOR DO REG. W COM O VALOR DO LITERAL ; CTE_CONT - O RESULTADO DA OPERAÇÃO SERÁ ; COLOCADO NO REG. W 1 0 0 1 1 0 1 0 154 W + + + + + + + + + (SOMA) + 0 1 1 0 1 0 0 0 104 CTE_CONT 0 0 0 0 0 0 1 0 2 W Atenção: o sinal “+” representa a operação aritmética da adição. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 77/103 * Valores contidos nos registros W e CTE_CONT depois da execução da instrução: 0 0 0 0 0 0 1 0 2 W 0 1 1 0 1 0 0 0 104 CTE_CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução. O registro CTE_CONT permanece inalterado. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de adição foi um número maior que 255 logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. Fizemos uma operação de adição entre dois valores (154 e 104) que deve apresentar o resultado esperado de 258 (maior que 255): 154 + 104 258 A resposta do flag C no registro STATUS aconteceu da forma esperada, isto é, mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255: IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 MSB STATUS LSB Porém, o resultado apresentado no registro W não corresponde ao valor esperado (258), mas apresentou o valor 2: 0 0 0 0 0 0 1 0 2 W O valor 258 não cabe em 8 bits. Para representá-lo são necessários pelo menos 9 bits e, como pode ser observado, os 8 bits menos significativos representam o valor 2. ┌───> nono bit - inexistente - peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 W Como a estrutura do microcontrolador é baseada em 8 bits, o flag C do registro STATUS representa o nono bit necessário para a composição de valores maiores do que 255. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 78/103 ┌───> flag C do registro STATUS - representa o nono bit com peso 29 = 256 │ 1 0 0 0 0 0 0 1 0 258 W └┬┘ └─────────┬─────────┘ │ │ │ └────────> 2 │ + └─────────────────────> 256 ─── 258 O programador deve prever técnicas de avaliação dos resultados da operação dentro do código_fonte para interpretar os resultados obtidos nas operações aritméticas realizadas e, se necessário, acrescentar um novo registro para representar valores com mais de 8 bits. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 79/103 SUBWF MNEMÔNICO SUBWF INSTRUÇÃO Subtract W from F SINTAXE SUBWF DESCRIÇÃO Subtrai o valor contido no registro W do valor contido no registro F identificado em [registro origem], e coloca o resultado da operação no registro identificado em [ registro destino ] [ registro origem ], [ registro destino ] CICLO MÁQUINA 1 STATUS C, DC, Z Esta instrução realiza a operação aritmética da subtração entre o valor contido no registro W (método do “complemento de 2” - two’s complement), e o valor contido no registro F de acordo com a expressão algébrica: - registro de destino W → - registro de destino F → W = F −W F = F −W O mecanismo utilizado pela Unidade Lógica e Aritmética para a execução da subtração realiza a adição do primeiro operador (F) ao “complemento de 2” do segundo operador (W). O uso do “complemento de 2” do segundo operador considera o fato do valor ser negativo, o que coloca a expressão algébrica efetivamente empregada no formato: - registro de destino W → - registro de destino F → W = F + (−W ) F = F + (−W ) Os resultados obtidos com a operação de subtração são sinalizados pelos flags C e Z do registro STATUS: ┌───────> flag sinalização resultado operação nulo │ │ ┌─> flag sinalização resultado operação positivo/negativo │ │ IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS MSB LSB Observação: 1. o valor “x” representa valor irrelevante (não influencia o resultado). 2. o retorno a 0 (zero) do flag é feito automaticamente pela Unidade Lógica. 3. uma vez indicada a ocorrencia de “overflow” (excesso) da operação, os flags C e Z podem permanecer com valor 1 (um) por vários ciclos de máquina - a Unidade Lógica retorna os flags a 0 (zero) no ciclo imediatamente anterior a uma nova operação aritmética. Considerando que os valores de F e W são sempre positivos (F>0 e W>0), o resultado da operação de subtração depende da ordem de grandeza dos valores envolvidos nos registros F e W, de acordo com as possibilidades: - F > W → o resultado da operação é um número positivo - o valor representado pelo registro que contém o resultado está na forma direta e o flag C do registro STATUS é colocado no valor 1 (um). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 80/103 - F < W → o resultado da operação é um número negativo - o valor representado pelo registro que contém o resultado está na forma do “complemento de 2” e o flag C do registro STATUS é mantido no valor 0 (zero). - F = W → o resultado da operação é nulo - o valor representado pelo registro que contém o resultado é nulo (todos os bits do registro tem valor 0 - zero), o flag C do registro STATUS é mantido no valor 0 (zero) e o flag Z do registro STATUS é colocado no valor 1 (um), indicando que o resultado da operação foi nulo (o flag Z sinaliza resultado nulo da última operação). O programador deve prever técnicas de avaliação da operação dentro do código_fonte para interpretar os resultados obtidos. EXEMPLO: W = F −W → - Registro de destino W - Subtrair o valor contido no registro W do valor contido no registro CONT e colocar o resultado no registro W a) F > W → o resultado da operação é um número positivo - o valor representado pelo registro que contém o resultado (W) está na forma direta e o flag C do registro STATUS é colocado no valor 1 (um). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 0 1 0 0 0 104 W 0 1 1 1 0 0 0 1 113 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W 0 1 1 1 0 0 0 1 113 CONT - - - - - - - - - 0 1 1 0 1 0 0 0 104 W 0 0 0 0 1 0 0 1 9 W (SUBTRAI) - Atenção: o sinal “-” representa a operação aritmética da subtração. Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 81/103 * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi um número positivo (CONT > W) logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x X x 1 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 0 0 0 0 1 0 0 1 9 W 0 1 1 1 0 0 0 1 113 CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução, enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). Se na operação aritmética de subtração o flag C do registro STATUS muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é maior que o valor contido no registro W (CONT > W) antes da execução da operação de subtração. - o valor contido no registro W após a execução da operação de subtração é um número positivo e representa o resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F > W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 0 1 0 0 0 104 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 1 0 1 1 1 151 (COMP 1) W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 82/103 b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 1 0 1 1 1 151 (COMP 1) W + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 1 1 0 0 0 152 (COMP 2) W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: 0 1 1 1 0 0 0 1 113 CONT + + + + + + + + + (SOMA) + 1 0 0 1 1 0 0 0 152 0 0 0 0 1 0 0 1 9 (COMP 2) W W * Valor contido no registro W depois da execução da adição: 0 0 0 0 1 0 0 1 9 W O resultado da operação de adição foi um número maior que 255 logo, o flag C do registro STATUS muda de estado, passando a 1 (um). IRP RP1 RP0 /TO /PD Z x x x x x x ┌───> flag sinalização após a execução da instrução │ DC C x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (113 e 152) que deve apresentar o resultado maior que 255 (no caso, 265): 113 + 152 265 A resposta do flag C no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255. IRP RP1 RP0 /TO /PD Z x x x x x x MSB DC C x 1 STATUS LSB Porém, o resultado apresentado no registro W não corresponde ao valor esperado da adição (265), mas apresentou o valor 9: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 83/103 0 0 0 0 1 0 0 1 9 W O valor 265 não cabe em 8 bits. Para representá-lo são necessários pelo menos 9 bits e, como pode ser observado, os 8 bits menos significativos representam o valor 9. ┌───> nono bit - inexistente - peso 29 = 256 │ 1 0 0 0 0 1 0 0 1 265 W Na estrutura de 8 bits, o flag C do registro STATUS representa o nono bit necessário para a composição de valores maiores do que 255. Consequentemente, o resultado apresentado pela ULA fica: ┌───> flag C do registro STATUS - indica resultado da subtração positivo (CONT > W) │ 1 0 0 0 0 1 0 0 1 9 W └─────────┬─────────┘ └───────────> registro apresenta o valor real da subtração _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 84/103 b) F < W → o resultado da operação é um número negativo - o valor representado pelo registro que contém o resultado (W) está na forma “complemento de 2” e o flag C do registro STATUS mantém o valor 0 (zero). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 0 1 0 0 0 104 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Instrução SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W 0 1 1 0 1 0 0 0 104 CONT - - - - - - - - - 0 1 1 1 0 0 0 1 113 W 1 1 1 1 0 1 1 1 247 W (SUBTRAI)) - Atenção: o sinal “-” representa a operação aritmética da subtração. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi um número positivo (CONT > W) logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 1 1 1 1 0 1 1 1 247 W 0 1 1 0 1 0 0 0 104 CONT Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução, enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 85/103 Se na operação aritmética de subtração o flag C do registro STATUS não muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é menor que o valor contido no registro W (CONT < W) antes da execução da operação de subtração. - o valor contido no registro W após a execução da operação de subtração é um número negativo e representa o “complemento de 2” do resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F < W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 1 0 0 0 1 113 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 0 1 1 1 0 142 (COMP 1) W b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 0 1 1 1 0 142 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 0 1 1 1 1 143 (COMP 1) (COMP 2) W W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: 0 1 1 0 1 0 0 0 104 CONT + + + + + + + + + (SOMA) + 1 0 0 0 1 1 1 1 143 1 1 1 1 0 1 1 1 247 (COMP 2) W W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 86/103 * Valor contido no registro W depois da execução da adição: 1 1 1 1 0 1 1 1 247 W O resultado da operação de adição foi um número menor que 255 logo, o flag C do registro STATUS não muda de estado, mantendo o valor 0 (zero). IRP RP1 RP0 /TO /PD Z x x x x x x ┌───> flag sinalização após a execução da instrução │ DC C x 0 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (104 e 143) que deve apresentar o resultado menor que 255 (no caso, 247): 104 + 143 247 A resposta do flag C no registro STATUS não mudou de valor, mantendo 0 (zero), indicando que o resultado final da operação tem valor menor que 255. IRP RP1 RP0 /TO /PD Z x x x x x x DC C x 0 MSB STATUS LSB O resultado apresentado no registro W não corresponde ao valor esperado da adição (247): 1 1 1 1 0 1 1 1 247 W No entanto, a operação solicitada pela instrução é uma subtração, cujo resultado deveria ser -9 (menos 9), isto é, o resultado da operação real é um número negativo: 104 113 - 9 A estrutura de registro do microcontrolador não consegue representar um número negativo incluindo o sinal, consequentemente, a forma de representá-lo é através do seu “complemento de 2” (two’s complement). O programador deve providenciar o cálculo do valor real do resultado da operação usando a seguinte sequencia: a) transferir o valor contido no registro W para um registro na memória RAM, por exemplo, W_TEMP, para usar a instrução COMF: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 87/103 * Valores contidos nos registros W e W_TEMP antes da execução da instrução MOVWF: MOVWF 1 1 1 1 0 1 1 1 247 W 0 0 0 0 0 0 0 0 0 W_TEMP W_TEMP ; TRANSFERE O VALOR DO REG. W PARA O ; REG. W_TEMP * Valores contidos nos registros W e W_TEMP após a execução da instrução MOVWF: 1 1 1 1 0 1 1 1 247 W 1 1 1 1 0 1 1 1 247 W_TEMP b) determina-se o “complemento de 1” (one’s complement) executando a instrução COMF no registro W_TEMP, que inverte os valores de todos os bits contidos no registro: * Valor contido no registro W_TEMP antes da execução da instrução COMF (“complemento de 1”): 1 COMF 1 1 1 0 1 W_TEMP 1 1 247 W_TEMP ; CALCULA “complemento 1”DO REG. W_TEMP * Valor contido no registro W_TEMP após a execução da instrução COMF (“complemento de 1”): 0 0 0 0 1 0 0 0 8 (COMP 1) W_TEMP c) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 0 0 0 0 1 0 0 0 8 (COMP 1) W_TEMP + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 0 0 0 0 1 0 0 1 9 (COMP 2) W_TEMP d) retornar o valor contido no registro W_TEMP para o registro W: * Valores contidos nos registros W e W_TEMP antes da execução da instrução MOVF: 1 1 1 1 0 1 1 1 247 0 0 0 0 1 0 0 1 9 W (COMP 2) W_TEMP Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 88/103 MOVF W_TEMP,W ; TRANSFERE O VALOR DO REG. W_TEMP ; PARA O REG. W * Valores contidos nos registros W e W_TEMP após a execução da instrução MOVF: 0 0 0 0 1 0 0 1 9 0 0 0 0 1 0 0 1 9 W (COMP 2) W_TEMP Agora o registro W contém o valor real da operação de subtração porém, sem indicação do sinal negativo. A interpretação do sinal negativo deve ser feita pelo programador. _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 89/103 c) F = W → o resultado da operação é nulo - o valor representado pelo registro que contém o resultado (W) está na forma direta e os flags Z e C do registro STATUS são colocados no valor 1 (um). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 1 0 0 0 1 113 CONT * Valor dos flags Z e C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───────> flag sinalização antes da execução da instrução │ │ ┌─> flag sinalização antes da execução da instrução │ │ IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS MSB LSB * Instrução SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. W 0 1 1 1 0 0 0 1 113 CONT - - - - - - - - - 0 1 1 1 0 0 0 1 113 W 0 0 0 0 0 0 0 0 0 W (SUBTRAI)) - Atenção: o sinal “-” representa a operação aritmética da subtração. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi nulo (CONT = W) logo, o flag Z muda de estado, passando a 1 (um) e o flag C muda de estado também passando a 1 (um) ┌───────> flag sinalização depois da execução da instrução │ │ ┌─> flag sinalização depois da execução da instrução │ │ IRP RP1 RP0 /TO /PD Z DC C x x x x x 1 x 1 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 0 0 0 0 0 0 0 0 0 W 0 1 1 1 0 0 0 1 113 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 90/103 Observação: notar que o valor contido no registro W apresenta o resultado da operação após a execução da instrução, enquanto o registro CONT permanece inalterado (o valor contido originalmente é preservado). Se na operação aritmética de subtração os flags Z e C do registro STATUS mudam seus estados de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é igual ao valor contido no registro W (CONT = W) antes da execução da operação de subtração. - o valor contido no registro W após a execução da operação de subtração é nulo e representa o resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F = W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 1 0 0 0 1 113 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 0 1 1 1 0 142 (COMP 1) W b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 0 1 1 1 0 142 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 0 1 1 1 1 143 (COMP 1) (COMP 2) W W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 91/103 0 1 1 1 0 0 0 1 113 CONT + + + + + + + + + (SOMA) + 1 0 0 0 1 1 1 1 143 0 0 0 0 0 0 0 0 0 (COMP 2) W W * Valor contido no registro W depois da execução da adição: 0 0 0 0 0 0 0 0 0 W O resultado da operação de adição foi um número maior que 255 logo, o flag C do registro STATUS muda de estado, passando a 1 (um). IRP RP1 RP0 /TO /PD Z x x x x x x ┌───> flag sinalização após a execução da instrução │ DC C x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (113 e 143) que deve apresentar o resultado maior que 255 (no caso, 256): 113 + 143 256 A resposta do flag C no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255, e o flag Z no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor nulo. IRP RP1 RP0 /TO /PD Z x x x x x 1 DC C x 1 MSB STATUS LSB O resultado apresentado no registro W corresponde ao valor esperado da adição (256): 0 0 0 0 0 0 0 0 0 W _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 92/103 W = F −W → - Registro de destino F - Subtrair o valor contido no registro W do valor contido no registro CONT e colocar o resultado no registro CONT a) F > W → o resultado da operação é um número positivo - o valor representado pelo registro que contém o resultado (CONT) está na forma direta e o flag C do registro STATUS é colocado no valor 1 (um). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 0 1 0 0 0 104 W 0 1 1 1 0 0 0 1 113 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x X x x x 0 STATUS MSB LSB * Instrução SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 CONT - - - - - - - - - 0 1 1 0 1 0 0 0 104 W 0 0 0 0 1 0 0 1 9 CONT (SUBTRAI) - Atenção: o sinal “-” representa a operação aritmética da subtração. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi um número positivo (CONT > W) logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x X X x X x 1 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 0 1 0 0 0 104 W 0 0 0 0 1 0 0 1 9 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 93/103 Observação: notar que o valor contido no registro CONT apresenta o resultado da operação após a execução da instrução, enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Se na operação aritmética de subtração o flag C do registro STATUS muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é maior que o valor contido no registro W (CONT > W) antes da execução da operação de subtração. - o valor contido no registro CONT após a execução da operação de subtração é um número positivo e representa o resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F > W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 0 1 0 0 0 104 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 1 0 1 1 1 151 (COMP 1) W Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 94/103 b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 1 0 1 1 1 151 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 1 1 0 0 0 152 (COMP 1) (COMP 2) W W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: 0 1 1 1 0 0 0 1 113 CONT + + + + + + + + + (SOMA) + 1 0 0 1 1 0 0 0 152 0 0 0 0 1 0 0 1 9 (COMP 2) W CONT * Valor contido no registro CONT depois da execução da adição: 0 0 0 0 1 0 0 1 9 CONT O resultado da operação de adição foi um número maior que 255 logo, o flag C do registro STATUS muda de estado, passando a 1 (um). IRP RP1 RP0 /TO /PD Z x x x X x x ┌───> flag sinalização após a execução da instrução │ DC C x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (113 e 152) que deve apresentar o resultado maior que 255 (no caso, 265): 113 + 152 265 A resposta do flag C no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255. IRP RP1 RP0 /TO /PD Z x x x X x x MSB DC C x 1 STATUS LSB Porém, o resultado apresentado no registro CONT não corresponde ao valor esperado da adição (265), mas apresentou o valor 9: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 95/103 0 0 0 0 1 0 0 1 9 CONT O valor 265 não cabe em 8 bits. Para representá-lo são necessários pelo menos 9 bits e, como pode ser observado, os 8 bits menos significativos representam o valor 9. ┌───> nono bit - inexistente - peso 29 = 256 │ 1 0 0 0 0 1 0 0 1 265 CONT Na estrutura de 8 bits, o flag C do registro STATUS representa o nono bit necessário para a composição de valores maiores do que 255. Consequentemente, o resultado apresentado pela ULA fica: ┌───> flag C do registro STATUS - indica resultado da subtração positivo (CONT > W) │ 1 0 0 0 0 1 0 0 1 9 CONT └─────────┬─────────┘ └───────────> registro apresenta o valor real da subtração _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 96/103 b) F < W → o resultado da operação é um número negativo - o valor representado pelo registro que contém o resultado (CONT) está na forma “complemento de 2” e o flag C do registro STATUS mantém o valor 0 (zero). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 0 1 0 0 0 104 CONT * Valor do flag C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───> flag sinalização antes da execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x X x x x 0 STATUS MSB LSB * Instrução SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. CONT 0 1 1 0 1 0 0 0 104 CONT - - - - - - - - - 0 1 1 1 0 0 0 1 113 W 1 1 1 1 0 1 1 1 247 CONT (SUBTRAI) - Atenção: o sinal “-” representa a operação aritmética da subtração. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi um número positivo (CONT > W) logo, o flag de sinalização muda de estado, passando a 1 (um). ┌───> flag sinalização após a execução da instrução │ IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 113 W 1 1 1 1 0 1 1 1 247 CONT Observação: notar que o valor contido no registro CONT apresenta o resultado da operação após a execução da instrução, enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 97/103 Se na operação aritmética de subtração o flag C do registro STATUS não muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é menor que o valor contido no registro W (CONT < W) antes da execução da operação de subtração. - o valor contido no registro CONT após a execução da operação de subtração é um número negativo e representa o “complemento de 2” do resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F < W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 1 0 0 0 1 113 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 0 1 1 1 0 142 (COMP 1) W b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 0 1 1 1 0 142 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 0 1 1 1 1 143 (COMP 1) (COMP 2) W W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: 0 1 1 0 1 0 0 0 104 CONT + + + + + + + + + (SOMA) + 1 0 0 0 1 1 1 1 143 1 1 1 1 0 1 1 1 247 (COMP 2) W CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 98/103 * Valor contido no registro CONT depois da execução da adição: 1 1 1 1 0 1 1 1 247 CONT O resultado da operação de adição foi um número menor que 255 logo, o flag C do registro STATUS não muda de estado, mantendo o valor 0 (zero). IRP RP1 RP0 /TO /PD Z x x x x x x ┌───> flag sinalização após a execução da instrução │ DC C x 0 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (104 e 143) que deve apresentar o resultado menor que 255 (no caso, 247): 104 + 143 247 A resposta do flag C no registro STATUS não mudou de valor, mantendo 0 (zero), indicando que o resultado final da operação tem valor menor que 255. IRP RP1 RP0 /TO /PD Z x x x x x x DC C x 0 MSB STATUS LSB O resultado apresentado no registro CONT não corresponde ao valor esperado da adição (247): 1 1 1 1 0 1 1 1 247 CONT No entanto, a operação solicitada pela instrução é uma subtração, cujo resultado deveria ser -9 (menos 9), isto é, o resultado da operação real é um número negativo: 104 113 - 9 A estrutura de registro do microcontrolador não consegue representar um número negativo incluindo o sinal, consequentemente, a forma de representá-lo é através do seu “complemento de 2” (two’s complement). O programador deve providenciar o cálculo do valor real do resultado da operação usando a seguinte sequencia: a) determina-se o “complemento de 1” (one’s complement) utilizando a instrução COMF, que inverte os valores de todos os bits contidos no registro: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 99/103 * Valor contido no registro CONT antes da execução da instrução COMF (“complemento de 1”): 1 1 1 1 0 1 1 1 247 CONT * Valor contido no registro CONT após a execução da instrução COMF (“complemento de 1”): 0 0 0 0 1 0 0 0 8 (COMP 1) CONT b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 0 0 0 0 1 0 0 0 8 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 0 0 0 0 1 0 0 1 9 (COMP 1) (COMP 2) CONT CONT Agora o registro W contém o valor real da operação de subtração porém, sem indicação do sinal negativo. A interpretação do sinal negativo deve ser feita pelo programador. _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 100/103 c) F = W → o resultado da operação é nulo - o valor representado pelo registro que contém o resultado (W) está na forma direta e os flags Z e C do registro STATUS são colocados no valor 1 (um). * Valores contidos nos registros W e CONT antes da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 1 1 1 0 0 0 1 113 CONT * Valor dos flags Z e C no registro STATUS antes da execução da instrução (a Unidade Lógica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instrução): ┌───────> flag sinalização antes da execução da instrução │ │ ┌─> flag sinalização antes da execução da instrução │ │ IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS MSB LSB * Instrução SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAÇÃO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 CONT - - - - - - - - - 0 1 1 1 0 0 0 1 113 W 0 0 0 0 0 0 0 0 0 CONT (SUBTRAI)) - Atenção: o sinal “-” representa a operação aritmética da subtração. * Valor do flag C no registro STATUS após a execução da instrução: O resultado da operação de subtração foi nulo (CONT = W) logo, o flag Z muda de estado, passando a 1 (um) e o flag C muda de estado também passando a 1 (um) ┌───────> flag sinalização depois da execução da instrução │ │ ┌─> flag sinalização depois da execução da instrução │ │ IRP RP1 RP0 /TO /PD Z DC C x x x x x 1 x 1 STATUS MSB LSB * Valores contidos nos registros W e CONT depois da execução da instrução: 0 1 1 1 0 0 0 1 113 W 0 0 0 0 0 0 0 0 0 CONT Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 101/103 Observação: notar que o valor contido no registro CONT apresenta o resultado da operação após a execução da instrução, enquanto o registro W permanece inalterado (o valor contido originalmente é preservado). Se na operação aritmética de subtração os flags Z e C do registro STATUS mudam seus estados de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no código_fonte para interpretar o resultado como: - o valor contido no registro CONT é igual ao valor contido no registro W (CONT = W) antes da execução da operação de subtração. - o valor contido no registro CONT após a execução da operação de subtração é nulo e representa o resultado final da operação. _______________________________________________________________________________________ Vamos observar como a Unidade Lógica e Aritmética realizou a operação de subtração quando F = W: A operação efetivamente realizada foi: W = CONT + (−W ) Isto é, a ULA realizou uma operação de adição de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binária utiliza-se o “complemento de 2” (two’s complement) deste valor, calculado da seguinte forma: a) determina-se o “complemento de 1” (one’s complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execução do “complemento de 1”: 0 1 1 1 0 0 0 1 113 W * Valor contido no registro W após a execução do “complemento de 1”: 1 0 0 0 1 1 1 0 142 (COMP 1) W b) somar 1 (um) ao valor do “complemento de 1” (one’s complement) para se obter o “complemento de 2” (two’s complement): 1 0 0 0 1 1 1 0 142 + + + + + + + + + (SOMA) + 0 0 0 0 0 0 0 1 1 UNIDADE 1 0 0 0 1 1 1 1 143 (COMP 1) (COMP 2) W W Com o valor do “complemento de 2” do registro W ((COMP 2) W), a ULA realiza a operação de adição dos valores de CONT e (COMP 2) W: Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 102/103 0 1 1 1 0 0 0 1 113 CONT + + + + + + + + + (SOMA) + 1 0 0 0 1 1 1 1 143 0 0 0 0 0 0 0 0 0 (COMP 2) W CONT * Valor contido no registro CONT depois da execução da adição: 0 0 0 0 0 0 0 0 0 CONT O resultado da operação de adição foi um número maior que 255 logo, o flag C do registro STATUS muda de estado, passando a 1 (um). IRP RP1 RP0 /TO /PD Z x x x x x x ┌───> flag sinalização após a execução da instrução │ DC C x 1 STATUS MSB LSB Vamos olhar o resultado desta operação. A ULA fez uma operação de adição entre dois valores (113 e 143) que deve apresentar o resultado maior que 255 (no caso, 256): 113 + 143 256 A resposta do flag C no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor maior que 255, e o flag Z no registro STATUS mudou do valor 0 (zero) para o valor 1 (um), indicando que o resultado final da operação tem valor nulo. IRP RP1 RP0 /TO /PD Z x x x x x 1 DC C x 1 MSB STATUS LSB O resultado apresentado no registro CONT corresponde ao valor esperado da adição (256): 0 0 0 0 0 0 0 0 0 CONT _______________________________________________________________________________________ Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 103/103