HOME      PROJETOS      PROGRAMAÇÃO     
  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções


Libraries - Construindo e Usando Bibliotecas de Funções


Em programação, as funções podem ser consideradas como subrotinas com o objetivo de resolverem um problema específico como, por exemplo, somar dois números. Geralmente as funções ou subrotinas são escritas dentro do próprio programa e são acionadas pela instrução CALL do assembler que, ao final da execução, retorna o controle de volta ao chamador com a instrução RETURN. O trecho de código abaixo exemplifica o que foi dito:

. . inicio call salva_st ; salva o status . . salva_st movwf save_W ; salva W num registrador de uso geral bsf STATUS,RP0 ; acesso ao banco 1 swapf STATUS,w ; carrega STATUS em W movwf save_ST ; salva STATUS bcf STATUS,RP0 ; forca acesso no banco zero return ; retorna ao chamador

Em muitos programas diferentes que desenvolvemos notamos que, quase sempre, temos que escrever um procedimento para realizar uma tarefa que já haviamos usado num programa escrito anteriormente. Se nos lembrarmos qual foi o programa que usou a função e onde foi que o guardamos, então será possível, com um mínimo de sofrimento, recuperarmos o trecho de programa que executa a função e copiarmos para dentro do programa que estamos desenvolvendo atualmente.

Mas, será que ao copiar o trecho que contem a função, vamos fazê-lo com segurança, sem termos que analisar o que realmente a função esta fazendo, como são definidos seus parâmetros de entrada e como o resultado será devolvido após a execução?

Se no dia em que escrevemos a função usada naquele velho programa estavamos com um espírito de organização, então a função terá sido documentada e, no mínimo, os comentários feitos no próprio corpo da função servirão para dizer como ela funciona, quais seus parâmetros de entrada e como o resultado será devolvido. Se isso foi realmente feito, basta copiar o código da função para dentro do novo programa e esperemos que tudo corra bem. Mas, se essa documentação mínima não existir... preparemo-nos para analisar o código e, se não o entendermos, infelizmente teremos que reescrevê-lo.

Para evitar os transtornos descritos acima, podemos nos educar e fazer as coisas direito desde o início, isto é, sempre que necessitarmos desenvolver uma subrotina ou função, devemos pensar se ela poderia ser usada num outro programa futuramente e, em caso afirmativo, devemos escrevê-la com todo cuidado, documentá-la com comentários no corpo do código e guardá-la num lugar comum, onde saberemos onde encontrá-la no futuro. Assim, quando necessitarmos usá-la, poderemos incluí-la no programa usando a diretiva #include "filename" do assembler.

Esse método de armazenamento é bom mas usa um arquivo com o código fonte da função. Isso fragiliza o processo porque um código fonte pode ser passível de alteração acidental quando editado no computador. Podemos dizer, também, que a insersão de código fonte dentro do programa implica na compilação desse código sempre que recompilamos o programa. Para melhorar o sistema de armazenamento, a disponibilização de funções entre vários projetos e otimizar a compilação, podemos usar as chamadas Libraries ou Bibliotecas que podem ser construidas através da IDE do MPLAB. Antes de prosseguir, conselho a leitura da página MPLAB - Criando projetos.

Agora que já sabemos usar o MPLAB, vamos criar uma pasta chamada "Funcoes" e, no MPLAB, abrir um novo projeto para o processador PIC18F4550 chamado "tmr1intr" dentro dessa pasta.

Na pasta "Funcoes" adicione o script para linkar o projeto.

Crie o arquivo "tmr1intrc.asm" e copie para esse arquivo o código fonte abaixo:

; ------------------------------------------------------------------------------------------------------ ; FUNCAO DE INICIALIZACAO DE INTERRUPCAO DO TIMER1 ; ; Esta funcao presume que o TIMER1 esta usando um oscilador externo nas portas OSC1/OSC2. ; ; ENTRADA: o registrador "TMR1OSCXCT" deve ser definido com um valor inicial de contagem para ; estouro de TIMER1. ; ; Exemplo: ; Para conseguir interrupcoes em intervalos precisos de 1 segundo, usar um oscilador a ; cristal, nas portas OSC1/OSC2, de 32KHZ e definir o simbolo "TMR1OSCXCT" com o valor ; 32768. ; ; TMR1OSCXCT RES 2 ; ; ; SAIDA: INTERRUPCAO DE TIMER1 HABILITADA. ; ; CHAMADA: movlw HIGH(.32768) ; movwf TMR1OSCXCT ; movlw LOW(.32768) ; movwf TMR1OSCXCT ; call TMR1OSCX ; ; ------------------------------------------------------------------------------------------------------ LIST P=18F4550 #include <P18F4550.INC> ; ; ------------------------------------------------------------------------------------------------------ CODE ; ------------------------------------------------------------------------------------------------------ ; CONFIGURA O TIMER1 - RTC (relogio de tempo real) ; ------------------------------------------------------------------------------------------------------ ; GLOBAL TMR1OSCX EXTERN TMR1OSCXCT ; TMR1OSCX bcf T1CON,TMR1ON ; desliga o TIMER1 clrf TMR1L ; limpa TMR1L para nao ter perigo de estourar movff TMR1OSCXCT,TMR1H ; MSB para 1 segundo movff TMR1OSCXCT+1,TMR1L ; LSB para 1 segundo bsf T1CON,T1OSCEN ; habilita oscilador bsf T1CON,T1SYNC ; nao sincroniza o clock externo bsf T1CON,TMR1CS ; seleciona clock externo bsf PIE1, TMR1IE ; habilita interrupcao de TIMER1 bsf INTCON,PEIE ; habilita interrupcoes de perifericos bsf INTCON,GIE ; habilita interrupcoes gerais bsf T1CON,TMR1ON ; liga o TIMER1 return END

Abra o arquivo "tmr1intrc.asm" e compare-o com a figura 1, abaixo.

Note que, como dissemos acima, existem comentários explicando como afunção funciona, quais seus parâmetros de entrada e como a saída é fornecida.

Note, na linha 35, a diretiva "GLOBAL" informando que a função "TMR1OSCX" pode ser reconhecida por todos os módulos do projeto que fazem chamadas a ela.

A linha 36 informa para a função que o símbolo "TMR1OSCXCT" é definido num módulo externo que chamará esta função. O símbolo "TMR1OSCXCT" é o parâmetro de entrada para a função.

FIG 1 -








Agora observe a figura 2 abaixo e, no MPLAB, clique no menu Project e navegue para Build Options... ---> Project e vá para a aba MPASM/C17/C18 Suite.

Na aba MPASM/C17/C18 Suite, selecione as opções Build library target conforme mostrado na figura com o número 1. Essa opção fará com que seja gerado um arquivo próprio de library com a extensão .lib, no caso tmr1intr.lib

Selecione, também, a opção Generate relocatable code conforme mostrado na figura com o número 2. Essa opção fará com que seja gerado um código relocável, isto é, que pode ter seus endereços resolvidos pelo programa de linkagem.

Clique no botão OK (3) para encerrar.

Neste ponto é só compilar o projeto para gerar a library "tmr1intr.lib" usando o menu Project ---> Build all.

Após compilar, abra a pasta "Funcoes" e verifique se o arquivo "tmr1intr.lib" foi criado.

FIG 2 -








FIG 3 -

FIG 4 -

FIG 5 -

FIG 6 -

FIG 7 -





  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções

H P S P I N

Desde 04 de Março de 2010

Atualização: 29 de Mar de 2024