[Menu]>[Circuits Gallery]>[Remote Controller]


Source code file of Receiver

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
;********************************************************
;
;                Remote Controller Receiver
;
;                                 Author : Seiichi Inoue
;********************************************************

        list            p=pic16f84a
        include         p16f84a.inc
        __config _hs_osc & _wdt_off & _pwrte_on & _cp_off
        errorlevel      -302    ;Eliminate bank warning


;****************  Label Definition  ********************
        cblock  h'0c'
rx_status                       ;RX status save area
rx_substatus                    ;RX substatus save area
rx_edge                         ;Input edge check flag
last_look                       ;Input last look flag
code_ck                         ;Code check flag
cont_data                       ;Control Data
relay                           ;Relay ON counter
w_save                          ;W reg save area
s_save                          ;Status reg save area
        endc

ptn1    equ     b'11110000'     ;Pattern 1 data
ptn2    equ     b'00001111'     ;Pattern 2 data
ra1     equ     d'1'            ;RA1 bit position
rb5     equ     d'5'            ;RB5 bit position
rb7     equ     d'7'            ;RB7 bit position

;****************  Program Start  ***********************
        org     0               ;Reset Vector
        goto    init
        org     4               ;Interrupt Vector
        goto    int

;******************  Initial Process  *******************
init    bsf     status,rp0      ;Change to Bank1
        movlw   b'00011111'     ;RA4-0:IN mode
        movwf   trisa           ;Set TRISA reg
        movlw   b'00000000'     ;RB7-0:OUT mode
        movwf   trisb           ;Set TRISB reg
        movlw   b'00000101'     ;RBPU/TOCS/PSA=0,PS=101
        movwf   option_reg      ;Set OPTION_REG
        bcf     status,rp0      ;Change to Bank0

        clrf    portb           ;RL1,RL2 OFF
        clrf    rx_status       ;Clear RX status
        clrf    rx_substatus    ;Clear RX substatus
        clrf    rx_edge         ;Clear Edge check flag
        incf    last_look,f     ;Set Last Look flag ON
        clrf    code_ck         ;Clear code check flag
        clrf    cont_data       ;Clear Control Data
        clrf    relay           ;Clear Relay ON counter
        movlw   d'100'          ;256-10000us/64us = 100
        movwf   tmr0            ;Set 10msec to TMR0
        movlw   h'a0'           ;GIE=1,TOIE=1
        movwf   intcon          ;Interruption enable

;***********  Initial Input check Process  **************
edge_check
        btfss   porta,ra1       ;Input signal ON ?
        goto    check1          ;No. Signal OFF
        btfsc   last_look,0     ;Last Look flag OFF ?
        goto    edge_check      ;No. Input NOT changed
        bcf     intcon,gie      ;Interruption disable
        incf    code_ck,f       ;Set code check flag ON
        incf    last_look,f     ;Set Last Look flag ON
        movlw   d'178'          ;256-5000us/64us = 178
        movwf   tmr0            ;Set 5msec to TMR0
        bsf     intcon,gie      ;Interruption enable
wait
        btfss   rx_edge,0       ;Input edge check ?
        goto    wait            ;No. Wait interruption
        clrf    rx_edge         ;Clear edge check flag
        goto    edge_check      ;Jump to Input edge check
check1
        clrf    last_look       ;Set Last Look flag OFF
        goto    edge_check      ;Jump to Input edge check

;************  Timer Interruption Process  **************
int
        movwf   w_save          ;Save W register
        movf    status,w        ;Read STATUS reg
        movwf   s_save          ;Save STATUS reg
        bcf     status,rp0      ;Change to Bank0
        bcf     intcon,t0if     ;Clear timer int flag

        movf    relay,w         ;Read Relay ON counter
        btfsc   status,z        ;Counter = 0 ?
        goto    stchk0          ;Yes
        decfsz  relay,f         ;Counter - 1 = 0 ?
        goto    stchk0          ;No
        clrf    portb           ;Relay OFF

stchk0
        movf    code_ck,w       ;Read code check flag
        btfsc   status,z        ;Flag ON ?
        goto    int_end         ;No. End of interruption
        movf    rx_status,w     ;Read RX status
        btfss   status,z        ;Status = 0 ?
        goto    stchk1          ;No. Next

;***********  Preamble data check Process  *************
        movf    rx_substatus,w  ;Read RX substatus
        btfss   status,z        ;Substatus = 0 ?
        goto    st00            ;No. Next
        goto    st_on           ;Input signal ON ?
st00    movlw   d'1'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 1 ?
        goto    st01            ;No.
        goto    st_off          ;Input signal OFF ?
st01    movlw   d'2'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 2 ?
        goto    st02            ;No.
        goto    st_on           ;Input signal ON ?
st02    movlw   d'3'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 3 ?
        goto    st03            ;No.
        goto    st_off          ;Input signal OFF ?
st03    movlw   d'4'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 4 ?
        goto    st04            ;No.
        goto    st_on           ;Input signal ON ?
st04    movlw   d'5'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 5 ?
        goto    st05            ;No.
        goto    st_off          ;Input signal OFF ?
st05    movlw   d'6'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 6 ?
        goto    st06            ;No.
        goto    st_on           ;Input signal ON ?
st06   movlw   d'7'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 7 ?
        goto    st07            ;No. Substatus=8
        goto    st_on           ;Input signal ON ?
st07    btfsc   porta,ra1       ;Input signal OFF ?
        goto    illegal         ;No. Jump to illegal
        clrf    rx_substatus    ;RX substatus = 0
        incf    rx_status,f     ;RX status = 1
        clrf    cont_data       ;Clear count data
        goto    int_end         ;End of interruption

;********************************************************
stchk1
        movlw   d'1'            ;Set check data
        subwf   rx_status,w     ;RX status - check data
        btfss   status,z        ;RX status = 1 ?
        goto    stchk2          ;No. Next

;************  Control data check Process  **************
        movf    rx_substatus,w  ;Read RX substatus
        btfss   status,z        ;Substatus = 0 ?
        goto    st10            ;No. Next
        goto    st_on           ;Input signal ON ?
st10    movlw   d'1'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 1 ?
        goto    st11            ;No.
        btfss   porta,ra1       ;B0 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,0     ;Set B0 = 1
        goto    stinc           ;Jump to Substatus + 1
st11    movlw   d'2'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 2 ?
        goto    st12            ;No.
        goto    st_off          ;Input signal OFF ?
st12    movlw   d'3'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 3 ?
        goto    st13            ;No.
        goto    st_on           ;Input signal ON ?
st13    movlw   d'4'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 4 ?
        goto    st14            ;No.
        btfss   porta,ra1       ;B1 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,1     ;Set B1 = 1
        goto    stinc           ;Jump to Substatus + 1
st14    movlw   d'5'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 5 ?
        goto    st15            ;No.
        goto    st_off          ;Input signal OFF ?
st15    movlw   d'6'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 6 ?
        goto    st16            ;No.
        goto    st_on           ;Input signal ON ?
st16    movlw   d'7'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 7 ?
        goto    st17            ;No.
        btfss   porta,ra1       ;B2 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,2     ;Set B2 = 1
        goto    stinc           ;Jump to Substatus + 1
st17    movlw   d'8'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 8 ?
        goto    st18            ;No.
        goto    st_off          ;Input signal OFF ?
st18    movlw   d'9'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 9 ?
        goto    st19            ;No.
        goto    st_on           ;Input signal ON ?
st19    movlw   d'10'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 10 ?
        goto    st20            ;No.
        btfss   porta,ra1       ;B3 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,3     ;Set B3 = 1
        goto    stinc           ;Jump to Substatus + 1
st20    movlw   d'11'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 11 ?
        goto    st21            ;No.
        goto    st_off          ;Input signal OFF ?
st21    movlw   d'12'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 12 ?
        goto    st22            ;No.
        goto    st_on           ;Input signal ON ?
st22    movlw   d'13'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 13 ?
        goto    st23            ;No.
        btfss   porta,ra1       ;B4 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,4     ;Set B4 = 1
        goto    stinc           ;Jump to Substatus + 1
st23    movlw   d'14'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 14 ?
        goto    st24            ;No.
        goto    st_off          ;Input signal OFF ?
st24    movlw   d'15'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 15 ?
        goto    st25            ;No.
        goto    st_on           ;Input signal ON ?
st25    movlw   d'16'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 16 ?
        goto    st26            ;No.
        btfss   porta,ra1       ;B5 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,5     ;Set B5 = 1
        goto    stinc           ;Jump to Substatus + 1
st26    movlw   d'17'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 17 ?
        goto    st27            ;No.
        goto    st_off          ;Input signal OFF ?
st27    movlw   d'18'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 18 ?
        goto    st28            ;No.
        goto    st_on           ;Input signal ON ?
st28    movlw   d'19'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 19 ?
        goto    st29            ;No.
        btfss   porta,ra1       ;B6 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,6     ;Set B6 = 1
        goto    stinc           ;Jump to Substatus + 1
st29    movlw   d'20'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 20 ?
        goto    st30            ;No.
        goto    st_off          ;Input signal OFF ?
st30    movlw   d'21'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 21 ?
        goto    st31            ;No.
        goto    st_on           ;Input signal ON ?
st31    movlw   d'22'           ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 22 ?
        goto    st32            ;No. Substatus=23
        btfss   porta,ra1       ;B7 = 1 ?
        goto    stinc           ;Jump to Substatus + 1
        bsf     cont_data,7     ;Set B7 = 1
        goto    stinc           ;Jump to Substatus + 1
st32    btfsc   porta,ra1       ;Input signal OFF ?
        goto    illegal         ;No. Jump to illegal
        clrf    rx_substatus    ;RX substatus = 0
        incf    rx_status,f     ;RX status = 2
        goto    int_end         ;End of interruption

st_on
        btfss   porta,ra1       ;Input signal ON ?
        goto    illegal         ;No. Jump to illegal
        goto    stinc           ;Jump to Substatus + 1
st_off
        btfsc   porta,ra1       ;Input signal OFF ?
        goto    illegal         ;No. Jump to illegal
        goto    stinc           ;Jump to Substatus + 1

;**************  End data check Process  ****************
stchk2  btfss   porta,ra1       ;Input signal ON ?
        goto    illegal         ;No. Jump to illegal
        movlw   d'2'            ;Set check data
        subwf   rx_substatus,w  ;Substatus - check data
        btfss   status,z        ;Substatus = 2 ?
        goto    stinc           ;Jump to Substatus + 1

;****************  Data check Process  ******************
        movf    cont_data,w     ;Read control data
        xorlw   ptn1            ;Check Pattern1
        btfss   status,z        ;Data = Pattern1 ?
        goto    dtchk0          ;No.
        bcf     portb,rb7       ;RL2 OFF
        bsf     portb,rb5       ;RL1 ON
        goto    dtchk1          ;Jump to ON counter set
dtchk0
        movf    cont_data,w     ;Read control data
        xorlw   ptn2            ;Check Pattern2
        btfss   status,z        ;Data = Pattern2 ?
        goto    illegal         ;No. Jump to illegal
        bcf     portb,rb5       ;RL1 OFF
        bsf     portb,rb7       ;RL2 ON
dtchk1  movlw   d'50'           ;Set 500msec Relay ON
        movwf   relay           ;Save Relay ON counter

;*****************  Illegal Process  ********************
illegal incf    rx_edge,f       ;Edge check flag ON
        clrf    rx_substatus    ;RX substatus = 0
        clrf    rx_status       ;RX status = 0
        clrf    code_ck         ;Clear code check flag
        goto    int_end         ;End of interruption

;***********  Substatus Increment Process  **************
stinc   incf    rx_substatus,f  ;Substatus + 1

;********  End of Timer Interruption Process  ***********
int_end movlw   d'100'          ;256-10000us/64us = 100
        movwf   tmr0            ;Set 10msec to TMR0
        movf    s_save,w        ;Read saved STATUS reg
        movwf   status          ;Recover STATUS reg
        swapf   w_save,f        ;Read saved W register
        swapf   w_save,w        ;Recover W register
        retfie                  ;End of interruption

;********************************************************
;           END of Remote Controller Receiver
;********************************************************

        end

remo_r_source.zip
remo_r_hex.zip