Вы находитесь на странице: 1из 43

AULA 03: Interrupes e

Temporizadores
Sistemas Embarcados
professor
Interrupo
Evento de hardware que, quando ocorre,
provoca um desvio no programa, isto ,
interrompe momentaneamente o fluxo
normal de execuo do programa;
professor
Instr. 1
Instr. 2
Instr. 3
Instr. 4
Instr. 5
Instr. 6
Instr. 7
Instr. 8
Instr. 9
Instr. 10
Instr. 11
Instr. 12
Vetor Int.
Instr. Int. 1
Instr. Int. 2
Instr. Int. 3
Instr. Int. 4
Instr. Int. 5
Retorno
Programa
Principal
Rotina de
tratamento da
interrupo
Interrupes
professor
A rotina de tratamento de interrupo (ISR
Interrupt Service Routine) deve:
Salvar contexto (registrador Status e outros);
Verificar qual evento ocorreu;
Tratar a interrupo;
Restaurar o contexto;
Retornar.
Interrupes
professor
Existem dois tipos de interrupo no AVR:
Um seta um interrupt flag (evento fica memorizado);
Outro no seta flag ( esquecido se no for executado
enquanto o evento estiver presente).
Quando ocorre um desvio para rotina de
interrupo, o bit I de SREG (GIE) zerado. Ele
novamente setado pela instruo de retorno;
Antes de fazer o desvio para a rotina de interrupo,
a instruo em curso concluda;
No retorno, o AVR sempre voltar ao programa
principal e executar uma instruo, mesmo que j
exista outra interrupo com flag setado.
Interrupes
professor
O ATmega328 possui 26 fontes de interrupo;
As interrupes podem ser tratadas ou no;
Para que uma interrupo seja tratada, ela precisa
estar habilitada, sendo que cada interrupo pode
ser habilitada individualmente;
A habilitao feita por meio de registradores
especficos;
Para habilitar a uma interrupo necessrio:
1 - Habilitar a chave individual da interrupo desejada;
2 - Habilitar a chave geral de interrupo (bit I de SREG).
Cada fonte de interrupo provoca desvio para um
endereo especfico (vetor de interrupo).
Interrupes
professor
Interrupes
professor
Interrupes
professor
Interrupes
professor
As interrupes possuem diferentes prioridades:
quanto menor o endereo, maior a
prioridade da interrupo correspondente;
O desvio para uma rotina de interrupo leva
pelo menos 4 ciclos de clock;
Se estiver em modo sleep, 4 ciclos adicionais so
necessrios, alm do tempo para acordar o
processador;
O retorno da interrupo tambm leva 4 ciclos
de clock;

Interrupes
professor
Todo o controle e sinalizao de eventos
de interrupo feito por registradores;
Por exemplo, o registrador EICRA contm
os bits de configurao das interrupes
externas INT0 e INT1;
A habilitao dessas interrupes feita
pelos bits 0 e 1 do registrador EIMSK;
A ocorrncia do evento externo nos pinos
INT0 e INT1 sinalizada pelo registrador
EIFR.
Interrupes
professor
A mudana de nvel em qualquer pino do
ATmega328 pode provocar interrupo (PCINT0
a PCINT23);
Dois desses pinos (INT0 e INT1) tambm podem
provocar interrupo por:
Borda de subida;
Borda de descida;
Manuteno do estado lgico (baixo).
Ao contrrio das interrupes por mudana de
nvel, INT0 e INT1 tm vetores de interrupo
especficos e de alta prioridade.
Interrupes
professor
Pinos de Interrupo Externa
professor
#include <avr/interrupt.h>
void setup(void)
{
pinMode(2, INPUT);
digitalWrite(2, HIGH); // Enable pullup resistor
sei(); // Enable global interrupts
EIMSK |= (1 << INT0); // Enable ext int INT0
EICRA |= (1 << ISC01); // Trigger on falling edge
}
void loop(void)
{}
ISR(INT0_vect)
{
digitalWrite(13, !digitalRead(13)); // Toggle LED
}
Interrupes - Exemplo
professor
O Arduino possui funes especficas para lidar
com interrupes externas:




Para trabalhar com outras interrupes,
necessrio configurar os registradores do
ATmega328P. Veremos um exemplo desse tipo
mais adiante.
Interrupes no Arduino
professor
void setup()
{
pinMode(2, INPUT);
digitalWrite(2, HIGH); // Enable pullup resistor
attachInterrupt(0, pin2ISR, FALLING);
}
void loop()
{}
pin2ISR()
{
digitalWrite(13, !digitalRead(13)); // Toggle
LED
}
Interrupes no Arduino
professor
Enquanto a ISR est sendo executada o
processador paralisa outros processos e
desabilita as interrupes;
A funo delay() no funciona;
A funo milis() no incrementada;
Dado recebido pela serial pode ser perdido;
Outros eventos de interrupo s sero atendidos
quando a ISR atual for concluda;
Dica: construa a ISR de modo que fique o mais
curta possvel;
Toda varivel modificada dentro da ISR deve ser
declarada como volatile.
Interrupes no Arduino
professor
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
Exemplo
professor
int pin = 13;
volatile int state = LOW;
void setup(){
pinMode(pin, OUTPUT);
attachInterrupt(0, led_on, CHANGE); //pino 2
attachInterrupt(1, led_off, FALLING); //pino 3
}
void loop(){
digitalWrite(pin, state);
}
void led_on(){
state = HIGH;
}
void led_off(){
state = LOW;
}
Exemplo
professor
Prtica: Contador de pessoas
Voc est construindo um sistema de catraca
eletrnica para controle de acesso. Uma das
funes do sistema contar o nmero de pessoas
que passam pela catraca. Um sensor ptico ligado
ao pino INT0 gera um pulso a cada volta da
catraca. Um boto est ligado ao pino INT1.
Faa um programa que utilize interrupo
para contar quantas pessoas passaram pela
catraca. Quando o boto for pressionado, o LED
do pino 13 deve piscar um nmero de vezes igual
ao nmero de pessoas contado.
professor
Temporizadores/Contadores
professor
Timer em Microcontroladores
Um timer, ou temporizador, um circuito auxiliar
ao microprocessador (perifrico);
professor
Timer em Microcontroladores
utilizado para contagem de tempo sem carregar
a CPU um registrador incrementado
automaticamente a cada x ciclos de clock;

Ao completar a contagem (overflow), o timer pode
ativar uma interrupo, permitindo a execuo de
cdigo a intervalos regulares com preciso;

Alm disso, como o timer no depende de
processamento da CPU, seu programa pode fazer
outra coisa enquanto o tempo contado.
professor
Timer em Microcontroladores
Considerando um clock de 16MHz, qual o menor
perodo possvel entre incrementos de contagem
para um timer?
professor
Timer em Microcontroladores
Considerando um clock de 16MHz, qual o menor
perodo possvel entre incrementos de contagem
para um timer?
O registrador do timer incrementado a cada ciclo
de clock (ou a cada 8, 64, 1024... ciclos). Logo, o
perodo mnimo de incremento de:
1/(16*10^6) = 62,5 ns.
Esse valor representa a resoluo do timer.

professor
Timer em Microcontroladores
Considere um clock de 16MHz. Qual o perodo
mximo para estouro de um timer de 8 bits que
incrementado a cada 1024 ciclos? E se o timer for
de 16 bits?


professor
Timer em Microcontroladores
Considere um clock de 16MHz. Qual o perodo
mximo para estouro de um timer de 8 bits que
incrementado a cada 1024 ciclos? E se o timer for
de 16 bits?

Incremento a cada 1024/(16*10^6) = 64 us.
Para 8 bits: estouro ocorre aps 256 incrementos:
256 * 64 us = 16,38 ms.
Para 16 bits: estouro ocorre aps 65.536
incrementos:
65.536 * 64 us = 4,194 s.
professor
Timer no ATmega
O ATmega328 possui trs circuitos independentes
de temporizadores, chamados de Timer0, Timer1
e Timer2.
Timer0: 8 bits. utilizado pelas funes delay()
e milis() do Arduino. Portanto, no
recomendvel usar o Timer0 se voc est usando
um Arduino;
Timer1: 16 bits. utilizado pela biblioteca Servo
do Arduino;
Timer2: 8 bits. utilizado pela biblioteca Tone do
Arduino.

professor
Timer no ATmega
professor
Timer no ATmega
Os microcontroladores ATmega1280 e
ATmega2560, usados nos Arduino Mega e Mega
2560, possuem os mesmos circuitos de Timer0,
Timer1 e Timer2 que o ATmega328;
Alm desses, eles tambm possuem outros trs
temporizadores de 16 bits: Timer3, Timer4 e
Timer5;
O funcionamento dos temporizadores
controlado por registradores especiais:
Timer/Counter Control Register A e B (TCCRxA e
TCCRxB), onde x o nmero do Timer.

professor
Timer no ATmega
professor
Timer no ATmega
Os 3 LSBs de TCCRxB configuram o perodo de
incremento do timer:
professor
Prtica: Pisca-LED Timer1
#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPIN 13
void setup() {
pinMode(LEDPIN, OUTPUT);
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
TIMSK1 = (1 << TOIE1); // enable Timer1 interrupt
TCCR1B |= (1 << CS10); // runs at clock speed
sei(); // enable global interrupts
}
void loop(){}
ISR(TIMER1_OVF_vect) {
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
}
professor
Prtica: Pisca-LED Timer1
Funcionou como esperado?
Porqu?
Modifique seu programa para que o LED pisque
numa velocidade perceptvel.
professor
Timer no ATmega
Os temporizadores do ATmega tambm podem ser
configurados para gerarem pedidos de interrupo
quando a contagem atingir um limite programado:
Clear Timer on Compare Match (CTC);
A seguir apresentado um exemplo de como seria
a funo setup() para fazer o LED 13 piscar a
intervalos de exatamente 1 segundo;
A ISR deve ser configurada da seguinte forma:
ISR(TIMER1_COMPA_vect) {
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
}
professor
Exemplo
void setup() {
pinMode(LEDPIN, OUTPUT);
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
OCR1A = 15624;
TCCR1B |= (1 << WGM12); // turn on CTC mode
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
}
professor
Watchdog Timer
professor
Watchdog Timer (WDT)
Sua funo proteger o sistema contra possveis
travamentos, fazendo com que o sistema reinicie
e volte a funcionar;
um circuito temporizador acionado por um
oscilador prprio, que incrementa um
registrador;
Quando ocorre o timeout (estouro), provoca um
reset no microcontrolador;
Opcionalmente, o estouro pode provocar um
pedido de interrupo.
professor
Watchdog Timer (WDT)
O ATmega328 possui um oscilador de 128kHz
dedicado ao watchdog timer.
No modo de operao normal, o programador
deve posicionar estrategicamente instrues de
reset do temporizador do watchdog (WDR), de
forma a evitar o estouro de contagem.
No modo de interrupo, o estouro do
temporizador pode ser usado para fazer uma
chamada peridica a uma funo, ou para
despertar o dispositivo de algum modo de
economia de energia.

professor
Watchdog Timer no Arduino
Para utilizar o watchdog timer do ATmega no Arduino
necessrio incluir a biblioteca <avr/wdt.h>.
A funo wdt_enable(opo) habilita o WDT.
A funo wdt_reset() zera a contagem.
opo uma constante que determina o tempo de estouro:
15 ms WDTO_15MS
30 ms WDTO_30MS
60 ms WDTO_60MS
120 ms WDTO_120MS
250 ms WDTO_250MS
500 ms WDTO_500MS
1 s WDTO_1S
2 s WDTO_2S
4 s WDTO_4S
8 s WDTO_8S
professor
Watchdog Timer no Arduino
Para utilizar o watchdog timer do ATmega no Arduino
necessrio incluir a biblioteca <avr/wdt.h>.
A funo wdt_enable(opo) habilita o WDT.
A funo wdt_reset() zera a contagem.
opo uma constante que determina o tempo de estouro:
15 ms WDTO_15MS
30 ms WDTO_30MS
60 ms WDTO_60MS
120 ms WDTO_120MS
250 ms WDTO_250MS
500 ms WDTO_500MS
1 s WDTO_1S
2 s WDTO_2S
4 s WDTO_4S
8 s WDTO_8S
No Arduino, podem
fazer o ATmega resetar
durante a gravao,
inutilizando o
microcontrolador!!
professor
Exemplo
#include <avr/wdt.h>
int led = 13;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
delay(2000);
wdt_enable(WDTO_8S);
}
void loop() {
digitalWrite(led, HIGH);
delay(20);
digitalWrite(led, LOW);
delay(980);
}
professor
Referncias
ARDUINO. Language Reference. Disponvel em:
<http://arduino.cc/en/Reference/HomePage>. Acesso em
20/set/2012.
ARDUINO. Hardware Index. Disponvel em:
<http://arduino.cc/en/Main/Boards>. Acesso em 20/set/2012.
ATMEL. ATmega48A/PA/88A/PA/168A/PA/328/P datasheet. Rev.
8271DAVR05/11. 2011.
ATMEL. Atmel AVR042: AVR Hardware Design
Considerations. Rev. 2521K-AVR-03/11. 2011.
LIMA, Charles B. de; VILLAA, Marco V. M. AVR e Arduino
Tcnicas de Projeto. 2 ed. 2012.
MARTINS, Felipe N. Introduo Eletrnica com Arduino.
Disponvel em: <http://www.slideshare.net/felipenm/oficina-de-
introduo-a-eletrnica-com-arduino>. Acesso em 20/set/2012.
http://www.engblaze.com/we-interrupt-this-program-to-bring-you-
a-tutorial-on-arduino-interrupts/ Acesso em 13/fev/2013.
http://www.engblaze.com/microcontroller-tutorial-avr-and-
arduino-timer-interrupts/ Acesso em 13/fev/2013.