HOME      PROJETOS      PROGRAMAÇÃO      MÓDULOS     
  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


INTERRUPÇÕES

As interrupções são uma maneira de fazer com que o microcontrolador execute uma tarefa fora da sequência do fluxo normal do programa. Várias são as fontes que podem dar origem às interrupções. Algumas delas:

     
  • Interrupção externa num pino de I/O (INT)
  • Estouro do TMR0
  • Estouro do TMR1
  • Estouro do TMR2
  • Interrupção de SSP (Synchronous Serial Port)
  • Interrupção de mudança de estado num dos pinos de uma porta de I/O
  • Interrupção de alteração num comparador
  • Interrupção de Parallel Slave Port
  • Interrupção de USART
  • Interrupção Receive
  • Interrupção Transmit
  • Interrupção de término de conversã Analógico/Digital

As interrupções são ocasionadas por eventos que tiram o microcontrolador do fluxo normal de execução e transferem o controle para uma rotina especialmente escrita para tratar o evento. Quando uma interrupção acontece, a instrução que esta sendo executada no momento é terminada e o endereço da instrução seguinte é guardada no stack. A seguir, a instrução do endereço 0x004 da memória (interrupt vector) é executada, desviando para a rotina de tratamento de interrupção.




SALVANDO E RESTAURANDO O ESTADO

A primeira coisa que a rotina de tratamento deve fazer é salvar o estado em que o microcontrolador se encontrava antes da interrupção ocorrer. Isso é feito salvando-se o o conteúdo do registrador W e o conteúdo registrador STATUS em registradores de uso geral definidos pelo programador. O trecho de programa abaixo exemplifica o processo:

movwf save_W ; salva W num registrador de uso geral swapf STATUS,w ; carrega STATUS em W sem mudanca no STATUS movwf save_ST ; salva STATUS num registrador de uso geral bcf STATUS,RP0 ; forca acesso no banco zero

Após providenciar o salvamento do estado o microcontrolador, a rotina deve cuidar do tratamento da interrupção propriamente dito. Feito isso, é necessário restaurar o estado original e devolver o controle ao fluxo normal do programa. O trecho de programa abaixo mostra como restaurar o estado original:

swapf save_W,w ; recupera STATUS movwf STATUS ; restaura o STATUS antes da interrupcao swapf save_ST,f ; inverte nibles (LSB + MSB) swapf save_W,w ; restaura W sem afetar o STATUS

A última instrução da rotina de tratamento de interrupção, deve ser RETFIE. Essa instrução retira do stack o endereço da instrução que iria ser executada antes da interrupção ocorrer e o coloca de volta no PC (program counter) e o fluxo do programa se restabelece.


CONTROLANDO AS INTERRUPÇÕES

O controle de uma interrupção é feito pelos registradores INTCON, PIE, e PIR.

O registrador INTCON permite habilitar as interrupções de modo global (bit GIE) e as interrupções periféricas (bit PEIE).Esse registrador também contem flags que habilitam/desabilitam as interrupções externas (INTE), de estouro de TMR0 (T0IE) e mudança de estado na porta RB (RBIE). Além disso, o registrador INTCON contem os flags indicadores para a ocorrência dessas interrupções (T0IF, INTF e RBIF). Os bits T0IF, INTF e RBIF são ligados quando a interrupção correspondente ocorre e devem ser desligados pelo programa ao final da rotina de interrupção.


FIG 1 - Registrador INTCON

Outros periféricos podem ser controlados pelo registrador PIE que contem flags para habilitar/desabilitar as interrupções de periféricos. Para usar as interrupções de periféricos o bit INTCON<PEIE> deve ser ligado.


FIG 2 - Registrador PIE

Como as interrupções de periféricos são habilitadas/desabilitadas pelos flags no registrador PIE, os flags indicativos das ocorrências dessas interrupções ficam no registrador PIR. Esses flags são ligados quando a interrupção correspondente ocorre e devem ser desligados pelo programa ao final da rotina de interrupção.


FIG 3 - Registrador PIR




Programa Exemplo

A seguir temos um exemplo de programa que usa a interrupção externa do chip PIC16F628A. A interrupção externa é acionada pelo bit 0 (zero) do PORTB. Ao ser iniciado, o programa desliga os comparadores, especifica o I/O em PORTB, habilita a interrupção externa e em seguida entra num loop infinito. Ao se pressionar a chave ligada no bit zero de PORTB, o controle será desviado para a rotina de interrupção que acenderá temporariamente o LED ligado ao bit 3 de PORTB. O programa esta devidamente comentado e dispensa mais explicações.





  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: 30 de Novembro de 2020