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

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

(Parte 5 de 6)

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]

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

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

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

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

[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 B'10000011' MOVWFOPTION_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 TMR0

; DIVISÃO 1:16 NO PRE SCALER MOVLW B'0' MOVWFINTCON; INTERRUPÇÕES NÃO HABILITADAS

MOVLW B'010' MOVWFTRISA; RA2:3 ENTRADA, DEMAIS SAÍDAS

MOVLW B'0' MOVWFTRISB; TODOS OS BITS SAÍDAS

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

CALL3FFh; CHAMA VALOR EXISTENTE NO ENDEREÇO MOVWFOSCCAL; 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’01’no registro CMCON, que desliga as entradas analógicas dos comparadores.]

MOVLW B'01' MOVWFCMCON; DESLIGA OS COMPARADORES ANALÓGICOS E ; HABILITA OS PINOS DO PORTA PARA I/O DIGITAL

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

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

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

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

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

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

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

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

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

<P16F628A

B A NK0

US ,RP0

B A NK1

(Parte 5 de 6)

Comentários