Você está na página 1de 10

Interrupção

A interrupção é uma função interna que 99% dos microcontroladores possuem.


Este recurso é muito útil, para realizar tarefas que precisam ocorrer de forma
independente à rotina do programa, e para isso a interrupção é fundamental.
Quando uma interrupção é habilitada, é possível contar tempo sem que uma
rotina de atraso seja implementada, ou verificar um sinal importante externo ao
microcontrolador, sem que sejam testados os pinos do micro via programação.

Aplicações práticas podem ser implementadas como cronômetros, timers,


tacômetros, entradas de segurança, sinais para sincronismo entre outros.

A funcionalidade da interrupção, se dá com a paralisação da tarefa que o micro


está realizando naquele momento, e o armazenamento do endereço da tarefa
na pilha ( Stack). Após essas duas ações o programa é desviado para o
endereço do vetor de interrupção.

Neste ponto o programador, cria a rotina de tratamento da interrupção.

Um exemplo de aplicação da interrupção é o cronômetro.

Para que se tenha um cronometro efetivo, não deve-se lançar mão das rotinas
de tempo baseadas em atrasos, pois essas rotinas vão acumular erros
indesejáveis no sistema.
O melhor a fazer, é utilizar a interrupção por Timer, que ocorre em tempo
sincronizado, independente da tarefa que o dispositivo esteja executando.

CRONOMETRO

Para se obter o cronômetro, é preciso estabelecer qual a menor unidade de


tempo deseja-se.
No exemplo aqui proposto, será implementado um cronômetro, a menor fração
de tempo sendo 1 segundo.

Como o micro trabalha em 1 MIPS, seriam preciso 1 milhão de instruções para


que seja alcançado o tempo de 1 segundo.

Então como obter esse tempo todo sem que o programa fique parado.
Para essa tarefa usamos o contador TIMER 0, esse contador tem um registro
de 8 bits, logo o valor máximo que ele consegue armazenar é 255, se a
contagem ultrapassar esse valor, ele causa uma interrrupção.
O tempo de incremento do contador, pode ser configurado através dos BITS 0
a 2 do registrador OPTION REG, bits estes que compõem a tabela de PRE-
SCALE mostrada na página 37.
Para realizar essa configuração deve-se levar em conta que o sistema é digital,
logo é preciso evitar números fracionários.
Como a base é 1 segundo ou 1000000 de micro-segundos, temos que
1000000 não é divisível por 255, então o número mais elevado que divide
1000000 é 250.
1000000/250 = 4000 como 4000 é maior que o limite de um byte, usamos um
contador auxiliar para dividir esse valor de forma a caber 8 bits. Fazendo
4000/250 = 16. Desta forma chegamos ao valor de configuração do prescale.
1:16.
É possível usar outros valores respeitando a relação de resultados inteiros.
Ex. 1000000/125 = 8000 / 125 = 32.

O PIC18F2420/2520/4420/4520 tem varias fontes de interrupção e


recursos de prioridade de interrupção que permite atribuir um nível de alta
prioridade ou um nível de baixa prioridade. O vetor de interrupção de alta
prioridade está no endereço 0008h e o vetor de interrupção de baixa prioridade
esta em 0018h. Eventos de interrupção de alta prioridade interrompe qualquer
interrupção de baixa prioridade que possam estar em progresso. Existem dez
registros, que são usados para controlar a operação de interrupção. São eles:

- RCON

- INTCON

- INTCON2

- PIR1, PIR2

- PIE1, PIE2

- IPR1, IPR2

Recomenda-se que os arquivos de cabeçalho Microchp fornecido com


MPLAB ® IDE pode ser usados para os nomes simbólicos de bit nesses
registros. Isso permite que o compilador automaticamente cuide da colocação
desses bits dentro do registro especificado. Em geral, fontes de interrupção têm
três bits para controlar o seu funcionamento. São eles:

- Flag (sinalizador): bit para indicar que ocorreu um evento de interrupção.

- Enable (habilitar): bit que permite que o programa desvie para o endereço de
vetor de interrupção quando o bit sinalizador (Flag) está definido.

- Prioridade: bit de prioridade para selecionar prioridade alta ou baixa


prioridade. O recurso de prioridade de interrupção é ativado pelo bit IPEN
(RCON <7>). Quando a interrupção de prioridade estiver ativada, existem dois
bits que permitem interrupção globalmente. Definir o bit GIEH (INTCON <7>)
permite todas as interrupções que tem o conjunto de bits de prioridade alta.
Definir o bit GIEL (INTCON<6>) permite todas as interrupções que tem o bit de
prioridade baixa. Quando a sinalização de interrupção (flag), o bit de habilitação
(enable) e o bit que habilita a apropriada interrupção global são definidas, o
vetor de interrupção ira imediatamente para o endereço 0008h ou 0018h,
dependendo da configuração do bit prioridade. Interrupções individuais podem
ser desativadas através do seu correspondente bits.

© 2008 Microchip Tehnology Inc.

Quando o bit IPEN está desabilitado (estado padrão), o recurso de


prioridade de interrupção é desativado e as interrupções são compatíveis com
os dispositivos PIC ® de gama media (mid-range). Em modo de
compatibilidade, os bits de prioridade de interrupção para cada fonte não tem
efeito. INTCON<6> é o bit PEIE, que ativa/ desativa todas as fontes de
interrupção periférica. INTCON<7> é o bit GIE, que ativa/ desativa todas as
fontes de interrupção. Todas as interrupções no ramo do endereço 0008h esta
em modo de compatibilidade.

Quando uma interrupção é respondida, o bit que habilita a interrupção


global é liberado para desativar outras interrupções. Se o bit IPEN é limpo, isto
é o bit GIE. Se os níveis de prioridade de interrupção são usados, isso vai ser
tanto o bit GIEH ou GIEL. Fontes de interrupção de alta prioridade pode
interromper uma interrupção de baixa prioridade. Interrupções de baixa
prioridade não são processadas enquanto as interrupções de alta prioridade
estão em andamento.

O endereço de retorno é colocado na pilha e o PC é carregado com


endereço do vetor de interrupção (0008h ou 0018h). Uma vez na rotina de
interrupção de serviço, a fonte (s) da interrupção pode ser determinada pela
votação dos bits de sinalização de interrupção (Flag). Os bits de sinalização de
interrupção devem ser limpos em software antes de reativar uma nova
interrupção para evitar interrupções recursivas.

A instrução "retorno de interrupção", RETFIE, sai da rotina de


interrupção e define o bit GIE (GIEH ou GIEL, se os níveis de prioridade são
usados), que permite interrupções.

Para eventos de interrupção externas, tais como os pinos inTX ou a


mudança de entrada PORTB da interrupção, a latência de interrupção será de
três a quatro ciclos de instrução. A exata latência é o mesmo para as
instruções de um ou dois ciclos. Bits de sinalização de interrupção individual
são definidos, independentemente do status de seu correspondente bit de
habilitação (enable) ou o bit GIE.

Nota:

Não use a instrução MOVFF para modificar qualquer um dos registros


de controle de interrupção enquanto qualquer interrupção é ativada. Fazer isso
pode causar um comportamento errático no microcontrolador.
Registro do INTCON:

Nota:

Os registros INTCON são registradores legíveis e graváveis que contêm


vários enable (bit que habilita), prioridades e bits flag (bit de sinalização).

REGISTER 9-1:

Bits de sinalização de interrupção são definidos quando uma condição


de interrupção ocorre, independentemente do estado de seu bit correspondente
ativar a global ou bit enable. O software usuário deve garantir os bits flag de
interrupção adequados são limpos antes de permitir que uma interrupção. Este
recurso permite a soldagem dosoftware.
bit 7 GIE/GIEH: Bit que habilita a interrupção global

Quando IPEN = 0:

1 = interrompe todos os desmascarados

0 = Desativa todas as interrupções

Quando IPEN = 1:

1 = Permite que todas as interrupções de alta prioridade

0 = Desativa todas as interrupções

bit 6 PEIE/GIEL: bit que habilita a interrupção periférica

Quando IPEN = 0:

1 = Permite que todas as interrupções periféricas sem máscara

0 = Desativa todas as interrupções periféricas

Quando IPEN = 1:

1 = Permite que todas as interrupções periféricas de baixa prioridade

0 = Desativa todas as interrupções periféricas de baixa prioridade

bit 5 TMR0IE: TMR0 Bit que habilita a interrupção estourado

1 = Permite que o estouro de interrupção TMR0

0 = Desabilita o estouro de interrupção TMR0

bit 4 INT0IE: INT0 Bit que habilita de interrupção externa

1 = Permite o INT0 interrupção externa

0 = desabilita o INT0 interrupção externa


bit 3 RBIE: Bit que habilita de interrupção mudança de port RB

1 = Permite a mudança de interrupção porta RB

0 = Desativa a mudança de interrupção port RB

bit 2 TMR0IF: TMR0 Bit que sinaliza o estouro

1 = TMR0 Registro estourado (devem ser limpo em software)

0 = TMR0 Registro não estourado

bit 1 INT0IF: INT0 Bit que sinaliza a interrupção externa

1 = A INT0 interrupção externa ocorreu (devem ser limpo em software)

0 = A INT0 interrupção externa não ocorrem

bit 0 RBIF: Bit sinalizador de interrupção mudança de Port RB(1)

1 = Pelo menos um dos RB < 7: 4 > pinos de estado alterado (deve ser limpo
em software)

0 = Nenhum dos RB < 7: 4 > pinos mudaram estado

Nota 1:

Uma condição de incompatibilidade continuará a definir este bit. PORTB


lendo vai acabar com a condição de incompatibilidade e permitir o bit ser limpo.

REGISTRO 9-2:

INTCON2: INTERRUPT CONTROL REGISTER 2

bit 7 RBPU: Bit que habilita puxar para cima (pull – up) PORTB

1 = Todos PORTB pull – up são desabilitados

0 = PORTB pull-ups são ativadas por valores de fecho de portas individuais

bit 6 INTEDG0: bit de interrupção externa borda de seleção 0

1 = Interromper na subida

0 = Interromper na borda de descida

bit 5 INTEDG1: bit de interrupção externa borda de seleção 1


1 = Interromper na subida

0 = Interromper na borda de descida

bit 4 INTEDG2: bit de interrupção externa borda de seleção 2

1 = Interromper na subida

0 = Interromper na borda de descida

bit 3 não implementado: lido como ‘0’

bit 2 TMR0IP: TMR0 bit de interrupção estouro prioritário

1 = Alta prioridade

0 = Baixa prioridade

bit 1 não implementado: lido como ‘0’

bit 0 RBIP: Bit de interrupção prioridade mudança de PORT RB

1 = Alta prioridade

0 = Baixa prioridade

Nota:

x = Bit não conhecido

Bit de sinalização de interrupção é definido quando uma condição de


interrupção ocorre independentemente do estado de seu correspondente.

Bit de habilitação ou bit global de habilitação. O usuário deve garantir a


interrupção apropriada e os bits de sinalização devem ser limpos antes de
permitir uma nova interrupção. Este recurso permite a sondagem software.

Módulo TIMER 0

O módulo TIMER 0 incorpora as seguintes funções:

• Seleção por software das funções contador e timer, para ambos os


modos 8 e 16 bits;

• Registradores podem ser lidos ou escritos;

• Prescale dedicado de 8 bits programável por software;

• Fonte de clock selecionável (interno ou externo);

• Borda de transição selecionável para clock externo;


• Interrupção por estouro.

O registrado T0CON, controla todos os aspectos operacionais do modulo,


inclusive a seleção de prescale. Ele tanto permite leitura quanto escrita.

bit 7 TMR0ON: Timer0 On/Off Control bit

1 = Aciona o Timer0

0 = Para o Timer0

bit 6 T08BIT: Timer0 8-Bit/16-Bit Control bit

1 = Timer0 é configurado como contador/timer de 8 bits

0 = Timer0 é configurado como contador/timer de 16 bits

bit 5 T0CS: Timer0 Clock Source Select bit

1 = Transição no pino T0CKI

0 = Ciclo de clock de instrução interna (CLKO)

bit 4 T0SE: Timer0 Source Edge Select bit

1 = Incrementa na transição de alto para baixo no pino T0CKI

0 = Incrementa na transição de baixo para alto no pinoT0CKI

bit 3 PSA: Timer0 Prescaler Assignment bit

1 = TImer0 prescaler não é atribuido. A entrada de Timer0 bypassa o prescaler.

0 = Timer0 prescaler é atribuido. A entrada de clock do Timer0 vem da saída do


prescaler.

bit 2-0 T0PS<2:0>: Timer0 Prescaler Select bits

111 = 1:256 valor do prescale

110 = 1:128 valor do prescale

101 = 1:64 valor do prescale


100 = 1:32 valor do prescale

011 = 1:16 valor do prescale

010 = 1:8 valor do prescale

001 = 1:4 valor do prescale

000 = 1:2 valor do prescale

Código exemplo

while(1)
{
if(!botao)
{
__delay_ms(10);
while(!botao){}
TMR0IE=!TMR0IE; // inverte estado do TMR0IE - liga desliga relógio

}
if(!PORTCbits.RC0)

__delay_ms(10);
while(!PORTCbits.RC0){}
lcd_clear(); // inverte estado do TMR0IE - liga desliga relógio
}
}
}
void escreve(void)
{
lcd_clear();
lcd_goto(0);
lcd_puts("interrupcao");
lcd_goto(0x40);
lcd_puts("pressionado");
}

static void interrupt myHiIsr(void)


{
if(TMR0IF==1)
{
TMR0IF=0;
contatempo++;
TMR0=6;
if(contatempo==250)
{
contatempo=0;
LATB5=!LATB5;
}
}
}

Você também pode gostar