wanderleycardoso-aula 03 - interrupções e temporizadores
TRANSCRIPT
AULA 03: Interrupções e Temporizadores
Sistemas Embarcados
professor
Interrupção
• Evento de hardware que, quando ocorre, provoca um desvio no programa, isto é, interrompe momentaneamente o fluxo normal de execução 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 interrupção
Interrupções
professor
• A rotina de tratamento de interrupção (ISR – Interrupt Service Routine) deve:– Salvar contexto (registrador Status e outros);– Verificar qual evento ocorreu;– Tratar a interrupção;– Restaurar o contexto;– Retornar.
Interrupções
professor
• Existem dois tipos de interrupção no AVR:– Um seta um interrupt flag (evento fica memorizado);– Outro não seta flag (é esquecido se não for executado
enquanto o evento estiver presente).– Quando ocorre um desvio para rotina de
interrupção, o bit I de SREG (GIE) é zerado. Ele é novamente setado pela instrução de retorno;
– Antes de fazer o desvio para a rotina de interrupção, a instrução em curso é concluída;
– No retorno, o AVR sempre voltará ao programa principal e executará uma instrução, mesmo que já exista outra interrupção com flag setado.
Interrupções
professor
• O ATmega328 possui 26 fontes de interrupção;• As interrupções podem ser tratadas ou não;• Para que uma interrupção seja tratada, ela precisa
estar habilitada, sendo que cada interrupção pode ser habilitada individualmente;
• A habilitação é feita por meio de registradores específicos;
• Para habilitar a uma interrupção é necessário:– 1º - Habilitar a chave individual da interrupção desejada; – 2º - Habilitar a chave geral de interrupção (bit I de SREG).
– Cada fonte de interrupção provoca desvio para um endereço específico (vetor de interrupção).
Interrupções
professor
Interrupções
professor
Interrupções
professor
Interrupções
professor
• As interrupções possuem diferentes prioridades: quanto menor é o endereço, maior é a prioridade da interrupção correspondente;
• O desvio para uma rotina de interrupção leva pelo menos 4 ciclos de clock;
• Se estiver em modo sleep, 4 ciclos adicionais são necessários, além do tempo para acordar o processador;
• O retorno da interrupção também leva 4 ciclos de clock;
Interrupções
professor
• Todo o controle e sinalização de eventos de interrupção é feito por registradores;
• Por exemplo, o registrador EICRA contém os bits de configuração das interrupções externas INT0 e INT1;
• A habilitação dessas interrupções é feita pelos bits 0 e 1 do registrador EIMSK;
• A ocorrência do evento externo nos pinos INT0 e INT1 é sinalizada pelo registrador EIFR.
Interrupções
professor
• A mudança de nível em qualquer pino do ATmega328 pode provocar interrupção (PCINT0 a PCINT23);
• Dois desses pinos (INT0 e INT1) também podem provocar interrupção por:• Borda de subida;• Borda de descida;• Manutenção do estado lógico (baixo).
• Ao contrário das interrupções por mudança de nível, INT0 e INT1 têm vetores de interrupção específicos e de alta prioridade.
Interrupções
professor
Pinos de Interrupção 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 • }
Interrupções - Exemplo
professor
• O Arduino possui funções específicas para lidar com interrupções externas:
• Para trabalhar com outras interrupções, é necessário configurar os registradores do ATmega328P. Veremos um exemplo desse tipo mais adiante.
Interrupções 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 • }
Interrupções no Arduino
professor
• Enquanto a ISR está sendo executada o processador paralisa outros processos e desabilita as interrupções;• A função delay() não funciona;• A função milis() não é incrementada;• Dado recebido pela serial pode ser perdido;• Outros eventos de interrupção só serão atendidos
quando a ISR atual for concluída;• Dica: construa a ISR de modo que fique o mais
curta possível;• Toda variável modificada dentro da ISR deve ser
declarada como volatile.
Interrupções 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
Prática: Contador de pessoas• Você está construindo um sistema de
catraca eletrônica para controle de acesso. Uma das funções do sistema é contar o número de pessoas que passam pela catraca. Um sensor óptico ligado ao pino INT0 gera um pulso a cada volta da catraca. Um botão está ligado ao pino INT1.
• Faça um programa que utilize interrupção para contar quantas pessoas passaram pela catraca. Quando o botão for pressionado, o LED do pino 13 deve piscar um número de vezes igual ao número de pessoas contado.
professor
Temporizadores/Contadores
professor
Timer em Microcontroladores
• Um timer, ou temporizador, é um circuito auxiliar ao microprocessador (periférico);
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 interrupção, permitindo a execução de código a intervalos regulares com precisão;
• Além disso, como o timer não 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 período possível entre incrementos de contagem para um timer?
professor
Timer em Microcontroladores
• Considerando um clock de 16MHz, qual é o menor período possível 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 período mínimo de incremento é de:1/(16*10^6) = 62,5 ns.
• Esse valor representa a resolução do timer.
professor
Timer em Microcontroladores
• Considere um clock de 16MHz. Qual é o período máximo 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 período máximo 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 após 256 incrementos:
256 * 64 us = 16,38 ms.• Para 16 bits: estouro ocorre após 65.536
incrementos:65.536 * 64 us = 4,194 s.
professor
Timer no ATmega
• O ATmega328 possui três circuitos independentes de temporizadores, chamados de Timer0, Timer1 e Timer2.
• Timer0: 8 bits. É utilizado pelas funções delay() e milis() do Arduino. Portanto, não é recomendável 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;
• Além desses, eles também possuem outros três 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 número do Timer.
professor
Timer no ATmega
professor
Timer no ATmega
• Os 3 LSBs de TCCRxB configuram o período de incremento do timer:
professor
Prática: 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
Prática: Pisca-LED Timer1• Funcionou como esperado?• Porquê?• Modifique seu programa para que o LED pisque
numa velocidade perceptível.
professor
Timer no ATmega
• Os temporizadores do ATmega também podem ser configurados para gerarem pedidos de interrupção quando a contagem atingir um limite programado: Clear Timer on Compare Match (CTC);
• A seguir é apresentado um exemplo de como seria a função 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 função é proteger o sistema contra possíveis travamentos, fazendo com que o sistema reinicie e volte a funcionar;
• É um circuito temporizador acionado por um oscilador próprio, que incrementa um registrador;
• Quando ocorre o timeout (estouro), provoca um reset no microcontrolador;
• Opcionalmente, o estouro pode provocar um pedido de interrupção.
professor
Watchdog Timer (WDT)
• O ATmega328 possui um oscilador de 128kHz dedicado ao watchdog timer.
• No modo de operação normal, o programador deve posicionar estrategicamente instruções de reset do temporizador do watchdog (WDR), de forma a evitar o estouro de contagem.
• No modo de interrupção, o estouro do temporizador pode ser usado para fazer uma chamada periódica a uma função, 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 é
necessário incluir a biblioteca <avr/wdt.h>.• A função wdt_enable(opção) habilita o WDT.• A função wdt_reset() zera a contagem.opção é 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 é
necessário incluir a biblioteca <avr/wdt.h>.• A função wdt_enable(opção) habilita o WDT.• A função wdt_reset() zera a contagem.opção é 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 gravação, 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
Referências• ARDUINO. Language Reference. Disponível em:
<http://arduino.cc/en/Reference/HomePage>. Acesso em 20/set/2012.
• ARDUINO. Hardware Index. Disponível em: <http://arduino.cc/en/Main/Boards>. Acesso em 20/set/2012.
• ATMEL. ATmega48A/PA/88A/PA/168A/PA/328/P datasheet. Rev. 8271D–AVR–05/11. 2011.
• ATMEL. Atmel AVR042: AVR Hardware Design• Considerations. Rev. 2521K-AVR-03/11. 2011.• LIMA, Charles B. de; VILLAÇA, Marco V. M. AVR e Arduino –
Técnicas de Projeto. 2ª ed. 2012.• MARTINS, Felipe N. Introdução à Eletrônica com Arduino.
Disponível 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.