S. Jemioło B. Jakubiec
G. Kulig Ł. Król
D. Gorący K. Kubik P. Kurek
Klasa VgT
Ćwiczenie nr 15
TEMAT: Sterownik przerwań DSM-51.
Cel ćwiczenia:
Celem ćwiczenie jest poznanie możliwości oraz właściwości sterownika przerwań systemu DSM-51
Wiadomości wstępne:
W lekcji 12 przedstawiony był system przerwań mikrokontrolera 8051. Występują w nim m.in. dwa zewnętrzne źródła przerwań. W wielu systemach może okazać się to niewystarczające. W takim przypadku należy dobudować do systemu zewnętrzny sterownik przerwań. Istnieją gotowe układy scalone spełniające tę funkcję, na przykład Intel 8259. Mają one dość duże możliwości, ale również dość skomplikowaną obsługę. Często wystarczające jest zbudowanie prostego sterownika w oparciu o standardowe układy cyfrowe.
W systemie DSM-51 zdecydowano się na rozwiązanie pośrednie. Sterownik przerwań zbudowano w oparciu o programowalny układ logiczny typu GAL. Pozwoliło to na stosunkowo duże jego możliwości przy jednocześnie niewielkich wymiarach. Istotną zaletą jest fakt, że przy pewnych specyficznych potrzebach możliwa jest modyfikacja działania sterownika poprzez zmianę zawartości układu GAL. Opis zawarty w tej lekcji dotyczy standardowej konfiguracji sterownika przerwań.
Do sterownika doprowadzono sześć sygnałów przerwań:
IAD - z przetwornika analogowo-cyfrowego 101 - z wejścia izolowanego galwanicznie IPA -z układu 8255 IPB -z układu 8255
IX - ze złącza szyny systemowej IRS - z kanału COM2.
Sterownik może sygnalizować przyjście przerwania poprzez obydwa zewnętrzne wejścia przerwań mikrokontrolera 8051 - INTO i INT1. Oprócz tego, sterownik jest podłączony do szyny systemowej DSM-51 jako urządzenie wybierane sygnałem CSIC. Doprowadzone są do niego sygnały sterujące oraz dwie linie danych. Dzięki temu, możliwy jest odczyt numeru zgłoszonego przerwania i zapis kasujący to zgłoszenie.
Na dwóch liniach możliwe jest przesłanie 4 różnych numerów. Tyle przerwań sterownik potrafi zapamiętać. Ponieważ do sterownika doprowadzonych jest więcej sygnałów przerwań, w ich wyróżnieniu pomaga linia P 1.1 mikrokontrolera podłączona do sterownika.
Jak to zostało przedstawione w poprzedniej lekcji, sygnał przerwania z portu szeregowego COM2 (IRS) jest praktycznie bezpośrednio podłączony do wejścia INTO mikrokontrolera. Pozostałe przerwania są zapamiętywane w sterowniku i zgłaszane do mikrokontrolera poprzez wejście INT1. Linia P 1.1 wyróżnia dwa tryby pracy sterownika przerwań.
Po sygnale RESET linia Pl .1 jest w stanie l, więc możliwe jest zatrzaśnięcie jednego z trzech przerwań: z przetwornika analogowo-cyfrowego, z wejścia 12 izolowanego galwanicznie i ze złącza szyny systemowej. Jako przykład obsługi przerwania zgłoszonego przez sterownik przerwań posłuży wejście izolowane galwanicznie.
System DSM-51 jest wyposażony w złącza, do których można podłączyć urządzenia zewnętrzne. Jednym z nich jest złącze wejść/wyjść izolowanych galwanicznie.
Przy łączeniu ze sobą kilku systemów DSM-51 połączonych z różnymi komputerami nie można wykluczyć istnienia różnicy potencjałów między ich masami. Przy czym nie chodzi tu wyłącznie o składową stałą, ale również o różne impulsy powstające w wyniku pracy zasilaczy impulsowych w tych komputerach. Dlatego najbezpieczniejsze jest wykorzystanie do połączenia ze sobą systemów DSM-51 złącz wejść/wyjść izolowanych galwanicznie.
W sieci RS485 nadawanie bajtu odbywa się analogicznie do transmisji szeregowej RS232. Istotną różnicą jest to, że do sieci RS485 może być podłączonych kilka urządzeń nadawczo-odbiorczych. Jednocześnie może nadawać tylko jedno urządzenie, choć odbierać mogą wszystkie. Nad tym, aby nie zaczęły nadawać wszystkie jednocześnie, musi czuwać odpowiednie oprogramowanie sieciowe.
PRZYKŁAD 15.1
NADAWANIE RS-485
T0_G EQU 0 ;GATE
T0_C EQU 0 ;COUNTER/-TIMER
T0_M EQU 2 ;MODE (0..3)
TIM0 EQU T0_M+T0_C*4+T0_G*8
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 0 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
BIT_TIME EQU 11059200/12/4800
T0_SET EQU 256-BIT_TIME
OUT EQU P1.2
OUT_EN EQU P1.3
LJMP START
ORG 0BH
PUSH PSW
PUSH ACC
DJNZ R2,NEXT ;koniec transmisji bajtu
SETB OUT ;bit stopu
CLR TR0 ;stop Timer 0
POP ACC
POP PSW
RETI
NEXT: ;kolejny bit transmisji
MOV A,R7
RRC A
MOV OUT,C ;bit na port
MOV R7,A
POP ACC
POP PSW
RETI
ORG 100H
START:
MOV TMOD,#TMOD_SET ;Timer 0 dla
MOV TH0,#T0_SET ;transmisji
MOV TL0,#T0_SET
CLR OUT_EN ;wĄcz nadajnik RS485
SETB EA ;włącz przerwanie
SETB ET0 ;od Timera 0
LCALL LCD_CLR
LOOP:
LCALL WAIT_KEY
ADD A,#30H
MOV R7,A ;znak do nadania
MOV R2,#9 ;licznik bitów
CLR OUT ;bit startu
SETB TR0 ;start Timera 0
LCALL WRITE_DATA ;wyświetl na LCD
SJMP LOOP
Praktycznie przykład ten jest identyczny z przykładem Iż lekcji 14. Tyle tylko, że nadawanie odbywa się tu poprzez linię P l.2 mikrokontrolera. Sygnał ten poprzez transoptor dociera do złącza jako wyjście pierwsze (01). W modelu M-07 do tego wyjścia podłączony jest układ scalony realizujący transmisję RS485.
Jak już wspomniano, w sieci RS485 może pracować wiele urządzeń, ale w danym momencie może nadawać tylko jedno. Z tego powodu układy do transmisji RS485 wyposażone są w wejście odłączające je od linii przesyłowej. W modelu M-07 zadanie to spełnia sygnał z wyjścia 02. Ustawienie jedynki na bicie P1.3 mikrokontrolera powoduje odłączenie nadajnika od linii przesyłowej, natomiast ustawienie O na tym bicie powoduje przyłączenie nadajnika.
Ponieważ program z pierwszego przykładu stale nadaje, na początku ustawia on bit P1.3 na O, powodując w ten sposób przyłączenie nadajnika na stałe do linii przesyłowej.
W przykładzie drugim przedstawiony jest program odbierający dane z sieci RS485.
PRZYKŁAD 15.2
ODBIÓR RS-485
T0_G EQU 0 ;GATE
T0_C EQU 0 ;COUNTER/-TIMER
T0_M EQU 2 ;MODE (0..3)
TIM0 EQU T0_M+T0_C*4+T0_G*8
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 0 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
;Timer/Bit = Fosc[Hz] /12 /V[bod]
BIT_TIME EQU 11059200/12/4800
T0_SET EQU 256-BIT_TIME
T0_STRT EQU 256-BIT_TIME/2
IN EQU P3.4
LJMP START
ORG 0BH
PUSH PSW
PUSH ACC
DJNZ R2,NEXT
SJMP LAST
ORG 13H
PUSH PSW
PUSH ACC ;obsługa sterownika
MOVX A,@R1 ;odczyt numeru przerwania
ANL A,#03H
MOVX @R1,A ;skasowanie przerwania
CJNE A,#1,INT_END ;czy przerwanie nr 1
SETB TR0 ;włącz Timer 0
CLR EX1 ;blokuj przerwanie INT1
INT_END:
POP ACC
POP PSW
RETI
LAST: ;odebrano cały bajt aktualnie trwa bit stopu
CLR TR0 ;wyłącz Timer 0
MOV TL0,#T0_STRT ;ustawienia dla kolejnej
MOV R2,#10 ;transmisji
MOVX @R1,A ;skasowanie przerwania
LCALL WRITE_DATA
POP ACC
POP PSW
RETI
NEXT: ;kolejny bit transmisji
MOV C,IN ;pobierz bit
MOV A,R7
RRC A ;dopisz do poprzednich
RETI
ORG 100H
START:
LCALL LCD_CLR
MOV TMOD,#TMOD_SET ;Timer 0 dla
MOV TH0,#T0_SET ;transmisji
MOV TL0,#T0_STRT ;1/2 bitu startu
MOV R2,#10 ;licznik bitów
MOV R1,#CSAD ;skasowanie przerwania
MOVX A,@R1 ;w przetworniku A/C
MOV R1,#CSIC ;skasowanie przerwań
CLR A ;w sterowniku
MOVX @R1,A ;A=0 (IAD)
INC A
MOVX @R1,A ;A=1 (IOI)
MOVX @R1,A ;A=3 (IX)
SETB EA ;włącz przerwania
SETB ET0 ;od Timera 0
SETB EX1 ;i z wejścia INT1
SJMP $
Działanie powyższych przykładów można zaobserwować łącząc dwa systemy DSM-51 poprzez łącze RS485 (modele M-07). Do jednego z systemów należy załadować przykład l, natomiast do drugiego przykład 2. Po uruchomieniu tych programów naciśnięcie klawisza klawiatury matrycowej systemu nadawczego powoduje wyświetlenie odpowiedniego znaku na wyświetlaczach LCD obu systemów. Dzieje się tak dzięki przesłaniu znaku do drugiego systemu poprzez sieć RS485.
Odbiór danych z sieci RS485 jest w zasadzie identyczny z programowym odbiorem transmisji szeregowej ze złącza COM2. Dane przychodzące z układu realizującego transmisję RS485 są podłączone do obu wejść izolowanych galwanicznie. Bit startu, docierający poprzez wejście 12 do sterownika przerwań, generuje przerwanie inicjujące odbiór przesyłanego bajtu. Natomiast wartość kolejnych bitów może być bezpośrednio odczytywana z linii P3.4, do której doprowadzony jest poprzez transoptory sygnał z wejścia II.
Obsługa przerwania przychodzącego do mikrokontrolera poprzez sterownik przerwań składa się z dwóch elementów:
• właściwa obsługa przerwania
• obsługa sterownika przerwań.
Przerwanie zgłaszane przez sterownik na wejście INT1 mikrokontrolera może pochodzić z kilku źródeł (patrz tabela na początku lekcji). Przerwanie przychodzące do sterownika jest w nim zapamiętywane. Nawet krótki impuls zostanie zatrzaśnięty i wygeneruje przerwanie do mikrokontrolera. Dopiero właściwa obsługa sterownika może spowodować skasowanie tak zapamiętanego przerwania. W sterowniku mogą zostać jednocześnie zapamiętane maksymalnie 4 przerwania.
W obsłudze przerwania z wejścia INT1 należy dowiedzieć się, które przerwanie jest zatrzaśnięte w sterowniku. Można to wykonać poprzez odczyt numeru przerwania ze sterownika przerwań. Sterownik jest podłączony do szyny systemu DSM-51 jako urządzenie wejść/wyjść pod adresem OOH. Liczba odczytana spod tego adresu jest numerem przerwania. Jeżeli w sterowniku jest zatrzaśniętych kilka przerwań, to odczytany będzie najniższy numer zatrzaśniętego przerwania.
Niestety, nie zawsze takie działanie jest skuteczne. Sterownik przerwań reaguje na stan linii wejściowych. Oznacza to, że jeżeli sygnał przerwania jest nadal aktywny, to przerwanie zostanie natychmiast zatrzaśnięte z powrotem. Tak to odbędzie się m.in. dla przerwania od bitu startu. W momencie obsługi przerwania bit startu jeszcze trwa, a więc na linii wejściowej jest ciągle stan 0. Jeżeli obsługa przerwania zostałaby w ten sposób zakończona, to natychmiast mikrokontroler rozpocząłby po raz kolejny obsługę tego samego przerwania.
Tak więc przed skasowaniem przerwania w sterowniku należy zlikwidować źródło przerwania. W przypadku transmisji nie jest to możliwe (nadaje inny system), a jednocześnie nie jest to przerwanie potrzebne w czasie odbioru bajtu. Stąd też, aby przerwanie nie przeszkadzało, zostało ono zablokowane w mikrokontrolerze. Po zakończeniu transmisji, a w zasadzie już w czasie trwania bitów stopu, wartość na linii wejściowej ustala się ponownie na l. W tym momencie można skasować przerwanie w sterowniku (wysłanie numeru l do sterownika) i ponownie włączyć przerwania. Od tej pory mikrokontroler znowu oczekuje na przyjście bitu startu kolejnego bajtu transmisji.
PRZYKŁAD 15.3
ODBIÓR RS-485
T0_G EQU 0 ;GATE
T0_C EQU 0 ;COUNTER/-TIMER
T0_M EQU 2 ;MODE (0..3)
TIM0 EQU T0_M+T0_C*4+T0_G*8
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 0 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
BIT_TIME EQU 11059200/12/4800
T0_SET EQU 256-BIT_TIME
T0_STRT EQU 256-BIT_TIME/2
IN EQU P3.4
LJMP START
ORG 0BH
PUSH PSW
PUSH ACC
DJNZ R2,NEXT
PUSH ACC
MOVX A,@R1 ;odczyt numeru przerwania
ANL A,#03H
MOVX @R1,A ;skasowanie przerwania
CJNE A,#1,INT_END ;czy przerwanie nr 1
SETB TR0 ;włącz Timer 0
CLR EX1 ;blokuj przerwanie INT1
POP ACC
POP PSW
RETI
INT_END: ;obsługa innych przerwań
PUSH ACC
MOV R1,#CSAD ;skasowanie przerwania
MOVX A,@R1 ;w przetworniku A/C
POP ACC
MOV R1,#CSIC ;skasowanie przerwania
MOVX @R1,A ;w sterowniku
POP ACC
POP PSW
RETI
LAST: ;odebrano cały bajt
MOV TL0,#T0_STRT ;ustawienia dla kolejnej
MOV R2,#10 ;transmisji
MOV A,#1
MOVX @R1,A ;skasowanie przerwania
SETB EX1
MOV A,R7 ;odebrany bajt na LCD
LCALL WRITE_DATA
POP ACC
POP PSW
RETI
NEXT: ;kolejny bit transmisji
MOV C,IN ;pobierz bit
MOV A,R7
RRC A ;dopisz do poprzednich
MOV R7,A
POP ACC
ORG 100H
START:
MOV TMOD,#TMOD_SET ;Timer 0 dla
MOV TH0,#T0_SET ;transmisji
MOV TL0,#T0_STRT ;1/2 bitu startu
MOV R2,#10 ;licznik bitów
MOV R1,#CSIC ;skasowanie przerwania
MOV A,#1 ;1 (IOI) w sterowniku
MOVX @R1,A
SETB EA ;włącz przerwania
SETB ET0 ;od Timera 0
SETB EX1 ;i z wejścia INT1
SJMP $
W programie wykorzystane jest tylko przerwanie l w sterowniku przerwań, a więc przerwanie z wejścia izolowanego galwanicznie. Dla prawidłowej pracy programu należy zapewnić, aby przy sygnale RESET to przerwanie zostało skasowane w sterowniku przerwań. Tak więc, ustawianie sterownika zostało sprowadzone tylko do wysłania cyfry l pod adres sterownika. Gwarantuje to, że nie będzie z transmisji RS485 odczytany znak, który faktycznie nie był wysłany. Natomiast w sterowniku mogą pozostać zawieszone przerwania z innych źródeł. Aby nie przeszkadzały one w pracy programu, należy obsługę sterownika przerwań odpowiednio zorganizować. W przypadku innego przerwania niż l, musi nastąpić nie tylko skasowanie numeru tego przerwania w sterowniku, ale również należy zlikwidować źródło przerwania. Jeżeli nie ma innych przeciwwskazań, można zorganizować jednakową obsługę dla wszystkich tych dodatkowych przerwań. W powyższym przykładzie odczyt z przetwornika A/C w celu skasowania wystawionego przez niego przerwania, będzie wykonany zarówno przy zgłoszeniu przerwania O (od przetwornika A/C), jak i przerwania 3 - z wejścia IX. W niczym to nie przeszkadza, a obsługa przerwania jest szybsza - uniknięto niepotrzebnego rozgałęziania programu według źródła przerwania.
Wnioski:
Podsumowując, można stwierdzić, że obsługa każdego przerwania podłączonego do sterownika przerwań wygląda tak:
• odczytanie numeru przerwania
• wykonanie właściwego programu obsługi
• zlikwidowanie źródła przerwania (jeśli nie jest to automatycznie wykonane w poprzednim punkcie)
• skasowanie właściwego numeru przerwania.