Você está na página 1de 50

Prof.

Pedro Pedrosa
h"p://www.facebook.com/lproFfcemaracanau  
h"p://buscatextual.cnpq.br/buscatextual/visualizacv.do?id=K4227622E1    
pedrosarf@ifce.edu.br
Prof. Pedro Pedrosa
Ø  Definição
Interrupção gerada pelo estouro de um contagem
interna do MCU.

Int. Timer disponíveis no PIC 18f2550


Identificadores  

•  Int. Timer 0 - int_timer0

•  Int. Timer 1 - int_timer1

•  Int. Timer 2 – int_timer2

•  Int. Timer 3 – int_timer3

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Habilitando interrupções
enable_interrupts(Identificador)
Habilita interrupção com o identificador indicado.
Sintaxe:

Enable_interrupts(identificador);
Exemplos:

enable_interrupts (global);

enable_interrupts (int_timer0);

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Habilitação das Interrupções por Timer
Chamada que habilita o uso de interrupções no seu
enable_interrupts(global); programa. Deve-se chamar este comando antes de
habilitar qualquer interrupção específica.

enable_interrupts(int_timer0); Chamada que habilita o uso da interrupções timer 0

enable_interrupts(int_timer1); Chamada que habilita o uso da interrupções timer 1

enable_interrupts(int_timer2); Chamada que habilita o uso da interrupções timer 2

enable_interrupts(int_timer3); Chamada que habilita o uso da interrupções timer 3

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Exemplo de Habilitação
#include <18f2550.h>
#use delay(clock=20000000)
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupções
enable_interrupts(int_timer0); //Habilita o uso da interrupção timer 0
while(1)
{
//funções do programa do usuário
}
}

enable_interrupts(global);
-> Equivalente a -> enable_interrupts( global | int_timer0);
enable_interrupts(int_timer0);

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Funções de Interrupção
•  São as funções chamadas quando uma interrupção é acionada.
•  A função de uma interrupção fica logo abaixo do seu identificador.
Sintaxe:
#identificador IdenFficador  da  interrupção  antecedido  por  #  
void nomeFuncao (void)
{
}

Exemplo com int. por Timer 0:


#int_timer0 IdenFficador  da  interrupção  do  Fmer  0  
void trata_timer0(void)
{
cont++;
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Funções de Interrupção
•  São as funções chamadas quando uma interrupção é acionada.
•  A função de uma interrupção fica logo abaixo do seu identificador.
Sintaxe:
#identificador Função  da  interrupção.  Pode  ter  qualquer  nome.  
void nomeFuncao (void) Deve  estar  logo  abaixo  do  idenFficador.  Usuário  
{ não  a  chama,  ela  é  executada  automaFcamente  
} quando  interrupção  é  acionada  

Exemplo com int. por Timer 0:


#int_timer0
void trata_timer0(void) Função  da  interrupção  pelo  Fmer  0.  
{ Incrementa  variável  cont  sempre  
cont++; que  o  Fmer  0  estourar.  
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Exemplo com int. Timer 1:
#int_timer1 IdenFficador  da  interrupção  por  Fmer  1  
void interrupt_timer1(void)
{ Função  da  interrupção  do  Fmer  1.  
cont--; Decrementa  variável  cont  sempre  
} que  o  Fmer  1  estourar  a  contagem.  

Exemplo com int. Timer 2:


#int_timer2 IdenFficador  da  interrupção  por  Fmer  2  
void processa_t2(void)
{ Função  da  interrupção  do  Fmer  2.  
cont=0; Zera  variável  cont  sempre  que  o  
} Fmer  2  estourar  a  contagem.  

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
 

Aula_08_v1_Fmer_estouro_contagem_maxima.mov

Prof. Pedro Pedrosa


Ø  Quando se deseja um valor menor que o máximo?

Contagem Desejada = 8 Contagem máxima = 10;

Solução  

•  estouro do timer sempre é no valor máximo (10)


•  Para contar até 8, basta iniciar em outro número que não zero

Número de início: Cont. Máxima – Cont. Desejada


Número de início: 10 – 8
Número de início: 2
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
 

Aula_08_v2_contagem_menor_maximo.mov

Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
 

Aula_08_v3_Fmer_estouro_prescaler.mov

Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Configuração do clock do timer
SETUP_TIMER_N(PARÂMETRO)

Coloca o TIMER especificado por N com origem


determinada por PARÂMETRO.
Tipos:
Timer 0 -> N = 0 SETUP_TIMER_0(RTCC_INTERNAL)

Timer 1 -> N = 1 SETUP_TIMER_1(T1_INTERNAL)

Timer 2 -> N = 2 SETUP_TIMER_2(T2_INTERNAL)

Timer 3 -> N = 3 SETUP_TIMER_3(T3_INTERNAL)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Contagem máxima
16
Timer 0 -> 16 bits 2 = 65536 us = 0,065536 s
16
Timer 1 -> 16 bits 2 = 65536 us = 0,065536 s
8
Timer 2 -> 8 bits 2 = 256 us = 0,000256 s
16
Timer 3 -> 16 bits 2 = 65536 us = 0,065536 s

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Configuração do prescaler do timer 0
SETUP_TIMER_0(RTCC_DIV_VAR)
Coloca o TIMER 0 com prescaler de valor VAR.

Prescaler Timer 0: Valor máximo = 256


Timer 0 -> VAR = 256 SETUP_TIMER_0(RTCC_DIV_256)

Timer 0 -> VAR = 128 SETUP_TIMER_0(RTCC_DIV_128)

Timer 0 -> VAR = 64 SETUP_TIMER_0(RTCC_DIV_64)

Timer 0 -> VAR = 1 SETUP_TIMER_0(RTCC_DIV_1)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Configuração do prescaler do timer 1
SETUP_TIMER_1(T1_DIV_VAR)
Coloca o TIMER 1 com prescaler de valor VAR.

Prescaler Timer 1: Valor máximo = 8


Timer 1 -> VAR = 8 SETUP_TIMER_1(T1_DIV_8)

Timer 1 -> VAR = 4 SETUP_TIMER_1(T1_DIV_4)

Timer 1 -> VAR = 2 SETUP_TIMER_1(T1_DIV_2)

Timer 1 -> VAR = 1 SETUP_TIMER_1(T1_DIV_1)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Configuração do prescaler do timer 2
SETUP_TIMER_2(T2_DIV_VAR)
Coloca o TIMER 2 com prescaler de valor VAR.

Prescaler Timer 2: Valor máximo = 16


Timer 2 -> VAR = 16 SETUP_TIMER_2(T2_DIV_16)

Timer 2 -> VAR = 8 SETUP_TIMER_2(T2_DIV_8)

Timer 2 -> VAR = 4 SETUP_TIMER_2(T2_DIV_4)

Timer 2 -> VAR = 2 SETUP_TIMER_2(T2_DIV_2)

Timer 2 -> VAR = 1 SETUP_TIMER_2(T2_DIV_1)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Ø  Configuração do prescaler do timer 3
SETUP_TIMER_3(T3_DIV_VAR)
Coloca o TIMER 3 com prescaler de valor VAR.

Prescaler Timer 3: Valor máximo = 8


Timer 3 -> VAR = 8 SETUP_TIMER_3(T3_DIV_8)

Timer 3 -> VAR = 4 SETUP_TIMER_3(T3_DIV_4)

Timer 3 -> VAR = 2 SETUP_TIMER_3(T3_DIV_2)

Timer 3 -> VAR = 1 SETUP_TIMER_3(T3_DIV_1)

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Exemplo  1  -­‐  So1ware:  

#include <18f2550.h>
#use delay(clock=20000000)
#int_Fmer0  //idenFficador  da  interrupção  externa  0  
void  trata_t0(void)  //  Trata  interrupção  externa  0  
{  
output_high  (pin_b7);  //  Acende  LED  para  demonstrar  que  houve  interrupção    
delay_ms  (250);    
output_low  (pin_b7);  //  após  250  ms  apaga  LED  
}  
void  main()  
{  
enable_interrupts(GLOBAL|INT_TIMER0);  //  Habilita  interrupção  Global  e  Int_TIMER0  
setup_Fmer_0(RTCC_INTERNAL|RTCC_DIV_64);  //configura timer 0 com clock interno e prescaler 64
while  (true);  //  Aguarda  por  uma  interrupção  
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Contagem máxima (Prescaler P Máximo)
16
Timer 0 -> 16 bits 2 = 65536 us = 0,065536 s
Timer 0 -> P=256 x = 16,777216 s
16
Timer 1 -> 16 bits 2 = 65536 us = 0,065536 s
Timer 1 -> P=8 x = 0,524288 s
8
Timer 2 -> 8 bits 2 = 256 us = 0,000256 s
Timer 2 -> P=16 x = 0,002048 s

Timer 3 -> Igual Timer 1

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Inicializando a contagem do timer
set_timer_x(valor)

Inicializa a contagem do time x com valor


Exemplo com timer 0:

set_timer_0(20);

Exemplos com timer 1, 2, 3:

set_timer_1(30); set_timer_2(40); set_timer_3(50);

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Verificação a contagem do timer
valor = get_timer_x()

A variável valor recebe a contagem do time x


Exemplo com timer 0:

int a = get_timer_0();

Exemplos com timer 1, 2, 3:

int b = get_timer_1(); int c = get_timer_2(); int c = get_timer_3();

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø Configuração – Tempo de Interrupção
1.  Escolher o timer que será utilizado
2.  Escolher o prescaler utilizado
3.  Verificar se o tempo desejado é menor que o produto do prescaler pelo
valor máximo do timer escolhido. Caso não, repetir 1, 2 e 3.
4.  Calcular a inicialização para o obter o tempo desejado, a partir da fórmula:

Nbits
2 * Vprescaler - TD
Vinit = ________________
Resultados  em  microsgundos  (uS)  
Vprescaler

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø Exemplo – Interrupção em 0,5 segundos (500.000 us)
1.  Escolher o timer que será utilizado Timer 0 -> 16 bits
2.  Escolher o prescaler utilizado 64 ( Máx 256 )
3.  Verificar se o tempo desejado é menor que o produto do prescaler pelo
valor máximo do timer escolhido. Caso não, repetir 1, 2 e 3.
4.  Calcular a inicialização para o obter o tempo desejado, a partir da fórmula:
Nbits
2 * Vprescaler - TD
Vinit = ________________
Vprescaler
16
*264 - 500000
Vinit = _______________ = 3036
64
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Exemplo de Interrupção de Interrupção com timer 0 (0,5 s)
Prescaler = 64 e Inicialização = 3036
#include <18f2550.h>
#use delay(clock=20000000)
#int_timer0
void timer0(void)
{
delay_ms(50);
set_timer_0( 3036 + get_timer_0() ); //Inicialização da contagem para o proximo ciclo de interrupcao com 3036
//get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) -> neste caso )
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupções
enable_interrupts(int_timer0); //Habilita o uso da interrupção pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno e prescaler 64
set_timer_0(3036); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Interrupção com timer 0 (0,5) - Presc = 64 e Inic. = 3036
#include <18f2550.h>
#use delay(clock=20000000)
int contTimer = 0;
#int_timer0
void timer0(void)
{
contTimer ++; Explicação  no  slide  seguinte  
if(contTimer = = 2)
{
delay_ms(50);
}
set_timer_0( 3036 + get_timer_0() ); //Inicialização da contagem para o proximo ciclo de interrupcao com 3036
//get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) -> neste caso )
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupções
enable_interrupts(int_timer0); //Habilita o uso da interrupção pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno e prescaler 64
set_timer_0(3036); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Ø  Interrupção com timer 0 (0,5) - Presc = 64 e Inic. = 3036
#include <18f2550.h>
#use delay(clock=20000000)
int contTimer = 0;
#int_timer0 1.  O  que  está  em  vermelho  é  apenas  um  recurso  de  programação  
void timer0(void) 2.  Funciona  como  um  prescaler  arFficial  
{ 3.  Realiza  uma  contagem  de  vezes  que  o  Fmer  é  acionado  para  
contTimer ++;
realizar  comandos  em  tempos  mulFplos  ao  estouro  do  Fmer  
if(contTimer = = 2)
{ 4.  Neste  caso  2  vezes,  então  2x0,5  =  1  segundo  
delay_ms(50);
}
set_timer_0( 3036 + get_timer_0() ); //Inicialização da contagem para o proximo ciclo de interrupcao com 3036
//get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) -> neste caso )
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupções
enable_interrupts(int_timer0); //Habilita o uso da interrupção pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno e prescaler 64
set_timer_0(3036); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Priorizando ordem de execução de interrupções
Define a ordem de execução de interrupções quando
as mesmas são acionadas ao mesmo tempo.
Sintaxe:

#priority identificador1, identificador2, identificador3

Exemplos:

#priority int_ext, int_rda, int_timer1


Neste exemplo, int. externa 0 tem a maior prioridade
que interrupção serial, que por sua vez é maior que
interrupção do timer 1.

pedrosarf@ifce.edu.br Prof. Pedro Pedrosa


Prof. Pedro Pedrosa
Ø  Exemplo de Prioridade de interrupção
#include <18f2550.h>
#use delay(clock=20000000)
#priority int_ext, int_timer1 //Prioriza int_ext em relação a int_timer1
#int_ext
void interrupt0(void)
{
cont++;
}
#int_timer1
void timer1(void)
{
cont--;
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupções
enable_interrupts(int_ext); //Habilita o uso da interrupção externa 0 (Pino B0 – pic18f2550)
enable_interrupts(int_timer1); //Habilita o uso da interrupção pelo timer 1
setup_timer_1(T1_INTERNAL|RTCC_DIV_BY_8); //configura timer 1 com clock interno e prescaler 8
while(1);
}
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa
Prof. Pedro Pedrosa
Ø  Prática 1: Projete um contador que incremente
sua contagem através de uma interrupção externa Sa  
a cada 0,5 segundo.
Ø  Prática 2: Projete um hardware e um software Sg  
com MCU que a cada acione o timer a cada 1
segundo, leia um ADC, transforme este valor em Sd  
tensao e apresente a parte inteira desta tensão em
um display de 7 segmentos.

Ø  Prática 3: Projete um hardware e um software com MCU que a cada


acione o timer a cada 5 segundos e acenda o LED1 durante 0,5
segundos. Além disto, acenda o LED2 por 0,5 segundos sempre que
apertar um botão conectado e acionado através de uma interrupção
externa.
pedrosarf@ifce.edu.br Prof. Pedro Pedrosa

Você também pode gostar