Conceito
Uma interrupção é um sinal de um dispositivo que tipicamente resulta em uma troca de contexto, isto é, o processador para de fazer o que está fazendo para atender o dispositivo que pediu a interrupção.
Funcionamento
- Funciona “semelhante” a uma função ou sub-rotina,
- A diferença é que chamada não está código do programa e sim em um evento de hardware
- O processamento continua de forma sequencial
- Quando o evento ocorre o código para onde estiver, vai para a rotina (função) de interrupção e quando esta termina retorna ao ponto onde parou
- Datasheet – Capítulo 9 - INTERRUPTS
Prioridade
- O sistema pode trabalhar com prioridade entre as interrupções.
- A prioridade é importância que uma ação tem sobre outra.
- Exemplo impressora
- Botão “desliga” – Maior prioridade
- Botão “puxa papel” – Menor prioridade
Comportamento das interrupções com prioridade em eventos de alta (H) e baixa (L)
Ocorrendo um evento H e após um L (durante H)
A interrupção e alta (H) continua rodando e a interrupção de baixa (L) é escalonada para acontecer após a de alta (H) e ao fim desta (L) retornar ao código principalOcorrendo um evento L e após um H (durante L)
A interrupção de baixa (L) é parada e a interrupção de alta (H) é iniciada, ao seu término ela retornaao código da interrupção de baixa (L) e ao fim deste retorna ao código principal
Registradores envolvidos
- RCON RESET CONTROL REGISTER
- INTCON INTERRUPT CONTROL REGISTER
- INTCON2 INTERRUPT CONTROL REGISTER 2
- INTCON3 INTERRUPT CONTROL REGISTER 3
- PIR1 PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 1
- PIR2 PERIPHERAL INTERRUPT REQUEST (FLAG) REGISTER 2
- PIE1 PERIPHERAL INTERRUPT ENABLE REGISTER 1
- PIE2 PERIPHERAL INTERRUPT ENABLE REGISTER 2
- IPR1 PERIPHERAL INTERRUPT PRIORITY REGISTER 1
- IPR2 PERIPHERAL INTERRUPT PRIORITY REGISTER 2
Fontes de interrupção
- Eventos externos como mudança de estado de pino
- Eventos internos vindo de módulos internos:
- Conversão A/D,
- TIMER
- WTD
- Módulo ECCP/PWM
- Vias para comunicação de dados como USART, I²C, SPI, USB
Eventos Externos
Interrupções externas
- INT0 – B0 (33)
- INT1 – B1 (34)
- INT2 – B2 (35)
- RB – Controla mudança de nível em uma das entradas de B4 a B7
- B4 (37)
- B5 (38)
- B6 (39)
- B7 (40)
________________________________________________________________
Configuração geral de Interrupções
IPEN
- Prioridade: IPEN bit pertencente ao registrador RCON<7>
- Com nível de prioridade (IPEN = 1) RCONbits.IPEN = 1;
- Sem nível de prioridade (IPEN = 0) RCONbits.IPEN = 0;
Configuração geral de Interrupções INTCON <7:6>
Com Prioridade
- Alta prioridade: bit GIEH (INTCON<7>)
- INTCONbits.GIEH = 0; Desabilita as interrupções de alta prioridade
- INTCONbits.GIEH = 1; Habilita as interrupções de alta prioridade
- Baixa prioridade: bit GIEL (INTCON<6>)
- INTCONbits.GIEL = 0; Desabilita as interrupções de baixa prioridade
- INTCONbits.GIEL = 1; Habilita as interrupções de baixa prioridade
Sem Prioridade
- Chave geral: bit GIE (INTCON<7>)
- INTCONbits.GIE = 0; Desabilita a chave geral das interrupções
- INTCONbits.GIE = 1; Habilita a chave geral das interrupções
- Periféricos: bit PEIE (INTCON<6>)
- INTCONbits.GIEL = 0; Desabilita as interrupções dos periféricos
- INTCONbits.GIEL = 1; Habilita as interrupções dos periféricos
Exemplo de configuração geral de interrupções
// instruções colocadas dentro de uma funçãovoid config_int(void) {
RCONbits.IPEN = 1; // Habilita interrupções com prioridade.
INTCONbits.GIEH = 1; // Habilita todas interrupções de alta prioridade
INTCONbits.GIEL = 1; // Habilita todas interrupções de baixa prioridade
}
Configurando uma interrupção
- Basicamente existem 3 bits que controlam uma interrupção:
- Enable Bit de ativação: ativa um determinado evento de interrupção
- Priority Bit de prioridade: define o nível de prioridade da interrupção
- Flag Bit de sinalização: sinaliza a ocorrência da interrupção
- Para os sinais externos (Interrupção externa) existe um controle adicional
- EDGE Bit que indica a borda de ocorrência do evento (subida/descida)
- Os bits de configuração estão “espalhados” nos registradores ligados a interrupção
Exemplo de configuração inicial para a INT0
- A Interrupção Externa 0 (INT0) não possui o bit de configuração de prioridade.
- Ela sempre atua como alta prioridade
void config_int0 (void){ // configurações específicas a INT0
INTCONbits.INT0IE = 1; // Ativa a interrupção externa INT0 (RB0)
INTCON2bits.INTEDG0 = 0; // Interrupção externa INT0 na borda de descida
INTCONbits.INT0IF = 0; // Limpa o flag bit da interrupção externa INT0
}
Funcionamento após ativada
- Ocorrendo o evento o FLAG bit muda o seu estado de “0” para “1”, isso acontece automaticamente por hardware.
- Quando ocorre a mudança no FLAG bit (0 ->1) o código é interrompido
- A função de interrupção começa a processar os comandos.
- O software somente interrompe a função de interrupção quando o FLAG bit voltar para 0 (por linha de software).
- Exemplo para INT0
- INTCONbits.INT0IF = 0;
Exemplo de função: interrupção de alta prioridade controlada pela INT0
void interrupt int_alta(void) { // o nome int_alta é escolhido//
// aqui vai o código
//
INTCONbits.INT0IF = 0; // Limpa o flag bit da interrupção externa INT0
}
Exemplo de função: interrupção de baixa prioridade controlada pela INT1
void interrupt low_priority int_baixa(void) { // o nome int_baixa é escolhido//
// aqui vai o código
//
INTCON3bits.INT1IF = 0;; // Limpa o flag bit da interrupção externa INT1
}
Trabalhando com mais de uma interrupção (INT0 e INT1)
void interrupt ISRH(void) { // o nome ISRH é escolhidoif (INTCONbits.INT0IF == 1){ // testa se o flag da INT0 está acionado
//
// aqui vai o código relativo a INT0
//
INTCONbits.INT0IF = 0; // Limpa o flag bit da interrupção externa INT0
}
if (INTCON3bits.INT1IF == 1){ // testa se o flag da INT1 está acionado
//
// aqui vai o código relativo a INT1
//
INTCON3bits.INT1IF = 0; // Limpa o flag bit da interrupção externa INT1
}
}
_________________________________________________________________
Estou com uma duvida sobre alguma coisa sobre o INTCON.BCD ou algo assim. Alguem poderia me ajudar?
ResponderExcluir