sexta-feira, 12 de agosto de 2016

Interrupção - PIC18F4550

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 principal



Ocorrendo 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 retorna 
ao 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ção
void 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 é escolhido
if (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
}
}


_________________________________________________________________

Um comentário:

  1. Estou com uma duvida sobre alguma coisa sobre o INTCON.BCD ou algo assim. Alguem poderia me ajudar?

    ResponderExcluir