Pozwolę sobie zwrócić uwagę na pewne kwestie.
Pomysł kolegi
xentis na wykorzystanie pinu ICP jako substytutu pinu INT jest jak najbardziej słuszny. Niezależnie jednak od tego, który pin będzie wykorzystany, należy pamiętać o zwłoce pomiędzy zboczem narastającym na pinie, a momentem zmiany wartości zmiennej. Gdybyś korzystał tylko z tego jednego przerwania, ten czas byłby po pierwsze bardziej powtarzalny, po drugie zapewne pomijalny. Jako że jednak planujesz korzystać z innych przerwań, a zbocze na pinie może pojawić się np. w trakcie obsługi innego przerwania, czas reakcji może się zmieniać i być dość długi, w zależności od tego, ile będzie trwała obsługa innych przerwań. Jeśli to nie jest problemem, to OK.
Jeśli reakcją na zbocze ma być zmiana wartości zmiennej, a nie np. stanu na jakimś innym pinie, to niestety rozwiązanie z opóźnieniem typu "time-wasting" (delay) w przerwaniu raczej nie zda egzaminu, i to nie ze względu na czas. Taka zmiana wartości zmiennej przecież nie miałaby sensu, gdyby program w jakiś sposób na ten fakt nie zareagował. W takim przypadku:
xentis napisał(a):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
mikrokontroler nie będzie miał możliwości w jakikolwiek sposób zareagować na zmianę stanu zmiennej, chyba że zastosujemy zagnieżdżanie przerwań (czego raczej bym nie polecał początkującemu, tym bardziej w przypadku korzystania z
delay). Ewentualnie reakcję na zmianę wartości zmiennej trzeba by też umieścić w procedurze obsługi przerwania, ale wtedy zastosowanie zmiennej
flaga_clk raczej nie miałaby większego sensu.
Poniższy sposób jest może nieco bardziej skomplikowany, ale (imho) to zdecydowanie lepsze rozwiązanie, jeśli mikrokontroler ma mieć szansę "zauważyć" zmianę wartości zmiennej
flaga_clk:
xentis napisał(a):
Możesz w obsłudze przerwania od ICP zmienić stan zmiennej oraz aktywować inny (bądź ten sam timer) na przerwanie od porównania, i jego porównanie ustawić na czas dokładnie taki jak potrzebujesz długość impulsu czyli te 11,92us, w przerwaniu od porównania z kolei zmienną wyzerować, wyzerować też i zatrzymać timer w przygotowaniu na wygenerowanie następnego impulsu
Ogólnie nie bardzo rozumiem całą koncepcję. 11,92us to dość krótki czas. Nawet przy zegarze 16MHz to tylko 190 taktów zegara. Aby zmiana wartości zmiennej nie pozostała niezauważona, musiałbyś zmienną
flaga_clk testować co najmniej raz na 190 taktów, co może być trudne do osiągnięcia, szczególnie biorąc pod uwagę, że oprócz pętli głównej programu będziesz tam miał też obsługę innych przerwań. Flag używa się raczej w ten sposób, że w reakcji na zdarzenie (czyli np. na zbocze na jakimś pinie) taką flagę się ustawia, a zeruje dopiero po obsłużeniu takiej flagi.