Escolar Documentos
Profissional Documentos
Cultura Documentos
Instrucao Assembler
Instrucao Assembler
INSTRUES ASSEMBLER
Introduo
Atravs das Instrues o cdigo-fonte pode executar as funes determinadas pelo programador para controlar o sistema externo de acordo com o projeto. A Instruo Assembler formada por uma srie de palavras (mnemnicos) que traduzem a funo a ser realizada. Normalmente, cada fabricante desenvolve seu prprio conjunto de instrues que tem aplicao exclusiva nos seus componentes, sem nenhuma compatibilidade com outros fabricantes. Para o programador, cabe estudar cada instruo no seu formato, funo e aplicao de acordo com o controlador empregado no projeto. claro que, se existem vrios projetos de aplicao desenvolvidos por uma nica empresa, esta optar pelo uso de um s fabricante de controlador por uma simples questo de custo/investimento na educao dos programadores para a linguagem de programao (conjunto de instrues) e caractersticas de intercambio de programas ou trechos de programas em aplicaes diversas. No geral, entre os diversos controladores existentes no mercado, a funo que se deseja realizar com uma instruo em qualquer dispositivo no altera, apenas o nome da instruo (mnemnico) que sofre uma alterao. Para o nosso caso, sero utilizadas as instrues da famlia PIC Microchip, que rene um conjunto de 37 instrues aplicadas em controladores de 8 bits (Mid Range MCU).
ndice de Instrues
As instrues so agrupadas em trs categorias bsicas de aplicao: INSTRUO ORIENTADA A BYTE (BYTE-ORIENTED OPERATION)
MNEMONICO ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF DESCRIO Soma o valor contido em W com valor contido em F Operao AND (E) entre o valor contido em W e valor contido em F Coloca valor 0 (zero) no registro F Coloca valor 0 (zero) no registro W Complemento de 1 (1s complement) do valor contido em F Decrementa uma unidade do valor contido em F Decrementa uma unidade do valor contido em F e salta a instruo 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 instruo seguinte se o resultao for 0 (zero) Operao OR (OU) entre o valor contido em W e valor contido em F Mover o valor contido no registro F para o destino especificado Mover o valor contido em W para o registro F Nenhuma operao (No Operation) Rotaciona valor contido em F esquerda atravs do bit CARRY Rotaciona valor contido em F direita atravs do bit CARRY Subtrai o valor contido em W do valor contido em F Troca NIB_LO com NIB_HI no registro F Operao EXCLUSIVE OR (OU EXCLUSIVO) entre o valor contido em W e valor contido em F CM 1 1 1 1 1 1 1 (2) 1 1 (2) 1 1 1 1 1 1 1 1 1 Z C C C, DC, Z * * * Z Z Z STATUS C, DC, Z Z Z Z Z Z * * * * * * * * PG. * * * *
Coloca valor 1 (set) no bit F 1 Testa o valor (nvel lgico) do bit F e salta a instruo seguinte se valor do 1 (2) bit for igual a 0 (clear) Testa o valor (nvel lgico) do bit F e salta a instruo seguinte se valor do 1 (2) bit for igual a 1 (set)
Interpretando as Informaes
Cada instruo se apresenta como um captulo onde descrita em sua funo com os detalhes necessrios para a compreenso de sua operao, includos exemplos de aplicao com amostra da sintaxe no cdigo_fonte e como ocorre o comportamento dos bits e registros quando a instruo executada. Quadro Demonstrativo Contm as informaes bsicas para consulta de aplicao indicando a funo e o uso a instruo. MNEMNICO Forma contrada da instruo - normalmente formado pelas iniciais da frase que descreve a operao - o compilador dispes dos cdigos de converso adequados para esta forma. Frase que descreve a operao realizada pela instruo reproduzindo o texto na lngua de origem (ingles). Forma que as instrues devem ser escritas no cdigo_fonte para que o compilador interprete corretamente a converso para cdigo de mquina. Descreve a operao da instruo com detalhes.
Quantidade de Ciclos de Mquina necessrios para que a instruo seja executada CICLO MQUINA completamente - tempo de execuo da instruo, dependente da frequencia do clock do dispositivo aplicado. STATUS Bit do registro STATUS que sofre alterao quando a execuo da instruo resulta em situao definida pelo fabricante (ver quadro descritivo do registro STATUS).
Organizao do Registro Lembrar que todos os sistemas processados tem como base as Tcnicas Digitais fundamentais logo, a estrutura do registro onde a informao armazenada segue todos os padres habituais de formato, nomes, localizao de bit etc., etc., etc.. Para a exposio do funcionamento das instrues e seu emprego, os exemplos sero sempre baseados nos elementos identificados como mostra a figura abaixo:
> [ posio 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
Vocabulrio [ posio bit ] nmero inteiro, no intervalo de 0 a 7, que identifica a posio do bit em um registro, contado sempre da direita para a esquerda, comeando no bit 0 (LSB - bit menos significativo). [ nome registro ],[ posio bit ]
PORTA,6 ; VERIFICA O ESTADO DO BIT [ ; REG. [ nome registro ]
BTFSC
posio bit ] DO
BTFSC
PORTA
MSB
LSB
_______________________________________________________________________________________ [ nome bit ] nome que identifica o bit dentro do registro em substituio do nmero que identifica a [ posio bit ] - o nome do bit pode ser estabelecido pelo fabricante (Registros de Funes Especiais - SFR): [ nome registro ],[ nome bit ] ; DESLIGA O BIT [ nome bit ] NO REGISTRO ; [ nome registro ]
INTCON,PEIE > PEIE 0 0 0 0 0 0 0 0 INTCON ; DESLIGA BIT PEIE NO REGISTRO INTCON
BCF
BCF
Ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na rea de Diretivas.
BCF BCF
[ nome bit ]
F_CONT > F_CONT 0 0 0 0 0
; DESLIGA O BIT [
nome bit ]
FLAG
[ nome registro ] -
identifica um registro na memria (Ram ou Programa) a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funes 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:
CBLOCK ENDC CBLOCK 0x20 FLAG ENDC 0 1 0 0 0
_______________________________________________________________________________________ [ registro origem ] - identifica o registro de origem do valor a ser empregado pela instruo a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funes Especiais - SFR), ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na rea de Diretivas.
ADDWF
; SOMAR O VALOR DO [ registro origem ; COM O VALOR DO [ registro destino ] E COLOCAR O ; RESULTADO DA OPERAO NO [ registro destino ] ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W
ADDWF
CONT,W
_______________________________________________________________________________________ [ registro destino ] - identifica o registro de destino do valor resultado da execuo da instruo a partir de um nome - o nome do registro pode ser estabelecido pelo fabricante (Registros de Funes Especiais - SFR), ou pode ser estabelecido pelo programador (Registros de Uso Geral) e devidamente declarado na rea de Diretivas.
SUBWF
; SOMAR O VALOR DO [ registro origem ; COM O VALOR DO [ registro destino ] E COLOCAR O ; RESULTADO DA OPERAO NO [ registro destino ] ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W
SUBWF
CONT,W
[ nome literal ] -
identifica um valor numrico (constante) a partir de um nome estabelecido pelo programador e devidamente declarado na rea de Diretivas. A utilizao do valor numrico (constante) no programa se faz utilizando sempre o nome dado. O compilador se encarrega de realizar a substituio do nome pelo valor no registro.
EQU .XXX ; RELACIONA O NOME [ nome ; VALOR NUMRICO XXX
[ nome literal ]
REFERENCIA
literal ] AO
EQU
.133
MOVLW MOVLW
[ nome literal ]
REFERENCIA
_______________________________________________________________________________________ [ endereo ] identifica o destino de um desvio originado no cdigo_fonte - o programador pode utilizar nomes para identificar os diversos endereos. O compilador se encarrega de realizara a substituio do nome pela posio numrica na memria. No tem necessidade de se declarar os nomes dos endereos na rea de Diretivas. [ endereo ]
SINALIZACAO ; DESVIA PARA SUB-ROTINA [
CALL CALL
endereo ]
GOTO GOTO
[ endereo ]
DESLIGA_LED
endereo ]
_______________________________________________________________________________________ [ valor ] valor numrico diretamente declarado na instruo dentro do cdigo_fonte - o programador no identificou o valor atravs de um nome declarado na rea de Diretivas. [ valor ]
B'10000011' ; MOVER [
MOVLW MOVLW
STATUS
O registro STATUS dispe de 6 bits de flag (sinalizao) reagindo ao resultado das operaes realizadas por diversas instrues. A tabela descreve apenas os bits relacionados s funes afetadas.
R/W 7 R/W 6 R/W 5 R 4 R 3 R/W 2 R/W 1 R/W 0
IRP
MSB
RP1
RP0
/TO
/PD
DC
C
LSB
NOME IRP
6:5
R/W
1 = Ativa Pginas de Memria 2 e 3 (Bank2 e Bank3) 0 = Ativa Pginas de Memria 0 e 1 (Bank0 e Bank1) RP1:RP0 Seleo da Pgina de Memria (usado para endereamento direto) 11 = Ativa Pgina de Memria 3 (Bank3) 10 = Ativa Pgina de Memria 2 (Bank2) 01 = Ativa Pgina de Memria 1 (Bank1) 00 = Ativa Pgina de Memria 0 (Bank0) Time-Out - Tempo esgotado a CPU informa as seguintes ocorrncias neste bit: 1 = aps energizao do controlador ou ocorrncia da instruo CLRWDT ou ocorrncia da instruo SLEEP 0 = tempo esgotado para ocorrncia da instruo WDT (o programa est parado em um loop infinito) Power Down Queda Alimentao/Reduo de Consumo - a CPU informa as seguintes ocorrncias neste bit: 1 = aps energizao do controlador ou ocorrncia da instruo SLEEP 0 = execuo da instruo SLEEP Zero - a CPU informa as seguintes ocorrncias neste bit: 1 = o resultado da ltima operao aritmtica/lgica foi zero 0 = o resultado da ltima operao aritmtica/lgica no foi zero Digit Carry/Borrow - Dgito de Transporte/Emprstimo - a CPU informa as seguintes ocorrncias neste bit: 1 = o resultado da ltima operao aritmtica/lgica no excedeu os 4 bits menos significativos do registro. 0 = o resultado da ltima operao aritmtica/lgica excedeu os 4 bits menos significativos do registro. Carry/Borrow - Transporte/Emprstimo - a CPU informa as seguintes ocorrncias neste bit: 1 = o resultado da ltima operao aritmtica/lgica no excedeu o valor 255. 0 = o resultado da ltima operao aritmtica/lgica excedeu o valor 255.
/TO
/PD
R/W
R/W
DC
R/W
BCF
MNEMNICO INSTRUO SINTAXE DESCRIO BCF Bit Clear F BCF BCF BCF [ nome bit ] bit pertence a Registro de Uso Geral [ nome registro ],[ nome bit ] bit pertence a Registro Especial [ nome registro ],[ posio bit ] uso geral
Coloca o valor (nvel lgico) 0 (clear) no bit identificado por [ nome bit ]
Esta instruo coloca o nvel lgico 0 (zero - clear) no bit especfico em um determinado registro. S afeta o bit considerado dentro do registro. A sintaxe da instruo 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 cdigo_fonte, usar o nome do Bit aps a instruo. Bit em Registro Especial: BCF [ nome registro ],[ nome bit ]
O nome do Bit j existe (o fabricante estabelece no arquivo de incluso) mas no tem relacionamento entre ele e os Registros Especiais (o fabricante no coloca este relacionamento no arquivo de incluso) no cdigo_fonte o programador deve identificar o Registro Especial e o nome do Bit. Uso Geral: BCF [ nome registro ],[ posio bit ]
O Registro Especial no possui nomes para os Bits (por exemplo: registros PORT) no cdigo_fonte, o programador indica o nome do registro (definido na rea de Diretivas) e a posio do Bit. EXEMPLOS: Bit em Registro de Uso Geral Operao: Desligar o bit F_CONT BCF [ nome bit ]
* Definir o nome do bit na rea de diretivas identificando qual o registro e qual a posio do bit no registro:
#DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME F_CONT O BIT 6 DO ; REGISTRO FLAG
* Instruo
BCF BCF [ nome bit ] F_CONT ; DESLIGA [ nome bit ] ; DESLIGA FLAG F_CONT
* Instruo
BCF BCF [ nome registro ],[ nome bit ] INTCON,T0IE ; DESLIGA [ nome registro ],[ nome bit ] ; DESLIGA INTERRUPO TMR0
Desligar o bit relacionado a um Led (apagar o Led eltricamente ligado a uma sada)
* Valor contido no bit 6 (eltricamente ligado a um Led) do registro PORTA antes da execuo da instruo (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
* Instruo
BCF BCF [ nome registro ],[ posio bit ] PORTA,6 ; DESLIGA [ nome registro ],[ posio bit ] ; DESLIGA O BIT 6 DO REGISTRO PORTA
* Valor contido no bit 6 (eltricamente ligado a um Led) do registro PORTA depois da execuo da instruo (o estado do bit indica que o Led est desligado):
> LED 0 0 0 0 0 0 0 0 PORT A
BSF
MNEMNICO INSTRUO SINTAXE DESCRIO BSF Bit Set F BSF BSF BSF [ nome bit ] bit pertence a Registro de Uso Geral [ nome registro ],[ nome bit ] bit pertence a Registro Especial [ nome registro ],[ posio bit ] uso geral
Coloca o valor (nvel lgico) 1 (set) no bit identificado por [ nome bit ]
Esta instruo coloca o nvel lgico (valor) 1 (set) no bit especfico em um determinado registro. S afeta o bit considerado dentro do registro. A sintaxe da instruo 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 cdigo_fonte, usar o nome do Bit aps a instruo Bit em Registro Especial: BSF [ nome registro ],[ nome bit ]
O nome do Bit j existe (o fabricante estabelece no arquivo de incluso) mas no tem relacionamento entre ele e os Registros Especiais (o fabricante no coloca este relacionamento no arquivo de incluso) no cdigo_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BSF [ nome registro ],[ posio bit ]
O Registro Especial no possui nomes para os Bits (por exemplo: registros PORT) no cdigo_fonte, o programador indica o nome do registro (definido na rea de Diretivas) e a posio do Bit. EXEMPLOS: Bit em Registro de Uso Geral Operao: Ligar o bit F_CONT BSF [ nome bit ]
* Definir o nome do bit na rea de diretivas identificando qual o registro e qual a posio do bit no registro:
#DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME F_CONT O BIT 6 DO ; REGISTRO FLAG
* Instruo
BSF BSF [ nome bit ] F_CONT ; LIGA [ nome bit ] ; LIGA FLAG F_CONT
BSF
* Instruo
BSF BSF [ nome registro ],[ nome bit ] INTCON,T0IE ; LIGA [ nome registro ],[ nome bit ] ; LIGA INTERRUPO TMR0
BSF
* Valor contido no bit 6 (eltricamente ligado a um Led) do registro PORTA antes da execuo da instruo (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
* Instruo
BSF BSF [ nome registro ],[ posio bit ] PORTA,6 ; LIGA [ nome registro ],[ posio bit ] ; LIGA BIT 6 NO REGISTRO PORTA
* Valor contido no bit 6 (eltricamente ligado a um Led) do registro PORTA depois da execuo da instruo (o estado do bit indica que o Led est ligado):
> LED 0 1 0 0 0 0 0 0 PORT A
BTFSC
MNEMNICO INSTRUO SINTAXE BTFSC Bit Test F, Skip if Clear BTFSC [ nome bit ] uso geral BTFSC [ nome registro ],[ nome bit ] bit pertence a Registro Especial BTFSC [ nome registro ],[ posio bit ] - bit pertence a Reg de Uso Geral Testa o valor (nvel lgico) do bit identificado por [ nome bit ] e salta a instruo DESCRIO seguinte se valor do bit for igual a 0 (clear) 2 CM se valor do bit = 0 (clear) executa uma NOP CICLO MQUINA 1 CM se valor do bit = 1 (set) STATUS Nenhum
Esta instruo verifica o nvel lgico (valor) de um bit especfico em um determinado registro: - se o bit = 1 (set) executa a instruo seguinte (no caso um GOTO). - se o bit = 0 (clear) salta a instruo seguinte e executa as demais instrues. Ateno: a execuo da instruo (teste de um bit) no altera o valor contido no bit. A sintaxe da instruo 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 cdigo_fonte, usar o nome do Bit aps a instruo Bit em Registro Especial: BTFSC [ nome registro ], [ nome bit ]
O nome do Bit j existe (o fabricante estabelece no arquivo de incluso) mas no tem relacionamento entre ele e os Registros Especiais (o fabricante no coloca este relacionamento no arquivo de incluso) no cdigo_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BTFSC [ nome registro ], [ posio bit ]
O Registro Especial no possui nomes para os Bits (por exemplo: registros PORT) no cdigo_fonte, o programador indica o nome do registro (declarado na rea de Diretivas) e a posio do Bit. Nos EXEMPLOS DE SINTAXE podemos ver como a instruo deve ser escrita no cdigo_fonte nas suas diversas formas, mas no explica como a instruo funciona. No EXEMPLO DE APLICAO utiliza-se um cdigo_fonte funcional completo para explicar como a instruo opera com detalhe. EXEMPLOS DE SINTAXE: Bit em Registro de Uso Geral Operao: BTFSC [ nome bit ]
* Definir o nome do bit na rea de diretivas identificando qual o registro e qual a posio do bit no registro:
#DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME F_CONT O BIT 6 DO ; REGISTRO FLAG
* Instruo
BTFSC BTFSC [ nome bit ] F_CONT ; VERIFICA ESTADO [ nome bit ] ; VERIFICA ESTADO FLAG F_CONT
BTFSC
* Instruo
BTFSC BTFSC [ nome registro ],[ nome bit ] INTCON,T0IE ; VERIFICA ESTADO [ nome registro ],[ nome bit ] ; VERIFICA ESTADO T0IE - INTERRUPO TMR0
BTFSC
* Valor contido no bit 6 (eltricamente 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
* Instruo
BTFSC BTFSC [ nome registro ],[ posio bit ] PORTA,6 ; VERIFICA ESTADO [ nome registro ],[ posio bit ] ; VERIFCA ESTADO DO BIT 6 NO REGISTRO PORTA
EXEMPLO DE APLICAO: Para estudar a maneira como a instruo funciona dentro de um cdigo_fonte, vamos desenvolver uma aplicao simples onde possamos verificar detalhadamente o comportamento dos bits controlados . Consideremos o diagrama funcional:
VDD
R1
MCU RA0
RA6 R2 B1 L1 VSS
A operao proposta bastante simples: - Aperta o boto B1, acende o led L1. - Solta o boto B1, apaga o led L1. Os estados lgicos que os componentes B1 e L1 podem apresentar para a operao proposta:
B1 Livre Pressionado Apagado Aceso 1 0 0 1
L1
B1
= 1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
No exemplo de aplicao vamos empregar a sintaxe da instruo: 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 cdigo_fonte ser usado o nome do Bit aps a instruo * Definir o nome dos bits de entrada e sada na rea de diretivas relacionando o nome ao registro e posio do bit no registro:
#DEFINE #DEFINE B1 L1 PORTA,0 PORTA,6 ; RELACIONANDO O NOME B1 AO BIT 0 DO ; REGISTRO PORTA ; RELACIONANDO O NOME L1 O BIT 6 DO ; REGISTRO PORTA > B1 bit 0 0 0 1 PORT A
> L1 bit 6 0 0 0 0 0
A execuo do cdigo comea em INICIO, verifica o nvel lgico (valor) do bit representado pelo nome B1 e adota uma das duas possibilidades que a instruo oferece, como o cdigo_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 ENDEREO INICIO) < (BUSCA ENDEREO DESLIGA_L1) DESLIGA_L1 > BCF L1 ; DESLIGA L1 GOTO INICIO ; RETORNA PARA INICIO (BUSCA ENDEREO INICIO)
Analisando as opes da instruo: * Se B1 = 1 (set) - B1 livre realiza a instruo seguinte (no caso, um GOTO). O fluxograma mostra o caminho que o cdigo_fonte realiza para esta condio:
INICIO
B1
=1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
Analisando o comportamento dos bits envolvidos nas instrues dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execuo da instruo BTFSC:
> L1 0 0 0 0 0 0 0 > B1 1 PORT A
* Instruo - durante a execuo do cdigo_fonte, somente as instrues envolvidas so consideradas, as demais so completamente ignoradas - no existem - portanto, o controlador vai ver o cdigo_fonte da seguinte forma:
>INICIO BTFSC B1 ; VERIFICA O ESTADO DE B1 =1 > GOTO DESLIGA_L1 ; B1 = 1 > VAI PARA DESLIGA_L1 (BUSCA ENDEREO DESLIGA_L1) DESLIGA_L1 > BCF L1 ; DESLIGA L1 GOTO INICIO ; RETORNA PARA INICIO (BUSCA ENDEREO INICIO)
* Valor contido no bit 0 (B1) do registro PORTA depois da execuo da instruo BTFSC - o valor contido no bit 0 (B1) no se altera com a execuo da instruo; a execuo da instruo BCF impe o valor 0 (zero) no bit 6 (L1).
> L1 0 0 0 0 0 0 0 > B1 1 PORT A
* Se B1 = 0 (clear) - B1 pressionado salta a instruo seguinte e executa a instruo encontrada (no caso, um BSF). O fluxograma mostra o caminho que o cdigo_fonte realiza para esta condio:
INICIO
B1
=1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
Analisando o comportamento dos bits envolvidos nas instrues dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execuo da instruo BTFSC:
> L1 0 0 0 0 0 0 0 > B1 0 PORT A
* Instruo - durante a execuo do cdigo_fonte, somente as instrues envolvidas so consideradas, as demais so completamente ignoradas - no existem - portanto, o controlador vai ver o cdigo_fonte da seguinte forma:
>INICIO BTFSC B1 =0 > BSF L1 GOTO INICIO (BUSCA ENDEREO INICIO) < ; VERIFICA O ESTADO DE B1
* Valor contido no bit 0 (B1) do registro PORTA depois da execuo da instruo BTFSC - o valor contido no bit 0 (B1) no se altera com a execuo da instruo; a execuo da instruo BSF impe o valor 1 (um) no bit 6 (L1).
> L1 0 1 0 0 0 0 0 > B1 1 PORT A
BTFSS
MNEMNICO INSTRUO SINTAXE BTFSS Bit Test F, Skip if Set BTFSS [ nome bit ] uso geral BTFSS [ nome registro ],[ nome bit ] bit pertence a Registro Especial BTFSS [ nome registro ],[ posio bit ] - bit pertence a Reg de Uso Geral Testa o valor (nvel lgico) do bit identificado por F [ nome bit ] e salta a instruo DESCRIO seguinte se valor do bit for igual a 1 (set) 2 CM se valor do bit = 1 (set) executa uma NOP CICLO MQUINA 1 CM se valor do bit = 0 (clear) STATUS Nenhum
Esta instruo verifica o nvel lgico (valor) de um bit especfico em um determinado registro: - se o bit = 0 (clear) executa a instruo seguinte (no caso um GOTO). - se o bit = 1 (set) salta a instruo seguinte e executa as demais instrues. Ateno: a execuo da instruo (teste de um bit) no altera o valor contido no bit. A sintaxe da instruo 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 cdigo_fonte, usar o nome do Bit aps a instruo Bit em Registro Especial: BTFSS [ nome registro ],[ nome bit ]
O nome do Bit j existe (o fabricante estabelece no arquivo de incluso) mas no tem relacionamento entre ele e os Registros Especiais (o fabricante no coloca este relacionamento no arquivo de incluso) no cdigo_fonte o programador deve identificar o Registro Especial e nome do Bit Uso Geral: BTFSS [ nome registro ],[ posio bit ]
O Registro Especial no possui nomes para os Bits (por exemplo: registros PORT) no cdigo_fonte, o programador indica o nome do registro (declarado na rea de Diretivas) e a posio do Bit. Nos EXEMPLOS DE SINTAXE podemos ver como a instruo deve ser escrita no cdigo_fonte nas suas diversas formas, mas no explica como a instruo funciona. No EXEMPLO DE APLICAO utiliza-se um cdigo_fonte funcional completo para explicar como a instruo opera com detalhe.
EXEMPLOS DE SINTAXE: Bit em Registro de Uso Geral Operao: BTFSS [ nome bit ]
* Definir o nome do bit na rea de diretivas identificando qual o registro e qual a posio do bit no registro:
#DEFINE F_CONT FLAG,6 ; IDENTIFICANDO COM O NOME F_CONT O BIT 6 DO ; REGISTRO FLAG
* Instruo
BTFSS BTFSS [ nome bit ] F_CONT ; VERIFICA ESTADO [ nome bit ] ; VERIFICA ESTADO FLAG F_CONT
BTFSS
* Instruo
BTFSS BTFSS [ nome registro ],[ nome bit ] INTCON,T0IE ; VERIFICA ESTADO [ nome registro ],[ nome bit ] ; VERIFICA ESTADO T0IE - INTERRUPO TMR0
BTFSS
* Valor contido no bit 6 (eltricamente 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
* Instruo
BTFSS BTFSS [ nome registro ],[ posio bit ] PORTA,6 ; VERIFICA ESTADO [ nome registro ],[ posio bit ] ; VERIFCA ESTADO DO BIT 6 NO REGISTRO PORTA
EXEMPLO DE APLICAO: Para estudar a maneira como a instruo funciona dentro de um cdigo_fonte, vamos desenvolver uma aplicao simples onde possamos verificar detalhadamente o comportamento dos bits controlados . Consideremos o diagrama funcional:
VDD
R1
MCU RA0
RA6 R2 B1 L1 VSS
A operao proposta bastante simples: - Aperta o boto B1, acende o led L1. - Solta o boto B1, apaga o led L1. Os estados lgicos que os componentes B1 e L1 podem apresentar para a operao proposta:
B1 Livre Pressionado Apagado Aceso 1 0 0 1
L1
B1
= 1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
No exemplo de aplicao vamos empregar a sintaxe da instruo: 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 cdigo_fonte ser usado o nome do Bit aps a instruo * Definir o nome dos bits de entrada e sada na rea de diretivas relacionando o nome ao registro e posio do bit no registro:
#DEFINE #DEFINE B1 L1 PORTA,0 PORTA,6 ; RELACIONANDO O NOME B1 AO BIT 0 DO ; REGISTRO PORTA ; RELACIONANDO O NOME L1 O BIT 6 DO ; REGISTRO PORTA > B1 bit 0 0 0 1 PORT A
> L1 bit 6 0 0 0 0 0
A execuo do cdigo comea em INICIO, verifica o nvel lgico (valor) do bit representado pelo nome B1 e adota uma das duas possibilidades que a instruo oferece, como o cdigo_fonte indica abaixo:
>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 ENDEREO INICIO) < (BUSCA ENDEREO LIGA_L1) LIGA_L1 > BSF L1 ; LIGA L1 GOTO INICIO ; RETORNA PARA INICIO (BUSCA ENDEREO INICIO)
Analisando as opes da instruo: * Se B1 = 1 (set) - B1 livre salta a instruo seguinte e executa a instruo encontrada (BCF). O fluxograma mostra o caminho que o cdigo_fonte realiza para esta condio:
INICIO
B1
=1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
Analisando o comportamento dos bits envolvidos nas instrues dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execuo da instruo BTFSS:
> L1 0 0 0 0 0 0 0 > B1 1 PORT A
* Instruo - durante a execuo do cdigo_fonte, somente as instrues envolvidas so consideradas, as demais so completamente ignoradas - no existem - portanto, o controlador vai ver o cdigo_fonte da seguinte forma:
>INICIO BTFSS B1 =1 > BCF L1 GOTO INICIO (BUSCA ENDEREO INICIO) < ; VERIFICA O ESTADO DE B1
* Valor contido no bit 0 (B1) do registro PORTA depois da execuo da instruo BTFSS - o valor contido no bit 0 (B1) no se altera com a execuo da instruo; a execuo da instruo BCF impe o valor 0 (zero) no bit 6 (L1).
> L1 0 0 0 0 0 0 0 > B1 1 PORT A
* Se B1 = 0 (clear) - B1 pressionado realiza a instruo seguinte (GOTO). O fluxograma mostra o caminho que o cdigo_fonte realiza para esta condio:
INICIO
B1
=1 (B1 livre)
L1 = 0
=0 (B1 pressionado)
L1 = 1
Analisando o comportamento dos bits envolvidos nas instrues dentro do registro PORTA: * Valor contido no bit 0 (B1) do registro PORTA antes da execuo da instruo BTFSS:
> L1 0 0 0 0 0 0 0 > B1 0 PORT A
* Instruo - durante a execuo do cdigo_fonte, somente as instrues envolvidas so consideradas, as demais so completamente ignoradas - no existem - portanto, o controlador vai ver o cdigo_fonte da seguinte forma:
>INICIO BTFSS B1 ; VERIFICA O ESTADO DE B1 =0 > GOTO LIGA_L1 ; B1 = 0 > VAI PARA LIGA_L1 (BUSCA ENDEREO LIGA_L1) LIGA_L1 > BSF L1 ; LIGA L1 GOTO INICIO ; RETORNA PARA INICIO (BUSCA ENDEREO INICIO)
* Valor contido no bit 0 (B1) do registro PORTA depois da execuo da instruo BTFSS - o valor contido no bit 0 (B1) no se altera com a execuo da instruo; a execuo da instruo BSF impe o valor 1 (um) no bit 6 (L1).
> L1 0 1 0 0 0 0 0 > B1 1 PORT A
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 29/103
CALL
MNEMNICO INSTRUO SINTAXE DESCRIO CALL Call Subroutine CALL [ endereo ] Desvia o programa para uma sub-rotina (sequencia de instrues pr-definida) identificada por [ endereo ] Nenhum
Esta instruo desvia o programa para o endereo indicado em [ nome subrotina ] e executa a sequencia de instrues indicada. A sequencia de instrues do desvio deve ser encerrada com a instruo RETURN, que retorna posio imediatamente seguinte da instruo CALL. EXEMPLO:
CALL SINALIZACAO ; DESVIA PARA SUB-ROTINA DE SINALIZACAO > ; SEQUENCIA DE INSTRUES DE EXECUO ; NORMAL DO PROGRAMA (BUSCA ENDEREO SINALIZACAO) SINALIZACAO ; SEQUENCIA DE INSTRUES DE EXECUO ; DA SUB-ROTINA SINALIZACAO RETURN ; SADA DA SUB-ROTINA SINALIZACAO (BUSCA ENDEREO DE RETORNO - linha seguinte da instruo CALL)
CLRF
MNEMNICO INSTRUO SINTAXE DESCRIO CLRF Clear F CLRF [ nome registro ]
Esta instruo substitui todos os valores de cada bit de um registro pelo valor 0 (clear). Ateno: colocar valor 0 (zero) em todos os bits de um registro no significa apagar o valor contido anteriormente neste registro, uma vez que o nmero zero representado por um registro com todos os bits com valor 0 (zero). EXEMPLO: * Valor contido no registro PORTA antes da execuo da instruo:
1 0 1 0 1 0 0 1 PORTA
* Instruo
CLRF PORTA ;COLOCA VALOR ZERO NO REGISTRO PORTA
CLRW
MNEMNICO INSTRUO SINTAXE DESCRIO CLRW Clear W CLRW Coloca o valor 0 (clear) dentro do registro W
Esta instruo substitui todos os valores de cada bit do registro W pelo valor 0 (clear). Ateno: colocar valor 0 (zero) em todos os bits de um registro no significa apagar o valor contido anteriormente neste registro, uma vez que o nmero zero representado por um registro com todos os bits com valor 0 (zero). EXEMPLO: * Valor contido no registro W antes da execuo da instruo:
1 0 1 0 1 0 0 1 W
* Instruo
CLRW ; COLOCA VALOR ZERO NO REGISTRO W
DECF
MNEMNICO INSTRUO SINTAXE DESCRIO CICLO MQUINA STATUS DECF Decrement F DECF [ nome registro ] Decrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] 1 Z
Esta instruo subtrai uma unidade ( 1 ) do registro. Se o resultado da subtrao do registro resultar em valor zero (nulo), o bit Z do registro STATUS altera o valor para 1. necessrio que o registro seja definido como varivel nas diretivas. EXEMPLO: * Definir o registro como varivel nas diretivas:
CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR
* Instruo
DECF CONT 0 0 0 0 0 ; DECREMENTA UMA UNIDADE O REG. CONT 0 1 0 2 CONT
0 0 0 0 0 0 0 1 1
CONT 1
CONT
DECFSZ
MNEMNICO INSTRUO SINTAXE DESCRIO DECFSZ Decrement F, Skip if Zero DECFSZ [ nome registro ]
Decrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] e salta a instruo seguine se o resultado da operao for zero. 2 CM se valor do registro for igual a zero executa uma NOP CICLO MQUINA 1 CM se valor do registro for diferente de zero STATUS Nenhum
Esta instruo subtrai uma unidade ( 1 ) do registro e verifica se o resultado da operao zero (nulo): - se o resultado da operao = 0 (igual a zero) salta a instruo seguinte e executa as demais instrues. - se o resultado da operao 0 (diferente de zero) executa a instruo seguinte (no caso um GOTO). necessrio que o registro seja definido como varivel nas diretivas. EXEMPLO: * Definir o registro como varivel nas diretivas:
CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR
A execuo do cdigo comea em INICIO, subtrai uma unidade do registro CONT,verifica se o resultado da operao zero e deve adotar uma das duas possibilidades que a instruo oferece: * Resultado da operao 0 (diferente de zero) executa a instruo seguinte (no caso um GOTO). * Valor contido no registro CONT antes da execuo da instruo:
0 0 0 0 0 0 1 0 2 CONT
* Instruo
DECFSZ CONT 0 0 0 0 0 ; DECREMENTA UMA UNIDADE O REG. CONT 0 1 0 2 CONT
0 0 0 0 0 0 0 1 1
CONT 1
CONT
* Instruo seguinte
GOTO INICIO ; RESULTADO 0 > VAI PARA INICIO
* Resultado da operao = 0 (clear) salta a instruo seguinte e executa as demais instrues. * Valor contido no registro CONT antes da execuo da instruo:
0 0 0 0 0 0 0 1 1 CONT
* Instruo
DECFSZ CONT 0 0 0 0 0 ; DECREMENTA UMA UNIDADE O REG. CONT 0 0 1 1 CONT
0 0 0 0 0 0 0 1 1
CONT 1
CONT
* Instruo seguinte
BSF FLAG ; RESULTADO = 0 > COLOCA 1 NO BIT FLAG ; SEQUENCIA DE INSTRUES DO PROGRAMA
Observando o cdigo completo com as indicaes de caminhos a serem seguidos em funodo resultado da operao INCFSZ, podemos notar que, uma vez escolhido o caminho de execuo, as demais possbilidades so ignoradas:
(BUSCA ENDEREO)
; DECREMENTA UMA UNIDADE O REG. CONT ; RESULTADO 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA 1 NO BIT FLAG ; SEQUENCIA DE INSTRUES DO PROGRAMA
GOTO
MNEMNICO INSTRUO SINTAXE DESCRIO GOTO Go To GOTO [ endereo ]
Esta instruo cria um desvio incondicional para qualquer outra parte do programa de acordo com o nome do endereo indicado. Este desvio no tem retorno e no depende de condies internas ou externas ao programa. EXEMPLO: * Instruo
GOTO DESLIGA_LED ; VAI PARA O ENDEREO DESLIGA_LED
; DESLIGA LED
INCF
MNEMNICO INSTRUO SINTAXE DESCRIO INCF Increment F INCF [ nome registro ] Incrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] Z
Esta instruo adiciona uma unidade ( 1 ) ao registro. Se o resultado da adio ao registro resultar em valor zero (nulo), o bit Z do registro STATUS altera o valor para 1. necessrio que o registro seja definido como varivel nas diretivas. EXEMPLO: * Definir o registro como varivel nas diretivas:
CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR
* Instruo
INCF CONT 1 1 1 1 1 ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 0 254 CONT
+
0 0 0 0 0 0 0 1 1
+
CONT + 1
255
CONT
INCFSZ
MNEMNICO INSTRUO SINTAXE DESCRIO INCFSZ Increment F, Skip if Zero INCFSZ [ nome registro ]
Incrementa de uma unidade o valor contido no registro F identificado por [ nome registro ] e salta a instruo seguine se o resultado da operao for zero. 2 CM se valor do registro for igual a zero executa uma NOP CICLO MQUINA 1 CM se valor do registro for diferente de zero STATUS Nenhum
Esta instruo adiciona uma unidade ( 1 ) ao registro e verifica se o resultado da operao zero (nulo): - se o resultado da operao = 0 (igual a zero) salta a instruo seguinte e executa as demais instrues. - se o resultado da operao 0 (diferente de zero) executa a instruo seguinte (no caso um GOTO). necessrio que o registro seja definido como varivel nas diretivas. EXEMPLO: * Definir o registro como varivel nas diretivas:
CBLOCK 0x20 CONT ENDC ; REGISTRO CONTADOR
A execuo do cdigo comea em INICIO, adiciona uma unidade ao registro CONT,verifica se o resultado da operao zero e deve adotar uma das duas possibilidades que a instruo oferece: * Resultado da operao 0 (diferente de zero) executa a instruo seguinte (no caso um GOTO). * Valor contido no registro CONT antes da execuo da instruo:
1 1 1 1 1 1 1 0 254 CONT
* Instruo
INCFSZ CONT 1 1 1 1 1 ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 0 254 CONT
+
0 0 0 0 0 0 0 1 1
+
CONT + 1
255
CONT
* Instruo seguinte
GOTO INICIO ; RESULTADO 0 > VAI PARA INICIO
* Resultado da operao = 0 (igual a zero) salta a instruo seguinte e executa as demais instrues. * Valor contido no registro CONT antes da execuo da instruo:
1 1 1 1 1 1 1 1 255 CONT
* Instruo
INCFSZ CONT 1 1 1 1 1 ; INCREMENTA UMA UNIDADE O REG. CONT 1 1 1 255 CONT
+
0 0 0 0 0 0 0 1 1
+
CONT + 1
CONT
* Instruo seguinte
BSF FLAG ; RESULTADO = 0 > COLOCA 1 NO BIT FLAG ; SEQUENCIA DE INSTRUES DO PROGRAMA
Observando o cdigo completo com as indicaes de caminhos a serem seguidos em funodo resultado da operao INCFSZ, podemos notar que, uma vez escolhido o caminho de execuo, as demais possbilidades so ignoradas:
(BUSCA ENDEREO)
; INCREMENTA UMA UNIDADE O REG. CONT ; RESULTADO 0 > VAI PARA INICIO ; RESULTADO = 0 > COLOCA 1 NO BIT FLAG ; SEQUENCIA DE INSTRUES DO PROGRAMA
MOVLW
MNEMNICO INSTRUO SINTAXE DESCRIO MOVLW Move Literal to W MOVLW [ nome literal ] MOVLW [ valor ] Mover o valor do literal identificado por [ nome literal ] ou [ valor ] para o registro W Nenhum
Esta instruo usada para copiar o valor de um nmero ou constante (literal) armazenado em um registro da memria de programa, para o registro W. Observar que no importa a forma que o valor declarado (binrio, decimal ou hexa) no programa, o valor que ser colocado no registro W ser sempre em binrio. 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 numrica dentro da prpria instruo. EXEMPLOS: - Nome Literal * Relacionar a constante a um nome e declarar o valor na rea de diretivas:
CT_TEMPO EQU .125 ; CONSTANTE DE TEMPO
* Instruo
MOVLW CT_TEMPO ; MOVER LITERAL PARA REG. W
* Instruo
MOVLW B'10000011' ; MOVER LITERAL PARA REG. W
* Instruo
MOVLW .123 ; MOVER LITERAL PARA REG. W
* Instruo
MOVLW 0x4F ; MOVER LITERAL PARA REG. W
MOVF
MNEMNICO INSTRUO SINTAXE DESCRIO MOVF Move F MOVF [ registro origem ], [ registro destino ] Mover o valor contido no registro F identificado em [registro origem] para o registro identificado em [ registro destino ] Z (ver observao)
Esta instruo 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. - no possvel mover do registro de origem W para o registro de destino F. Observao: se o valor contido no registro de origem F for nulo (todos os bits contm o valor 0), a execuo da instruo MOVF muda o estado do bit Z do registro STATUS de 0 1, indicando que o resultado da operao foi nulo. O programador pode utilizar este evento para testar se o registro de origem F nulo ou no. EXEMPLO: - Mover valor do registro de origem W para o registro de destino W * Valor contido no registro W antes da execuo da instruo:
1 0 1 0 1 0 0 1 W
* Instruo
MOVF W,W ; MOVER O VALOR CONTIDO NO REG. W PARA O REG. W
- Mover valor do registro de origem F (INTCON) para o registro de destino F (INTCON). * Valor contido no registro INTCON antes da execuo da instruo:
1 0 1 0 1 1 1 1 INTCON
* Instruo
MOVF INTCON,F ; MOVER O VALOR CONTIDO NO REG. INTCON PARA ; O REG. INTCON
- Mover valor do registro de origem F (INTCON) para o registro de destino W * Valores contidos nos registros INTCON e W antes da execuo da instruo:
1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 INTCON W
* Instruo
MOVF INTCON,W ; MOVER O VALOR CONTIDO NO REG. INTCON PARA ; O REG. W
MOVWF
MNEMNICO INSTRUO SINTAXE DESCRIO MOVFW Move W to F MOVWF [ nome registro ] Mover o valor contido no registro W para o registro F identificado em [ nome registro ] Nenhum
Esta instruo 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 instrues 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 memria RAM rea SFR). A sequencia de instrues fica como abaixo:
MOVLW MOVWF B'10100000' INTCON ; GIE HABILITADO (INTERRUPES LIGADAS) ; INTERRUPO TMR0 HABILITADA
Os valores dentro dos registros modificam-se de acordo com a sequencia de instrues: * Valores contidos nos registros W e INTCON antes da execuo da instruo:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 W INTCON
* Instruo
MOVLW B'10100000'
* Instruo
MOVWF INTCON ; GIE HABILITADO (INTERRUPES LIGADAS) ; INTERRUPO TMR0 HABILITADA
NOP
MNEMNICO INSTRUO SINTAXE DESCRIO NOP No Operation NOP No executa nenhuma operao
Esta instruo no executa nenhuma operao especfica em um cdigo ou programa. A execuo da instruo NOP consome 1 CM (um ciclo de mquina) que pode ser empregado para produzir um atraso equivalente. EXEMPLO: Vamos considerar o cdigo abaixo:
INICIO BTFSC GOTO BSF NOP NOP NOP GOTO BOTAO DESLIGA_LED LED ; VERIFICA O ESTADO DO BIT QUE REPRESENTA BOTAO ; BOTAO = 0 > VAI PARA DESLIGA_LED ; BOTAO = 1 > LIGA LED ; ; AGUARDA 3 CM ANTES DA INSTRUO GOTO ; ; RETORNA PARA INICIO
INICIO
Entre a instruo BSF e a instruo GOTO existem tres instrues NOP, isto , o programa consome 3 CM sem realizar nenhuma operao. O nmero de vezes que a instruo NOP pode ser utilizada (sem sequencia ou no) no tem limite. Depende exclusivamente da necessidade de uso no programa.
RETFIE
MNEMNICO INSTRUO SINTAXE DESCRIO RETFIE Return From Interrupt Enable RETFIE Retorno de uma Interrupo
Esta instruo empregada somente para retorno de interrupo (qualquer tipo). Para melhor visualizao da aplicao da instruo, vamos considerar o cdigo abaixo como uma sequencia padro para tratamento de interrupes:
ORG GOTO SAI_INT RETFIE 0X04 ; ENDEREO DO VETOR DE INTERRUPO ; SEQUENCIA DE INSTRUES DO PROGRAMA ; PARA PRESERVAR CONTEXTO (REGISTROS ; IMPORTANTES)
; SEQUENCIA DE INSTRUES DO PROGRAMA ; PARA DETERMINAR QUAL INTERRUPO ; FOI ATIVADA PARA TRATAMENTO SAI_INT ; VAI PARA ROTINA DE SADA INTERRUPO ; QUANDO O TRATAMENTO TERMINAR ; SEQUENCIA DE INSTRUES DO PROGRAMA ; PARA RECUPERAR CONTEXTO (REGISTROS ; IMPORTANTES SALVOS) ; SADA DO TRATAMENTO DE INTERRUPO
RETURN
MNEMNICO INSTRUO SINTAXE DESCRIO RETURN Return RETURN Retorna de uma sub-rotina (sequencia de instrues pr-definida) executada completamente. Nenhum
Esta instruo retorna ao programa aps a execuo das instrues de uma sub-rotina iniciada pela instruo CALL. EXEMPLO:
CALL SINALIZACAO ; DESVIA PARA SUB-ROTINA DE SINALIZACAO > ; SEQUENCIA DE INSTRUES DE EXECUO ; NORMAL DO PROGRAMA (BUSCA ENDEREO SINALIZACAO) SINALIZACAO ; SEQUENCIA DE INSTRUES DE EXECUO ; DA SUB-ROTINA SINALIZACAO RETURN ; SADA DA SUB-ROTINA SINALIZACAO (BUSCA ENDEREO DE RETORNO - linha seguinte da instruo CALL)
SWAPF
MNEMNICO INSTRUO SINTAXE DESCRIO SWAPF Swap Nibbles in F SWAPF [ registro origem ], [ registro destino ] Troca de posio o Nibble Alto (NIB_HI) com o Nibble Baixo (NIB_LO) do registro F identificado em [registro origem] e coloca o resultado da operao no registro identificado em [ registro destino ] Nenhum
Esta instruo troca de posio 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 1 1 1 1 Registro
O resultado da operao 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. Observao: quando a instruo for empregada no registro de origem F e o resultado da operao for colocado no registro de destino W, a instruo troca o Nibble Alto (NIB_HI) com o Nibble Baixo (NIB_LO) somente no registro de destino W, preservando a posio original no registro de origem F. EXEMPLO: - Trocar a posio no registro de origem W e colocar o resultado no registro de destino W * Valor contido no registro W antes da execuo da instruo:
0 0 0 0 1 1 1 1 W
* Instruo
SWAPF W,W ; TROCA O NIB_HI COM O NIB_LO DO REG. W ; E COLOCA O RESULTADO DA OPERAO ; NO REG. W
- Trocar a posio do registro de origem F (INTCON) e colocar o resultado no registro de destino F (INTCON). * Valor contido no registro INTCON antes da execuo da instruo:
0 0 0 0 1 1 1 1 INTCON
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 50/103
* Instruo
SWAPF INTCON,F ; TROCA O NIB_HI COM O NIB_LO DO REG. INTCON ; E COLOCA O RESULTADO DA OPERAO ; NO REG. INTCON
- Trocar a posio no registro de origem F (INTCON) e colocar o resultado no registro de destino W * Valores contidos nos registros INTCON e W antes da execuo da instruo:
0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 INTCON W
* Instruo
SWAPF INTCON,W ; TROCA O NIB_HI COM O NIB_LO DO REG. INTCON ; E COLOCA O RESULTADO DA OPERAO ; NO REG. W
Observao: notar que a instruo foi empregada no registro de origem INTCON e o resultado da operao 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 posio original no registro de origem INTCON.
IORWF
MNEMNICO INSTRUO SINTAXE DESCRIO IORWF W logic OR with F IORWF [ registro origem ], [ registro destino ] Realiza a operao lgica 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 operao no registro identificado em [ registro destino ] Z
Esta instruo realiza a operao lgica OR (ou), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expresso booleana: - registro de destino W - registro de destino F W =W + F F =W + F
A tabela verdade da lgica OR (ou) representada abaixo para todas as possveis combinaes de W e F:
W 0 0 1 1 F 0 1 0 1 0 1 1 1
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro de destino (W ou F), onde o sinal + representa a operao lgica ou:
Bit 0 1 2 3 4 5 6 7 W 0 0 1 1 0 0 1 1 + + + + + + + + F 0 1 0 1 0 1 0 1 = = = = = = = = 0 1 1 1 0 1 1 1
EXEMPLO: - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
IORWF CONT,W ; LGICA OR ENTRE O REG. W E O REG. CONT COLOCAR O ; RESULTADO DA OPERAO NO REG. W 0 1 1 1 0 0 0 1 W (OR) + CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
Ateno: o sinal + representa a operao lgica ou. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 0 W CONT
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado). - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
IORWF CONT,F ; LGICA OR ENTRE O REG. W E O REG. CONT - COLOCAR ; O RESULTADO DA OPERAO NO REG. CONT 0 1 1 1 0 0 0 1 W (OR) + CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
CONT
Ateno: o sinal + representa a operao lgica ou. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 W CONT
Observao: notar que o valor contido no registro CONT sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro W permanece inalterado (o valor contido originalmente preservado).
ANDWF
MNEMNICO INSTRUO SINTAXE DESCRIO ANDWF W logic AND with F ANDWF [ registro origem ], [ registro destino ] Realiza a operao lgica 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 operao no registro identificado em [ registro destino ] Z
Esta instruo realiza a operao lgica AND (e), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expresso booleana: - registro de destino W - registro de destino F W =W F F =W F
A tabela verdade da lgica AND (e) representada abaixo para todas as possveis combinaes de W e F:
W 0 0 1 1 F 0 1 0 1 0 0 0 1
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro de destino (W ou F), onde o sinal representa a operao lgica e:
Bit 0 1 2 3 4 5 6 7 W 0 0 1 1 0 0 1 1 F
0 1 0 1 0 1 0 1
= = = = = = = =
0 0 0 1 0 0 0 1
EXEMPLO: - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
ANDWF CONT,W ; LGICA AND ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAO NO REG W
W (AND)
CONT
Ateno: o sinal representa a operao lgica e. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 W CONT
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado). - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
ANDWF CONT,F ; LGICA AND ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAO NO REG W 0 1 1 1 0 0 0 1 W (AND)
CONT
CONT
Ateno: o sinal representa a operao lgica e. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 W CONT
Observao: notar que o valor contido no registro CONT sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro W permanece inalterado (o valor contido originalmente preservado).
XORWF
MNEMNICO INSTRUO SINTAXE DESCRIO XORWF W logic EXCLUSIVE-OR with F XORWF [ registro origem ], [ registro destino ] Realiza a operao lgica 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 operao no registro identificado em [ registro destino ] Z
Esta instruo realiza a operao lgica AND (e), bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expresso booleana: - registro de destino W - registro de destino F W =W F F =W F
A tabela verdade da lgica EXCLUSIVE-OR (ou-exclusivo) representada abaixo para todas as possveis combinaes de W e F:
W 0 0 1 1 F 0 1 0 1 0 1 1 0
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro de destino (W ou F), onde o sinal representa a operao lgica exclusive-or:
Bit 0 1 2 3 4 5 6 7 W 0 0 1 1 0 0 1 1 F
0 1 0 1 0 1 0 1
= = = = = = = =
0 1 1 1 0 1 1 0
EXEMPLO: - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
XORWF CONT,W ; LGICA EXCLUSIVE-OR ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAO NO REG W 0 1 1 1 0 0 0 1 W
0 1 1 0 1 0 0 0
CONT
Ateno: o sinal representa a operao lgica ou-exclusivo. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 W CONT
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado). - Realizar a lgica 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 execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 W CONT
* Instruo
XORWF CONT,F ; LGICA EXCLUSIVE-OR ENTRE O REG. W E O REG. CONT ; COLOCAR O RESULTADO DA OPERAO NO REG W 0 1 1 1 0 0 0 1 W
0 1 1 0 1 0 0 0
CONT
CONT
Ateno: o sinal representa a operao lgica ou-exclusivo. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 W CONT
Observao: notar que o valor contido no registro CONT sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro W permanece inalterado (o valor contido originalmente preservado).
ANDLW
MNEMNICO INSTRUO SINTAXE DESCRIO ANDLW Literal logic AND with W ANDLW [ nome literal ] Realiza a operao lgica AND (e) entre o valor do literal identificado em [ nome literal ] e o valor contido no registro W; o resultado da operao ser colocado no registro W. Z
Esta instruo realiza a operao lgica AND (e), bit a bit, entre o valor de um nmero ou constante (literal) e o valor contido no registro W de acordo com a expresso 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 lgica AND (e) representada abaixo para todas as possveis combinaes do literal e W:
Literal 0 0 1 1 W 0 1 0 1 0 0 0 1
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro W, onde o sinal representa a operao lgica e:
Bit 0 1 2 3 4 5 6 7 Literal 0 0 1 1 0 0 1 1 W
0 1 0 1 0 1 0 1
= = = = = = = =
0 0 0 1 0 0 0 1
EXEMPLO: - Realizar a lgica 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
* Instruo
ANDLW SOMA_REF,W ; LGICA AND ENTRE O LITERAL SOMA_REF E O REG. W ; COLOCAR O RESULTADO DA OPERAO NO REG W 1 1 1 0 0 0 1 W (AND)
SOMA_REF
Ateno: o sinal representa a operao lgica e. * Valores contidos nos registros W e SOMA_REF depois da execuo da instruo:
0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 W SOMA_REF
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro SOMA_REF permanece inalterado (o valor do literal no sofre alterao).
IORLW
MNEMNICO INSTRUO SINTAXE DESCRIO IORLW Literal logic OR with W IORLW [ nome literal ] Realiza a operao lgica OR (ou) entre o valor do literal identificado em [ nome literal ] e o valor contido no registro W; o resultado da operao ser colocado no registro W. Z
Esta instruo realiza a operao lgica OR (ou), bit a bit, entre o valor de um nmero ou constante (literal) e o valor contido no registro W de acordo com a expresso 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 lgica OR (ou) representada abaixo para todas as possveis combinaes de W e F:
W 0 0 1 1 F 0 1 0 1 0 1 1 1
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro W, onde o sinal + representa a operao lgica ou:
Bit 0 1 2 3 4 5 6 7 Literal 0 0 1 1 0 0 1 1 + + + + + + + + W 0 1 0 1 0 1 0 1 = = = = = = = = 0 1 1 1 0 1 1 1
EXEMPLO: - Realizar a lgica 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
; LGICA OR ENTRE O LITERAL SOMA_REF E O REG. W ; COLOCAR O RESULTADO DA OPERAO NO REG. W 0 1 1 1 0 0 0 1 W (OR) + SOMA_REF
+
0
+
1
+
1
+
1
+
1
+
1
+
0
+
1
Ateno: o sinal + representa a operao lgica ou. * Valores contidos nos registros W e SOMA_REF depois da execuo da instruo:
0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 W SOMA_REF
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro SOMA_REF permanece inalterado (o valor do literal no sofre alterao).
XORLW
MNEMNICO INSTRUO SINTAXE DESCRIO XORLW Literal logic EXCLUSIVE-OR with W XORLW [ nome literal ] Realiza a operao lgica 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 operao no registro W. Z
Esta instruo realiza a operao lgica AND (e), bit a bit, entre o valor de um nmero ou constante (literal) e o valor contido no registro W de acordo com a expresso booleana:
W = Literal W
A tabela verdade da lgica EXCLUSIVE-OR (ou-exclusivo) representada abaixo para todas as possveis combinaes de W e F:
W 0 0 1 1 F 0 1 0 1 0 1 1 0
A Unidade Lgica do processador realiza a operao em cada bit dos registros individualmente, colocando o resultado da operao no bit correspondente do registro de destino (W ou F), onde o sinal representa a operao lgica exclusive-or:
Bit 0 1 2 3 4 5 6 7 Literal 0 0 1 1 0 0 1 1 F
0 1 0 1 0 1 0 1
= = = = = = = =
0 1 1 1 0 1 1 0
EXEMPLO: - Realizar a lgica 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
* Instruo
XORLW SOMA_REF,W ; LGICA EXCLUSIVE-OR ENTRE O LITERAL SOMA_REF ; E O O REG. W - COLOCAR O RESULTADO DA OPERAO ; NO REG W 1 1 1 0 0 0 1 W
0 1 1 1 1 1 0 1
SOMA_REF
Ateno: o sinal representa a operao lgica ou-exclusivo. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 W SOMA_REF
Observao: notar que o valor contido no registro W sofreu modificao (apresenta o resultado da operao aps a execuo da instruo), enquanto o registro SOMA_REF permanece inalterado (o valor do literal no sofre alterao).
ADDWF
MNEMNICO INSTRUO SINTAXE DESCRIO ADDWF Add W to F ADDWF [ registro origem ], [ registro destino ] Soma o valor contido no registro W com o valor contido no registro F identificado em [registro origem], e coloca o resultado da operao no registro identificado em [ registro destino ] C, Z
Esta instruo realiza a operao aritmtica da adio, bit a bit, entre o valor contido no registro W e o valor contido no registro F de acordo com a expresso algbrica: - registro de destino W - registro de destino F W =W + F F =W + F
+
0 0 0 1
+
1 1
+
1
10
A operao aritmtica de adio deve atender aos limites impostos pelo tamanho do registro (8 bits), isto , o resultado final da operao deve ser necessriamente menor ou igual a 255. Com operaes onde o valor do resultado maior que 255, a sinalizao feita atravs do bit (flag) C no registro STATUS, que muda de 0 (zero) para 1 (um) indicando a ocorrencia de resultado da operao com valor maior que 255 (overflow):
> flag sinalizao resultado operao >255 IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
Observao: 1. o valor x representa valor irrelevante (no influencia o resultado). 2. o retorno a 0 (zero) do flag feito automaticamente pela Unidade Lgica. 3. uma vez indicada a ocorrencia de overflow (excesso) da operao, o flag C pode permanecer com valor 1 (um) por vrios ciclos de mquina - a Unidade Lgica retorna o flag a 0 (zero) no ciclo imediatamente anterior a uma nova operao aritmtica. O programador deve estabelecer procedimentos para determinar a ocorrencia de overflow (excesso) nas operaes de adio previstas no cdigo_fonte.
- Somar o valor contido no registro W com o valor contido no registro CONT e colocar o resultado no registro W a) Resultado da operao menor ou igual a 255 * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 113 104 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
ADDWF CONT,W ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W 1 1 1 0 0 0 1 113 W (SOMA) + CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
+
104
217
Ateno: o sinal + representa a operao aritmtica da adio. * Valores contidos nos registros W e CONT depois da execuo da instruo:
1 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 217 104 W CONT
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo, enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado).
* Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao foi um nmero menor que 255 logo, o flag de sinalizao permanece igual a 0 (zero).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
b) Resultado da operao maior que 255 (uso do flag CARRY do registro STATUS) * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 113 145 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
ADDWF CONT,W ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W 1 1 1 0 0 0 1 113 W (SOMA) + CONT
+
1
+
0
+
0
+
1
+
0
+
0
+
0
+
1
+
145
Ateno: o sinal + representa a operao aritmtica da adio. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 2 145 W CONT
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo, enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado).
* Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de adio foi um nmero maior que 255 logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS
MSB LSB
Vamos olhar o resultado desta operao. Fizemos uma operao de adio 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 operao tem valor maior que 255:
IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1
MSB LSB
STATUS
Porm, o resultado apresentado no registro W no corresponde ao valor esperado (258), mas apresentou o valor 2:
0 0 0 0 0 0 1 0 2 W
O valor 258 no cabe em 8 bits. Para represent-lo so necessrios 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 necessrio para a composio 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
- Registro de destino F
F =W + 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 operao menor ou igual a 255 * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 113 104 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
ADDWF CONT,F ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 W (SOMA) + CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
+
104
217
CONT
Ateno: o sinal + representa a operao aritmtica da adio. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 113 217 W CONT
Observao: notar que o valor contido no registro CONT apresenta o resultado da operao aps a execuo da instruo, enquanto o registro W permanece inalterado (o valor contido originalmente preservado).
* Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao foi um nmero menor que 255 logo, o flag de sinalizao permanece igual a 0 (zero).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
b) Resultado da operao maior que 255 (uso do flag CARRY do registro STATUS) * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 113 145 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
ADDWF CONT,F ; SOMAR O VALOR DO REG. W COM O VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 W (SOMA) + CONT
+
1
+
0
+
0
+
1
+
0
+
0
+
0
+
1
+
145
CONT
Ateno: o sinal + representa a operao aritmtica da adio. * Valores contidos nos registros W e CONT depois da execuo da instruo:
0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 113 2 W CONT
Observao: notar que o valor contido no registro CONT apresenta o resultado da operao aps a execuo da instruo, enquanto o registro W permanece inalterado (o valor contido originalmente preservado).
* Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de adio foi um nmero maior que 255 logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS
MSB LSB
Vamos olhar o resultado desta operao. Fizemos uma operao de adio 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 operao tem valor maior que 255:
IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1
MSB LSB
STATUS
Porm, o resultado apresentado no registro CONT no corresponde ao valor esperado (258), mas apresentou o valor 2:
0 0 0 0 0 0 1 0 2 CONT
O valor 258 no cabe em 8 bits. Para represent-lo so necessrios 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 necessrio para a composio 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
O programador deve prever tcnicas de avaliao dos resultados da operao dentro do cdigo_fonte para interpretar os resultados obtidos nas operaes aritmticas realizadas e, se necessrio, acrescentar um novo registro para representar valores com mais de 8 bits.
ADDLW
MNEMNICO INSTRUO SINTAXE DESCRIO ADDLW Add Literal to F ADDLW [ nome literal ] Soma o valor contido no registro W com o valor do literal identificado em [ nome literal] - o resultado da operao sempre colocado no registro W. C, DC, Z
Esta instruo realiza a operao aritmtica da adio, bit a bit, entre e o valor de um nmero ou constante (literal) e o valor contido no registro W de acordo com a expresso algbrica:
W = Literal + W
+
0 0 0 1
+
1 1
+
1
10
A operao aritmtica de adio deve atender aos limites impostos pelo tamanho do registro (8 bits), isto , o resultado final da operao deve ser necessriamente menor ou igual a 255. Com operaes onde o valor do resultado maior que 255, a sinalizao feita atravs do bit (flag) C no registro STATUS, que muda de 0 (zero) para 1 (um) indicando a ocorrencia de resultado da operao com valor maior que 255 (overflow):
> flag sinalizao resultado operao >255 IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
Observao: 1. o valor x representa valor irrelevante (no influencia o resultado). 2. o retorno a 0 (zero) do flag feito automaticamente pela Unidade Lgica. 3. uma vez indicada a ocorrencia de overflow (excesso) da operao, o flag C pode permanecer com valor 1 (um) por vrios ciclos de mquina - a Unidade Lgica retorna o flag a 0 (zero) no ciclo imediatamente anterior a uma nova operao aritmtica. O programador deve estabelecer procedimentos para determinar a ocorrencia de overflow (excesso) nas operaes de adio previstas no cdigo_fonte.
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 operao 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 INCIO DO REG CONTADOR
Ateno: valores numricos declarados na rea de diretivas so armazenados dentro da memria de programa - no possvel fazer alteraes de valor atravs do cdigo_fonte. * Valores contidos nos registros W e CTE_CONT antes da execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 113 104 W CTE_CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
ADDLW CTE_CONT ; SOMAR O VALOR DO REG. W COM O VALOR DO LITERAL ; CTE_CONT - O RESULTADO DA OPERAO SER ; COLOCADO NO REG. W 1 1 1 0 0 0 1 113 W (SOMA) + CTE_CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
+
104
217
Ateno: o sinal + representa a operao aritmtica da adio. * Valores contidos nos registros W e CTE_CONT depois da execuo da instruo:
1 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 217 104 W CTE_CONT
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo. 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 aps a execuo da instruo: O resultado da operao foi um nmero menor que 255 logo, o flag de sinalizao permanece igual a 0 (zero).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x X x x 0 STATUS
MSB LSB
b) Resultado da operao 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 INCIO DO REG CONTADOR
Ateno: valores numricos declarados na rea de diretivas so armazenados dentro da memria de programa - no possvel fazer alteraes de valor atravs do cdigo_fonte. * Valores contidos nos registros W e CTE_CONT antes da execuo da instruo:
1 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 154 104 W CTE_CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x X x x 0 STATUS
MSB LSB
* Instruo
ADDLW CTE_CONT ; SOMAR O VALOR DO REG. W COM O VALOR DO LITERAL ; CTE_CONT - O RESULTADO DA OPERAO SER ; COLOCADO NO REG. W 0 0 1 1 0 1 0 154 W (SOMA) + CTE_CONT
+
0
+
1
+
1
+
0
+
1
+
0
+
0
+
0
+
104
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo. O registro CTE_CONT permanece inalterado. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de adio foi um nmero maior que 255 logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1 STATUS
MSB LSB
Vamos olhar o resultado desta operao. Fizemos uma operao de adio 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 operao tem valor maior que 255:
IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 1
MSB LSB
STATUS
Porm, o resultado apresentado no registro W no corresponde ao valor esperado (258), mas apresentou o valor 2:
0 0 0 0 0 0 1 0 2 W
O valor 258 no cabe em 8 bits. Para represent-lo so necessrios 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 necessrio para a composio 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 W
O programador deve prever tcnicas de avaliao dos resultados da operao dentro do cdigo_fonte para interpretar os resultados obtidos nas operaes aritmticas realizadas e, se necessrio, acrescentar um novo registro para representar valores com mais de 8 bits.
SUBWF
MNEMNICO INSTRUO SINTAXE DESCRIO SUBWF Subtract W from F SUBWF [ registro origem ], [ registro destino ] Subtrai o valor contido no registro W do valor contido no registro F identificado em [registro origem], e coloca o resultado da operao no registro identificado em [ registro destino ] C, DC, Z
Esta instruo realiza a operao aritmtica da subtrao entre o valor contido no registro W (mtodo do complemento de 2 - twos complement), e o valor contido no registro F de acordo com a expresso algbrica: - registro de destino W - registro de destino F W = F W F = F W
O mecanismo utilizado pela Unidade Lgica e Aritmtica para a execuo da subtrao realiza a adio 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 expresso algbrica efetivamente empregada no formato: - registro de destino W - registro de destino F W = F + (W ) F = F + (W )
Os resultados obtidos com a operao de subtrao so sinalizados pelos flags C e Z do registro STATUS:
> flag sinalizao resultado operao nulo > flag sinalizao resultado operao positivo/negativo IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS
MSB LSB
Observao: 1. o valor x representa valor irrelevante (no influencia o resultado). 2. o retorno a 0 (zero) do flag feito automaticamente pela Unidade Lgica. 3. uma vez indicada a ocorrencia de overflow (excesso) da operao, os flags C e Z podem permanecer com valor 1 (um) por vrios ciclos de mquina - a Unidade Lgica retorna os flags a 0 (zero) no ciclo imediatamente anterior a uma nova operao aritmtica. Considerando que os valores de F e W so sempre positivos (F>0 e W>0), o resultado da operao de subtrao depende da ordem de grandeza dos valores envolvidos nos registros F e W, de acordo com as possibilidades: - F > W o resultado da operao um nmero positivo - o valor representado pelo registro que contm o resultado est na forma direta e o flag C do registro STATUS colocado no valor 1 (um).
- F < W o resultado da operao um nmero negativo - o valor representado pelo registro que contm 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 operao nulo - o valor representado pelo registro que contm 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 operao foi nulo (o flag Z sinaliza resultado nulo da ltima operao). O programador deve prever tcnicas de avaliao da operao dentro do cdigo_fonte para interpretar os resultados obtidos. EXEMPLO: - Registro de destino W W = F 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 operao um nmero positivo - o valor representado pelo registro que contm 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 execuo da instruo:
0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 104 113 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W 1 1 1 0 0 0 1 113 CONT (SUBTRAI) W
104
* Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi um nmero positivo (CONT > W) logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x X x 1 STATUS
MSB LSB
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo, enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado). Se na operao aritmtica de subtrao o flag C do registro STATUS muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT maior que o valor contido no registro W (CONT > W) antes da execuo da operao de subtrao. - o valor contido no registro W aps a execuo da operao de subtrao um nmero positivo e representa o resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F > W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 0 1 0 0 0 104 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 1 0 1 1 1 151 (COMP 1) W (SOMA) + UNIDADE
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
152
(COMP 2) W
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
0 1 1 1 0 0 0 1 113 CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 1 1 0 0
+
0
+
152
O resultado da operao de adio foi um nmero 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
MSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 operao tem valor maior que 255.
IRP RP1 RP0 /TO /PD Z x x x x x x
MSB
DC C x 1
LSB
STATUS
Porm, o resultado apresentado no registro W no corresponde ao valor esperado da adio (265), mas apresentou o valor 9:
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 83/103
O valor 265 no cabe em 8 bits. Para represent-lo so necessrios 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 necessrio para a composio de valores maiores do que 255. Consequentemente, o resultado apresentado pela ULA fica:
> flag C do registro STATUS - indica resultado da subtrao positivo (CONT > W) 1 0 0 0 0 1 0 0 1 9 W
b) F < W o resultado da operao um nmero negativo - o valor representado pelo registro que contm o resultado (W) est na forma complemento de 2 e o flag C do registro STATUS mantm o valor 0 (zero). * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 113 104 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W 1 1 0 1 0 0 0 104 CONT (SUBTRAI)) W
113
247
Ateno: o sinal - representa a operao aritmtica da subtrao. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi um nmero positivo (CONT > W) logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo, 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 operao aritmtica de subtrao o flag C do registro STATUS no muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT menor que o valor contido no registro W (CONT < W) antes da execuo da operao de subtrao. - o valor contido no registro W aps a execuo da operao de subtrao um nmero negativo e representa o complemento de 2 do resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F < W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 1 0 0 0 1 113 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 0 1 1 1 0 142
(COMP 1)
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
143
(COMP 2)
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
0 1 1 0 1 0 0 0 104 CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 0 1 1 1
+
1
+
143
247
W
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 86/103
O resultado da operao de adio foi um nmero menor que 255 logo, o flag C do registro STATUS no muda de estado, mantendo o valor 0 (zero).
> flag sinalizao aps a execuo da instruo DC C x 0 STATUS
LSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 no mudou de valor, mantendo 0 (zero), indicando que o resultado final da operao tem valor menor que 255.
IRP RP1 RP0 /TO /PD Z x x x x x x
MSB
DC C x 0
LSB
STATUS
No entanto, a operao solicitada pela instruo uma subtrao, cujo resultado deveria ser -9 (menos 9), isto , o resultado da operao real um nmero negativo:
104
113 9
A estrutura de registro do microcontrolador no consegue representar um nmero negativo incluindo o sinal, consequentemente, a forma de represent-lo atravs do seu complemento de 2 (twos complement). O programador deve providenciar o clculo do valor real do resultado da operao usando a seguinte sequencia: a) transferir o valor contido no registro W para um registro na memria RAM, por exemplo, W_TEMP, para usar a instruo COMF:
W_TEMP
MOVWF
W_TEMP
247
W_TEMP
b) determina-se o complemento de 1 (ones complement) executando a instruo COMF no registro W_TEMP, que inverte os valores de todos os bits contidos no registro: * Valor contido no registro W_TEMP antes da execuo da instruo COMF (complemento de 1):
1 COMF W_TEMP 1 1 1 0 1 1 1 247 W_TEMP
* Valor contido no registro W_TEMP aps a execuo da instruo 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 (ones complement) para se obter o complemento de 2 (twos complement):
0 0 0 0 1 0 0 0 8 (COMP 1) W_TEMP
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
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 execuo da instruo MOVF:
1 1 1 1 0 1 1 1 247 W
(COMP 2)
W_TEMP
MOVF
W_TEMP,W
(COMP 2)
W_TEMP
Agora o registro W contm o valor real da operao de subtrao porm, sem indicao do sinal negativo. A interpretao do sinal negativo deve ser feita pelo programador. _______________________________________________________________________________________
c) F = W o resultado da operao nulo - o valor representado pelo registro que contm o resultado (W) est na forma direta e os flags Z e C do registro STATUS so colocados no valor 1 (um). * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 113 113 W CONT
* Valor dos flags Z e C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo > flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,W ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. W 1 1 1 0 0 0 1 113 CONT (SUBTRAI)) W
113
Ateno: o sinal - representa a operao aritmtica da subtrao. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi nulo (CONT = W) logo, o flag Z muda de estado, passando a 1 (um) e o flag C muda de estado tambm passando a 1 (um)
> flag sinalizao depois da execuo da instruo > flag sinalizao depois da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x 1 x 1 STATUS
MSB LSB
Observao: notar que o valor contido no registro W apresenta o resultado da operao aps a execuo da instruo, enquanto o registro CONT permanece inalterado (o valor contido originalmente preservado). Se na operao aritmtica de subtrao 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 cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT igual ao valor contido no registro W (CONT = W) antes da execuo da operao de subtrao. - o valor contido no registro W aps a execuo da operao de subtrao nulo e representa o resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F = W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 1 0 0 0 1 113 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 0 1 1 1 0 142
(COMP 1)
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
143
(COMP 2)
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
113
CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 0 1 1 1
+
1
+
143
O resultado da operao de adio foi um nmero 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
MSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 operao 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 operao tem valor nulo.
IRP RP1 RP0 /TO /PD Z x x x x x 1
MSB
DC C x 1
LSB
STATUS
_______________________________________________________________________________________
- Registro de destino F
W = F W
- 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 operao um nmero positivo - o valor representado pelo registro que contm 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 execuo da instruo:
0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 104 113 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x X x x x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 CONT (SUBTRAI) W
104
CONT
Ateno: o sinal - representa a operao aritmtica da subtrao. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi um nmero positivo (CONT > W) logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x X X x X x 1 STATUS
MSB LSB
Observao: notar que o valor contido no registro CONT apresenta o resultado da operao aps a execuo da instruo, enquanto o registro W permanece inalterado (o valor contido originalmente preservado). Se na operao aritmtica de subtrao o flag C do registro STATUS muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT maior que o valor contido no registro W (CONT > W) antes da execuo da operao de subtrao. - o valor contido no registro CONT aps a execuo da operao de subtrao um nmero positivo e representa o resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F > W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 0 1 0 0 0 104 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 1 0 1 1 1 151
(COMP 1)
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
152
(COMP 2)
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
0 1 1 1 0 0 0 1 113 CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 1 1 0 0
+
0
+
152
CONT
O resultado da operao de adio foi um nmero 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
MSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 operao tem valor maior que 255.
IRP RP1 RP0 /TO /PD Z x x x X x x
MSB
DC C x 1
LSB
STATUS
Porm, o resultado apresentado no registro CONT no corresponde ao valor esperado da adio (265), mas apresentou o valor 9:
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 95/103
CONT
O valor 265 no cabe em 8 bits. Para represent-lo so necessrios 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 necessrio para a composio de valores maiores do que 255. Consequentemente, o resultado apresentado pela ULA fica:
> flag C do registro STATUS - indica resultado da subtrao positivo (CONT > W) 1 0 0 0 0 1 0 0 1 9 CONT
b) F < W o resultado da operao um nmero negativo - o valor representado pelo registro que contm o resultado (CONT) est na forma complemento de 2 e o flag C do registro STATUS mantm o valor 0 (zero). * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 113 104 W CONT
* Valor do flag C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x X x x x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. CONT 0 1 1 0 1 0 0 0 104 CONT (SUBTRAI) W
113
247
CONT
Ateno: o sinal - representa a operao aritmtica da subtrao. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi um nmero positivo (CONT > W) logo, o flag de sinalizao muda de estado, passando a 1 (um).
> flag sinalizao aps a execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x x x 0 STATUS
MSB LSB
Observao: notar que o valor contido no registro CONT apresenta o resultado da operao aps a execuo da instruo, 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 operao aritmtica de subtrao o flag C do registro STATUS no muda seu estado de 0 (zero) para 1 (um), o programador deve estabelecer o procedimento adequado no cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT menor que o valor contido no registro W (CONT < W) antes da execuo da operao de subtrao. - o valor contido no registro CONT aps a execuo da operao de subtrao um nmero negativo e representa o complemento de 2 do resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F < W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 1 0 0 0 1 113 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 0 1 1 1 0 142
(COMP 1)
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
143
(COMP 2)
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
0 1 1 0 1 0 0 0 104 CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 0 1 1 1
+
1
+
143
247
CONT
Bento Alves Cerqueira Cesar Filho - R 1.4 - Mai/09 98/103
O resultado da operao de adio foi um nmero menor que 255 logo, o flag C do registro STATUS no muda de estado, mantendo o valor 0 (zero).
> flag sinalizao aps a execuo da instruo DC C x 0 STATUS
LSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 no mudou de valor, mantendo 0 (zero), indicando que o resultado final da operao tem valor menor que 255.
IRP RP1 RP0 /TO /PD Z x x x x x x
MSB
DC C x 0
LSB
STATUS
No entanto, a operao solicitada pela instruo uma subtrao, cujo resultado deveria ser -9 (menos 9), isto , o resultado da operao real um nmero negativo:
104
113 9
A estrutura de registro do microcontrolador no consegue representar um nmero negativo incluindo o sinal, consequentemente, a forma de represent-lo atravs do seu complemento de 2 (twos complement). O programador deve providenciar o clculo do valor real do resultado da operao usando a seguinte sequencia: a) determina-se o complemento de 1 (ones complement) utilizando a instruo COMF, que inverte os valores de todos os bits contidos no registro:
* Valor contido no registro CONT antes da execuo da instruo COMF (complemento de 1):
1 1 1 1 0 1 1 1 247 CONT
* Valor contido no registro CONT aps a execuo da instruo 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 (ones complement) para se obter o complemento de 2 (twos complement):
0 0 0 0 1 0 0 0 8
(COMP 1)
CONT
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
(COMP 2)
CONT
Agora o registro W contm o valor real da operao de subtrao porm, sem indicao do sinal negativo. A interpretao do sinal negativo deve ser feita pelo programador. _______________________________________________________________________________________
c) F = W o resultado da operao nulo - o valor representado pelo registro que contm o resultado (W) est na forma direta e os flags Z e C do registro STATUS so colocados no valor 1 (um). * Valores contidos nos registros W e CONT antes da execuo da instruo:
0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 113 113 W CONT
* Valor dos flags Z e C no registro STATUS antes da execuo da instruo (a Unidade Lgica sempre posiciona o valor do bit C no valor 0 (zero) antes de executar a instruo):
> flag sinalizao antes da execuo da instruo > flag sinalizao antes da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x 0 x 0 STATUS
MSB LSB
* Instruo
SUBWF CONT,F ; SUBTRAIR O VALOR DO REG. W DO VALOR DO REG. ; CONT E COLOCAR O RESULTADO DA OPERAO ; NO REG. CONT 0 1 1 1 0 0 0 1 113 CONT (SUBTRAI)) W
113
CONT
Ateno: o sinal - representa a operao aritmtica da subtrao. * Valor do flag C no registro STATUS aps a execuo da instruo: O resultado da operao de subtrao foi nulo (CONT = W) logo, o flag Z muda de estado, passando a 1 (um) e o flag C muda de estado tambm passando a 1 (um)
> flag sinalizao depois da execuo da instruo > flag sinalizao depois da execuo da instruo IRP RP1 RP0 /TO /PD Z DC C x x x x x 1 x 1 STATUS
MSB LSB
Observao: notar que o valor contido no registro CONT apresenta o resultado da operao aps a execuo da instruo, enquanto o registro W permanece inalterado (o valor contido originalmente preservado). Se na operao aritmtica de subtrao 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 cdigo_fonte para interpretar o resultado como: - o valor contido no registro CONT igual ao valor contido no registro W (CONT = W) antes da execuo da operao de subtrao. - o valor contido no registro CONT aps a execuo da operao de subtrao nulo e representa o resultado final da operao. _______________________________________________________________________________________ Vamos observar como a Unidade Lgica e Aritmtica realizou a operao de subtrao quando F = W: A operao efetivamente realizada foi: W = CONT + (W ) Isto , a ULA realizou uma operao de adio de um valor positivo (CONT) com um valor negativo (W). Para representar um valor negativo na forma binria utiliza-se o complemento de 2 (twos complement) deste valor, calculado da seguinte forma: a) determina-se o complemento de 1 (ones complement) invertendo os valores de todos os bits contidos no registro: * Valor contido no registro W antes da execuo do complemento de 1:
0 1 1 1 0 0 0 1 113 W
b) somar 1 (um) ao valor do complemento de 1 (ones complement) para se obter o complemento de 2 (twos complement):
1 0 0 0 1 1 1 0 142
(COMP 1)
+
0
+ + + + + +
0 0 0 0 0 0
+
1
+
1
(SOMA) + UNIDADE
143
(COMP 2)
Com o valor do complemento de 2 do registro W ((COMP 2) W), a ULA realiza a operao de adio dos valores de CONT e (COMP 2) W:
113
CONT (SOMA) +
(COMP 2)
+
1
+ + + + + +
0 0 0 1 1 1
+
1
+
143
CONT
O resultado da operao de adio foi um nmero 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
MSB
Vamos olhar o resultado desta operao. A ULA fez uma operao de adio 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 operao 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 operao tem valor nulo.
IRP RP1 RP0 /TO /PD Z x x x x x 1
MSB
DC C x 1
LSB
STATUS
_______________________________________________________________________________________