P O L I T E C H N I K A L U B E L S K A
w Lublinie
SPRAWOZDANIE
LABORATORIUM Z TECHNIK MIKROPROCESOROWYCH |
Ćwiczenie nr 3 |
TEMAT: Licznik obiektów. |
Data: 2008-03-31 |
RACHWAŁ MAREK ID6.3
|
|
Budowa i zasada działania
Licznik obiektów (model M-03) jest przystawką systemu DSM-51. Przystawka ta, zawierająca fotokomórkę, przeznaczona jest do zliczania przesuwających się obiektów. Dzięki zastosowaniu dwóch fototranzystorów umieszczonych naprzeciw diody emitującej promieniowanie podczerwone, możliwe jest określenie nie tylko liczby obiektów przecinających wiązkę promieniowania, ale także kierunku ich ruchu i czasu przejścia (prędkości ruchu). Zastosowane w modelu układy różniczkujące, generujące krótkie impulsy w momencie zasłaniania i odsłaniania każdego z fototranzystorów, umożliwiają obsługę przystawki z wykorzystaniem zgłoszenia przerwania zewnętrznego. Diody emitujące promieniowanie podczerwone wymagają zazwyczaj zasilania stosunkowo dużym prądem. System mikroprocesorowy może decydować o zapaleniu i zgaszeniu diody nadawczej w przystawce. Umożliwia to pisanie programów oszczędnie gospodarujących energią. Układ licznika obiektów podłącza się do złącza wejść / wyjść cyfrowych systemu DSM-51.
Informacje z modelu, jak i sygnały sterujące są przesyłane przez port C układu 8255. Port C powinien być tak ustawiony aby jego starsza część (PC4...7) była ustawiona jako wyjście, natomiast młodsza część (PC0...4) jako wejście. Schemat blokowy modelu przedstawia rysunek 1. Dioda D1, emitująca promieniowanie podczerwone, jest sterowana linią PC4. Ustawienie na linii PC4 stanu logicznego 0 powoduje włącznie diody D1. Promieniowanie z diody dociera do fototranzystorów T1 i T2 powodując ich przewodzenie. Stan fototranzystorów jest sygnalizowany odpowiednio przez diody D2 (dla T1) i D3 (dla T2). Informacja o stanie fototranzystora T1 może być również odczytana na linii PC1, a fototranzystora T2 na linii PC2. Stan 0 na odpowiedniej linii (i świecenie diody) oznacza, że fototranzystor nie jest oświetlony promieniami podczerwonymi (jest zasłonięty lub dioda D1 jest wyłączona). Dodatkowo sygnały z fototranzystorów podawane są na układy różniczkujące generujące dodatnie impulsy przy każdorazowej zmianie stanu tych sygnałów. Te impulsy podawane są odpowiednio na linie PC0 (dla T1) i PC3 (dla T2). Linie te są włączone w system przerwań w DSM-51 umożliwiając przerwaniom ą obsługę każdej zmiany fototranzystorów.
1 ;TITLE 'LICZNIK OBIEKTŕW'
2 ;**************************************
3 ;Program liczy obiekty przesuwajĄce si© przez model M-03.
4 ;Obiekty przesuwajĄce si© z g˘ry na d˘ sĄ dodawane do licznika.
5 ;Obiekty przesuwajĄce si© z dou do g˘ry sĄ odejmowane od licznika.
6 ;Program liczy tylko obiekty duľe, kt˘re w czasie przesuwania
7 ;si© przesaniajĄ w jakim momencie oba tory podczerwieni
8 ;jednoczenie.
9 ;Obiekty mae, kt˘re ani na chwil© nie przesaniajĄ obu
10 ;tor˘w podczerwieni jednoczenie, sĄ uznawane za zak˘cenia.
11 ;Liczba obiekt˘w jest wywietlana na wywietlaczu LCD jako liczba
12 ;hexalna bez znaku.
13
14 ;**************************************
15 ;uľywane rejestry
16 ;R1 - adresowanie urzĄdzeä we/wy
17 ;R2 - licznik obiekt˘w
18 ;R3 - licznik ostatnio wywietlonej liczby obiekt˘w
19 ;R7 - licznik kolejnych faz ruchu pojedyäczego obiektu
20 ;R6 - licznik prawidowych faz ruchu obiektu 'z g˘ry'
21 ;R5 - licznik prawidowych faz ruchu obiektu 'z doou'
22
23 B0R3 EQU 3 ;adres rejestru R3 z banku 0
24
25 INT55 EQU P1.1 ;uaktywnienie przerwaä 8255
26
27 ;Ustawienie uk adu 8255
28 ;PORT A - WEJ—CIE MOD 0 - nieuľywane
29 ;PORT B - WEJ—CIE MOD 0 - nieuľywane
30 ;PORT CA - WYJ—CIE
31 ;C4=0 -> zapalenie LEDa podczerwonego
32 ;PORT CB - WEJ—CIE
33 ;C1=0 -> tor 1 przessoni©ty
34 ;C2=0 -> tor 2 przessoni©ty
35 ;C0(IPB)=impuls dodatni - zmiana w torze 1
36 ;C3(IPA)=impuls dodatni - zmiana w torze 2
37 SET_8255 EQU 10010011B
38
39
40 ;**************************************
41 0000: 02 01 00 LJMP START
42
43 ;**************************************
44 ORG 13H
45 ;obssuga przerwania z wejjcia INT1
46 0013: C0 E0 PUSH ACC ;przechowanie akumulatora
47 0015: C0 D0 PUSH PSW ;i rejestru stanu na stosie
48
49 0017: 79 00 MOV R1,#CSIC ;odczyt ze sterownika przerwaä
50 0019: E3 MOVX A,@R1 ;numeru przerwania
51 001A: 54 03 ANL A,#03H
52 001C: F3 MOVX @R1,A ;skasowanie przerwania
53
54 001D: B4 03 0B CJNE A,#3,INT_NO3 ;inne przerwanie
55
56 ;przerwanie IPB - TOR 1
57 0020: 0F INC R7 ;licznik kolejnych faz ruchu obiektu
58 0021: EF MOV A,R7
59 0022: 20 E0 03 JB ACC.0,T1_KIER_OK
60 0025: 0D INC R5 ;przy kierunku nieprawiddowym przerwanie
61 ;IPB dla 2 i 4 fazy ruchu
62 0026: 80 0F SJMP OBIEKT
63 0028: T1_KIER_OK: ;przy kierunku prawiddowym przerwanie
64 0028: 0E INC R6 ;IPB dla 1 i 3 fazy ruchu
65 0029: 80 0C SJMP OBIEKT
66
67 002B: INT_NO3:
68 002B: B4 02 22 CJNE A,#2,INT_END ;inne przerwanie-nie wystĄpi
69
70 ;przerwanie IPA - TOR 2
71 002E: 0F INC R7 ;licznik kolejnych faz ruchu obiektu
72 002F: EF MOV A,R7
73 0030: 30 E0 03 JNB ACC.0,T2_KIER_OK
74 0033: 0D INC R5 ;przy kierunku nieprawiddowym przerwanie
75 ;IPA dla 1 i 3 fazy ruchu
76 0034: 80 01 SJMP OBIEKT
77 0036: T2_KIER_OK: ;przy kierunku prawiddowym przerwanie
78 0036: 0E INC R6 ;IPB dla 1 i 3 fazy ruchu
79
80 0037: OBIEKT:
81 0037: 79 2A MOV R1,#CS55C ;odczyt stanu na porcie C 8255
82 0039: E3 MOVX A,@R1
83 003A: 54 0F ANL A,#0FH ;tylko modsza cz©† jest wejciem
84
85 003C: B4 06 11 CJNE A,#6,INT_END ;czy obiekt w kt˘rym torze podczerwieni
86
87 ;obiekt juľ poza licznikiem - analiza kierunku ruchu i prawidowoci przesuwu
88 003F: BF 04 08 CJNE R7,#4,INT_ERROR ;nie by o czterech faz ruchu
89 0042: BE 04 01 CJNE R6,#4,OK_NO ;ruch nie by 4 razy sklasyfikowany
90 ;jako w prawiddowym kierunku
91 0045: 0A INC R2 ;ruch prawiddowy - zwi©kszam licznik
92 0046: OK_NO:
93 0046: BD 04 01 CJNE R5,#4,INT_ERROR ;ruch nie byy 4 razy sklasyfikowany
94 ;jako w kierunku przeciwnym
95 0049: 1A DEC R2 ;ruch w kierunku przeciwnym
96
97 004A: INT_ERROR:
98 004A: 7F 00 MOV R7,#0 ;zerownie licznik˘w jednego obiektu
99 004C: 7E 00 MOV R6,#0
100 004E: 7D 00 MOV R5,#0
101
102 0050: INT_END:
103 0050: D0 D0 POP PSW ;odtworzenie rejestr˘w na koniec przerwania
104 0052: D0 E0 POP ACC
105 0054: 32 RETI
106
107 ;**************************************
108 ORG 0100H
109 0100: START:
110 0100: 79 2B MOV R1,#CS55D ;ustawienie ukkadu 8255
111 0102: 74 93 MOV A,#SET_8255
112 0104: F3 MOVX @R1,A
113
114 0105: 19 DEC R1
115 0106: 74 EF MOV A,#11101111B ;wĄczenie nadajnika IR
116 0108: F3 MOVX @R1,A
117
118 0109: 12 81 0C LCALL LCD_CLR ;wypisanie napisu na wy˜wietlaczu LCD
119 010C: 90 01 3A MOV DPTR,#TEXT
120 010F: 12 81 00 LCALL WRITE_TEXT
121
122 ;zerowanie sterownika przerwaä
123 0112: 79 10 MOV R1,#CSAD ;skasowanie ewentualnego przerwania
124 0114: E3 MOVX A,@R1 ;wystawianego przez przetwornik A/C
125
126 0115: 79 00 MOV R1,#CSIC ;skasowanie przerwaä 0..3
127 0117: E4 CLR A ;w sterowniku przerwaä
128 0118: F3 MOVX @R1,A
129 0119: 04 INC A
130 011A: F3 MOVX @R1,A
131 011B: 04 INC A
132 011C: F3 MOVX @R1,A
133 011D: 04 INC A
134 011E: F3 MOVX @R1,A
135
136 011F: E4 CLR A
137 0120: FF MOV R7,A ;wyzerowanie licznik˘w pojedyäczego obiektu
138 0121: FE MOV R6,A
139 0122: FD MOV R5,A
140
141 0123: FA MOV R2,A ;wyzerowanie licznik˘w obiekt˘w
142 0124: FB MOV R3,A
143
144 0125: D2 AF SETB EA ;wĄczenie przerwaä z wejcia INT1
145 0127: D2 AA SETB EX1 ;- tj. sterownika przerwaä
146 0129: C2 91 CLR INT55 ;uaktywnienie sterownika na przerwania
147 ;z ukkadu 8255
148
149 012B: LOOP:
150 012B: EA MOV A,R2
151 012C: B5 03 02 CJNE A,B0R3,WRITE ;zapis na LCD dla nowej wartooci licznika
152 012F: 80 FA SJMP LOOP
153
154 0131: WRITE:
155 0131: FB MOV R3,A ;zapami©tanie nowej wartooci licznika
156 0132: 31 59 ACALL KURSOR_2L ;przesuni©cie kursora o 2 pozycje w lewo
157 0134: EB MOV A,R3
158 0135: 12 81 04 LCALL WRITE_HEX ;wyywietlenie nowej wartooci licznika
159 0138: 80 F1 SJMP LOOP
160
161 ;**************************************
162 013A: TEXT:
163 DB 'Liczba obiektow GORA -> DOL 00',0
164 013A: 4C 69 63
013D: 7A 62 61
0140: 20 6F 62
0143: 69 65 6B
0146: 74 6F 77
0149: 20 47 4F
014C: 52 41 20
014F: 2D 3E 20
0152: 44 4F 4C
0155: 20 30 30
0158: 00
165 ;**************************************
166 ;podprogram przesuwajĄcy kursor o 2 pozycje w lewo
167 0159: KURSOR_2L:
168 0159: 74 10 MOV A,#10H ;kod rozkazu dla wy˜wietlacza LCD
169 015B: 12 81 06 LCALL WRITE_INSTR ;przesuni©cia kursora w lewo
170 015E: 74 10 MOV A,#10H
171 0160: 12 81 06 LCALL WRITE_INSTR
172 0163: 22 RET
173
174 ;**************************************
175 ;END
**************************************************************************
Żeby móc wyświetlić liczbę w postaci dziesiętnej należy uprzednio zamienić ją na kod BCD. Realizację tej procedury ukazuje poniższy fragment programu:
BCD:
MOV B,#10
DIV AB
SWAP A
ADD A,B
LCALL WRITE_HEX
RET
Powyższą procedurę należy wstawić w miejsce wywołania WRITE_HEX w linii 158 kodu programu. Procedura ta pozwala na wyświetlanie dwucyfrowych liczb w postaci dziesiętnej.
**************************************************************************
W celu sygnalizacji zliczania kolejnych elementów za pomocą buzera, należy po 91 linii kodu dopisać następujący fragment programu:
CLR P1.5
LCALL DELAY_100MS
SETB P1.5
Jeśli uprzednio nie wpiszemy żadnej wartości do akumulatora, to buzer wyda dźwięk długości 100ms. Należy zwrócić uwagę, by elementy nie pojawiały się częściej niż wskazujący na nie czas działania buzera, bo może to spowodować zapętlenie procedury.
**************************************************************************
Modyfikacja programu w tym ćwiczeniu miała polegać na przedstawieniu na wyświetlaczu zliczania obiektów w obie strony - „w górę” i „w dół”. Do tego celu wykorzystujemy dwa rejestry: R3 - do zliczania w jedna stronę i R4 - w drugą. Na początku należy wyzerować oba rejestry zliczające (w poniższym programie odpowiadają za to linie 142 i 143 kodu). W programie źródłowym wyświetlaliśmy jedną liczbę dwucyfrową. Teraz potrzebujemy czterech miejsc, dlatego dwukrotnie wywołujemy procedurę KURSOR_2L (linie 156, 157) przesuwającą kursor o dwa miejsca w lewo. Oto listing tego programu:
1 ;TITLE 'LICZNIK OBIEKTÓW'
2 ;**************************************
3 ;Program liczy obiekty przesuwające się przez model M-03.
4 ;Obiekty przesuwające się z góry na dół są dodawane do licznika.
5 ;Obiekty przesuwające się z dołu do góry są odejmowane od licznika.
6 ;Program liczy tylko obiekty duże, które w czasie przesuwania
7 ;się przesłaniają w jakimś momencie oba tory podczerwieni
8 ;jednocześnie.
9 ;Obiekty małe, które ani na chwilę nie przesłaniają obu
10 ;torów podczerwieni jednocześnie, są uznawane za zakłócenia.
11 ;Liczba obiektów jest wyświetlana na wyświetlaczu LCD jako liczba
12 ;hexalna bez znaku.
13
14 ;**************************************
15 ;używane rejestry
16 ;R1 - adresowanie urządzeń we/wy
17 ;R2 - licznik obiektów
18 ;R3 - licznik ostatnio wyświetlonej liczby obiektów
19 ;R7 - licznik kolejnych faz ruchu pojedyńczego obiektu
20 ;R6 - licznik prawidłowych faz ruchu obiektu 'z góry'
21 ;R5 - licznik prawidłowych faz ruchu obiektu 'z dołu'
22
23 0003 B0R3 EQU 3 ;adres rejestru R3 z banku 0
24
25 0091 INT55 EQU P1.1 ;uaktywnienie przerwań 8255
26
27 ;Ustawienie układu 8255
28 ;PORT A - WEJ—CIE MOD 0 - nieużywane
29 ;PORT B - WEJ—CIE MOD 0 - nieużywane
30 ;PORT CA - WYJ—CIE
31 ;C4=0 -> zapalenie LEDa podczerwonego
32 ;PORT CB - WEJ—CIE
33 ;C1=0 -> tor 1 przesłonięty
34 ;C2=0 -> tor 2 przesłonięty
35 ;C0(IPB)=impuls dodatni - zmiana w torze 1
36 ;C3(IPA)=impuls dodatni - zmiana w torze 2
37 0093 SET_8255 EQU 10010011B
38
39
40 ;**************************************
41 0000: 02 01 00 LJMP START
42
43 ;**************************************
44 0013: ORG 13H
45 ;obsługa przerwania z wejścia INT1
46 0013: C0 E0 PUSH ACC ;przechowanie akumulatora
47 0015: C0 D0 PUSH PSW ;i rejestru stanu na stosie
48
49 0017: 79 00 MOV R1,#CSIC ;odczyt ze sterownika przerwań
50 0019: E3 MOVX A,@R1 ;numeru przerwania
51 001A: 54 03 ANL A,#03H
52 001C: F3 MOVX @R1,A ;skasowanie przerwania
53
54 001D: B4 03 0B CJNE A,#3,INT_NO3 ;inne przerwanie
55
56 ;przerwanie IPB - TOR 1
57 0020: 0F INC R7 ;licznik kolejnych faz ruchu obiektu
58 0021: EF MOV A,R7
59 0022: 20 E0 03 JB ACC.0,T1_KIER_OK
60 0025: 0D INC R5 ;przy kierunku nieprawidłowym przerwanie
61 ;IPB dla 2 i 4 fazy ruchu
62 0026: 80 0F SJMP OBIEKT
63 0028: T1_KIER_OK: ;przy kierunku prawidłowym przerwanie
64 0028: 0E INC R6 ;IPB dla 1 i 3 fazy ruchu
65 0029: 80 0C SJMP OBIEKT
66
67 002B: INT_NO3:
68 002B: B4 02 22 CJNE A,#2,INT_END ;inne przerwanie-nie wystąpi
69
70 ;przerwanie IPA - TOR 2
71 002E: 0F INC R7 ;licznik kolejnych faz ruchu obiektu
72 002F: EF MOV A,R7
73 0030: 30 E0 03 JNB ACC.0,T2_KIER_OK
74 0033: 0D INC R5 ;przy kierunku nieprawidłowym przerwanie
75 ;IPA dla 1 i 3 fazy ruchu
76 0034: 80 01 SJMP OBIEKT
77 0036: T2_KIER_OK: ;przy kierunku prawidłowym przerwanie
78 0036: 0E INC R6 ;IPB dla 1 i 3 fazy ruchu
79
80 0037: OBIEKT:
81 0037: 79 2A MOV R1,#CS55C ;odczyt stanu na porcie C 8255
82 0039: E3 MOVX A,@R1
83 003A: 54 0F ANL A,#0FH ;tylko młodsza część jest wejściem
84
85 003C: B4 06 11 CJNE A,#6,INT_END ;czy obiekt w którymś torze podczerwieni
86
87 ;obiekt już poza licznikiem - analiza kierunku ruchu i prawidłowości przesuwu
88 003F: BF 04 08 CJNE R7,#4,INT_ERROR ;nie było czterech faz ruchu
89 0042: BE 04 01 CJNE R6,#4,OK_NO ;ruch nie był 4 razy sklasyfikowany
90 ;jako w prawidłowym kierunku
91 0045: 0A INC R2 ;ruch prawidłowy - zwiększam licznik
92 0046: OK_NO:
93 0046: BD 04 01 CJNE R5,#4,INT_ERROR ;ruch nie był 4 razy sklasyfikowany
94 ;jako w kierunku przeciwnym
95 0049: 0C INC R4 ;ruch w kierunku przeciwnym
96
97 004A: INT_ERROR:
98 004A: 7F 00 MOV R7,#0 ;zerownie liczników jednego obiektu
99 004C: 7E 00 MOV R6,#0
100 004E: 7D 00 MOV R5,#0
101
102 0050: INT_END:
103 0050: D0 D0 POP PSW ;odtworzenie rejestrów na koniec przerwania
104 0052: D0 E0 POP ACC
105 0054: 32 RETI
106
107 ;**************************************
108 0100: ORG 0100H
109 0100: START:
110 0100: 79 2B MOV R1,#CS55D ;ustawienie układu 8255
111 0102: 74 93 MOV A,#SET_8255
112 0104: F3 MOVX @R1,A
113
114 0105: 19 DEC R1
115 0106: 74 EF MOV A,#11101111B ;włączenie nadajnika IR
116 0108: F3 MOVX @R1,A
117
118 0109: 12 81 0C LCALL LCD_CLR ;wypisanie napisu na wyświetlaczu LCD
119 010C: 90 01 3E MOV DPTR,#TEXT
120 010F: 12 81 00 LCALL WRITE_TEXT
121
122 ;zerowanie sterownika przerwań
123 0112: 79 10 MOV R1,#CSAD ;skasowanie ewentualnego przerwania
124 0114: E3 MOVX A,@R1 ;wystawianego przez przetwornik A/C
125
126 0115: 79 00 MOV R1,#CSIC ;skasowanie przerwań 0..3
127 0117: E4 CLR A ;w sterowniku przerwań
128 0118: F3 MOVX @R1,A
129 0119: 04 INC A
130 011A: F3 MOVX @R1,A
131 011B: 04 INC A
132 011C: F3 MOVX @R1,A
133 011D: 04 INC A
134 011E: F3 MOVX @R1,A
135
136 011F: E4 CLR A
137 0120: FF MOV R7,A ;wyzerowanie liczników pojedyńczego obiektu
138 0121: FE MOV R6,A
139 0122: FD MOV R5,A
140
141 0123: FA MOV R2,A ;wyzerowanie liczników obiektów
142 0124: FB MOV R3,A
143 0125: FC MOV R4,A
144
145 0126: D2 AF SETB EA ;włączenie przerwań z wejścia INT1
146 0128: D2 AA SETB EX1 ;- tj. sterownika przerwań
147 012A: C2 91 CLR INT55 ;uaktywnienie sterownika na przerwania
148 ;z układu 8255
149
150 012C: LOOP:
151 012C: EA MOV A,R2
152 012D: 80 00 SJMP WRITE ;zapis na LCD dla nowej wartości licznika
153
154 012F: WRITE:
155 012F: FB MOV R3,A ;zapamiętanie nowej wartości licznika
156 0130: 31 5D ACALL KURSOR_2L ;przesunięcie kursora o 2 pozycje w lewo
157 0132: 31 5D ACALL KURSOR_2L
158 0134: EC MOV A,R4
159 0135: 12 81 04 LCALL WRITE_HEX
160 0138: EB MOV A,R3
161 0139: 12 81 04 LCALL WRITE_HEX ;wyświetlenie nowej wartości licznika
162 013C: 80 EE SJMP LOOP
163
164 ;**************************************
165 013E: TEXT:
166 013E: 4C 69 63 DB 'Liczba obiektow GORA->DOL 0000',0
0141: 7A 62 61
0144: 20 6F 62
0147: 69 65 6B
014A: 74 6F 77
014D: 20 47 4F
0150: 52 41 2D
0153: 3E 44 4F
0156: 4C 20 30
0159: 30 30 30
015C: 00
167
168 ;**************************************
169 ;podprogram przesuwający kursor o 2 pozycje w lewo
170 015D: KURSOR_2L:
171 015D: 74 10 MOV A,#10H ;kod rozkazu dla wyświetlacza LCD
172 015F: 12 81 06 LCALL WRITE_INSTR ;przesunięcia kursora w lewo
173 0162: 74 10 MOV A,#10H
174 0164: 12 81 06 LCALL WRITE_INSTR
175 0167: 22 RET
176
177 ;**************************************
178 ;END