6. Estrutura do Programa em Assembly Professor: Vlademir de Oliveira Disciplina: Microcontroladores e DSP
A estrutura se baseia em um formato sugerido pela própria Microchip para programação da família PIC. O programa é organizado em 13 campos, que podem ser entendidos como passos. 1. Título, nome do projetista, data de conclusão e versão do programa; 2. Arquivos include; 3. Paginação de memória; 4. Criação das variáveis(gpr); 5. Identificação(Flags); 6. Definição de constantes; 7. Identificação dos pinos; 8. Vetordereset; 9. Vetor de interrupção; 10. Configuração dos SFR; 11. Inicialização das variáveis; 12. Rotina principal; 13. Sub-rotinas.
1º passo Ex.: ; Programa : Acionar um LED com botão. ; Desenvolvido por Fulano de Tal ; VERSÃO : 1.0 ; DATA : 23/06/2003 Acima foi dado um exemplo de cabeçalho para um programa assembly. Obs.: Será usado um programa de exemplo para todos os passos. O programa realiza o acionamento de um LED através de um botão.
2º passo Incluir arquivos de configuração; Geralmente, um arquivo.inc. Ex.1: #INCLUDE <P16F877A.INC> ; Arquivo padrão da Microchip. Ex.2: #INCLUDE F:\projeto\my_include.INC ; Arquivo próprio. A seguir um exemplo de arquivo de configuração.
2º passo Ex. Trechos do arquivo P16F877A.INC: ; Register files INDF TMR0 PCL STATUS... ; Status bits IRP RP1 EQU H'0000' EQU H'0001' EQU H'0002' EQU H'0003 EQU H'0007' EQU H'0006
Definição Diretiva: São comandos reconhecidos pelo montador que auxiliam na programação. Ex.1: #DEFINE botao PORTB, 0 ; Quando aparecer a palavra botao em uma instrução, o montador interpretará como PORTB, 0. Ex.2: A diretiva EQU define constantes. Também é usada para atribuir endereços temporários da RAM para variáveis.
3º passo CriarumatalhodeacessoaosbancosdememóriaRAM. Ex.1: #DEFINE BANK0 BCF STATUS,RP0 ; Seta o banco 0 da memória RAM #DEFINE BANK1 BSF STATUS,RP0 ; Seta o banco 1 da memória RAM Para setar os 4 bancos é necessário a diretiva MACRO e ENDM. Ex.1: BANK1 MACRO ; Seta o banco 1 da memória RAM BSF STATUS,RP0 BCF STATUS,RP1 ENDM
4º passo Para criação das variáveis utilizam-se as diretivas EQU ou CBLOCK. Ex.1: TEMP1 EQU 0x20 FLAGS EQU 0x21... CONT1 EQU 0x25 ou CBLOCK 0x20 TEMP1 FLAGS... ENDC ; Endereço inicial da memória temporária
5º passo Identificar as flags usadas no sistema; As flags podem ser identificadas usando os padrões abaixo: Ex.1: #DEFINE ST_BT1 FLAGS, 0 ; Status do botão 1 #DEFINE ST_BT2 FLAGS, 1 ; Status do botão 2 Ex.2: #DEFINE ST_BT1 FLAGS, 0 ; Status do botão 1 #DEFINE ST_BT2 FLAGS, 1 ; Status do botão 2
6º passo Pode-se definir uma constante através da diretiva EQU e representá-la como: decimal hexa outros Ex.: D NN ou.nn H NN ou 0xNN octal: O, binário: B, ASCII: A MIN EQU.12 ; valores em decimal MAX EQU.240
7º passo A diretiva #define pode ser usada para associar uma string a um PORT usadocomoi/o.assim,astringficaassociadaaumpinodei/o. Ex.1: ; ENTRADAS #DEFINE BOTAO PORTA, 1 ; 0 -> pressionado ; 1 -> liberado ; SAÍDAS #DEFINE LED1 PORTB, 0 ; 0 -> apagado ; 1 -> aceso
8º passo A diretiva ORG 0x00 informa ao montador que a instrução GOTO INICIO deve ser gravada na localidade 0x00 da memória de programa. Ex.: ORG 0x00 GOTO INICIO
9º passo Nesse campo encontra-se a rotina de tratamento de interrupções. Mesmo que nenhuma interrupção estiver habilitada ainda se escreve uma rotina, como exemplificado abaixo. Ex.: ORG 0x04 ; Início do vetor de interrupção RETFIE INICIO ; retorno da interrupção Obs.:A instrução RETFIE retorna para o ponto onde ocorreu o desvio, caso uma interrupção aconteça acidentalmente.
10º passo Configuração dos registradores SFR. Ex.: BANK1 MOVLW B'00001111' MOVWF TRISB MOVLW B'00000111' MOVWF ADCON1 MOVLW B'00000000' MOVWF INTCON MOVLW B 10000000' MOVWF OPTION_REG BANK0 ; Altera para o banco 1 da RAM ; define os 4 primeiros bits como entrada ; desliga conversores A/D ;desabilita todas as interrupções ;desabilita PULL-UPs ;retorna para o banco 0 da RAM
11º passo Inicialização das variáveis da RAM. Ex.: MOVLW.250 MOVWF TEMP1 ; inicializa TEMP1 com 250 em decimal 12º passo Rotina principal. 13º passo Sub-rotinas.