Skocz do zawartości

[C] Więcej niż 2 przerwania


bordeux

Pomocna odpowiedź

Witam.

Jestem początkującym, a jak już coś poważnego robię na uC to na gotowych bibliotekach.

Mam pytanie odnośnie przerwań.

Moja sytuacja jest taka że używam VUSB oraz RFM12b-lib

VUSB używa przerwania na INT0 a RFM12b-lib przerwania na INT1.

I mam pytanie.

Co mam zrobić, gdy będę chciał dodać nową bibliotekę, która wymaga obsługi przerwań? Mój uC ma tylko 2 piny przerwań (atmega168). Co w takich sytuacjach się robi?

Link do komentarza
Share on other sites

Zmienia się procesor.

Bądź sygnału przerwania się sumuje na jeden pin i po rozpoczęciu przerwania sprawdza się co przerwało.

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

Mój uC ma tylko 2 piny przerwań (atmega168). Co w takich sytuacjach się robi?

Przede wszystkim czyta dokładnie dokumentację uC, i szybko się okazuje że praktycznie każda końcówka mikroprocesora może być linią przerwań typu PCINT. Czyli może ich być 23.

Działa to dokładnie tak jak kolega opisał wyżej, z tą różnicą że jest już fabrycznie w uC i nie trzeba niczego dobudowywać. Trzeba tylko obsługiwać odpowiednio przerwanie od danego portu uC.

Oczywiście obsługa takich przerwań jest specyficzna,(programowo obsługiwany wektor) ale pozwala bez problemu obejść problem tylko dwóch wejść INT.

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

W takiej sytuacji ja widzę dwa wyjścia:

1. Możesz użyć innych wejść, które moga być potraktowane przez procesor jak przerwania.

2. Możesz kilka zgłoszeń przerwań podłączyć do jednego wejścia INTx, nie bezpośrednio oczywiście, tylko przez jakąś bramkę sumującą.

ad.1 Takimi wejściami mogą być np. piny portów związane z przerwaniemi PCINTxx, wejścia timerów T0, T1 lub nawet któreś wejście komparatora analogowego. Przerwania PCINT mają tę wadę, że są zgłaszane na każdym zboczu. Musiałbyś zmodyfikować funkcję obsługi przerwania tak, by nic nie robiła gdy podczas obsługi zastanie stan nieaktywny. Wejscia timerów (jeżeli możesz poświęcić któryś timer) mogą "napędzać" licznik. Wystarczy, że podczas obsługi przerwania będziesz ustawiał timer na 0xFF (lub 0xFFFF jeśli 16-bitowy) i zezwalała mu na liczenie impulsów z odpowiedniego wejścia T. Wtedy pierwsze aktywne zbocze doda 1, timer się przepełni i zgłosi przerwanie. Komparator analogowy wymaga z kolei podania na jego drugie wejście odpowiedniego napięcia np. 1V dzielnikiem rezystorowym. Wtedy zmiana napięcia na pierwszym wejściu może odpalić przerwanie.

ad.2 No to chyba jasne. Bierzez bramkę cyfrową np. AND, NAND, OR itp z odpowiednią liczbą wejść, podłączasz wszystkie zgłoszenia do niej a wyjście do wejścia INT procesora. Zamiast bramki możesz użyć diodek, tranzystorów, cokolwiek bądź. Procesor musi mieć też możliwość "zobaczenia" które przerwanie zostało rzeczywiście zgłoszone więc do wolnych portów wejsciowych musisz podpiąć wszystkie zgłoszenia.

Oczywiście oba te rozwiązania mają jedną wadę: wymagają ingerencji w strukturę bilblioteki. Np. w rf12 podłączenie funkcji obsługi przerwania do odpowiednigo przerwania sprzętowego następuje w rf12_initialize() poprzez wywołanie funkcji attachInterrupt(). Niestety nie może ona (z tego co pamiętam) "podłączać się" do dowonego przerwania a tylko do jednego z kilku zewnętrznych. Musiałbyś ten attachment wyrzucić i dopisać własną funkcję obsługi tego przerwania, które użyjesz. Jej treść byłaby bardzo prosta: wywoływałbyś tylko funkcję rf12_interrupt() z bilbioteki. W przypadku z timerem musiałbyś na koniec jeszcze odpowiednio przeładować timer tak, by był gotowy na kolejne (jedno) zbocze zewnętznego zegara T.

W przypadku z bramką Twoja nowa funkcja obsługi tego "wspólnego" przerwania musiałaby wczytać stan wszystkich liniii przerwań z portu, przejrzeć je, wybrać to najważniejsze i wykonanać odpowiednią funkcję z odpowiedniej bibliteki.

Ups, już Koledzy odpisali. No trudno 🙂

  • Pomogłeś! 1
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

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.