Arduino Yun i przerwanie

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
panpac
Młodszy majsterkowicz
Posty: 4
Rejestracja: 5 gru 2014, 16:27

Arduino Yun i przerwanie

Post autor: panpac » 5 gru 2014, 16:46

Witam

Mam problem z przerwaniem w Arduino Yun.
Jeżeli dobrze rozumiem to po wykonaniu przerwania (przerwanie wykonuje się w momencie wykrycia zbocza narastającego) procesor powinien dalej wykonywać program główny a tak nie jest.
Tzn. po zmianie stanu na wejściu na wysoki (naciśnięcie przycisku), zostaje wykonane przerwanie i dalej program "wisi" w tym przerwaniu, nie wraca do wykonywania pętli loop().
Dopiero po pojawieniu się na wejściu stanu niskiego (puszczenie przycisku), program ponownie zaczyna się dalej wykonywać.

Mój kod wygląda mniej więcej tak:

Kod: Zaznacz cały


volatile int ilosc = 0;

void setup()
{
   attachInterrupt(0, inkrementacja, RISING);                                                            
}

void loop()
{

   // i tutaj kilka innych funkcji które powinny się wykonywać cyklicznie

}

void inkrementacja()                                            //funkcja obsługi przerwania. 
{
   ilosc = ilocs + 1;                                              //następuje inkrementacja i program "zostaje" w tym miejscu, nie wraca do loop();
                                                                       //aż do momentu puszczenia przycisku
}
Prosiłbym o pomoc/wyjaśnienie dlaczego tak się może dziać.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


zgred125
Majsterkowicz
Posty: 88
Rejestracja: 23 gru 2013, 22:39

Re: Arduino Yun i przerwanie

Post autor: zgred125 » 5 gru 2014, 20:34

A mnie się wydaje, że wraca wykonuje jedną linię kodu maszynowego i wraca do kodu przerwania. Puść sobie na serial monitor wartość zmiennej ilość i sprawdź czy przy jednym przytrzymaniu przycisku zmienna ma wartość 1 a nie np 297

Nie wiem czy w Yun jest tak samo jak w leonardo ale może pomoże. Przerwania w leonardo mają swoje numery i przypisane do nich piny. Czyli np przerwanie 0 przypisane do pinu 3 przerwanie 1 do pinu 2 a u Ciebie masz taki sam numer przerwania jak pinu. Nie wiem czy to jest całość kodu ale nie ma u Ciebie w funkcji setup określenia czy pin jest wyjściem czy wejściem. Dla leonardo wygląda to tak:

Kod: Zaznacz cały

int pin = 3;
void inkrementacja()
{
  ilosc = ilocs + 1;
}

void setup()
{
  pinMode(pin, INPUT);
  attachInterrupt(0, inkrementacja, RISING);
}
void loop()
{
  //blok instukcji
}

Czyli: Uważaj na pin 2 bo do niego jest podpięte przerwanie nr 0 i jeśli pojawi się tam zbroczę narastające (z 0 na 5V) to uruchom podfunkcję inkrementacja
panpac
Młodszy majsterkowicz
Posty: 4
Rejestracja: 5 gru 2014, 16:27

Re: Arduino Yun i przerwanie

Post autor: panpac » 8 gru 2014, 11:07

Jeżeli zacznę nowy projekt i przepiszę kod przerwania (pętla loop pusta) wszystko jest ok. Działa dokładnie tak jak chcę.

Problem musi leżeć gdzieś w reszcie programu, który jest całkiem spory.
Obsługuje: wyświetlacz, rtc, klawiaturę oraz telnet i kilka innych rzeczy.
Czy istnieje możliwość, że któraś z bibliotek korzysta z przerwania i coś psuje ?
Oczywiście nigdzie nie używam delay();
panpac
Młodszy majsterkowicz
Posty: 4
Rejestracja: 5 gru 2014, 16:27

Re: Arduino Yun i przerwanie

Post autor: panpac » 11 gru 2014, 11:54

Znalazłem przyczynę problemu chociaż jej nie rozumiem.
Jak już wyżej napisałem używam zegara RTC podłączonego do arduino przez I2C.
Mam funkcję odczytującą datę i godzinę, które jest wywoływana z pętli głównej.

Kod: Zaznacz cały

void getDate()
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);

  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read() & 0b111111); 
  weekDay = bcdToDec(Wire.read()); 
  monthDay = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}
Jeżeli zakomentuje wywołanie tej funkcji z pętli głównej wszystko działa właściwie, Przerwanie jest obsługiwanie tak jak powinno. Za to jak tylko zacznę ją wywoływać, przerwanie natychmiast przestaje działać. Czy ktoś wie może dlaczego tak się dzieje ??
zgred125
Majsterkowicz
Posty: 88
Rejestracja: 23 gru 2013, 22:39

Re: Arduino Yun i przerwanie

Post autor: zgred125 » 11 gru 2014, 19:17

A spróbuj wykluczyć wywołanie odczytu z obsługi przerwań. Chodzi o to, żeby na czas odczytu wyłączyć możliwość przerwań a zaraz po włączyć ją ponownie. Coś takiego:

Kod: Zaznacz cały

void loop()
{
  noInterrupts();
  getDate();  
  interrupts();
}
panpac
Młodszy majsterkowicz
Posty: 4
Rejestracja: 5 gru 2014, 16:27

Re: Arduino Yun i przerwanie

Post autor: panpac » 12 gru 2014, 12:53

Próbowałem, przestaje odczytywać datę, czy jest możliwe, że korzysta z tego samego przerwania ??
Przepinałem też na inne wejście przerwaniowe i efekt taki sam.
zgred125
Majsterkowicz
Posty: 88
Rejestracja: 23 gru 2013, 22:39

Re: Arduino Yun i przerwanie

Post autor: zgred125 » 12 gru 2014, 14:29

Wklej cały kod
ODPOWIEDZ

Strony partnerskie: