Interrupções
O PIC 16F628A tem 10 fontes de interrupção:
-
Externa através do pino RB0/INT;
-
Mudanças de estados nos pinos 7 até 4 do PORTB;
-
Estouro do Timer 0;
-
Estouro do Timer 1;
-
Coincidência no Timer 2;
-
Comparador;
-
Módulo CCP;
-
Transmissão na USART;
-
Recepção na USART;
-
EEPROM;
TODAS APONTAM PARA O MESMO ENDEREÇO DE PROGRAMA!!!!!!!!
ORG 0x0004
E funcionam de acordo com a lógica mostrada na figura a seguir.
Os tempos para responder a uma interrupção são mostrados no gráfico abaixo:
Estrutura de tratamento de interrupções
Ao acontecer uma interrupção, o valor do Program Counter (PC) é automaticamente salvo na pilha (STACK). Mas APENAS ISSO é salvo automaticamente. O restante dos registradores SFR ou GPR e o WREG NÃO SÃO SALVOS automaticamente.
Antes de atender a interrupção que solicitou a parada no fluxo do programa, sua rotina de tratamento de interrupção deve prever o salvamento de todos os registradores que você julgar necessário, sendo obrigatório o salvamento dos SFR STATUS e WREG.
Após salvar os registradores, a interrupção é tratada e ao término desta atividade os registradores devem ser recuperados, ou seja, as informações que foram salvas devem voltar para seus devidos lugares.
Só após a recuperação do contexto é que se deve utilizar o comando RETFIE para sair da interrupção.
Como saber quem interrompeu o uC?
Veja que TODAS as 10 interrupções do PIC16F628A apontam para o mesmo endereço! Como saber quem foi que gerou uma interrupção, quando eu tenho mais de uma interrupção habilitada?
Basta testar as FLAGS de interrupção, como no exemplo a seguir.
Veja as questões de prioridade de interrupção e o que acontece quando se está tratando uma interrupção e outra interrupção também acontece, ao mesmo tempo.
Para entender isto, de uma olhada na página 135 do Livro Desbravando o PIC, onde é apresentado um fluxo do funcionamento interno do hardware quando acontece uma interrupção.
|
OPCODE |
COMENTÁRIO |
|
ORG 0x0004 | |
|
SALVA_CONTEXTO | |
|
MOVWF W_TEMP |
;Salva o WREG no W_TEMP |
|
SWAPF STATUS,W |
;Salva o STATUS no STATUS_TEMP. Note que a operação |
|
MOVWF STATUS_TEMP |
;SWAPF não altera os FLAGS, por isso é utilizada |
|
TESTA_INTERRUPÇÃO | |
|
BTFSS INTCON,T0IF |
;Testa se essa é a FLAG que acionou a interrupção |
|
GOTO RECUPERA |
;Se não for sai da interrupção ou vai para próximo teste |
|
BCF INTCON,T0IF |
;Limpa a FLAG de interrupção antes de qualquer coisa |
|
……………… |
;Faz o tratamento da interrupção |
|
RECUPERA | |
|
SWAPF STATUS_TEMP,W |
;Recupera o valor do STATUS |
|
MOVWF STATUS | |
|
SWAPF W_TEMP,F |
;Recupera o valor do WREG |
|
SWAPF W_TEMP,W | |
|
RETFIE |
;Sai da interrupção |
No próximo artigo aprenderemos um pouco sobre temporizadores e watchdog no PIC. Aguardem!
Saiba mais
Curso de C com microcontroladores MCF51QE128 e MC9S08QE128 – Parte 1







