Skocz do zawartości

Funkcja Input Capture w Arduino


ximot

Pomocna odpowiedź

29 minut temu, farmaceuta napisał:

Chyba malo osob z tego korzysta...szczerze to ja dopiero teraz sie dowiedzialem ze cos takiego istnieje...

I to jest wada arduino.

35 minut temu, farmaceuta napisał:

a nie mozesz mierzyc tego impulsu z uzyciem przerwan??

ICP jest przerwaniem które można konfigurować na zbocze narastające lub opadające albo oba naraz. Nie wiem jak obsługuje to arduino ale mogę pokazać kod w C jak to się "drzewniej" robiło 😉 Choć może lepiej zobacz sobie na tę stronę https://www.electronicwings.com/avr-atmega/atmega1632-timer-input-capture-mode

 

 

  • Lubię! 2
Link do komentarza
Share on other sites

1 minutę temu, _LM_ napisał:

ICP jest przerwaniem które można konfigurować na zbocze narastające lub opadające albo oba naraz.

Zaraz zaraz...ale zwykle przerwania zewnetrzne tez tak mozna konfigurowac...nawet biblioteka do PCINT tez to umozliwia...no chyba ze cos mi umknelo...😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Tak to prawda, jednak ICP ma taką właściwość że przechwytuje stan timera w locie i potrzebuje do tego mniej instrukcji niż obsługa przerwanie PCINT nie mam teraz tego jak pokazać, dokładniej jest to opisane w pdf atmegi. 

Edytowano przez _LM_
Link do komentarza
Share on other sites

2 minuty temu, _LM_ napisał:

Tak to prawda, jednak ICP ma taką właściwość że przechwytuje stan timer w locie i potrzebuje do tego mniej instrukcji niż obsługa przerwanie PCINT nie mam teraz tego jak pokazać, dokładniej jest to opisane w pdf atmegi. 

Ok lapie cokolwiek😉 no nic...kolega wyzej musi sie odezwac i powiedziec jakiej dokladnosci oczekuje, bo nawet PCINT ktore jest wolniejsze niz przerwanie zewnetrznie potrzebuje kilku mikrosekund wiec do wiekszosci zastosowan to napewno wystarczy..

Link do komentarza
Share on other sites

Dodatkowo o ile pamiętam to ICP może być wewnętrznie podłączony do komparatora analogowego lub nawet przetwornika ADC co znacznie zwiększa jego możliwości. Ogółem bardzo fajny jest ten timer czasem wykorzystuje się go do dekodowania ramek z pilota IR. Możesz też użyć go do pomiaru prędkości obrotowej jakiegoś silnika itd...

Edytowano przez _LM_
Link do komentarza
Share on other sites

3 minuty temu, farmaceuta napisał:

no nic...kolega wyzej musi sie odezwac i powiedziec jakiej dokladnosci oczekuje

Tak liczę że sprawdzi link który podałem i będziemy mieli jakiś punkt odniesienia w dyskusji 🙂

Link do komentarza
Share on other sites

Witam Panowie. Generalnie napotkałem problem odbierania komend z pilota IR, kiedy wywołuję funkcję do pomiaru odległości z czujnika HC-SR04. Mój robot przestaje reagować na komendy wysyłane przez pilot telewizyjny, ponieważ prawdopodobnie program przez większość czasu liczy odległość. Dokopałem się do informacji, że można to rozwiązać właśnie taka funkcją, natomiast jestem laikiem w tym temacie i poszukuję informacji... 

Link do komentarza
Share on other sites

Niestety ta strona (tj kod tam zamieszczony) którą ci podałem nie używa przerwań i wgl ten program jest do kitu napisany. Więc coś ode mnie możliwe że popełniłem  błedy gdyż tego kodu nie sprawdzam. Aby skonfigurowac timer musisz:

	PORTB|=(1<<PB0); // icp na pb0
	TCCR1B|=(1<<CS11)|(1<<CS10); // prescaler 1024
	TCCR1B&=~(1<<ICES1); // zbocze opadające
	TIMSK|=(1<<TICIE1); //  enable ICP intterrupt
	TIMSK|=(1<<TOIE1); // przerwanie od przepełnienia
sei();

To jest konfiguracja następnie przerwanie:

ISR(TIMER1_CAPT_vect){ // przerwanie od przechwytu
// tutaj możesz odczytać przechwyconą wartość timera1
  static uint16_t val = TCNT1;
// w ten sposób możesz odwrócić na zbocze narastające
  TCCR1B &=~(1<<ICES1);
// lub za pomocą toggle wtedy za każdym razem przerwanie będzie działało na zboczu przeciwnym
  TCCR1B^=(1<<ICES1);
}
ISR(TIMER1_OVF_vect){ // przerwanie od przepełnienia 
}

Mam nadzieję że łapiesz

I jeszcze notka od Atmela jak się za to zabrać klik

Edytowano przez _LM_
Link do komentarza
Share on other sites

(edytowany)

IR mam na płytce i jest skonfigurowane jako DI2.

Serdeczne dzięki za pomoc, jestem bardzo wdzięczny! W prawdzie nie rozumiem wszystkiego, ale po prostu będę musiał jeszcze poczytać o tym. 

W razie problemów, napiszę tutaj.

Edytowano przez ximot
Link do komentarza
Share on other sites

Jak ten kod, który zamieściłeś powyżej ma się w czasie do obsługi funkcji czujnika SR04?
 

// funkcja do obsługi czujnika odległości zwracająca odległość do przeszkody
int DistanceSensor ()
{

digitalWrite (TRIG, LOW);                                // zmiana stanu sygnału z wysokiego na niski na wyjściu TRIG powoduje wyzowlenie pomiaru
delayMicroseconds (5);
digitalWrite (TRIG, HIGH);
delayMicroseconds (15);
digitalWrite (TRIG, LOW);

measured_time = pulseIn(ECHO, HIGH);                    // dokonanie pomiaru czasu trwania impulsu na wyjściu ECHO
measured_distance = measured_time / 58 ;                // zmierzony czas podzielony przez 58 daje odległość w cm

return measured_distance;

}

Czemu ta manklatura użytego przez Ciebie kodu jest taka... inna? Gdzie można znaleźć opis użytych przez Ciebie symboli i znaków?
O co chodzi z tym przerwaniem od przepełnienia i prescalerem? 

Link do komentarza
Share on other sites

To są typowe operacje na rejestrach mikrokontrolera. Operatory których użyłem są operatorami logicznymi np << przesuwanie bitowe, ^ negacja itd. 

7 minut temu, ximot napisał:

O co chodzi z tym przerwaniem od przepełnienia i prescalerem?

Prescaler to dzielnik impulsów które później są zliczane przez timer. Czyli jesli twój mikrokontroler pracuje z kwarcem 16Mhz to prescaler dzieli wstępnie tę częstotliwość aby nie było potrzeba zbyt często wywoływać przerwań od przepełnienia(o tym za chwilę). Więc timer pracuje na częstotliwości 16Mhz/1024 15.625kHz. Jego pojemność to 16bit czyli maksymalnie zlicza do 65536 gdy doliczy do tej wartości zgłasza przerwanie czyli funkcję która wykonuje się jakby poza programem głównym. I liczy sobie dalej. Ja uczyłem się pisać w C więc nie znam wszystkich niuansów bibliotek Arduino. Co do linków mogę polecić: http://mikrokontrolery.blogspot.com/ Nie wiem w którą stronę chcesz skierować swoją drogę nauki i rozwoju chodzi o to że może warto zainwestować w jakąś książkę?

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.