Você está na página 1de 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

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

As rotinas de interrupo e timer so especiais e por isto geralmente so precedidas por um


cdigo que comea com # indicando ao compilador que a rotina subsequente deve ser tratada como
uma rotina de timer ou interrupo e por isto tem um tratamento especial.
No exemplo hipottico da leitura de teclas de um teclado matricial, imagine que a funo
main no execute mais nenhuma funo para leitura do teclado. Assim, ela est disponvel para
execuo de outras atividades. Assim que o programa iniciado (ou quer dizer, o microcontrolador
eletricamente ligado), os cdigos dentro de main so executados. Contudo, o compilador executa
periodicamente a funo de timer em um perodo de tempo configurvel e fixo. Nesta funo pode ser
inserido os cdigos que varrem as linhas do teclado. Considere, por exemplo, que o timer
programado para executar a cada 200ms. Isto significa que a cada 200ms, o processador par
automaticamente de executar as rotinas da main e executa os cdigos contidos na rotina timer.
Assim, a cada 200ms o cdigo da funo main interrompido para a varredura de uma linha do
teclado.
J a rotina de interrupo executada toda vez que acontece um determinado evento. Neste
caso, a interrupo poderia ser configurada para ser executada toda vez que um novo valor enviado
aos pinos de entrada do PIC. Isto quer dizer que apenas quando um tecla for pressionada (enviando a
um dos pinos de leitura do PIC um nvel lgico alto) a rotina de verificao de qual tecla foi
pressionada executada. Quando nenhuma tecla pressionada, esta rotina no executada deixando
os cdigos contidos em main serem executados. Deste modo, neste exemplo, as colunas so varridas
com uma certa periodicidade enquanto que em outros momentos o PIC est livre para processar os
cdigos contidos em main. Ainda, a rotina de deteco de tecla pressionada s executada quando
uma tecla pressionada pois ela ativada pela mudana de um nvel lgico em alguns dos pinos de
leitura do PIC. As prxima subsees tratam com mais detalhes o uso de interrupes e timers. Aps
isto sugerido uma aplicao que emprega dois diferentes tipos de timers simultaneamente e duas
diferentes interrupes que so acionadas pelo pressionamento de botes.

3.2 Teoria de interrupes


Para trabalhar com interrupes preciso entender os registradores associados a elas j que
atravs da leitura e gravao (R/W) das flags destes registradores que podermos manipular estes
recursos. Desde j fundamental entender que cada interrupo tem pelo menos trs bits (ou flags)
de configurao:
i. um bit que setado (pelo prprio hardware do microcontrolador) toda vez que o evento
associado interrupo acontece. Assim, deve-se monitorar constantemente este bit para
saber se alguma interrupo aconteceu pois ele indica a ocorrncia de uma interrupo que
avisada atravs do set desta flag;
ii. um bit de habilitao que deve ser configurado pelo programador pra indicar se a interrupo
deve estar ativa ou no e;
iii. um bit de prioridade para indicar se a interrupo deve ser tratada como de baixa ou alta
prioridade. Interrupes de baixa prioridade no so executadas enquanto interrupes de alta
prioridade esto em progresso. A flag IPEN (interrupt priority enable) contida no stimo bit
do registrador RCON habilita (IPEN=1) o tratamento das interrupes considerando seus
nveis de prioridade ou desabilita (IPEN=0) as prioridades tratando todas como de igual
relevncia.

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.

Existem ainda os registradores INTCON2 e INTCON3 que, a exemplo do INTCON mostrado


na Tabela 4.1, configuram o timer 1 e 2 alm das interrupes externas 1 e 2. Destaque deve ser dado
ao INTCON2 que configura algumas importantes aes de algumas interrupes. Este registrador
mostrado na Tabela 4.2. Os demais registradores citados podem ser consultados no datasheet do
18F4550.
Tabela 4.2 - Descrio resumida do registrador INTCON2 (endereo 0xFF1).

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.

Os registradores no se limitam apenas ao INTCON, INTCON2 e INTCON3. Existem ainda


outros importantes registradores tais como o PIR1 e PIR2 (peripheral interrupt request -
registradores que indicam a requisio de uma determinada interrupo chamada por um perifrico),
PIE1 e PIE2 (peripheral interrupt enable - registradores que habilitam ou desabilitam as prioridades
associadas aos perifricos), e, por fim, IPR1, IPR2 (interrupt priority register - registradores que
determinam a prioridade de alguns interrupes acionadas por perifricos). Neste caso, os perifricos
mais comuns so o conversor analgico-digital (interrupo indicando uma converso finalizada),
unidades USART e EUSART para transmisso de dados serial (indicando a recepo de um novo
dado no buffer de recepo ou o fim do envio de um dado), USB (interrupo de requisio de
conexo USB com novo dispositivo), memria EEPROM (interrupo indicando que uma operao
de escrita na memria est pronta) dentre outras opes de perifricos. Todos estes registradores e
suas flags so detalhadamente descritos no datasheet do 18F4550.

3.3 Teoria de timers


O timer um tipo especial de interrupo que acionado por tempo. Em termos mais
especficos, trata-se de um registrador contador que recebe um sinal de clock e conta at certo valor.
Uma vez alcanado este valor, ele causa o estouro de timer gerando uma interrupo. O tempo pode
ser controlado pelo clock ou pelo valor de contagem. Por exemplo, o timer 0 do 18F4550 de 8 bits
por padro (mas ele pode ser configurado para tambm trabalhar como sendo 16 bits) e pode ser
alimentado por um clock externo ou pelo prprio clock que alimenta internamente a CPU do
microcontrolador. Este clock pode ser dividido em vrias vezes atravs de um divisor de clock
chamado de prescaler. Assim, o timer 0 no modo padro ir contar de 0 (8 bits) at 255 a cada
intervalo de clock gerado para o contador do timer 0. Quando ele atingir o valor 0, ir estourar
gerando a interrupo.
Para controlar o tempo, deve ser configurado o prescaler gerando um sinal de clock adequado
ou o valor de contagem inicial deve ser modificado de 0, que seu valor de inicializao padro, para
qualquer outro valor que o usurio deseja. Por exemplo, imagine que o timer 0 alimentado pelo
sinal da CPU que de 20MHz/4=5MHz. Considere ainda que foi configurado um preescaler na
proporo de 1:64 o que quer dizer que o clock que alimenta a contagem de timer 0 ser
5MHz/64=78,125Khz ou 12,8 us. Assim, se ele contar de 0 at 255 (256x12,8us) o timer ir estourar
a cada 3,2ms. Se desejar que o timer estoure a cada 2ms, a contagem deve ir de 0 at 155 (gerando
156 x 12,8us = 2ms). Para ilustrar estas configuraes a Tabela 4.3 exibe o registrador T0CON

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.

O valor de contagem do timer 0 armazenado no registrador de 8 bits TMR0L (quando a


contagem vai de 0 a 255) ou nos registradores TMR0H e TMR0L (quando a contagem vai de 0 at
65.535). Estes registradores esto nos endereos 0xFD7 e 0xFD6, respectivamente. Quando a
contagem estourada (chega a zero), a flag TMR0IF setada indicando o estouro de timer 0 e
gerando a interrupo. Com isto, a CPU do PIC deixa de processar o que estava processando e passa
a processar a rotina que foi indicada para tratar a interrupo de timer 0. Depois que a rotina de
interrupo de timer 0 finalizada, a CPU volta para o ponto onde parou antes do timer estourar.
No caso do 18F4550, este possui outros timers. O timer 1 tem 16 bits, um timer 2 de 8bits e
um timer 3 de 16 bits. O funcionamento destes timers similar ao do timer 0 tendo cada um deles
seus prprios registradores.

3.4 Exemplo de aplicao


Para ilustrar a implementao de algumas interrupes e timer, considere um circuito com um
LED que pisca com uma certa frequncia. Um timer deve ser acionado para piscar este LED e a
frequncia pode variar (aumentar ou diminuir) segundo a seleo de um boto para aumentar a
frequncia em que o LED pisca e um outro para diminuir a frequncia.
Duas interrupes externas estaro ligadas aos botes de incrementar ou decrementar a
frequncia com que o LED pisca e toda vez que um boto for pressionado, acionando assim uma
interrupo, um segundo LED ir piscar para demonstrar a execuo das rotinas de interrupo
externas. Por fim, um terceiro LED tambm ir piscar continuamente e com o atraso de 4 segundo
na funo main. Isto mostrar que mesmo nos instantes de tempo quando a funo main estiver em
parada por 4 segundo, as rotinas de timer e interrupo podero ser executadas demonstrando a
independncia destas funes em relao ao contedo executado em main.

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.

Figura 4.2 - Circuito da aplicao.

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 }

Nas linhas 3 a 6, 8 a 11 e 13 a 16 so criadas as funes de tratamento das interrupes de


timer 0, interrupo externa 0 e interrupo externa 1 respectivamente. Note a presena do # para
indicar ao compilador a que tipo de interrupo estas funes esto vinculadas. Todo o cdigo das
interrupes deve ser inserido dentro destas rotinas criadas.
Na funo main alguns configuraes so feitas (estas funes habilitam e desabilitam alguns
dos valores das flags descritas nas sees 4.2 e 4.3 automaticamente). A funo setup_timer_0
(RTCC_INTERNAL|RTCC_DIV_64) habilita o timer 0 (que algumas vezes chamado de RTCC)
indicando que deve ser usado o clock interno da CPU para alimentar a contagem do timer 0. Ainda,
o clock do timer 0 deve ser dividido por 64. Logo, se temos um cristal de 20Mhz que dividido por 4
(na famlia 18F sempre o clock dividido de 4 antes de chegar a CPU) gerando 5MHz. Estes 5MHz
so divididos por 64 pelo preescaler gerando uma frequncia de 78125Hz ou um perodo de 12,8us.
Como o timer 0 foi registrado para trabalhar em 16 bits (216=65.536 contagens), teremos ao decorrer
das 65.536 contagens um tempo total de 0,838segundos ou, aproximadamente, 840ms.
Preencha as funes criadas conforme demonstra o Cdigo 4.2. Nas linhas 2 e 3 criaram-se
duas variveis globais. A primeira delas mos ajudar a controlar o tempo com que o timer 0 estoura.
A segunda contar quantas vezes o timer 0 j estourou.

Cdigo 4.2 - Cdigo da aplicao proposta.


1 #include <main.h>
2 int16 controla_tempo;
3 int8 num_estouros;
4
5 #INT_TIMER0
6 void TIMER0_isr(void)
7 {
8 disable_interrupts(GLOBAL);
9 set_timer0(controla_tempo);
10 num_estouros++;
11 if(num_estouros >= 5)
12 {
13 output_high(PIN_A0);
14 delay_ms(200);
15 num_estouros = 0;
16 output_low(PIN_A0);
17 }
18 enable_interrupts(GLOBAL);
19 }
20
21 #INT_EXT
22 void EXT_isr(void) //ira incrementar a variavel que controla contagem timer
23 {
24 int1 dado;
25 output_high(PIN_A1);
26 dado = input(PIN_B1);
27 if(dado)
28 if (controla_tempo < 55000) //se no esta do limite do incremento
29 controla_tempo = controla_tempo + 5000;
30 output_low(PIN_A1);
31 }
32
33 #INT_EXT1
34 void EXT1_isr(void)//ira decrementar a variavel que controla contagem timer
35 {

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 }

Na interrupo de timer (linhas 5 a 19) comeamos desabilitando todas as interrupes (linha


8) at que o timer finaliza. Isto feito desabilitando-se as flgs GIE/GIEH e GIEL do registrador
INTCON descrito na Tabela 4.1. Assim, enquanto no fosse processados os cdigos da rotina de
timer 0, nenhuma outra interrupes era chamada at que a ltima linha de cdigo de timer 0 fosse
executada. Esta linha justamente a habilitao global das interrupes (linha 18). Isto acontece pois
enquanto a rotina de timer processada espera-se que nada interfira no seu processamento at que
esta finalize. Na linha 9 o registrador de contagem do timer 0 iniciado pela varivel
"controla_tempo". Logo, controlando o valor desta varivel pode-se aumentar ou diminuir o valor de
estouro do timer 0 que contar no mais de 0 a 65.535 e sim de "controla_tempo" at 65.535. Na
linha 10 contado quantas vezes o timer 0 j estourou e quando temos 5 estouros (linha 11) piscamos
o LED ligado a A0 e reiniciamos a contagem de estouros. Assim, se controla_tempo=0, por exemplo,
o timer estoura a cada 840ms. Contudo, o LED s ira piscar a cada 5x840ms=4,2seg. Se
controla_tempo=20.000, por exemplo, o timer estoura a cada ((65536-20000)/65536)*840=583ms e o
LED s ira piscar a cada 5x583ms=2,9seg.
As rotinas de interrupes externas (linhas 21 a 31 e 33 a 43) s so chamadas quando um
dos botes pressionado fazendo assim executar a respectiva rotina ligada a esta interrupo. Os
cdigos de compilao das linhas 21 e 33 indicam ao compilador que as rotinas abaixo esto
associadas as interrupes externas 0 e 1 (INT_EXT e INT_EXT1, respectivamente). Como foi feito
na rotina de timer 0, poderia-se tambm aqui optar por desabilitar todas as outras interrupes
(linhas 8 e 18) enquanto esta interrupo externa processada. Isto evitaria um "encavalamento" de
interrupes. Contudo, aqui negligenciamos este processo. Na rotina de interrupo lemos o valor que
gerou o bit de interrupo (linhas 26 e 38) e se ele estiver em nvel alto, indicando que o boto foi
pressionado (linhas 27 e 39), incrementamos ou decrementamos em 5.000 unidades a varivel
"controla_tempo" (linhas 29 e 41) que inicializar o valor do timer toda vez que ele foi reiniciado (ver
linha 9). Contudo, antes, necessrio verificar se esta varivel pode ou no ser incrementada ou
decrementada (linhas 28 e 40). Um LED ligado na porta A1 pisca toda vez que um boto for
pressionado para indicar que a interrupo est sendo executada.
Por fim, nas linhas 50 a 56, a funo main pode se ocupar em qualquer atividade. Neste caso,
sua tarefa nica e exclusivamente fazer um LED ligado na porta A2 piscar a cada 4 segundos.

15