Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula

arrow_back Aula 05 - Linguagem Assembly e ambientes de programação

Modelo simplificado para construção de programas em Assembly

No Quadro 2, é apresentado um template simplificado para construção de programas em linguagem Assembly. À esquerda, foram colocadas numerações de linhas apenas para melhor descrever os conteúdos colocados no modelo, mas que logicamente não fazem parte dele.

Quadro 2 – Template simplificado para construção de programas em linguagem Assembly

No modelo apresentado, em azul encontram-se apenas as observações, em vermelho, exemplos de diretivas do Assembly ou de instruções do PIC, mas que não necessariamente fazem parte de todos os programas. Em preto estão as diretivas e instruções necessárias à estruturação mínima do programa, e em verde são nomes atribuídos, mas que podem ser outros quaisquer. Por analogia ao C, o nome da rotina principal poderia ser, por exemplo, main ao invés de Principal.

Em Assembly, comentário deve ser precedido de “;” (ponto e vírgula). Assim, tudo que está nas linhas 01 a 09, por exemplo, são comentários de linhas. Um comentário pode vir após uma diretiva ou uma instrução, como pode ser visto nos comentários feitos, por exemplo, nas linhas 22, 26 e 34.

A diretiva #INCLUDE, colocada na linha 10, permite a inclusão de arquivos no programa. No exemplo, é feita a inclusão do arquivo p16F877.inc, o qual contêm todas as definições feitas pela Microchip para pinos, registros e endereços de registros do microcontrolador 16F877. Com a inclusão desse arquivo (que pode ser encontrado na pasta de instalação do MPLAB, normalmente em C:\Arquivos de programas\Microchip\MPASM Suite), quando formos armazenar, por exemplo, um dado no endereço da porta B, não será preciso referenciar o endereço, basta utilizar o nome da porta, ou seja, PORTB, que o montador automaticamente insere o seu endereço, que é 0005.

Na linha 13, é usada a diretiva __CONFIG, que permite definir os bits de configuração usados para operação e gravação do programa na memória do chip. Estão referenciados apenas alguns dos bits de configuração. No exemplo, todas as configurações como, por exemplo, o código de proteção (CP) e o Watchdog (WDT) estão desligados (OFF). O último bit de configuração mostrado na linha 13 especifica que a fonte de clock é um cristal (XP_OSC). Essa linha está comentada porque esta configuração será feita no próprio ambiente MPLAB e não por linha de código. Essa linha está colocada apenas para manter compatibilidade com a linha de comando #fuses usada no template C, que será sugerido numa das próximas aulas.

Nas linhas 16 a 19, são usadas diretivas #DEFINE. Essa diretiva é extremamente útil na escrita de programas, já que permite que sejam feitas diversas definições quer sejam para instruções completas, parte de instruções ou para operandos.

Como exemplo, na linha 16, é definido através dela que quando o montador encontrar a palavra banco1, a substitua pelo comando que seta o bit RP0 do registrador STATUS (BSF STATUS,RP0) e, na linha 19, com essa diretiva é dito ao montador que substitua a palavra led0 como sendo o bit 5 da porta A (PORTA,5).

Entre as linhas 22 e 26, é mostrado como reservar posições de memórias para variáveis que serão utilizadas no programa usando as diretivas CBLOCK e ENDC. No exemplo, é reservado um byte de memória na posição 0x20 (20 hexadecimal) para a variável VarInt8 e duas posições para a variável VarInt16.

Nas linhas 30 a 39, são sugeridas duas áreas para escrita de duas sub-rotinas, denominadas no exemplo de SubRotina1 e SubRotina2. Todo retorno de chamada de uma sub-rotina feita pela instrução CALL deve ser feito pela instrução RETURN, quando não retorna valor (mostrada na linha 34), ou RETLW (mostrada na linha 39), que retorna da sub-rotina com um valor, no caso 10 decimal, para o registrador W. O endereço de retorno é buscado na memória pilha. No caso, o último endereço armazenado.

Nas linhas 42 e 46, se observa o uso da diretiva ORG. Esta diretiva define a partir de qual posição de memória a instrução seguinte e posteriores deverão ser armazenadas na memória de programa.

Como o endereço de tratamento de interrupção já é o endereço 04, na linha 43, é feito um desvio para a rotina principal, ficando a área do endereço 04 até a instrução RETFIE reservada para inserção da rotina de tratamento de interrupções.

A instrução RETFIE encerra a rotina de tratamento de interrupção e força o retorno do programa para o ponto de execução em que estava o programa no momento de sua ocorrência. Esse endereço de retorno é também buscado na memória pilha.

A área de memória reservada para que seja escrita a rotina principal do programa encontra-se entre a linha 54 (abaixo do nome da rotina, no caso Principal) e a linha 56. Na linha 57, exemplifica-se como criar um loop infinito.

Complementando a análise do template, na linha 58, está a diretiva de encerramento de programa para o montador: a diretiva END.

Versão 5.3 - Todos os Direitos reservados