• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przerwanie zewnętrzne
#1
Witam , chciałbym zainplementować przerwanie zewnętrzne w taki sposób aby oba czujniki MAX30100 ( pomiar pulsu i saturacji ) oraz GY-61 ( akcelerometr) " nie pracowały " w tej samej chwilii . Czujnik pulsu posiada złącze INT , które jest podpięte do pinu D2 arduino nano , jestem zielony jeśli chodzi o przerwania dlatego nie wiem czy napisałem je prawidłowo , czy mógłby ktoś to zweryfikować ? 

poza tym czy funkcja " przerwanie " nie powinna być wywołana w funkcji loop ? 

Z góry dzięki za pomoc.

Kod:
volatile int stan = LOW;
void setup()
{
  Serial.begin(9600);
 pinMode(2,INPUT);
  attachInterrupt(digitalPinToInterrupt(2),przerwanie,CHANGE);
  czujnik_max30100.begin();
 
 
}
void loop(){

część kodu związana z obsługą akcelerometru {

...

}

część kodu związana z obsługą MAX30100 {

...

}

}


}
void przerwanie(){
  stan =!stan;
  digitalWrite(2,stan);
}
 
Odpowiedź
#2
To się zdecyduj czy pin nr2 ma działać jako wejście czy wyjście ??

Bo w tej chwili to masz tylko bałagan...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(22-01-2020, 20:41)Jarewa0606 napisał(a): To się zdecyduj czy pin nr2 ma działać jako wejście czy wyjście ??

Bo w tej chwili to masz tylko bałagan...
Źle wkleiłem kod  

pinMode(2,INPUT); jest prawidłowe
 
Odpowiedź
#4
To tez zle wkleiłes??

stan =!stan;
digitalWrite(2,stan);
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
Witam,
W podanym przez Kolegę przypadku nie następuje przecież żaden konflikt czujników. Przecież GY-61 ma analogowe wyjścia, czyli działa niezależnie i "na wciąż". uC może z niego czytać wartości kiedy chce (konwersja ADC), natomiast MAX30100 ma komunikację przez I2C. Poza tym wejście INT tego czujnika w implementacjach programów jest podłączane do WYJŚCIA uC, czyli podanie jakiegoś stanu- lub jego zmiana- na to wejście czujnika powoduje w nim jakąś akcję. W innych modułach nóżka do obsługi przerwań sygnalizuje koniec konwersji i gotowość wysłania danych do uC. Należy się zatem upewnić, który rodzaj wyprowadzenia występuje w przypadku tego MAX-a?
Oczywiście podana przez Kolegę funkcja obsługująca przerwanie jest pozbawiona sensu.
Pozdrawiam,
Tomek
 
Odpowiedź
#6
(23-01-2020, 08:31)Smaczek napisał(a): Należy się zatem upewnić, który rodzaj wyprowadzenia występuje w przypadku tego MAX-a?

MAX30100 ma tylko jeden rodzaj wyjścia INT.
Po pobieżnym zaznajomieniu się z notą, można powiedzieć, że działa to w ten sposób:

W rejestrze Interrupt Enable o adresie 0x01, można ustawić cztery starsze bity, aby skonfigurować urządzenie do konkretnej pracy.
Przykładowo gdy ustawimy Bit:5 ENB_HR_ RDY, wprowadzamy MAX'a w tryb pomiaru tętna. Źródłem przerwania będzie moduł HR, który wystawi zero na pin INT po zakończeniu konwersji. Aby dowiedzieć się jaki to rodzaj przerwania należy odczytać rejestr Interrupt Status (adres 0x00). Jeśli wynikiem jest (bitowo) b00100000, czyli HR_RDY, to oznacza że czytamy właśnie tętno.
Później dopiero czytamy wynik konwersji, ponieważ opróżnienie bufora resetuje wszystkie bity rejestru statusu.

Można też czytać FIFO wprowadzając MAX'a w dany tryb, ale nie używać przerwań, choć wiąże się to z ryzykiem utraty niektórych danych przy przepełnieniu bufora.

edit: A cha, no i zamiast tego: attachInterrupt(digitalPinToInterrupt(2),przerwanie,CHANGE);
powinno być to: attachInterrupt(digitalPinToInterrupt(2),przerwanie,FALLING);
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości