wanderleycardoso-aula 03 - interrupções e temporizadores

43
AULA 03: Interrupções e Temporizadores Sistemas Embarcados

Upload: ricardo-albrecht

Post on 07-Feb-2016

84 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

AULA 03: Interrupções e Temporizadores

Sistemas Embarcados

Page 2: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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;

Page 3: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 4: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 5: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 6: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 7: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Interrupções

Page 8: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Interrupções

Page 9: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Interrupções

Page 10: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 11: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 12: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 13: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Pinos de Interrupção Externa

Page 14: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 15: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 16: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 17: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 18: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 19: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 20: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 21: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Temporizadores/Contadores

Page 22: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Timer em Microcontroladores

• Um timer, ou temporizador, é um circuito auxiliar ao microprocessador (periférico);

Page 23: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 24: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Timer em Microcontroladores

• Considerando um clock de 16MHz, qual é o menor período possível entre incrementos de contagem para um timer?

Page 25: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 26: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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?

Page 27: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 28: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 29: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Timer no ATmega

Page 30: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 31: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Timer no ATmega

Page 32: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Timer no ATmega

• Os 3 LSBs de TCCRxB configuram o período de incremento do timer:

Page 33: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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));• }

Page 34: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Prática: Pisca-LED Timer1• Funcionou como esperado?• Porquê?• Modifique seu programa para que o LED pisque

numa velocidade perceptível.

Page 35: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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));• }

Page 36: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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();• }

Page 37: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

professor

Watchdog Timer

Page 38: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 39: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.

Page 40: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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

Page 41: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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!!

Page 42: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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);• }

Page 43: Wanderleycardoso-Aula 03 - Interrupções e Temporizadores

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.