Você está na página 1de 23

Tratamento de Interrupções

Tipos de Interrupções:
- 3 interrupções relacionadas a timers;
- uma externa (Porta RB0);
- uma por mudança de estado das portas RB4, RB5, RB6 e RB7;
- uma para o fim de escrita na EEPROM;
- uma de comparador;
- duas relacionadas a USART;
- uma do módulo CCP.
Timers:
O TMR0 (timer 0) e TMR2 (timer 2) são registradores de 8bits e TMR1
(timer 1) é um registrador de 16bits.
Tratamento de Interrupções
Ligando as Interrupções
Geral: Habilita o controlador a usar interrupções. Ao habilitar essa
chave, todas as interrupções que estiverem com a chave ligada serão
também habilitadas.
Grupo: Habilita um conjunto de interrupções específicas.
Individual: Habilita uma interrupção específica.
Tratamento de Interrupções
Bit 7: GIE – GLOBAL INTERRUPT ENABLE (chave geral das interrupções)
1 = Poderá ocorrer interrupções.
0 = Nenhuma interrupção poderá ocorrer (mesmo que alguma interrupção
individual esteja habilitada).
Bit 6: PEIE – Habilitação das interrupções periféricas
1 = Interrupções periféricas habilitadas.
0 = Interrupções periféricas desabilitadas.
Bit 5: TMR0IE – Habilitação da interrupção de transbordo do Timer0
1 = Interrupção de transbordo do Timer0 ligada.
0 = Interrupção de transbordo do Timer0 desligada.
Bit 4: INTE – Habilitação da interrupção externa (RB0/INT)
1 = Interrupção externa habilitada.
0 = Interrupção externa desabilitada.
Tratamento de Interrupções
Bit 3: RBIE – Habilitação de interrupção por mudança de estado na porta B
(pinos RB4 a RB7)
1 = Interrupções por mudança na porta B habilitada.
0 = Interrupções por mudança na porta B desabilitada.
Bit 2: T0IF – Flag sinalizador de estouro do timer 0
1 = Ocorreu transbordo do timer 0 (Contagem superou 255).
0 = A contagem não superou 255.
Bit 1: INTF – Flag sinalizador de interrupção externa (RB0/INT)
1 = Ocorreu pedido externo de interrupção
0 = Não ocorreu pedido externo de interrupção
Bit 0: RBIF – Flag sinalizador de alteração nos pinos RB4 a RB7
1 = Houve alteração.
0 = Não houve alteração. .
Tratamento de Interrupções
Exemplo de configurações individuais.
INTCON.GIE = 1; // poderá haver interrupção
INTCON.PEIE = 0; // desabilita interrupções periféricas
INTCON.T0IE = 1; // habilita interrupção de transbordo do Timer0
INTCON.INTE = 0; // Desabilita interrupção externa RB0
INTCON.RBIE = 0; // desabilita mudança de Estado nas portas (RB4 a RB7)
INTCON.T0IF = 0; // inicia-se, não há estouro do timer0
INTCON.INTF = 0; // inicia-se, não ocorrei pedido de interrupção externa
RB0
INTCON.RBIF = 0; // inicia-se, não há alteração dos pinos (RB4 a RB7)
Tratamento de Interrupções
Registradores associados com TMR0;

TMR0 é o próprio registador que armazena a contagem de pulsos.


INTCON determina a utilização de interrupções como tratado
anteriormente.
OPTION determina condições para operação do TRM0
Serão necessárias T0CS, T0SE, PSA e PS2, PS1, PS0
Tratamento de Interrupções
Tratamento de Interrupções
T0SE – determina a borda de atuação do pulso.
1 – borda de descida (1 →0)
0 – borda de subida (0 →1)
Só si aplica caso a interrupção seja externa (pulso da chave)
T0CS – Determina a forma de incremento.
1 – incremento por RA4/T0CKI
0 – Incremento pelo ciclo de máquina (fosc/4)
PSA – Prescale (escala que modifica o tempo de estouro do contador)
1 – Aplicado ao WDT
0 – Aplicado ao TMR0
PS2, PS1 e PS0 - Determinam o multiplicador
0 0 0 - TMR0 - 1:2 (2 pulsos para incrementar 1 tempo no TRM0)
0 0 1 - TMR0 - 1:4 (4 pulsos para incrementar 1 tempo no TRM0)
. . .
1 1 1 - TMR0 - 1:256 (256 pulsos para incrementar 1 tempo no TRM0)
Tratamento de Interrupções
Cálculo tempo total de estouro
Tt = (256 – Vi) x Prescaler x Ciclo de máquina ( clock x 4).
Por exemplo.
Se XT = 4MHz; prescale (000) ou 1:2 e TMR0 = 0 (iniciado)
Clock=1/XT= 1/ 4000000 = 0,25µs

Tt= (256 – 0) x 2 x (0,25µs x 4)


Tt = 256 x 2 x 1µs = 512µs = 0,512ms

1:2 = 0,512ms 1:32 = 8,192ms


1:4 = 1,024ms 1:64 = 16,384ms
1:8 = 2,048ms 1:128 = 32,768ms
1:16 = 4,098ms 1:256 = 65,536ms
Tratamento de Interrupções
Programa com interrupção

void interrupt() { // inicio da rotina de interrupção


// comandos;
} // fim da rotina de interrupção
Void main(){ // inicio do corpo do programa
// configurar o registrador do TRM0 (OPTION)
// configurar o registrador de interrupções (INTCON)
// inicializar o temporizador TRM0
while (1) { // loop infinito
// comandos
} //fim do loop infinito
} // fim do programa principal
Tratamento de Interrupções
void interrupt(){ // iniciar procedimento de interrupção;
RB0_bit=~RB0_bit; // alterar a condição do PORTB na posição RB0 (inverso)
INTCON.T0IF=0; // apagar o bit que determina que houve uma interrupção
TMR0=0; // zerar o TMR0
}
void main(){ // iniciar o programa principal
TRISB=0; // inicializar os RB’s como saídas (output)
PORTB=0; // inicializar os RB’s com bit 0, desligado.
// Inicialização do registrador OPTION que controla as condições para utilização do TRM0
OPTION_REG.T0CS=0; // incrementa pelo ciclo de máquina
OPTION_REG.T0SE=0; // incrementa pela borda de subida
OPTION_REG.PSA=0; // aplica Prescale ao TMR0
OPTION_REG.PS2=0; // 0 0 0 – Prescale 1:2
OPTION_REG.PS1=0;
OPTION_REG.PS0=0;
// Inicialização do registrador INTCON que controla as interrupções
INTCON.GIE=1; // libera a utilização de interrupções
INTCON.T0IE=1; // libera a utilização da interrupção TRM0
INTCON.T0IF=0; // inicializa a variável de estouro em zero
TMR0=0; // inicializa a variável do registrador TRM0 em Zero
while(1){} // loop Infinito
}
Tratamento de Interrupções
Leitura de saída do osciloscópio
1:2 = 0,512ms (aproximadamente medido)

525 us = 0,525 ms
Tratamento de Interrupções
Leitura de saída do osciloscópio
1:2 = 0,512ms (aproximadamente medido)

525 us = 0,525 ms
Tratamento de Interrupções
Contagem de pulsos através do RA4/T0CKI
Modifica-se:
OPTION
T0CS para 1 (RA4/TOCKI)
PSA para 1 (WDT- possibilita mudanças de pulso em pulso da
chave)
INTCON
RBIE para 1 (RA4,RA5,RA6 e RA7)
RBIF para 0 inicializa sem modificação de estado
Tratamento de Interrupções
void interrupt(){ // iniciar procedimento de interrupção;
RB0_bit=~RB0_bit; // alterar a condição do PORTB na posição RB0 (inverso)
while(RB4_bit==1){} // permite que o botão gere apenas uma interrupção por acionamento
INTCON.T0IF=0; // apagar o bit que determina que houve uma interrupção TRM0
INTCON.RBIF=0; // apagar o bit que determina que houve uma interrupção RB4
TMR0=255; // zerar o TMR0
}
void main(){ // iniciar o programa principal
TRISB=0b00010000; // inicializar os RB’s como saídas (output) e RB4 como entrada
PORTB=0; // inicializar os RB’s com bit 0, desligado.
// Inicialização do registrador OPTION que controla as condições para utilização do TRM0
OPTION_REG.T0CS=1; // incrementa pelo RA4
OPTION_REG.T0SE=1; // incrementa pela borda de descida
OPTION_REG.PSA=1; // aplica Prescale ao WDT isso determina que soma-se +1 direto
OPTION_REG.PS2=0; // 0 0 0 – Prescale 1:2
OPTION_REG.PS1=0;
OPTION_REG.PS0=0;
// Inicialização do registrador INTCON que controla as interrupções
INTCON.GIE=1; // libera a utilização de interrupções
INTCON.T0IE=1; // libera a utilização da interrupção TRM0
INTCON.RBIE=1; // libera a utilização da interrupção RB4
INTCON.T0IF=0; // inicializa a variável de estouro em zero
INTCON.RBIF=0; // inicializa a variável RB4 sem interrupção
TMR0=255; // inicializa a variável do registrador TRM0 em Zero
while(1){} // loop Infinito
}
Tratamento de Interrupções
Memória EEPROM
Escrita na EEPROM
Os seguintes registradores são necessários no processo:
• EECON1
• EECON2 (Não é fisicamente implementado)
• EEDATA
• EEADR
Memória EEPROM
Registradores
Memória EEPROM
Registradores
Memória EEPROM
int arq;
void leitura(){ // iniciar procedimento de interrupção;
EEADR=0x00;
EECON1.RD=1;
while(EECON1.RD==1){}
arq=EEDATA;
}

void escrita(){ // iniciar procedimento de interrupção;


EEADR=0x00; // endereço a ser alterado
EEDATA=0x01; // valor escrito no endereço 0x00
EECON1.WREN = 1; // operação de escrita
INTCON.GIE = 0; // desabilita as Interrupções gerais
// é necessário esta sequencia para gravar //
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1.WR = 1; // Inicia a escrita
INTCON.GIE = 1; // Habilita as interrupções //
while (PIR1.EEIF==0){ //Espera a operação da escrita ser completada
delay_ms(10);}
}
}
Memória EEPROM
void main(){ // iniciar o programa principal
TRISB=0; // inicializar os RB’s como saídas (output) e RB4 como entrada
PORTB=0; // inicializar os RB’s com bit 0, desligado.
while(1)
{
escrita(); // escreve na EEPROM
leitura(); // Lê da EEPROM
if (arq==1) // Verifica se valor lido é 1
{
RB0_bit=1; // aciona saída se valor da EEPROM é igual a 1
}
else
{
RB0_bit=0; // desliga saída se valor da EEPROM é diferente de 1
}
} // loop Infinito
}
Memória EEPROM
int arq;
void leitura(){ // iniciar procedimento de interrupção;
EEADR=0x00;
EECON1.RD=1;
while(EECON1.RD==1){}
arq=EEDATA;
}

void escrita(){ // iniciar procedimento de interrupção;


EEADR=0x00; // endereço a ser alterado
EEDATA=0x01; // valor escrito no endereço 0x00
EECON1.WREN = 1; // operação de escrita
INTCON.GIE = 0; // desabilita as Interrupções gerais
// é necessário esta sequencia para gravar //
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1.WR = 1; // Inicia a escrita
INTCON.GIE = 1; // Habilita as interrupções //
while (PIR1.EEIF==0){ //Espera a operação da escrita ser completada
delay_ms(10);}
}
void main(){ // iniciar o programa principal
TRISB=0; // inicializar os RB’s como saídas (output) e RB4 como entrada
PORTB=0; // inicializar os RB’s com bit 0, desligado.
while(1)
{
escrita(); // escreve na EEPROM
leitura(); // Lê da EEPROM
if (arq==1) // Verifica se valor lido é 1
{
RB0_bit=1; // aciona saída se valor da EEPROM é igual a 1
}
else
{
RB0_bit=0; // desliga saída se valor da EEPROM é diferente de 1
}
} // loop Infinito
}
Memória EEPROM
Ligação.

Você também pode gostar