domingo, 17 de agosto de 2014

Interrupção no Arduino

    Recentemente tive o prazer de fazer um mini-curso sobre Arduino ministrado pelo PET de Mecatrônica/BSI da minha Faculdade  IFET/jf. Nesse evento tive uma ótima oportunidade de dar uma reciclada na forma de programar. Aprendi muito! E uma item em especial que destaco e justamente sobre o uso da interrupção com o Arduino.
    Já sabia que a placa poderia fazer tal ação, mas desconhecia como era feito a programação e o raciocínio. Achei muito interessante e bem poderosa a ferramenta. E gostaria de apresentar algo aqui no blog. Então vamos lá!

    Interrupções são funções que são chamadas quando algum evento externo acontece. Quando isso acontece o programa principal é parado, a função de interrupção é chamada e após sua execução o programa principal pode, ou não voltar a ser executado a partir de onde foi interrompido. Existem diversos tipos de interrupções, mas no Arduino vamos tratar de duas.




Timers

    Um timer é uma espécie de contador do Arduino que conta uma quantidade x de pulsos de clock, equivalentes à uma quantidade pré-estabelecida de ms. Quando ele chega no final de sua contagem ele manda um sinal para o Arduino. 
      Timers são essênciais para as interrupções por intervalo de tempo.
     O arduíno tem diversos timers, o 0, por exemplo é seu timer principal, que ele usar para a função delay e contagens internas importantes. Quando não está sendo usado, ele pode ser chamado pelo usuário para controlar outras rotinas.
     Qualquer um dos timers podem ser chamados e configurados atravéz de uma série de comandos. Mas a complexidade dos mesmos fogem dos objetivos desse curso introdutório. O Timer 1 e 3 possuem bibliotecas próprias, a partir das quais é possível configurar e usar facilmente os mesmos. Elas não vem originalmente com a IDE e podem ser baixadas em http://www.pjrc.com/teensy/td_libs_TimerOne.html.

Timer1

    Para configurarmos o timer1, devemos incluir a biblioteca TimerOne. Essa inclusão é feita de forma semelhante à linguagem c, com o comando #include<TimerOne.h>.
    Depois devemos inicializar o timer no setup. Isso é feito atravéz do comando: 
Timer1.initialize(tempo)
    A quantidade de tempo é dada em microsegundos.

attachInterrupt(interrupt, function, mode)


        Descrição: Especifica uma função para chamar quando ocorre uma interrupção externa. Substitui qualquer função anterior, que foi anexada à interrupção.  A maioria das placas Arduino tem duas interrupções externas: int 0 (pino digital 2) e int 1 (pino digital 3). O Arduino Mega tem mais quatro: os números 2 (pino 21), 3 (pino 20), 4 (pino 19), e 5 (pino 18).

Parâmetros
    Interrupt: o número da interrupção (int)

    Function: a função para chamar quando a interrupção ocorre, esta função não deve ter parâmetro e não retorna nada. Esta função é por vezes referido como uma rotina de serviço de interrupção.

    Mode: Define quando a interrupção deve ser acionada. Quatro constantes são pré-definidos como valores válidos:

  • 1.      LOW: Dispara a interrupção quando o pino é baixo;
  • 2.      CHANGE: Dispara a interrupção sempre que os pinos mudam de estado;
  • 3.      RISING: Dispara quando o pino vai de baixo a alto;
  • 4.      FALLING: Dispara a interrupção quando o pino vai de alto para baixo.

    Retorna
    Nada.

    Nota
    Dentro da attached function.,  delay () não vai funcionar e o valor retornado pelo millis () não será incrementado. Dados seriais recebidos podem ser perdidos. Você deve declarar como voláteis quaisquer variáveis 
​​que modificam dentro da attached function.

     Usando Interrupções
    Interrupções são úteis para fazer as coisas acontecerem automaticamente em programas de microcontroladores e pode ajudar a resolver problemas de tempoUma boa tarefa para usar uma interrupção pode ser a leitura de um encoder rotativoa entrada do usuário de monitoramento. Outros sensores possuem uma interface dinâmica, como tentar ler um sensor de som que está tentando pegar um clique, ou um sensor infravermelho (foto-interruptor). Em todas essas situações, usando uma interrupção pode liberar o microcontrolador para realizar algum outro trabalho.

Exemplo de blink com interrupção:


 #include <TimerOne.h>  
 int sinal = 0;  
 void setup(){  
  Timer1.initialize(100000);  
  Timer1.attachInterrupt(chama);  
 }  
 void loop(){  
  digitalWrite(13, sinal);  
 }  
 void chama(){  
  sinal =~ sinal;  
 }  



Referencias 



http://sites2.jf.ifsudestemg.edu.br/sites/default/files/Li%C3%A7%C3%A3o-4%20Slides.pdf




Nenhum comentário:

Postar um comentário