Técnica Programação Assembler - PIC - Microchip

Técnica Programação Assembler - PIC - Microchip

(Parte 4 de 6)

; 10 Não implementado 0

;8Não implementado0

;7LVPLow Voltage Programming1Desligado

;6BORENBrown-out Reset Enable0Ligado

;5MCLRERA5/Master Clear Enable0RA5 como entrada digital

;3PWTERNPower-up Time Enable0Ligado

;2WDTENWatchdog Timer Enable0Desligado

;4,1,0FOSC2:FOSC0Oscillator Selection100Oscilador Interno sem saída de clock

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

[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.]

#DEFINEBANK0BCFSTATUS,RP0; ATIVA BANCO DE MEMÓRIA 0 (ZERO) #DEFINEBANK1BSFSTATUS,RP0; 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 BCFSTATUS,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.]

[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.]

┬ ┬
│ │└─> Comentário

CBLOCK0X20; ENDEREÇO INICIAL MEMÓRIA USO GERAL │ └─> 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; REGISTRO TEMPORÁRIO PARA W STATUS_TEMP; REGISTRO TEMPORÁRIO PARA STATUS FLAG; REGISTRO PARA DESVIOS CONDICIONAIS CONT_1; 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.]

└─> Comentário identificando função da variável

ENDC; FIM BLOCO MEMÓRIA USO GERAL └─> Diretiva indicando que terminou a alocação de variáveis na memória

[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

┬ ┬ ┬┬ ┬
│ │ ││ └─> Comentário
│ │ │└─> Posição do bit associado ao Nome

#DEFINEF_CONT_1FLAG,1; DESVIO CONT_1 NO REG. FLAG, BIT 1 │ │ └─> 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 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.]

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

CT_CONT_1EQU.250; CONSTANTE DE INÍCO DO CONT_1 │ │ └─> 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.]

[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.]

┬┬ ┬┬ ┬
││ ││ └─> Comentário
││ │└─> Posição do bit associado ao Nome

#DEFINEB1PORTA,1; BOTAO B1 LIGADO AO PINO RA1 ││ └─> 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.]

[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.]

┬┬ ┬┬ ┬
││ ││ └─> Comentário
││ │└─> Posição do bit associado ao Nome

#DEFINEL1PORTA,6; LED L1 LIGADO AO PINO RA6 ││ └─> 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.

[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.}

┬ ┬
│ │└─> Comentário

ORG0X00; ENDEREÇO INICIAL DO CÓDIGO │ └─> 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

┬ ┬
│ │└─> Comentário

GOTOSET_UP; VAI PARA INÍCIO DO SET_UP CONTROLADOR │ └─> 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.)

[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))]

┬ ┬
│ │└─> Comentário

ORG0X04; ENDEREÇO INICIAL DA INTERRUPÇÃO │ └─> 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.]

(Parte 4 de 6)

Comentários