Microcontrolador Pic - Programação Em Assembler

  • Uploaded by: Nando
  • 0
  • 0
  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Microcontrolador Pic - Programação Em Assembler as PDF for free.

More details

  • Words: 7,305
  • Pages: 28
PROGRAMAÇÃO ASSEMBLER PIC - Microchip

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 1/28

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.1 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/07 2/28

ilegível para nós humanos. Portanto, escrever o código-fonte de uma aplicação é um exercício de apresentação de texto. Para facilitar o trabalho do programador, os programas para edição de código-fonte trazem uma série de facilidades automáticas tais como colorir o texto de acordo com a função de cada palavra, mas não organiza esse texto na tela. Isto é função do programador (trabalho braçal). Um código-fonte bem elaborado (no aspecto visual, porque no aspecto lógico é outro assunto) tem apresentação tal que facilite a leitura, compreensão do funcionamento, correção (quando necessário) e evolução por qualquer outro programador, ou pelo seu criador (um ano depois).

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 3/28

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/07 4/28

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/07 5/28

3- Área de Código Nesta área é escrito o programa efetivo que será gravado na memória do controlador. O compilador monta o arquivo executável com as instruções desta áre a partir das diretivas dadas na Área de Diretivas. A fig.4 mostra parte da Área de Código do arquivo BÁSICO.asm:

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

A extensão da Área de Código é dependente apenas da complexidade do sistema externo a ser controlado, podendo possuir tabelas de valores e caracteres, sub-rotinas, interrupções, cálculos matemáticos etc..

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 6/28

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_2 Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 7/28

-

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

#DEFINE

L1_ALTA

; ARQUIVO PADRÃO DO CONTROLADOR 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 W_TEMP _TEMPORARIO FLAGS ENDC

; ENDEREÇO DE INÍCIO DAS VARÁVEIS ; REG. TEMPORÁRIO PARA VALOR DE W ; REG. TEMPORÁRIO ; REG. PARA FLAG DE CONTROLE ; FIM DO BLOCO DE VARIÁVEIS

ORG

; ENDEREÇO VETOR DE RESET

0x00

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/07 8/28

EXEMPLO: a) Desvio Condicional INICIO BTFSS GOTO BSF GOTO DESLIGA_LED BCF GOTO

BOTAO DESLIGA_LED LED INICIO

; VERIFICA O ESTADO DO BIT QUE REPRESENTA BOTAO ; BOTAO = 0 > VAI PARA DESLIGA_LED ; BOTAO = 1 > LIGA LED ; RETORNA PARA INICIO

LED INICIO

; DESLIGA LED ; RETORNA PARA INICIO

b) Desvio ou Chamada de Sub-Rotina CALL ┌ │• │• │• └

SUB_ROTINA

; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO ; NORMAL DO PROGRAMA

SUB_ROTINA ┌ │• │• │• └ RETURN

-

; DESVIA PARA SUB-ROTINA

; SEQUENCIA DE INSTRUÇÕES DE EXECUÇÃO ; DA SUB-ROTINA ; SAÍDA DA SUB-ROTINA

Instruções (mnemônicos) As instruções informam ao processador as operações que devem ser realizadas com os registros e bits dentro do código-fonte. O termo “mnemônico” indica que cada instrução é a abreviatura de um texto indicativo da função da instrução. Regras - as instruções devem ser posicionadas a partir da coluna 2 ou mais adiante (interessante que se utilize um espaço TAB). - separar os operadores das instruções com um ou mais espaços ou vários TAB. EXEMPLO: MOVLW

CT_TEMPO

; COLOCA CONSTANTE CT_TEMPO NO REG. W

┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ └─> Comentário │ │ │ │ └─> Espaços (3 x TAB) │ │ │ └─> Operador (constante) │ │ └─> Espaços (1 x TAB) │ └─> Instrução └─> Espaços (1 x TAB)

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 9/28

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/07 10/28

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-eví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 W_TEMP _TEMPORARIO FLAGS ENDC

; ENDEREÇO DE INÍCIO DAS VARÁVEIS ; REG. TEMPORÁRIO PARA VALOR DE W ; REG. TEMPORÁRIO ; REG. PARA FLAG DE CONTROLE ; FIM DO BLOCO DE VARIÁVEIS

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 11/28

ARQUIVO BASICO.asm Para escrever um código-fonte vamos utilizar o arquivo BÁSICO.asm como referencia. Este arquivo foi desenvolvido para facilitar o início de qualquer desenvolvimento novo, apresentando ao programador uma tela que não esteja em branco. A extensão do nome do arquivo já é .asm, logo, o texto será como um códigofonte válido. O texto apresenta uma sequencia de atividades através de capítulos indicando o quê o programador deve fazer durante a criação do código-fonte. Os capítulos podem ser excluídos (quando não usados), ou novos podem ser acrescentados (de acordo com a necessidade). Algumas sequencias de instruções e Nomes de variáveis de uso geral já se encontram listadas no texto. São baseados na experiencia de uso e recomendações do fabricante logo, facilitam ao programador lembrar dos detalhes necessários antes de encontrar dificuldades durante simulação. As instruções e Nomes não utilizados podem ser descartados. Recomenda-se que, antes de escrever o código-fonte, o programador desenvolva detalhamente a sequencia lógica de funcionamento do projeto em um fluxograma. Inicialmente o texto BÁSICO.asm será apresentado sem comentários no mesmo formato encontrado no arquivo quando aberto pelo MPLAB – Microchip. ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ÁREA DE IDENTIFICAÇÃO ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ; PIMIL – PICARETAGENS MIL LTDA. - SISTEMAS DE AUTOMAÇÃO ; ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; IDENTIFICAÇÃO DE PROJETO ; ; PROJETO .....................: ; CLIENTE ......................: ; NOME ARQUIVO .......: ; ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; DATAS E VERSÕES ;

; 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..... ; INÍCIO.... 00/00/0000 VERSÃO..... 00.00 RESPONSÁVEL..... ; ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; DESCRIÇÃO OPERACIONAL ; ; ; ; ; ; ; ; ; ; ; ; ;

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 12/28

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ÁREA DE DIRETIVAS ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ARQUIVO DE DEFINIÇÕES #INCLUDE



; ARQUIVO PADRÃO DO CONTROLADOR

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; CONFIGURAÇÃO DO CONTROLADOR __CONFIG B’10000101001000’ ; ; ; ; ; ; ; ; ; ; ; ;

BIT 13 12 11 10 8 7 6 5 3 2 4,1,0

CÓDIGO CP

; 3F50h – REGISTRO DE CONFIGURAÇÃO FUNÇÃO Code Protection Não implementado Não implementado Não implementado Não implementado Low Voltage Programming Brown-out Reset Enable RA5/Master Clear Enable Power-up Time Enable Watchdog Timer Enable Oscillator Selection

LVP BOREN MCLRE PWTERN WDTEN FOSC2:FOSC0

VALOR 1 Desligado 0 0 0 0 1 Desligado 0 Ligado 0 RA5 entrada digital 0 Ligado 0 Desligado 100 Oscilador Interno

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; PÁGINA DE MEMÓRIA #DEFINE #DEFINE

BANK0 BANK1

BCF BSF

STATUS,RP0 STATUS,RP0

; ATIVA BANCO DE MEMÓRIA 0 (ZERO) ; ATIVA BANCO DE MEMÓRIA 1 (UM)

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; VARIÁVEIS CBLOCK

0X20

; ENDEREÇO INICIAL MEMÓRIA USO GERAL

W_TEMP STATUS_TEMP FLAG CONT_1

; REGISTRO TEMPORÁRIO PARA W ; REGISTRO TEMPORÁRIO PARA STATUS ; REGISTRO PARA DESVIOS CONDICIONAIS ; REGISTRO CONTAGEM CONT_1

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_1

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ENTRADAS #DEFINE

B1

PORTA,1

; BOTAO B1 LIGADO AO PINO RA1

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; SAÍDAS #DEFINE

L1

PORTA,6

; LED L1 LIGADO AO PINO RA6

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 13/28

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ÁREA DE CÓDIGO ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; VETOR DE RESET ORG GOTO

0X00 SET_UP

; ENDEREÇO INICIAL DO CÓDIGO ; VAI PARA INÍCIO DO SET_UP CONTROLADOR

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; VETOR DE INTERRUPÇÃO ORG MOVWF SWAPF

0X04 W_TEMP STATUS,W

MOVWF

STATUS_TEMP

; ENDEREÇO INICIAL DA INTERRUPÇÃO ; SALVA W EM W_TEMP ; TROCA NIB_HI POR NIB_LO EM STATUS E GRAVA ; EM W ; 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

MOVWF SWAPF

STATUS W_TEMP,F

SWAPF

W_TEMP,W

RETFIE

; TROCA NIB_HI POR NIB_LO EM STATUS_TEMP E ; GRAVA EM W ; RECUPERA STATUS ; TROCA NIB_HI POR NIB_LO EM W_TEMP E ; GRAVA EM W_TEMP ; TROCA NIB_HI POR NIB_LO EM W_TEMP E ; RECUPERA EM W ; RETORNA DA INTERRUPÇÃO

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; INÍCIO DO SET_UP DO CONTROLADOR SET_UP BANK1

; PÁGINA DE MEMÓRIA 1

MOVLW MOVWF

B'10000011' OPTION_REG

MOVLW MOVWF

B'00000000' INTCON

MOVLW MOVWF MOVLW MOVWF

B'00001100' TRISA B'00000000' TRISB

CALL MOVWF

3FFh OSCCAL

BANK0 MOVLW MOVWF

; 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 TMR0 ; DIVISÃO 1:16 NO PRE SCALER ; INTERRUPÇÕES NÃO HABILITADAS ; RA2:3 ENTRADA, DEMAIS SAÍDAS ; TODOS OS BITS SAÍDAS ; CHAMA VALOR EXISTENTE NO ENDEREÇO ; CALIBRADOR DO OSCILADOR LOCAL ; PÁGINA DE MEMÓRIA 0

B'00000111' 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/07 14/28

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; INÍCIO DAS VARIÁVEIS CLRF CLRF

PORTA PORTB

; COLOCA ZERO NO REGISTRO PORTA ; COLOCA ZERO NO REGISTRO PORTB

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ROTINA PRINCIPAL ROT_PRINC ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ROTINAS SECUNDÁRIAS ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; SUB-ROTINAS ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; FIM DO CÓDIGO END

; FIM DO CÓDIGO

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 15/28

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/07 16/28

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



; 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 13 12 11 10 8 7 6 5 3 2 4,1,0

CÓDIGO CP

LVP BOREN MCLRE PWTERN WDTEN FOSC2:FOSC0

FUNÇÃO Code Protection Não implementado Não implementado Não implementado Não implementado Low Voltage Programming Brown-out Reset Enable RA5/Master Clear Enable Power-up Time Enable Watchdog Timer Enable Oscillator Selection

VALOR 1 Desligado 0 0 0 0 1 Desligado 0 Ligado 0 RA5 como entrada digital 0 Ligado 0 Desligado 100 Oscilador Interno sem saída de clock

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 17/28

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; PÁGINA DE MEMÓRIA [O processo de substituição de uma linha de instrução por um Nome pode ser interessante quando a linha se torna comum e repetitiva dentro do código-fonte. Observar que este procedimento só é possível para a substituição de uma única linha de instrução. Para a substituição de duas ou mais linhas de instrução (sequencia) deve-se criar uma Macro.]

#DEFINE #DEFINE

BANK0 BANK1

BCF BSF

STATUS,RP0 STATUS,RP0

; ATIVA BANCO DE MEMÓRIA 0 (ZERO) ; ATIVA BANCO DE MEMÓRIA 1 (UM)

┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ └─> Comentário │ │ │ │ └─> Nome do bit controlado pela Instrução │ │ │ └─> Nome do registro onde está o bit controlado pela Instrução │ │ └─> Instrução substituída pelo Nome │ └─> Nome que substitui a linha de instrução └─> Diretiva de Definição [No exemplo, utilizamos o nome BANK1 em substituição à instrução BCF STATUS,RP0 (colocar o valor zero no bit POR do registro STATUS para ativar o Banco 1 da memória RAM). No código-fonte, o programador escreve este nome sempre que for necessário ativar o Banco 1 de memória.]

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; VARIÁVEIS [Neste capítuloo programador declara todas as variáveis (registros) que vai empregar no código-fonte, com exceção dos Registros Especiais já existentes. A diretiva CBLOCK pode ser empregada diversas vezes no código-fonte para alocar variáveis em diversas posições de memória. O programador deve verificar no datasheet do componente as áreas disponíveis para uso geral nos diversos bancos de memória, bem como os endereços disponíveis, e distribuir as variáveis adequadamente. O controlador não muda de banco de memória automáticamente – é função a ser determinada pelo programador (ver Paginação de Memória).] [A diretiva CBLOCK orienta o compilador no relacionamento entre o Nome da variável e o endereço de memória de uso geral onde será colocado.]

CBLOCK

0X20

; ENDEREÇO INICIAL MEMÓRIA USO GERAL

┬ ┬ ┬ │ │ └─> Comentário │ └─> Endereço de memória de uso geral a partir do qual serão incluídas as variáveis └─> Diretiva indicando início das varáveis a partir do endereço de memória indicado W_TEMP STATUS_TEMP FLAG CONT_1

; REGISTRO TEMPORÁRIO PARA W ; REGISTRO TEMPORÁRIO PARA STATUS ; REGISTRO PARA DESVIOS CONDICIONAIS ; REGISTRO CONTAGEM CONT_1

┬ ┬ │ └─> Comentário identificando função da variável └─> Lista de Nomes das variáveis (atenção ao número de registros disponíveis a partir do endereço indicado) [Os Nomes das variáveis W_TEMP e STATUS_TEMP, bem como o seu uso, são recomendação do fabricante para códigos-fonte que utilizam o recurso da Interrupção. O programador pode alterar ou não esses nomes mas deve atender às recomendações do fabricante no uso.]

ENDC

; FIM BLOCO MEMÓRIA USO GERAL

┬ ┬ │ └─> Comentário identificando função da variável └─> Diretiva indicando que terminou a alocação de variáveis na memória ; ----------------------------------------------------------------------------------------------------------------------------------------------------------; FLAG INTERNO [Este capítulo é destinado à descrição dos desvios condicionais – flags – que o sistema controlado necessita para operar A necessidade de desvios condicionais é determinada pelo programador. O Nome de cada flag deve ser tal que indique a sua função no código-fonte para facilitar a compreensão do funcionamento.]

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 18/28

#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_1 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_1

┬ ┬ ┬ ┬ │ │ │ └─> Comentário │ │ └─> Valor numérico da constante associado ao Nome CT_CONT_1 │ └─> 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 RA1

┬ ┬ ┬ ┬ ┬ │ │ │ │ └─> 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 RA6

┬ ┬ ┬ ┬ ┬ │ │ │ │ └─> 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/07 19/28

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 SWAPF

W_TEMP STATUS,W

MOVWF

STATUS_TEMP

; SALVA W EM W_TEMP ; TROCA NIB_HI POR NIB_LO EM STATUS E GRAVA ; EM W ; SALVA STATUS EM STATUS_TEMP Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 20/28

[Após escrever a sequencia Salvar Contexto, o programador deve verificar qual foi a interrupção requisitada testando os bits referentes aos flags de sinalização existentes nos registros adequados. Na existencia de um flag habilitado, o programa deve fazer o desvio para a rotina de tratamento da interrupção requisitada. Lembre-se sempre que a CPU não tem um mecanismo de desvio automático para a interrupção requisitada, apenas para o Vetor de Interrupção.] [Depois de realizar todos os testes nos respectivos flags de sinalização das interrupções para verificar qual foi requisitada e na possibilidade de nenhum flag habilitado (o desvio para o Vetor de Interrupção pode ter ocorrido devido a um ruído no controlador), o programa deve conter a instrução de desvio para a rotina de Recuperar Contexto – SAI_INT]

GOTO

SAI_INT

; VAI PARA FIM DA INTERRUPÇÃO

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; TRATAMENTO DAS INTERRUPÇÕES [Neste capítulo, o programador deve escrever o código-fonte para o tratamento de cada interrupção habilitada e que tenha um teste de flag com desvio para esta área. Cada interrupção deve ter seu próprio código-fonte completo e deve terminar sempre com a instrução de desvio para a rotina de Recuperar Contexto – SAI_INT]

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; FIM DA INTERRUPÇÃO [A sequencia de instruções segue a recomendação da Microchip para recuperar os valores contidos nos registros STATUS_TEMP e W_TEMP quando houvero retorno do Tratamento de Interrupções – no caso, Recuperar Contexto. O objetivo destas instruções é recuperar os valores contidos nos registros STATUS_TEMP (em STATUS) e W_TEMP (em W) após o atendimento da Interrupção requisitada. Quando o tratamento da interrupção for conpletado, o retorno à rotina normal implica na necessidade de se recuperar os valores existentes nos registros STATUS e W antes da interrupção. O programador deve seguir esta recomendação e, se houver outro registro que seja necessária a recuperação do valor contido, deve ser incluso na sequencia de Recuperarr Contexto.] [A sequencia Recuperar Contexto pode ser considerada como padrão em todos os códigos-fonte realizados.]

SAI_INT SWAPF

STATUS_TEMP,W

MOVWF SWAPF

STATUS W_TEMP,F

SWAPF

W_TEMP,W

; TROCA NIB_HI POR NIB_LO EM STATUS_TEMP E ; GRAVA EM W ; RECUPERA STATUS ; TROCA NIB_HI POR NIB_LO EM W_TEMP E ; GRAVA EM W_TEMP ; TROCA NIB_HI POR NIB_LO EM W_TEMP E ; RECUPERA EM W

[A saída do Tratamento das Interrupções só é completada com a instrução abaixo. O código-fonte retorna à rotina principal após a execução da instrução RETFIE.]

RETFIE

; RETORNA DA INTERRUPÇÃO

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; INÍCIO DO SET_UP DO CONTROLADOR [Este capítulo é de grande importancia. Aqui o programador deve estabelecer as condições que o controlador vai operar. Consiste em colocar valores (constantes) dentro de deteminados registros especiai para ativar/desativar recursos no controlador. Normalmente, os registros especiais envolvidos neste capítulo são: OPTION_REG: resisitores de pull-up, transição do TMR0 e definição do Pre Scaler INTCON: habilitação ou não das interrupções TRIS: identificação de Entrada/Saída utilizda pelo registro PORT CMCON: escolha de aplicação dos Comparadores Analógicos (quando existentes no controlador escolhido) OSCCAL: emprego do valor de calibração do oscilador interno (quando existente no controlador e habilitado no CONFIG) O programador deve observar a paginação de memória para ter acesso a estes registros.] [O endereço para início do SET_UP deve ser escrito na forma mostrada. Lembre-se que o nome do endereço é dado pelo programador e está direcionado no Vetor de Reset utilizando um desvio incondicional - GOTO.]

SET_UP [Verificar a página de memória onde estão os registros que serão operados – ver folha de dados do controlador. No caso de alteração da página de memória, utilizar o Nome definido no capítulo Paginação de Memória para a ativação da área correspodente. No exemplo, os registros especiais que serão operados estão localizados no BANK1.]

BANK1

; PÁGINA DE MEMÓRIA 1

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 21/28

[O direcionemento para a página de memória BANK1 permite o acesso aos registros especiais OPTION_REG, INTCON, TRISA e TRISB. O programador deverá colocar em cada registro os valores necessários para que o controlador opere dentro das características exigidas pelo código-fonte e pela utilização externa (circuito controlado)]. [A representação das constantes literais neste capítulo devem ser no formato binário para visualização do estado lógico de cada bit do registro. Nos registros especiais, cada bit tem uma função operacional no controlador.]

MOVLW MOVWF

B'10000011' OPTION_REG

MOVLW MOVWF

B'00000000' INTCON

; INTERRUPÇÕES NÃO HABILITADAS

MOVLW MOVWF

B'00001100' TRISA

; RA2:3 ENTRADA, DEMAIS SAÍDAS

MOVLW MOVWF

B'00000000' TRISB

; TODOS OS BITS SAÍDAS

; 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 TMR0 ; DIVISÃO 1:16 NO PRE SCALER

[Se no CONFIG foi escolhida a opção de uso do oscilador interno, verificar se o modelo possui um valor de calibração gravado pelo fabricante no último endereço da memória de programa. Se houver, utilizar a sequencia de instruções para colocar o valor da memória no registro OSCCAL.]

CALL MOVWF

3FFh OSCCAL

; CHAMA VALOR EXISTENTE NO ENDEREÇO ; CALIBRADOR DO OSCILADOR LOCAL

[Encerradas as operações nos registros especiais na página de memória 1, retornar à página de memória 0 (zero).]

BANK0

; PÁGINA DE MEMÓRIA 0

[O registro CMCON controla a configuração dos comparadoras analógicas do controlador. O fabricante inicia o controlador com os comparadores habilitados por questão de menor consumo do componente. Se o programa elaborado para o controlador não usa os comparadores, para desligá-los e utilizar as entradas analógicas como I/O digitais, carregar a constante B’00000111’no registro CMCON, que desliga as entradas analógicas dos comparadores.]

MOVLW MOVWF

B'00000111' CMCON

; DESLIGA OS COMPARADORES ANALÓGICOS E ; HABILITA OS PINOS DO PORTA PARA I/O DIGITAL

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; INÍCIO DAS VARIÁVEIS [Por segurança, o fabricante recomenda que os registros PORT sejam iniciados em valores conhecidos do programador antes de se iniciar a Rotina Principal de comandos. Não existe garantia de que os bits destes registros sejam iniciados com valor 0 (zero) na energização do controlador ou após um RESET de qualquer natureza. Para evitar acidentes, seguir a recomendação do fabricante. Observar que o comando CLRF utilizado faz com que o registro contenha o valor 0 (zero), isto é, todos os bits estarão no nível lógico baixo. O programador deve ter certeza de que estes valores são adequados para o código-fonte escrito.]

CLRF CLRF

PORTA PORTB

; COLOCA ZERO NO REGISTRO PORTA ; COLOCA ZERO NO REGISTRO PORTB

[Outras variáveis que podem ser iniciadas de um determinado valor conhecido pelo programador podem ser incluídas neste capítulo.]

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ROTINA PRINCIPAL [Neste capítulo o programador escreve todas as sequencias de instruções necessárias ao correto funcionamento do projeto. O programdor pode estabelecer a lógica funcional principal neste capítulo e direcionar as rotinas secundárias e sub-rotinas para outros capítulos. O compilador não considera esta organização em capítulos desde que os endereços e retornos estejam corretamente colocados.]

ROT_PRINC

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 22/28

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; ROTINAS SECUNDÁRIAS [Os desvios incondicionais ou condicionais existentes na Rotina Principal ou mesmo dentro das Rotinas Secundárias podem ser escritos neste capítulo. O programador deve ter o cuidado de estabelecer os Nomes dos endereços de desvio para evitar erros no código-fonte.] [Mesmo dentro das Rotinas Secundárias, o uso de Sub-Rotinas é importante. Os Nomes dos endereços de desvio não podem ser repetidos para posições de memórias diferentes.]

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; SUB-ROTINAS [Escrever sub-rotinas em separado das demais rotinas facilita a interpretação do código-fonte. Este capítulo deve conter apenas as sub-rotinas empregadas tanto pela Rotina Principal quanto pelas Rotinas Secundárias.] [Toda a sub-rotina deve começar com um Nome de endereço (que deverá ser chamado a partir da instrução CALL), e deve terminar com a instrução RETURN. ]

; ----------------------------------------------------------------------------------------------------------------------------------------------------------; FIM DO CÓDIGO [A instrução END indica para o compilador que as sequencias de instruções encerrou. É de uso obrigatório no final do código-fonte.]

END

; FIM DO CÓDIGO

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 23/28

ANEXO 1 REGISTRO DE CONFIGURAÇÃO – PIC 16F628A A figura é uma cópia da página da folha de dados (datasheet) do controlador mostrando o registro de Configuração do dispositivo. Em todos os controladores este registro dispõe de 14 bits, e cada bit (ou conjunto de bits) determina o modo de operação do modelo. Como o acesso a esse registro está fora do alcance dos endereços disponíveis de memória, a gravação dos valores em cada bit deve ser realizada no momento da gravação da memória de programa. Portanto, o programador deve colocar a diretiva de configuração ( __CONFIG ) na Área de Diretivas do código-fonte.

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 24/28

ANEXO 2 COMPARATIVO DE CÓDIGO-FONTE DETALHADO COM SIMPLES (PARCIAL)

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 25/28

-----------------------------------------------------------------------------------------------------------------; ÁREA DE DIRETIVAS; ---------------------------------------------------------------------------------------------------------------------------------------------------------------

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 26/28

ONT_1EQU.250 #DEFINEF_CONT_1FLAG,1ENDCCONT_1FLAGSTATUS_TEMPW_TEMPCBLOCK0X20#DEFINEBANK1BSFSTATUS,RP0#DEFINEBANK0BCFSTATUS,RP0__CONFIG B’10000101001000’#INCLUDE

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 27/28

Bento Alves Cerqueira Cesar Filho - R 1.2 - JUN/07 28/28

Related Documents


More Documents from "Nando"