Escolar Documentos
Profissional Documentos
Cultura Documentos
Prtica 3:
Interrupes e timers
3.1 Introduo e objetivos
Na prtica anterior foi visto que a funo main fica continuamente monitorando o teclado
avaliando se alguma tecla foi pressionada atravs da leitura contnua dos pinos do PIC que so
ligados ao teclado. Esta estratgia tem um grande problema: o PIC fica "ocupado" com esta tarefa de
monitorao e assim no pode fazer outras tarefas. Ter um microcontrolador dedicado a esta nica
atividade no algo vivel e representa um verdadeiro desperdcio de recursos.
Para resolver esta questo possvel usar os importantes recursos de interrupo e timers. De
modo simplificado, uma interrupo um desvio da execuo das instrues de um programa
ocasionados por um evento. De modo bastante ilustrativo, considere que agora o cdigo da aplicao
anterior (leitura do teclado matricial) seja reescrito e dividido em trs partes confirme ilustra a
Figura 4.1. Uma das partes continua sendo a funo principal main que continuamente executada
para realizar as atividades de uma determinada aplicao qualquer. Uma segunda parte, aqui
chamada de "rotina de timer" dever conter uma funo para - periodicamente - varrer as colunas de
um teclado. A terceira parte, aqui chamada de "rotina de interrupo", executada toda vez que uma
tecla pressionada e identifica qual tecla foi pressionada. Esta ltima s chamada quando uma
tecla pressionada.
Figura 4.1 - Esquema de diviso de funes de um programa que trabalha com timers e interrupes.
8
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
9
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
importante tambm destacar que o sistema de interrupo possui um bit de ativao global
que quando ligado, permite que as interrupes especficas programadas possam ser executadas. Se o
bit de interrupo global estiver desabilitado, ainda que os bits de configuraes das interrupes
estejam corretamente programadas, nenhuma interrupo deve acontecer j que o bit de habilitao
global inibe o funcionamento de qualquer interrupo. Para entender melhor este processo, so
descritos alguns importantes registradores de controle de interrupes na sequncia. O exemplo de
aplicao ajudara o leitor a entender de forma prtica como este processo acontece.
Tabela 4.1 - Descrio do registrador INTCON (endereo 0xFF2).
bit 7 (R/W) Bit 6 (R/W) bit 5 (R/W) bit 4 (R/W) bit 3 (R/W) bit 2 (R/W) bit 1 (R/W) bit 0 (R/W)
GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
GIE/GIEH: bit de interrupo global. Se 1 permite a execuo das interrupes habilitadas pelo usurio. Se 0
desabilita todas as interrupes.
PEIE/GIEL: bit de interrupo global para as interrupes acionadas pelos perifricos de hardware do PIC. Se
1 permite a execuo das interrupes de hardware habilitadas pelo usurio. Se 0 desabilita todas as
interrupes.
TMR0IE: habilita o uso da interrupo de timer 0 (TMR0).
INT0IE: habilita ou desabilita a funo de interrupo externa 0 (tambm chamada de INT0) do PIC. A
interrupo externa acionada quando um determinado pino do PIC tem seu valor de tenso alterado por
borda acionando assim esta interrupo. No 18F4550 este pinos so o 33, 34 e 35 (INT0, INT1 e INT2,
respectivamente).
RBIE: assim como acontece nas interrupes externas INT0, INT1 e INT2, a porta B (pinos 4 a 7) pode
tambm ser configurada para ser sensvel a uma mudana de nvel em seus pinos. Se RBIE=1 esta funo
habilitada.
TMR0IF: esta flag setada pelo prprio hardware do PIC aps um determinado perodo de tempo fixo. Assim,
toda vez que este tempo alcanado, esta flag setada indicando que acaba de ocorrer um evento de
interrupo de timer 0. Note que a flag TMR0IE deve ser habilitada para que TMR0IF possa indicar um
estouro de timer. Quando TMR0IF=0 indica que este tempo ainda no foi alcanado. As funes de timer
sero descritas adiante neste mesmo captulo.
INT0IF: esta flag setada pelo prprio hardware do PIC quando acontece uma mudana de nvel lgico no
pino externo (pino 33 do 18F4550) do PIC indicando que aconteceu uma interrupo de borda em um pino do
PIC. Depois de processada a interrupo, o programador deve limpar esta flag para que possa ser detectada
uma nova interrupo. Quando INT0IF=0 indica que nenhuma interrupo externa aconteceu. Esta flag s
alterada quando a interrupo externa habilitada fazendo-se INT0IE=1.
RBIF: ele setado se algum dos pinos (RB7 a RB4) do PIC tem recebido um dado novo. Isto s acontece se
esta interrupo habilitada fazendo-se RBIE=1. Se RBIF=0 indica que no h nenhuma alterao no nvel
lgico de nenhum dos pinos RB7 a RB4.
bit 7 (R/W) Bit 6 (R/W) bit 5 (R/W) bit 4 (R/W) bit 3 bit 2 (R/W) bit 1 bit 0 (R/W)
RBPU' INTEDG0 INTEDG1 INTEDG2 - TMR0IP - RBIP
10
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
RBPU: bit para ativar ou desativar as resistncias pull-up que a porta B possui.
INTEDG0: determina que tipo de borda deve ativar a interrupo externa 0. Se INTEDG0=1 uma borda de
subida no pino 33 ir acionar a interrupo externa fazendo com que a flag INT0IF do registrador INTCON
seja setada (INT0IF=1) desde que esta interrupo tenha sido ativada fazendo-se INT0IE=1. Se INTEDG0=0,
uma borda de descida deve acionar esta interrupo.
INTEDG1 e INTEDG2: tem significado similar a INTEDG0. Contudo, tratam das interrupes externas 1 e 2
(INT1 e INT2).
TMR0IP: determina se o timer 0 ter alta (TMR0IP=1) ou baixa (TMR0IP=0) prioridade.
RBIP: determina se a interrupo ocasionada por mudana de borda nos pinos RB7 a RB4 ter alta (RBIP=1)
ou baixa (RBIP =0) prioridade.
11
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
Tabela 4.3 - Descrio do registrador TOCON (endereo 0xFD5) que controla o timer 0 do 18F4550.
bit 7 (R/W) Bit 6 (R/W) bit 5 (R/W) bit 4 (R/W) bit 3 (R/W) bit 2 (R/W) bit 1 (R/W) bit 0 (R/W)
TMR0ON T08BIT T0CS T0SE PSA T0PS
TMR0ON: habilita o incio da contagem do timer 0 quando TMR0ON=1 ou se TMR0ON=0 pra a contagem
do timer 0.
T08BIT: se T08BIT=1 o timer 0 configurado como um contador de 8bits contando de 0 at 255. Caso
contrrio, um contador de 16 bits contando de 0 at 65.535.
T0CS: seleciona a fonte de clock que deve ser usada para decrementar a contagem do contador do timer 0.
Se T0CS=1 usado o clock inserido no pino TOCKI. Se TOCS=0 usado o mesmo clock que alimenta a
CPU do PIC.
T0SE: indica que tipo de transio (borda de subida ou descida) deve ser usada em considerao para
decremento quando se usa um clock externo no pino T0CKI para alimentar o timer.
PSA: liga (PSA=0) ou desliga (PSA=1) o preescaler para dividir o clock que ir alimentar o contador do timer
0.
TOPS: estes 3 bits selecionam o quanto o clock deve ser divido antes de chegar ao contador do timer zero
segundo a relao: 111= :256; 110=1:128; 101=1:64; 100=1:32; 011=1:16; 010=1:8; 001=1:4 e 000=1:2.
12
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
3.4.1 O circuito
A Figura 4.2 ilustra o circuito que deve ser montado para a aplicao deste captulo. Note que
nele temos 2 chaves com circuito que evita a trepidao de chave. e trs LEDs conforme descrito
anteriormente.
3.4.2 O cdigo
O Cdigo 4.1 ilustra o comportamento da aplicao. Antes, no Wizard do CCS 5, proceda
com as etapas:
1) Seo "Device": selecione o PIC 18F4550 e defina um clock de 20MHz;
2) Seo "Interrupts": selecione as opes "Timer 0 overflow (using TIMER0 name)", "Timer
1 overflow", "External interrupt" e, por fim, "External interrupt #1";
3) Seo "Timers": habilite a funo "Enable" de Timer 0 (RTCC). Deixe a opo "Source"
definida como "Internal" assim como "Bit count" definido como 16 bits. Por fim, no campo
"Resolution", escolha a opo 12,8us. Isto gerar um estouro (overflow) a cada 840ms
4) Seo "I/O Pins": selecione os pinos A0, A1 e A2 como "Output" e os pinos B0 e B1 como
"Input". Feito isto, finalize o Wizard clicando em "Creat Project".
Cdigo 4.1 - Cdigo gerado automaticamente pelo Wizard do CCS 5 no arquivo ".c" do projeto.
1 #include <main.h>
2
3 #INT_TIMER0
4 void TIMER0_isr(void)
5 {
6 }
7
8 #INT_EXT
9 void EXT_isr(void)
10 {
11 }
12
13 #INT_EXT1
14 void EXT1_isr(void)
15 {
16 }
17
18 void main()
19 {
20 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //840 ms overflow
13
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
21 enable_interrupts(INT_TIMER0);
22 enable_interrupts(INT_EXT);
23 enable_interrupts(INT_EXT1);
24 enable_interrupts(GLOBAL);
25 while(TRUE)
26 {
27 //TODO: User Code
28 }
29 }
14
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica - Prof. Alan Petrnio Pinheiro (www.alan.eng.br - alan@eletrica.ufu.br)
Curso de Engenharia Eletrnica e de Telecomunicaes (campus Patos de Minas) - Disciplina de Microprocessadores - Verso documento: 2.0
36 int1 dado;
37 output_high(PIN_A1);
38 dado = input(PIN_B0);
39 if(dado)
40 if (controla_tempo >= 5000) //se no esta do limite do decremento
41 controla_tempo = controla_tempo - 5000;
42 output_low(PIN_A1);
43 }
44
45 void main()
46 {
47 ... // (foram omitidos alguns cdigos de inicializao)
48 controla_tempo = 0; //inicializa variavel
49 num_estouros = 0; //inicializa variavel
50 while(TRUE)
51 {
52 output_high(PIN_A2);
53 delay_ms(300);
54 output_low(PIN_A2);
55 delay_ms(4000);
56 }
57 }
15