Interrupções
Interrupções são sub-rotinas que devem ser realizadas quando determinados eventos
ocorrem.
Na ocorrência de um evento que gere uma interrupção, o microcontrolador “interrompe”
o programa, executa a rotina de interrupção, e depois volta a executar o programa
principal a partir do ponto em que havia sido interrompido.
O programador não sabe quando a interrupção ocorrerá, mas sabe o que tem que ser
feito quando ela ocorrer.
Aplicação: chaves, botões, teclado, comunicação, sensores de fim de curso,, etc.
A interrupção pode ser externa (proveniente de elementos externos ligados a um pino do
microcontrolador) ou interna (proveniente de componentes internos do
microcontrolador).
As interrupções mais comuns e usadas nos PIC’s são: detecção de borda, mudança de
estado, recebimento de dado na serial, timers.
Principais interrupções do PIC18F4550
Pino B0: interrupção por detecção de borda (pode ser configurada pra subida ou
descida).
Pino B1: : interrupção por detecção de borda (pode ser configurada pra subida
ou descida).
PinoB2: : interrupção por detecção de borda (pode ser configurada pra subida ou
descida).
Pinos B4,B5,B6,B7: interrupção por mudança de nível em qualquer um desses
pinos
RX: interrupção por recebimento de dado na porta serial
Timers
OBS.:
Para se trabalhar com interrupções deve-se escolher quais serão utilizadas no project
wizard do CCS e no código fonte escrever as respectivas sub-rotinas para cada
interrupção.
A qualquer momento(em tempo de execução) as interrupções podem ser habilitadas ou
desabilitadas.
Teclados
São dispositivos de entrada que normalmente são ligados a pinos de interrupção.
Tipos comuns:
Direto
Codificado
Analógico
Matricial
Desses, o mais comum é o teclado matricial:
Observe que cada tecla fecha duas linhas.
Um teclado matricial n x m gasta n+m pinos do controle, sendo n entradas e m saídas ou
vice-versa.
Dicas importantes: precisa de resistores de Pull-up, tratar repique por software.
Exemplo de aplicação com o PIC:
//Rotina de interrupção
#int_RB
RB_isr()
{
delay_ms(100);
output_high(teclado_y2);
output_high(teclado_y3);
output_low(teclado_y1);
if(!(input(teclado_x1))){
tecla=1;
goto_address(label_address(fim));
}
if(!(input(teclado_x2))){
tecla=2;
goto_address(label_address(fim));
}
if(!(input(teclado_x3))){
tecla=3;
goto_address(label_address(fim));
}
output_high(teclado_y1);
output_low(teclado_y2);
if(!(input(teclado_x1))){
tecla=4;
goto_address(label_address(fim));
}
if(!(input(teclado_x2))){
tecla=5;
goto_address(label_address(fim));
}
if(!(input(teclado_x3))){
tecla=6;
goto_address(label_address(fim));
}
output_high(teclado_y2);
output_low(teclado_y3);
if(!(input(teclado_x1))){
tecla=7;
goto_address(label_address(fim));
}
if(!(input(teclado_x2))){
tecla=8;
goto_address(label_address(fim));
}
if(!(input(teclado_x3))){
tecla=9;
goto_address(label_address(fim));
}
fim:
output_low(teclado_y1);
output_low(teclado_y2);
output_low(teclado_y3);
output_low(teclado_y4);
clear_interrupt(INT_RB);
}
OBS: para se usar essa rotina é necessário definir x1, x2, x3, y1, y2, y3. Também é
necessário uma variável globala chamada tecla.