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 tempo. Uma boa tarefa para usar uma interrupção pode ser a leitura de um encoder rotativo, a 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