Rozbudowa przerwan do 32 w MCS-8051

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
jerry68
-
Posty: 2
Rejestracja: 07 gru 2005, 11:54

Rozbudowa przerwan do 32 w MCS-8051

Post autor: jerry68 » 07 gru 2005, 11:56

Witam
Mam do wykonania projekt z uP i w ogole nie wiem jak sie za niego
zabrać .
Moim tematem jest wykonanie układu,w którym zwiekszono liczbę
przerwań zewnętrznyh do 32.
Mam podać schemat układu i oraz schamat blokowy programu z tym ze
pamieci RAM i ROM są zewnętrzne.
Aha priorytet przerwań ma być stały wynikający z numeracji.
Prosze pomóżcie bo nie mam pojęcia jak to zrobić a z uP jestem
zielony.
Z góry dzięki za wszelkie odpowiedzi i jakbyscie znależli jakieś
schemaciki to prosze o oprzesłanie na adres: jerry-68@o2.pl .Pozdro

tasza
Użytkownik
Posty: 1389
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 07 gru 2005, 14:15

jerry68 pisze:prosze o oprzesłanie na adres
no...to nie tak, po to jest Forum, aby to co piszemy było dostępne dla wszystkich...

aby uzyskać 32 zewnętrzne przerwania, bloczków jak na schemacie
nalezy zbudować 4, każdy blok obsługuje osiem zewnętrznych przerwań,
to sygnały o nazwach MINT_0...MINT_7.
zasada działania...
narastające zbocze sygnału MINT_x ( x={0..7} ) spowoduje przełączenie dedykowanego
mu przerzutnika typu D, czyli na jego wyjściu Q stan zmieni się z 0 na 1.
odczytu, który przerzutnik odebrał sygnał przerwania dokonuje się
poprzez bufor trójstanowy, zapięty bezpośrednio na magistrali systemu,
bufor jest adresowany sygnałem /MOD_SELECT z dekodera adresowego,
podobnie jak zewnetrzne ROM/RAM czy inne peryferia

jeżeli zaadresujemy do odczytu w/w bufor i odczytamy np. wartość
0x80 - oznacza to że przerzutnik skojarzony z MINT_7 odebrał przerwanie.

sygnalizacja wystąpienia przerwania - do tego służy ośmiowejściowa bramka NAND,
do której wejść podłączone są wyjścia /Q wszystkich przerzutników w module.
kiedy wszystkie przerzutniki są na off (Q=0, /Q=1) na wyjściu bramki jest niski
stan logiczny (see: tabela prawdy NAND). ustawienie jakiegokolwiek przerzutnika
spowoduje że na wyjściu MOD_INT pojawi sie 1 logiczne, to sygnał dla procesora,
że w module wystąpiło przerwanie

po odebraniu przerwania i jego obsłużeniu, moduł nalezy wyzerować,
do tego służy sygnał MOD_INT_CLEAR, on kasuje (Q=0, /Q=1) wszystkie przerzutniki!

mamy cztery takie bloczki,
sygnały MOD_INT_CLEAR łączymy ze sobą i podłączamy do dowolnego, nie zajętego
bitu I/O procesora.
następnie budujemy układzik jak w szarej ramce, wyjścia MOD_INT podłączamy
do wejść MOD_INT (A...D), wyjście /EXTERNAL_INT podpinamy do wejścia np. /INT0 procesora.

krótko o oprogramowaniu tego cuda.
1) inicjalizacja-zerowanie - wystawić sygnał kasujący moduły
2) jeżeli przyjdzie przerwanie zewnetrzne /INT0 - odczytujemy po kolei
cztery rejestry (kolejno adresujemy moduły) sprawdzając czy znajdzie sie tam
wartość różna od 0 - jeżeli tak - system przyjął przerwanie
aby określić priorytety - najłatwiej sprawdzać kolejne bity odczytanych wartości
na okazję nie bycia zerem czyli
b0 modułu A, b1 modułu A .... b7 modułu A, b0 modułu B....etc,itd

po identyfikacji, które wejście zgłosiło przerwanie - moduł(y) nalezy wyzerować,
aby umożliwić przyjecie kolejnych przerwań....

całego przykładowego programu Ci nie napisze
niestety, też musisz trochę pocierpieć...

pa,
Natasza
Załączniki
bardzo_duzo_int.gif
(6.77 KiB) Pobrany 3076 razy

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 07 gru 2005, 19:21

Ze swojej strony dodam, że warto zainteresować się czymś co nazywa się koderem piorytetowym (priority encoder). Ogólnie jest to element który podaje na wyjściu kod aktywnego wejścia. Jeśli klika wejść jest aktywnych - podaje on kod wejścia o najwyższym piorytecie (stąd jego nazwa). Elementem takim jest na przykład '147 i '148 rodziny TTL. Układy te dzięki wejściom aktywacyjnym oraz wyjściom informującym o stanie aktywnym na którymś wejściu bardzo ładnie łączą się w łańcuchy.

Rozwiązanie oparte o wspomniane układy ma tą zaletę, że nie trzeba zajmować się programowym sprawdzaniem aktualnego przerwania - możliwy jest skok pod odpowiedni adres z wykorzystaniem tablic zawierających adresy skoku w zależności od numeru przerwania. Oznacza to dwie rzeczy:
1. Większą szybkość działania.
2. Niezależność czasu między wykryciem przerwania a skokiem do procedury jego obsługi od jego priorytetu - każde przerwania zostanie obsłużone z takim samym opóźnieniem.

Wadą w porównaniu z propozycją taszy jest niemożność programowej zmiany piorytetów przerwań.

Po szczegóły odsyłam do googla i alldatasheeta.

ODPOWIEDZ