HOME PROJETOS PROGRAMAÇÃO |
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:
|
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.
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.
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
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.
H P S P I N Desde 04 de Março de 2010 Atualização: 08 de Oct de 2024 |