niedziela, 15 listopada 2015

[19] Arduino - Przerwania

Tym razem opiszę sposób obsługi przerwań sprzętowych w Arduino.

Wstęp


Z przerwań sprzętowych można wybrać takie, które są generowane zewnętrzne (np. od przycisku) oraz takie które działają na zmiany stanu pinu. Oprócz tego przerwania mogą być jeszcze generowane poprzez timery.

W Arduino Uno przerwania z zewnętrznych urządzeń można ustawić na pinach 2 (Int 0) i 3 (Int 1). 

Przerwania mogą być wywoływane w następujących sytuacjach:
  • Gdy na pinie wystąpi stan niski (LOW);
  • Jak nastąpi zmiana stanu na pinie (CHANGE);
  • Gdy wystąpi narastające zbocze sygnału (RISING);
  • Przy opadającym zboczu sygnału (FALLING);

Program - przerwania z przycisku


Ten punkt zawiera krótki program prezentujący możliwość przerwania zewnętrznego. Do układu podłączono takie elementy jak diodę czerwoną, zieloną, żółtą oraz przycisk. Ten ostatni został podłączony do pinu 2, na którym można wytworzyć przerwanie Int 0. Został on podłączony do masy, przez co powoduje to wywołanie przerwania w momencie wystąpienia sygnału niskiego.

//Deklaracja przycisku jako 0, podłączenie do pinu 2
const int BUTTON = 0;
 
//Definicja pinów do których zostały podłączone diody
const int DiodeRed = 11;
const int DiodeGreen = 10;
const int DiodeYellow = 9;
 
//Zmienna volatile, może ulegać zmiannie podczas przerwania
volatile int LedToChange = DiodeRed;
 
void change(void);
 
void setup()
{
  //Inicjalizacja pinów z podłączonymi diodami
  pinMode (DiodeRed, OUTPUT);
  pinMode (DiodeGreen, OUTPUT);
  pinMode (DiodeYellow, OUTPUT);
 
  //Przycisk zwarty do masy przerwanie w stanie niskim
  attachInterrupt(BUTTON, change, FALLING);
}
 
void loop()
{
  for (int i = 0; i<=255; i++)
  {
    analogWrite(LedToChange, i);
    delay(5);
  }
  for (int i = 255; i>= 0; i--)
  {
    analogWrite(LedToChange, i);
    delay(5);
  }
}
 
void change()
{
  //Wylaczenie diody aktualnie zapalonej
  analogWrite(LedToChange, 0);
 
  //Następnie aktualna dioda ulega zmianie na odpowiednią inną
  if (LedToChange == DiodeGreen){
    LedToChange = DiodeRed;
  }
 
  else if (LedToChange == DiodeRed){
    LedToChange = DiodeYellow;
  }
 
  else if (LedToChange == DiodeYellow){
    LedToChange = DiodeGreen;
  }
}

Program - przerwania timer pierwszy


Przykład przedstawia prosty sposób inicjalizacji przerwania poprzez timer 1. W pierwszej kolejności ustawiany jest przerwanie co 1s. Funkcja jako parametr przyjmuje czas w ms. Następnie przypisuje się do przerwania funkcje jaka ma zostać wykonywana. Obsługa przerwania zmiana stan zapalonej diody na przeciwny.

#include <TimerOne.h>
 
void Mruganie(void);
 
void setup()
{
  pinMode(13, OUTPUT);
  //Ustawienie przerwania co 1s
  Timer1.initialize(1000000);
  //Przyczepienie funkcji mruganie do timera1
  Timer1.attachInterrupt(Mruganie);
}
 
void loop()
{}
 
void Mruganie()
{
  digitalWrite(13, !digitalRead(13));
}

Do programu należy dołączyć bibliotekę pozwalającą na obsługę tego timera. Ma ona nazwę TimerOne.h i powinna być ona dołączona do środowiska. Więc nie ma konieczności jej specjalnie ściągać.