Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Técnica Programação Assembler - PIC - Microchip, Notas de estudo de Engenharia Elétrica

Instruções para realização de programação assembler (geração de código-fonte) na linguagem do PIC - Microchip - o que voce deve fazer frente à pagina em branco do MPLAB

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 07/09/2009

bento-alves-cerqueira-cesar-filho-6
bento-alves-cerqueira-cesar-filho-6 🇧🇷

4.9

(10)

6 documentos

1 / 28

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
PROGRAMAÇÃO ASSEMBLER
PIC - Microchip
Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07
1/28
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c

Pré-visualização parcial do texto

Baixe Técnica Programação Assembler - PIC - Microchip e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!

PROGRAMAÇÃO ASSEMBLER

PIC - Microchip

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

PROGRAMAÇÃO ASSEMBLER

“Às vezes, as coisas que nos são mais importantes permanecem desconhecidas, escondidas por trás da sua familiaridade.” Lüdwig Wittgenstein, filósofo A arte de criar um programa ou algoritmo para controlar alguma coisa envolve muito mais que o conhecimento de uma linguagem de programação com suas instruções e recursos. Envolve o conhecimento do que deseja controlar. Como opera, funciona, responde, envia e recebe informações. A maioria dos problemas não envolve exclusivamente informações digitais, mas informações analógicas que devem ser manipuladas para atingir valores que podem ser lidos pelo sistema de controle. Envolve, ainda, a compreensão destes valores e o que representam para o sistema controlado. Pior, o programador deve ter conhecimento dos valores representados para transformá-los em valores digitais e interpretá-los adequadamente para que os sinais de controle enviados de retorno para o sistema tenham o correto desempenho. Em suma, o programador não deve e não pode ser um simples “organizador de instruções”, mas um profundo conhecedor do processo para que o programa ou algoritmo desenvolvido seja o menor e o mais eficiente possível. Assim como diz a frase do filósofo, o programador deve pensar o impensável, ver o invisível, imaginar o inimaginável para produzir uma obra de arte.

INTRODUÇÃO

Assembler é uma linguagem de programação usada para desenvolver o código-fonte para uma determinada

aplicação que utilize microcontroladores.

É uma linguagem com códigos e mnemônicos (baixo nível) que permitem o controle do processamento no

nível de um bit de um registro portanto, aproxima o usuário da manipulação da informação dentro do núcleo

de processamento e das memórias de programa e dados individualmente.

Ainda assim, o Assembler é uma linguagem para compreensão humana e não da máquina. A máquina só

compreende informações na forma binária, que é de compreensão impossível pelo humano. Logo, deve

existir um elemento tradutor da linguagem Assembler (humana) para a linguagem de máquina (binária). O

tradutor é um programa residente elaborado pelo fabricante do dispositivo microcontrolador (compilador)

que reconhece os comandos e mnemônicos da linguagem Assembler (que normalmente é exclusiva para cada

fabricante) – um arquivo code.asm - e converte em linguagem de máquina – um arquivo code.hex – que será

gravado na memória de programa do microcontrolador através de um dispositivo gravador adequado. A fig.

mostra, esquemáticamente, o processo:

Fig. 1 – Processo de formação de código-fonte e gravação no MCU

CÓDIGO-FONTE (.asm)

Os programas usados para criar um código-fonte são, essencialmente, editores de texto. Enquanto o código

está sendo escrito, todas as facilidades encontradas nos editores de texto estão presentes.

O código só será transformado em um arquivo executável após a compilação bem sucedida do código-fonte.

Mesmo após a compilação, o que é apresentado para o programador na tela continua sendo um texto.

Lembre-se que o arquivo executável (aquele que é gravado na memória de programa do controlador) é

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

APRESENTAÇÃO

A apresentação utilizada do código-fonte será aquela mostrada no arquivo BÁSICO.asm, desenvolvido a partir

de aplicações práticas e facilita as explicações e informações de como utilizar as diretivas e instruções do

microcontrolador bem como a maneira de escrever de tal forma que o compilador seja capaz de interpretar e

produzir o arquivo executável sem erros.

A formatação do texto do código-fonte foi organizada para permitir o fácil sequenciamento do procedimento

de programação utilizando, básicamente, tres grandes capítulos:

1- Área de Identificação

Nesta área são colocadas as informações que identificam o código-fonte.A fig.2 mostra parte da

Área de Identificação do arquivo BÁSICO.asm:

Fig. 2 – Trecho da Área de Identificação no Código-Fonte

É claro que a fig.2 mostra apenas uma sugestão, visto que o tipo de informação constante na Área de

Identificação depende exclusivamente dos objetivos do programador.

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

2- Área de Diretivas

Nesta área o programador coloca as instruções que orientam o compilador na formação do arquivo

executável. A fig.3 mostra parte da Área de Diretivas do arquivo BÁSICO.asm:

Fig. 3 – Trecho da Área de Diretivas no Código-Fonte

A quantidade de diretivas depende do número de variáveis envolvidas no processo, quantidade de

constantes, número de entradas e saídas empregadas pelo controlador etc..

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

REGRAS BÁSICAS

Para escrever o código-fonte algumas regras básicas devem ser observadas. Como o código-fonte é um editor

de texto, a formatação do texto pode seguir algumas regras simples comuns a todo o código-fonte:

  • não se usa acentuação do Portugues (acentos, til, cedilha etc.) – lembre-se que a língua de origem

do Assembler é o Ingles que não tem nenhum tipo de acentuação.

  • para evitar possíveis problemas de identificação do tamanhodo caixa da letra, utilizar sempre letras

maiúsculas (caixa alta) para qualquer texto no código-fonte – o processador tem códigos diferentes

para identificar a mesma letra quando maiúscula (caixa alta) ou minúscula (caixa baixa), o que

pode causar erro de compilação e este erro não é identificado como tamanho do caixa da letra, mas

como Nome (label) inexistente.

Nas figuras 2, 3 e 4 podemos ver como é a apresentação do texto do código-fonte atendendo a estas regras

básicas - é trabalho braçal feito pelo programador. No entanto, essa preocupação facilita a leitura e

interpretação do código-fonte pelo programador a qualquer tempo.

Para escrever na linguagem de código-fonte utilizamos os seguintes elementos:

  • Nomes (labels)

São criados e utilizados para identificar:

  • Endereços
  • Variáveis
  • Constantes
  • Registros
  • Bits

Os elementos especiais de um controlador (Registros de Função Especial e seus respectivos Bits)

são identificados por Nomes fornecidos pelo fabricante. Normalmente são mnemônicos ou

abreviaturas da função deste elemento na operação do controlador.

Os elementos de uso geral (Registros e Bits) são identificados por Nomes criados pelo

programador e que, preferencialmente, devem ser relacionados à função proposta de cada um deles.

Os Nomes empregados no código-fonte não são interpretados pelo compilador – são apenas para

interpretação humana – durante a compilação serão substituídos pelos endereços físicos das

memórias (registros, bits e endereços).

Regras

  • um Nome não pode ser repetido para elementos diferentes – uma vez criado um Nome,

ele é único e individual para aquele código-fonte.

  • deve ser iniciado por um carácter alfabético ou under-line (não deve ser um carácter

numérico ou dois. under-line).

  • pode ser formado por letras e números desde que o primeiro carácter não seja numérico.
  • nomes compostos devem ser separados sempre por under-line (não usar hífen ( - )ou

espaço).

  • não deve conter símbolos gráficos ou gramaticais.

EXEMPLO:

ROTINA

W_TEMP

_TEMPORARIO

FLAGS

CONTADOR_

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

  • Diretivas

São comandos Assembler que são colocados no código-fonte mas, normalmente, não são

transformados em códigos operacionais (opcodes) pelo compilador.

Através das diretivas o programador informa como o compilador deve proceder para interpretar as

informações escritas na Área de Código e relacionar com as informações do controlador usado

através do arquivo de inclusão ([ arquivo ].inc).

Regras

Diretivas

#INCLUDE

#DEFINE

  • devem ser posicionados sempre a partir da coluna 1 (junto à lateral esquerda da tela).

EXEMPLO:

#INCLUDE P16F628A.INC ; ARQUIVO PADRÃO DO CONTROLADOR

#DEFINE L1_ALTA PORTB,1 ; DEFINE NOME PARA BIT RB1 NO PORTB

Diretivas

CBLOCK

ENDC

ORG

  • devem ser posicionados com um espaço (mínimo) da coluna 1, preferencialmente com um

espaço do tipo tab.

  • separar o Endereço da Diretiva utilizando espaços ou tab.

EXEMPLO:

CBLOCK 0x20 ; ENDEREÇO DE INÍCIO DAS VARÁVEIS W_TEMP ; REG. TEMPORÁRIO PARA VALOR DE W _TEMPORARIO ; REG. TEMPORÁRIO FLAGS ; REG. PARA FLAG DE CONTROLE ENDC ; FIM DO BLOCO DE VARIÁVEIS ORG 0x00 ; ENDEREÇO VETOR DE RESET

  • Endereços (label)

São nomes criados pelo programador para indicar o destino de desvios condicionais do programa

ou início de sub-rotinas.

Regras

  • o nome do Endereço não pode ser repetido para destinos diferentes – uma vez criado um

Endereço para um destino de desvio, ele é único e individual para aquele destino.

  • deve ser iniciado por um carácter alfabético (não deve ser um carácter numérico).
  • Endereços compostos devem ser separados sempre por under-line (não usar hífen ( - )ou

espaço).

  • deve ser sempre posicionado na coluna 1 (junto à lateral esquerda da tela) uma única vez -

a partir do Endereço inicia-se a sequencia de instruções do desvio.

  • um Endereço pode ser repetido inúmeras vezes dentro do código-fonte desde que

precedido pela instrução GOTO ou CALL.

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

MOVWF TEMPO ; COLOCA O VALOR DE W NO REG. TEMPO

│ │ │ │ │ └─> Comentário

│ │ │ │ └─> Espaços (3 x TAB)

│ │ │ └─> Operador (constante)

│ │ └─> Espaços (1 x TAB)

│ └─> Instrução

└─> Espaços (1 x TAB)

  • Operadores

Os Operadores informam a instrução sobre os dados que serão usados e a localização dos registros

onde os dados se encontram.

Os Operadores podem ser registros, variáveis ou constantes, normalmente identificados por um

Nome (existente, no caso dos Registros Especiais ,ou criado, no caso dos Registros de Usuário).

Regras

  • operadores devem seguir instruções separados por espaços (utilizar um ou mais espaços TAB).
  • operadores múltiplos devem ser separados por vírgulas.

EXEMPLO:

MOVLW CT_TEMPO ; COLOCA CONSTANTE CT_TEMPO NO REG. W

│ │ │ │ │ └─> Comentário

│ │ │ │ └─> Espaços (3 x TAB)

│ │ │ └─> Operador (constante numérica)

│ │ └─> Espaços (1 x TAB)

│ └─> Instrução

└─> Espaços (1 x TAB)

MOVWF TEMPO ; COLOCA O VALOR DE W NO REG. TEMPO

│ │ │ │ │ └─> Comentário

│ │ │ │ └─> Espaços (3 x TAB)

│ │ │ └─> Operador (variável)

│ │ └─> Espaços (1 x TAB)

│ └─> Instrução

└─> Espaços (1 x TAB)

GOTO SET_UP ; DESVIA PARA ENDEREÇO SET_UP

│ │ │ │ │ └─> Comentário

│ │ │ │ └─> Espaços (3 x TAB)

│ │ │ └─> Operador (endereço)

│ │ └─> Espaços (1 x TAB)

│ └─> Instrução

└─> Espaços (1 x TAB)

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

SWAPF W_TEMP , F ; TROCA NIB_LO C/ NI_HI EM W_TEMP COLOCA EM

; W_TEMP

│ │ │ │ │ │ │ └─> Comentário

│ │ │ │ │ │ └─> Espaços (3 x TAB)

│ │ │ │ │ └─> Operador (registro de destino)

│ │ │ │ └─> Vírgula separando Operadores Múltiplos (os espaços entre operadores não existe)

│ │ │ └─> Operador (registro de origem)

│ │ └─> Espaços (1 x TAB)

│ └─> Instrução

└─> Espaços (1 x TAB)

  • Comentários

Comentários são textos explicativos da operação de um código-fonte, uma linha de comando ou

linhas de comando.

Podem ser escritos utilizando quaisquer caracteres inclusive com acentuação (Portugues).

Regras

  • comentários devem começar sempre por ponto-e-vírgula (;) – o compilador ignora todo e

qualquer carácter após o ponto-e-vírgula (;) até o fim da linha.

  • comentários que continuam na linha seguinte devem ser precedidos, também, por ponto-e-

vírgula (;), mesmo se precedidos por espaços.

  • podem ser colocados em qualquer posição do texto do código-fonte (separados ou não por

um ou mais espaços ou TAB’s, antes ou depois de linhas de instrução).

EXEMPLO:

; DEFINIÇÃO DE VARIÁVEIS

CBLOCK 0x20 ; ENDEREÇO DE INÍCIO DAS VARÁVEIS W_TEMP ; REG. TEMPORÁRIO PARA VALOR DE W _TEMPORARIO ; REG. TEMPORÁRIO FLAGS ; REG. PARA FLAG DE CONTROLE ENDC ; FIM DO BLOCO DE VARIÁVEIS Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

; ÁREA DE DIRETIVAS

; ARQUIVO DE DEFINIÇÕES

#INCLUDE <P16F628A.INC> ; ARQUIVO PADRÃO DO CONTROLADOR

; CONFIGURAÇÃO DO CONTROLADOR

CONFIG B’10000101001000’ ; 3F50h – REGISTRO DE CONFIGURAÇÃO ; BIT CÓDIGO FUNÇÃO VALOR ; 13 CP Code Protection 1 Desligado ; 12 Não implementado 0 ; 11 Não implementado 0 ; 10 Não implementado 0 ; 8 Não implementado 0 ; 7 LVP Low Voltage Programming 1 Desligado ; 6 BOREN Brown-out Reset Enable 0 Ligado ; 5 MCLRE RA5/Master Clear Enable 0 RA5 entrada digital ; 3 PWTERN Power-up Time Enable 0 Ligado ; 2 WDTEN Watchdog Timer Enable 0 Desligado ; 4,1,0 FOSC2:FOSC0 Oscillator Selection 100 Oscilador Interno ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ; ATIVA BANCO DE MEMÓRIA 0 (ZERO) #DEFINE BANK1 BSF STATUS,RP0 ; ATIVA BANCO DE MEMÓRIA 1 (UM) ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; VARIÁVEIS CBLOCK 0X20 ; ENDEREÇO INICIAL MEMÓRIA USO GERAL W_TEMP ; REGISTRO TEMPORÁRIO PARA W STATUS_TEMP ; REGISTRO TEMPORÁRIO PARA STATUS FLAG ; REGISTRO PARA DESVIOS CONDICIONAIS CONT_1 ; REGISTRO CONTAGEM CONT ENDC ; FIM BLOCO MEMÓRIA USO GERAL ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; FLAG INTERNO #DEFINE F_CONT_1 FLAG,1 ; DESVIO CONT_1 NO REG. FLAG, BIT 1 ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; CONSTANTES CT_CONT_1 EQU .250 ; CONSTANTE DE INÍCO DO CONT ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; ENTRADAS #DEFINE B1 PORTA,1 ; BOTAO B1 LIGADO AO PINO RA ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; SAÍDAS #DEFINE L1 PORTA,6 ; LED L1 LIGADO AO PINO RA Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

; ÁREA DE CÓDIGO

; VETOR DE RESET

ORG 0X00 ; ENDEREÇO INICIAL DO CÓDIGO

GOTO SET_UP ; VAI PARA INÍCIO DO SET_UP CONTROLADOR

; VETOR DE INTERRUPÇÃO

ORG 0X04 ; ENDEREÇO INICIAL DA INTERRUPÇÃO

MOVWF W_TEMP ; SALVA W EM W_TEMP

SWAPF STATUS,W ; TROCA NIB_HI POR NIB_LO EM STATUS E GRAVA

; EM W

MOVWF STATUS_TEMP ; SALVA STATUS EM STATUS_TEMP

GOTO SAI_INT ; VAI PARA FIM DA INTERRUPÇÃO

; TRATAMENTO DAS INTERRUPÇÕES

; FIM DA INTERRUPÇÃO

SAI_INT

SWAPF STATUS_TEMP,W ; TROCA NIB_HI POR NIB_LO EM STATUS_TEMP E

; GRAVA EM W

MOVWF STATUS ; RECUPERA STATUS

SWAPF W_TEMP,F ; TROCA NIB_HI POR NIB_LO EM W_TEMP E

; GRAVA EM W_TEMP

SWAPF W_TEMP,W ; TROCA NIB_HI POR NIB_LO EM W_TEMP E

; RECUPERA EM W

RETFIE ; RETORNA DA INTERRUPÇÃO

; INÍCIO DO SET_UP DO CONTROLADOR

SET_UP

BANK1 ; PÁGINA DE MEMÓRIA 1

MOVLW B'10000011'

MOVWF OPTION_REG ; RESISTORES PULL-UP DESABILITADOS

; TRANSIÇÃO RB0/INT NÃO UTILIZADA

; INCREMENTO TMR0 INTERNO (CM)

; TRANSIÇÃO T0CK1 NÃO UTILIZADA

; PRE SCALER SELECIONADO PARA TMR

; DIVISÃO 1:16 NO PRE SCALER

MOVLW B'00000000'

MOVWF INTCON ; INTERRUPÇÕES NÃO HABILITADAS

MOVLW B'00001100'

MOVWF TRISA ; RA2:3 ENTRADA, DEMAIS SAÍDAS

MOVLW B'00000000'

MOVWF TRISB ; TODOS OS BITS SAÍDAS

CALL 3FFh ; CHAMA VALOR EXISTENTE NO ENDEREÇO MOVWF OSCCAL ; CALIBRADOR DO OSCILADOR LOCAL BANK0 ; PÁGINA DE MEMÓRIA 0 MOVLW B'00000111' MOVWF CMCON ; DESLIGA OS COMPARADORES ANALÓGICOS E ; HABILITA OS PINOS DO PORTA PARA I/O DIGITAL Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

ARQUIVO BASICO.asm - COMENTADO

1- Área de Identificação

Esta área foi criada para que o projetista possa identificar e descrever o tipo de código-fonte que se encontra

no arquivo.

Como na abertura do programa a tela apresentada começa exatamente nesta posição, o programador

identifica a origem, destino, aplicação, datas etc. que interessam logo de início.

Observar que o texto da Área de Identificação é formado por Comentários – todas as linhas são iniciadas por

ponto-e-vírgula (;) – logo, como são ignoradas pelo compilador, pode-se usar a acentuação normal da língua

portuguesa.

Os comentários expressos em cada capítulo procuram orientar o programador para realizar o código-fonte da

melhor maneira possível.

; ÁREA DE IDENTIFICAÇÃO

; PIMIL – PICARETAGENS MIL LTDA. - SISTEMAS DE AUTOMAÇÃO

; IDENTIFICAÇÃO DE PROJETO

; PROJETO .....................: [nome de identificação ou referencia do projeto] ; CLIENTE ......................: [nome do cliente ou mercado ou produto de aplicação] ; NOME ARQUIVO .......: [nome de localização do arquivo no servidor principal ou outro meio de arquivo[ ; ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; DATAS E VERSÕES ; ; [cada linha pode conter informações desde o princípio do projeto, modificações e descrição sucinta de cada modificação realizada] ; ; INÍCIO.... 00/00/0000 VERSÃO..... 00.00 RESPONSÁVEL..... [nome ou sigla do programdor] ; INÍCIO.... 00/00/0000 VERSÃO..... 00.00 RESPONSÁVEL..... ; INÍCIO.... 00/00/0000 VERSÃO..... 00.00 RESPONSÁVEL..... ; INÍCIO.... 00/00/0000 VERSÃO..... 00.00 RESPONSÁVEL..... ; ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; DESCRIÇÃO OPERACIONAL ; [Descrever a operação do código-fonte com informações suficientes para a correta compreensão do funcionamento. Deve existir documentação com diagramas elétricos detalhados, lista de materiais e manual de instruções/operação/manutenção em outros tipos de documentos que podem e devem ser referenciados neste capítulo. Procurre não se apoiar em documentação exclusivamente eletronica.] ; ; ; ; ; ; ; -----------------------------------------------------------------------------------------------------------------------------------------------------------

2- Área de Diretivas

Nesta área o programador define todos os parametros de uso do controlador, identificando o modelo de

controlador, a configuração, os Nomes dos Registros e Bits de Uso Geral, a correlação existente entre os

Nomes dos dispositivos de Entrada/Saída e os Registros Especiais.

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

Essas informações serão utilizadas pelo compilador para transformar o arquivo do código-fonte ( code.asm ) em

um arquivo na linguagem de máquina ( code.hex ).

O compilador não interpreta a forma de capítulos agrupando as diretivas por função ou destinação. Durante a

execução da compilação do código-fonte, apenas as diretivas são buscadas e interpretadas. A sequencia em

que estão escritas e a distribuição organizada é ignorada – sua utilidade reside apenas na facilidade de leitura

e interpretação pelo programador. O Anexo 2 mostra uma comparação da Área de Diretivas comentada e

simples onde se pode ver a diferença de tamanho de texto com a compreensão deste mesmo texto.

Outros capítulos, além dos apresentados, podem ser acrescentados para melhorar o detalhamento das

diretivas bem como podem ser excluídos quando não utilizados no projeto.

; ÁREA DE DIRETIVAS

; ARQUIVO DE DEFINIÇÕES

[Neste capítulo o programador deve definir os arquivos de inclusão com o modelo do microcontrolador usado e as macros com sequencias de instruções já estabelecidas – sub rotinas.] #INCLUDE <P16F628A.INC> ; ARQUIVO PADRÃO DO CONTROLADOR

│ │ └─> Comentário

│ └─> Arquivo de Inclusão do microcontrolador selecionado

└─> Diretiva

; CONFIGURAÇÃO DO CONTROLADOR

[Neste capítulo coloca-se a configuração que o controlador vai operar. O acesso ao registro de configuração só é possível durante a gravação ds memória de programa. As opções de configuração dependem do modelo de controlador e devem ser estabelecidas com as informações da folha de dados do modelo escolhido no arquivo de inclusão.] __CONFIG B’10000101001000’ ; 3F50h – REGISTRO DE CONFIGURAÇÃO

│ │ └─> Comentário

│ └─> Valor numérico do Registro de Configuração que representa as opções escolhidas (ver Nota)

└─> Instrução MPASM

[Nota: o valor numérico colocado após a instrução CONFIG pode assumir qualquer representação, isto é, decimal ou binária ou hexadecimal. Para melhor compreensão das opções determinadas pelo programador, recomenda-se a utilização do formato binário, compatível com a página da folha de dados do componente – O Anexo 1 mostra a cópia da folha do datasheet que contém as informações de aplicação das opções de uso do controlador 16F628A..] [Descrever as opções do registro CONFIG torna mais fácil interpretar as escolhas de funcionamento do componente. Para cada modelo de controlador existe um registro específico, que o programador deve buscar na folha de dados.]] ; BIT CÓDIGO FUNÇÃO VALOR ; 13 CP Code Protection 1 Desligado ; 12 Não implementado 0 ; 11 Não implementado 0 ; 10 Não implementado 0 ; 8 Não implementado 0 ; 7 LVP Low Voltage Programming 1 Desligado ; 6 BOREN Brown-out Reset Enable 0 Ligado ; 5 MCLRE RA5/Master Clear Enable 0 RA5 como entrada digital ; 3 PWTERN Power-up Time Enable 0 Ligado ; 2 WDTEN Watchdog Timer Enable 0 Desligado ; 4,1,0 FOSC2:FOSC0 Oscillator Selection 100 Oscilador Interno sem saída de clock Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

#DEFINE F_CONT_1 FLAG,1 ; DESVIO CONT_1 NO REG. FLAG, BIT 1

│ │ │ │ └─> Comentário

│ │ │ └─> Posição do bit associado ao Nome

│ │ └─> Nome do registro que contém o bit associado ao Nome

│ └─> Nome associado ao bit 1 do registro FLAG

└─> Diretiva de Definição

[Cada flag é alocado em um bit de um registro – Nome recomendado FLAG – devidamente declarado no capítulo das Variáveis dentro da diretiva CBLOCK.. No exemplo, o Nome F_CONT_1 está sendo associado ao bit 1 do registro FLAG. O programador usa o Nome F_CONT no código-fonte.]_ ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; CONSTANTES [Constantes são valores numéricos que o código-fonte emprega para iniciar contadores, temporizadores, realizar comparações lógicas, acionar saídas etc..Neste capítulo o programador relaciona um Nome a um valor numérico que pode ser representado na forma decimal, binária ou hexadecimal, ou ainda na forma de uma expressão aritmética.] CT_CONT_1 EQU .250 ; CONSTANTE DE INÍCO DO CONT_

│ │ │ └─> Comentário

│ │ └─> Valor numérico da constante associado ao Nome CT_CONT_

│ └─> Diretiva de Igualdade (Equal)

└─> Nome da Constante Numérica

[A utilização de um Nome relacionado a uma constante numérica traz vantagens para o programador (não para o código-fonte). A lista de constantes está localizada em uma área específica do texto do código-fonte – capítulo Constantes – onde são especificadas as aplicações destas constantes. No código-fonte, o programador vai utilizar sempre o Nome relacionado à constante e não o valor numérico. Se houver necessidade de se modificar o valor numérico para adequar a operação do código-fonte, o programador faz a alteração no capítulo Constantes. O compilador se encarrega de fazer as alterações no restante do código-fonte.] ;------------------------------------------------------------------------------------------------------------------------------------------------------------ ; ENTRADAS [Neste capítulo são relacionados os Nomes associados aos dispositivos externos de controle que enviam sinais ao controlador – entradas (input)

- onde cada entrada corresponde a um bit de um registro PORT.] #DEFINE B1 PORTA,1 ; BOTAO B1 LIGADO AO PINO RA

│ │ │ │ └─> Comentário

│ │ │ └─> Posição do bit associado ao Nome

│ │ └─> Nome do registro que contém o bit associado ao Nome

│ └─> Nome associado ao bit 1 do registro PORTA

└─> Diretiva de Definição

[Cada dispositivo de entrada é alocado em um bit de um registro PORT. Ao se associar um Nome a um dispositivo externo, é importante que seja o mesmo Nome empregado tanto no diagrama de circuito quanto no fluxograma. No exemplo, o Nome B1 está sendo associado ao bit 1 do registro PORTA. O programador usa o Nome B1 no código-fonte.] ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; SAÍDAS [Neste capítulo são relacionados os Nomes associados aos dispositivos externos que são comandados pelo controlador – sáidas (output) – onde cada saída corresponde a um bit de um registro PORT.] #DEFINE L1 PORTA,6 ; LED L1 LIGADO AO PINO RA

│ │ │ │ └─> Comentário

│ │ │ └─> Posição do bit associado ao Nome

│ │ └─> Nome do registro que contém o bit associado ao Nome

│ └─> Nome associado ao bit 6 do registro PORTA

└─> Diretiva de Definição

[Cada dispositivo de saída é alocado em um bit de um registro PORT. Ao se associar um Nome a um dispositivo externo, é importante que seja o mesmo Nome empregado tanto no diagrama de circuito quanto no fluxograma. No exemplo, o Nome L1 está sendo associado ao bit 6 do registro PORTA. O programador usa o Nome L1 no código-fonte.] Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/

3- Área de Código

Nesta área o programador escrever as instruções que devem controlar os dispositivos externos de acordo com

o projeto eletro-eletronico de automação.

; ÁREA DE CÓDIGO

; VETOR DE RESET

[O endereço 0X00 é relativo ao Vetor de Reset. Quando o controlador é ligado à fonte ou quando ocorre um reset interno (por qualquer motivo) o programa inicia sempre neste endereço. O programador deve verificar no datasheet do controlador a disponibilidade de endereços livres para colocação de instruções antes da ocorrencia de outro Vetor automático.] [A diretiva ORG avisa o compilador que o texto seguinte refere-se às instruções que deverão ser gravadas na Memória de Programa a partir do endereço indicado.} ORG 0X00 ; ENDEREÇO INICIAL DO CÓDIGO

│ │ └─> Comentário

│ └─> Endereço de memória do Vetor de Reset

└─> Diretiva indicando início das instruções a partir do endereço da Memória de Programa indicado

GOTO SET_UP ; VAI PARA INÍCIO DO SET_UP CONTROLADOR

│ │ └─> Comentário

│ └─> Endereço de desvio para a rotina de SET_UP do controlador

└─> Instrução de Desvio Incondicional

[Normalmente existem 4 posições na Memória de Programa antes do Vetor de Interrupção (endereços 0x00 a 0x03) que podem ser ocupados com instruções. No geral, costuma-se fazer um desvio para um endereço de memória onde está escrito o código-fonte relativo ao SET_UP do controlador, que ocupa mais que 4 posições de memória. Este espaço inicial também pode ser utilizado para as instruções de teste das funções de Brown-Out Detect e Power-On Reset.) ; ----------------------------------------------------------------------------------------------------------------------------------------------------------- ; VETOR DE INTERRUPÇÃO [O endereço 0X04 é relativo ao Vetor de Interrupção. Quando interrupções são habilitadas, o programa é desviado para este endereço sempre que ocorre uma interrupção. O programador pode iniciar a sequencia de instruções para tratamento das interrupções a partir deste endereço ou fazer um desvio para um endereço da Memória de Programa a partir do qual estará escrito o código-fonte relativo ao tratamento das interrupções.] [O programador deve estar ciente de que o desvio para o Vetor de Interrupção ocorre para qualquer tipo de interrupção, bastando que esteja habilitada (bit relativo à habilitação – enable – com valor 1 (um))] ORG 0X04 ; ENDEREÇO INICIAL DA INTERRUPÇÃO

│ │ └─> Comentário

│ └─> Endereço de memória do Vetor de Interrupção

└─> Diretiva indicando início das Interrupções a partir do endereço da Memória de Programa indicado

[A sequencia de instruções segue a recomendação da Microchip para manter inalterados os valores contidos nos registros STATUS e W quando houver um desvio para Tratamento de Interrupções – no caso, Salvar Contexto – uma vez que estes dois registros são permanentemente empregandos pela CPU. O objetivo destas instruções é salvar os valores contidos nos registros STATUS (em STATUS_TEMP) e W (em W_TEMP) enquanto o programa realiza o atendimento da Interrupção requisitada. Quando o tratamento da interrupção for conpletado, o retorno à rotina normal implica que os valores contidos nos dois registros não correspondem aos valores que existiam antes da requisição da interrupção logo, a probabilidade de que o programa apresente soluções erradas é quase de 100%. O programador deve seguir esta recomendação e, se houver outro registro que seja necessária a preservação do valor contido durante o tratamento da interrupção, deve ser incluso na sequencia de Salvar Contexto. A sequencia Salvar Contexto pode ser considerada como padrão em todos os códigos-fonte realizados.] MOVWF W_TEMP ; SALVA W EM W_TEMP SWAPF STATUS,W ; TROCA NIB_HI POR NIB_LO EM STATUS E GRAVA ; EM W MOVWF STATUS_TEMP ; SALVA STATUS EM STATUS_TEMP Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/