Korzystałem PIC16F877
( arkusz danych ) do kilku projektów. W przypadku pojedynczych przerwań zmiany zewnętrznego pinu można użyć PORTB0
przerwania. Ale teraz muszę obsługiwać 8 niezależnych zewnętrznych przerwań zmiany pinów w jednym obwodzie.
W arkuszu danych jest napisanych, że jest 15 przerwań PIC16F877
, ale myślę, że są one liczone, w tym przerwania nadmiaru czasu itp., Które w tym przypadku są bezużyteczne.
Tak mówi arkusz danych o INTCON
rejestrze.
Czy mogę mieć 4 niezależne przerwań używając bit0, RBIF
? Reprezentuje zmianę w PB7:PB4
. Jak mogę zidentyfikować, który pin został zmieniony, czy jest to odczytane przez wartość portu w procedurze przerwania?
Nawet jeśli mam pozytywne odpowiedzi na powyższe pytania, potrzebuję 8 przerwań? oczywiście nadal mogę używać INTE
do PORTB0
zmian. Potem 4 + 1 = 5
, ale co innego 3? (Ponieważ jednak wszystkie 8 zdarzeń przerwania są tego samego typu, 4 + 1 + 3 = 8
sprawa wydaje się brzydka, prawda?)
Od mikrokontrolera nie oczekuje się żadnych innych ciężkich zadań poza monitorowaniem 8 styków. (Mówiąc o innych zadaniach, będzie musiał zachować zestaw oddzielnych zmiennych licznika i często przesyłać około 4 bajtów do komputera szeregowo)
Wszelkie sugestie są mile widziane. Nawet jeśli chodzi o zmianę mikrokontrolera na bardziej odpowiedni (ale nie mów mi, żebym odszedł od PIC
s).
źródło
Odpowiedzi:
To pseudo-kod C wyjaśniający jeden pomysł. Wykorzystuje i wyłączne OR, aby ustalić, które piny się zmieniły i wywoła różne procedury obsługi w ramach jednego przerwania RBIE. W zależności od tego, jak krytyczna jest ta aplikacja, możesz chcieć sprawdzić, jak PIC radzi sobie z sytuacjami takimi jak zmiana portu podczas wykonywania przerwania, aby upewnić się, że nie przegapisz żadnych zdarzeń.
źródło
RB7:RB4
tylko 4 piny. Ale proszę o sposób monitorowania 8 pinów. jakieś sugestie?and four interrupts for the RB0:RB3
? PIC16F877 nie obsługuje żadnych przerwańRB1:RB3
, co?Ta część ma tylko 4 przerwań zmiany pinów i kilka innych, które możesz ustawić na wybranych krawędziach. Jedną strategią byłoby wykrycie zmiany wartości 8 bitów zewnętrznie, a następnie przerwanie niedopasowania. Robi się bałagan w sprzęcie, ale robi dokładnie to, czego chcesz.
Ważnymi parametrami, których nie podałeś, jest to, jak szybko musisz zareagować na zmianę PIN, i jaki minimalny czas będzie trwał, aby zmiana PIN była ważna. W zależności od odpowiedzi możesz sondować na podstawie regularnych przerw w oprogramowaniu układowym. 16F877 może działać z częstotliwością instrukcji 5 MHz, a sprawdzenie zmiany zajmie tylko kilka instrukcji. Załóżmy, że ustawiasz przerwanie co 50 instrukcji. To pozostawia dużą część czasu procesora kodowi pierwszego planu. Szybkość przerwań wynosiłaby 100 kHz, a okres 10 µs. Oczywiście kod na pierwszym planie nadal musi widzieć flagę zmiany i coś z tym zrobić, więc czas odpowiedzi będzie dłuższy niż 10 µs, ale nie powiedziałeś nic o tym, co musisz zrobić, gdy wykryta zostanie zmiana. Jeśli to musi zareagować w czasie ludzkim,
źródło
once per second
będzie wystarczający. Gdy zostanie wykryta zmiana szpilki (tylko jedna krawędź, powiedzmy rosnące), należy zwiększyć licznik (zmienny). W głównej pętli musi monitorować wartości liczników, a gdy ktoś przekroczy pewną wartość, należy przesłać cztery bajtyUSART
do komputera. Następnie zresetuj odpowiednią wartość licznika do zera. Proste. Myślę, że opcja odpytywania pójdzie dobrze, prawda?Możesz użyć 8-wejściowej bramki NAND, o której wspomniał @Brian Drummond, aby podnieść przerwanie na pinie INT, a także podłączyć źródła przerwań do 8-bitowego rejestru przesunięcia równoległego / szeregowego, np. „74HC165N”, więc wtedy będziesz potrzebować aby po prostu odczytać dane z tego Rejestru Przesunięcia po podniesieniu przerwania, a to dostarczy informacji o twoim faktycznym źródle przerwań ... to może nie być najszybszy sposób, ale łatwy do rozszerzenia i użyje nie więcej niż 5 pinów, i jeśli dodasz system kontroli adresu (MUX, LATCH, ...), wtedy będziesz potrzebować tylko jednej sosny do powiadomienia o przerwaniu, a inne piny mogą być ponownie użyte w różnym czasie dla różnych zasobów;)
źródło