Skocz do zawartości

Funkcja Input Capture w Arduino


Pomocna odpowiedź

8 minut temu, _LM_ napisał:

Tak na szybko odpowiadam w przerwaniu mususz aktualizowac tcnt2

O ile dobrze rozumiem to musze ten rejestr aktualizowac ,ale tylko wtedy kiedy wartosc ma byc mniejsza niz pojemnosc tego rejestru...w moim przypadku nie istotne bo zawsze zliczam od 0-256 zakresu 8-bitow...po przepelnieniu, osiagnieciu tej wartosci wywolane jest przerwanie i "TCNT" jest automatycznie kasowane do wartosci 0...cykl sie powtarza..

 

14 minut temu, _LM_ napisał:

albo skorzystać z rejestru porownania ocr2 chyba.

No tak, ale to juz w trybie porownania z opcja "CTC"..a ja korzystam ze zwyklego trybu licznika bez "OCR" czy "CTC"..i tez ma dzialac bez zadnych wygibasow..poprostu wykonuje sie to u mnie 2 razy szybciej i tyle. To zaden problem pomnozyc razy 2 przed uwzglednieniem wartosci zmiennych itp. no ale, jednak wolalbym wiedziec czemu tak sie dzieje...obliczenia chyba dobre mam..stad moje zdziwienie...dzieki za pomaganie/poswiecony czas😉

Link to post
Share on other sites
(edytowany)

Ok odrobiłem się troszkę więc tak: Dobrze kombinujesz z tym liczeniem jednak wg noty powinieneś ustawić bity CS20,21,22 wtedy preskaler wyniesie 1024. Liczy się to tak fCpu/1024 = 15625kHz co daje 1/15625 64µS na wejściu timera. Więc przy maks pojemności timera przerwanie będzie generowane co  16.32 mS trzeba 61 przerwań dla jednej sekundy. Co do programu nie wiem jak to jest w Arduino ale kompilatory C wymagają aby zmienna która ma być przeliczana w przerwaniu musi być volatile, jak jest w arduino nie wiem.. Przykładowy program mógłby wyglądać tak:

volatile uint8_t sek = 0;

void setup() {
pinMode(13, OUTPUT);
                                
  TCCR2B|=(1<<CS22)|(1<<CS21)|(1<<CS20);  //preskaler na 1024
  TIMSK2|=(1<<TOIE2);    //wlaczenie przerwania od przepelnienia
  //TCNT2=0;               //przypisanie wartosci startowej do licznika --> niepotrzebnie gdyż licznik i tak ma wartość 0
  sei();                 // przerwania globalne wlacz
}


void loop() {
//delay(77777);
/*
if (x == 61)  {
  digitalWrite(13, HIGH);
}
if (x == 122)  {
  digitalWrite(13, LOW);
  x = 0;
*/
digitalWrite(13, sek % 2);
}



ISR(TIMER2_OVF_vect)
{
  static uint8_t ovfCount = 61;
  if(!--ovfCount){
  sek++;
    ovfCount = 61;
  }
 }

 

Edytowano przez _LM_
  • Lubię! 1
Link to post
Share on other sites

Teraz mam sytuacje dokladnie przeciwna...czyli czestotliwosc zmiany jest dwa razy wolniejsza niz powinna..czyli 2s-on /2s-off itd.😉hehe

A czym sie roznia te vectory(?)?

TIMER1_CAPT_vect
TIMER1_OVF_vect

z tego co widze to kazdy z trzech timerow posiada te "funkcje" dobrze rozumiem ze

TIMER1_OVF_vect

Moge uzywac tylko w trybie normalnym/licznik a ten drugi czyli

TIMER1_CAPT_vect

W trybie porownania(?) z CTC..?

No i jeszcze takie pytanie mi sie nasuwa ze dzieki jednemu czy drugiemu trybowi moge odczytac lub wczytac stan logiczny na dowolny pin powiedzmy co 10us...wiec jaka przewage maja te piny? 

OC0
OC1
OC2

 

Link to post
Share on other sites
17 minut temu, farmaceuta napisał:

Teraz mam sytuacje dokladnie przeciwna...czyli czestotliwosc zmiany jest dwa razy wolniejsza niz powinna..czyli 2s-on /2s-off itd.😉hehe

A no tak... zliczenie od 61 do zera trwa 1s xD  ovfCount = 30 i po bólu.

17 minut temu, farmaceuta napisał:

A czym sie roznia te vectory(?)?

A ja już chyba to tłumaczyłem wcześniej hmm? OVF od przepełnienia, CAPT od przechwytu. I niema problemu oba mogą być aktywne co z resztą widać w kodzie który wcześniej wkleiłem. Patrz: mamy aktywne przerwanie od przechwytu i przepełnienia. I teraz gdy nadejdzie sygnał przechwytywania, w rejestrze ICR1 znajduje się wartość timera która została skopiowania w momencie tegoż sygnału(przechwytu). Jeśli nie zatrzymamy timera lub go nie wyzerujemy on liczy dalej jeśli doliczy do swojego max zgłosi przerwanie przepełnienia. Można je obsłużyć lub nie, ale timer nadal liczy. Inaczej jest w trybie CTC  - Clear Timer on Compare Match. Czyli zeruj timer po porównaniu i to działa tak że w rejestrze np OCR1 przetrzymujesz jakąś wartość np 123; i wtedy gdy wartość zliczona timera zrówna się z tą 123 timer zostanie automatycznie wyzerowany i zgłosi przerwanie. 

 

27 minut temu, farmaceuta napisał:

No i jeszcze takie pytanie mi sie nasuwa ze dzieki jednemu czy drugiemu trybowi moge odczytac lub wczytac stan logiczny na dowolny pin powiedzmy co 10us...wiec jaka przewage maja te piny?

Kurcze no ciężko żebym tłumaczył Ci tutaj całą notkę. Wyjścia OC są właśnie od sprzętowego generowania PWM lub Częstotliwości. Jest fajna książka która opisuje po Polsku co w AVR piszczy. Mikrokontrolery AVR AtMega w praktyce Rafała Baranowskiego. 

  • Pomogłeś! 1
Link to post
Share on other sites
36 minut temu, farmaceuta napisał:

A czym sie roznia te vectory(?)?


TIMER1_CAPT_vect
TIMER1_OVF_vect

z tego co widze to kazdy z trzech timerow posiada te "funkcje" dobrze rozumiem ze

Bzdura w Atmedze328, tylko Timer1 ma funkcje przechwytywania.

Link to post
Share on other sites
(edytowany)
55 minut temu, farmaceuta napisał:

wiec jaka przewage maja te piny? 

Taką że sygnał na nich może być generowany automatycznie bez udziału programu

Spójrz też na to zwłaszcza na rozdział o Timerach

http://w-tarnawski.pl/wp-content/uploads/2014/08/Atmega16-polska-dokumentacja.pdf

Edytowano przez _LM_
  • Pomogłeś! 1
Link to post
Share on other sites
48 minut temu, _LM_ napisał:

A no tak... zliczenie od 61 do zera trwa 1s xD  ovfCount = 30 i po bólu

No wlasnie 1s...wiec stan diody powinien sie zmieniac co...1s. mam 61 przerwan na sekunde i gdy zmienna osiagnie ta wartosc to ma zmienic stan led...

 

54 minuty temu, _LM_ napisał:

 Inaczej jest w trybie CTC  - Clear Timer on Compare Match. Czyli zeruj timer po porównaniu i to działa tak że w rejestrze np OCR1 przetrzymujesz jakąś wartość np 123; i wtedy gdy wartość zliczona timera zrówna się z tą 123 timer zostanie automatycznie wyzerowany i zgłosi przerwanie. 

I to jest juz dla mnie zrozumiale😉 

 

1 godzinę temu, _LM_ napisał:

Bzdura w Atmedze328, tylko Timer1 ma funkcje przechwytywania.

Blad wynikajacy z tego ze jeszcze slabo zapamietalem te wszystkie nazwy i mi sie mieszaja..chodzilo o 

TIMER_COMP_vect

 

1 godzinę temu, _LM_ napisał:

Kurcze no ciężko żebym tłumaczył Ci tutaj całą notkę. 

Nie no jasne, ja rozumiem ze ciezko tak w kilku zdaniach odpowiedziec na wiele kwestii..😉

Dzieki wielkie za sporo wyjasnien..jak cos mi sie jeszcze uroi to bede pytal...😅

Link to post
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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.