С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Иосиф

Разработать программу для контроллера охранной системы

15.05.2014, 11:00. Показов 2029. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, в правильном направлении мы двигаемся? и по возможности помогите исправить код. Работаем над контроллером охранной сигнализации в программе MPLAB ide v8.92



Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
;---------------------------------------------------------------------- 
 ;
    LIST P=18F4520,R=DEC, X=ON, F=INHX8M ;директива определяющая целевой микроконтроллер
    #include <P18F4520.INC>
    ;
 ;
CONFIG OSC = LP ;LP
CBLOCK 0x080
 
W_TEMP ;переменная для сохранения контекста
 
STATUS_TEMP ;переменная для сохранения контекста
 
RP ;переменная для сохранения контекста
 
ENDC
 
 
 ORG    0x00           ; адрес начала программы
 GOTO   BEGIN          ; обойти прерывание (начало 04 установлено физически)
 
 ;------------обработка прерывания (каждые 0.4mc)---------------------
 
 ORG    0x04           ; адрес начала обработки прерывания
 MOVWF  W_TEMP         ; запомнить содержимое W
 MOVF   STATUS,0       ;
 MOVWF  STATUS_TEMP    ; запомнить содержимое STATUS
 
 INCFSZ TMR1,1         ; TMR1 переполнен?(переход с 0FFh на 00h через 100мс)
 GOTO   MINT1          ; перехода TMR1 с "0FF" на "0" не было-закончить
 INCF   TMR2,1         ; TMR1 переполнен, увеличить TMR2
MINT1
 BCF  INTCON,2         ; очистить запрос прерывания (от TMR0)
 CLRWDT                ; обнулить сторожевой таймер
 
 MOVF   STATUS_TEMP,0  ; восстановить STATUS
 MOVWF  STATUS         ;
 SWAPF  W_TEMP,1       ; восстановить W не меняя STATUS (при такой операции
                       ; биты регистра STATUS не изменяются)
 SWAPF  W_TEMP,0       ; SWAPF  W_TEMP,1 -обменять тетрады, сохранить в F
                       ; SWAPF  W_TEMP,1 -обменять тетрады, сохранить в W
 RETFIE                ; выход из подпрограммы прерывания
 
 ;------------------конец обработки прерывания----------------------------
 
BEGIN
 
 CLRF  INTCON               ; запретить все прерывания
 
 ;------------ инициализация регистра OPTION------------------------------
 
 BCF    STATUS, RP          ; выбрать банк 0
 CLRF   TMR0
 BSF    STATUS, RP          ; выбрать банк 1
 MOVLW  01Fh
 MOVWF  OPTION_REG
 
 ; PSA         = "1"  включить предварительный делитель после WDT
 ; T0CS        = "0"  источник тактирования-внутренняя тактовая частота
 ; NOT_RBPU    = "0"  подключить подтягивающие резисторы на входах
 ; PS0=PS1=PS2 = "1"  коэффициент деления 1:128 [для WDT] и 1:256 [для TMR0]
 
 BCF    STATUS, RP          ; выбрать банк 0
 
 ;------------инициализация регистра PORTA--------------------------------
 
 BCF    STATUS, RP     ; выбрать банк 0
 CLRF   PORTA          ; очистить выходные защелки PORTA
 BSF    STATUS, RP     ; выбрать банк 1
 MOVLW  01Ch           ; значение для выбора направления
 MOVWF  TRISA          ; установить RA<4,3,2> - вход, остальные (0,1) выход
 
 ;-----------инициализация регистра PORTB---------------------------------
 
 BCF    STATUS, RP     ; выбрать банк 0
 CLRF   PORTB          ; очистить выходные защелки PORTB
 BSF    STATUS, RP     ; выбрать банк 1
 MOVLW  0Bh            ; значение для выбора направления
 MOVWF  TRISB          ; установить RB<3,1,0> - вход, остальные (7-4,2) выход
 BCF    STATUS, RP     ; выбрать банк 0
 
 ;-------------инициализация  регистра INTCON-----------------------------
 
 MOVLW  0A0h           ; очистить запросы прерываний
 MOVWF  INTCON         ; разрешить прерывание от TMR0
 
 ;;;;;;;;;;;;;;;окончание начальных установок;;;;;;;;;;;;;;;;;;;
 
 CLRF   FLAG3
 
M01
 CLRWDT                ; обнулить сторожевой таймер
 BCF    PORTA,SR       ; выключить сирену
 CLRF   FLAG0          ; обнулить регистр флагов признаков режима
 BSF    FLAG0,OFF      ; включить признак режима "отключено"
 
 CLRF   FLAG1          ; обнулить регистр флагов признаков индикации
 CLRF   FLAG2          ; обнулить регистр флагов признаков звука
 
 BCF    FLAG3,S1       ; выключить признак прерывистой работы сирены
 BCF    FLAG3,PZK      ; обнулить признак запрета проверки кнопки "режим"
 
 BSF    PORTB,TZ       ; обнулить триггер пьезодатчика
 BCF    PORTA,SR       ; Отключить сирену
 
M02
 CLRWDT
 CLRF   TEMP0          ; Проверим и запомним состояние кнопки "режим"
 BTFSS  PORTB,KR       ; Если кнопка не нажата, ТЕМР0 останется обнулённым
 INCF   TEMP0,1        ; Кнопка нажата, ТЕМР0 увеличить на 1
 
 CLRF   TEMP1          ; Загрузим признак состоян кн "режим" в регистр TEMP1
 BTFSC  FLAG3,SST      ; Если признак НЕ нажатой, ТЕМР1 останется =0
 INCF   TEMP1,1        ; Если признак НАЖАТОЙ, ТЕМР1 увеличится на 1
 
 ;---Сравнить СОСТОЯНИЕ (PORTB,KR) кнопки и ПРИЗНАК состояния (FLAG3,SST)---
 
 MOVF   TEMP0,0        ; Загрузить значение TEMP0 в W (в TEMP0-состояние)
 XORWF  TEMP1,0        ; Сравним содержимое TEMP0 и TEMP1 (в TEMP1-признак)
 BTFSS  STATUS,Z       ;
 GOTO   M021           ; Состояние кнопки "режим" не соответствует признаку
 ;BTFSS  FLAG3,OPZ      ; Установлен признак опознавания  состояния кнопки?
 ;GOTO   M024           ; Нет
 GOTO   M023           ; Состояние кнопки "режим" соответствует признаку
 
M021                   ; ПРИЗНАК не соответствует СОСТОЯНИЮ
 BTFSC  FLAG3,OPZ      ; Установлен признак опознавания  состояния кнопки?
 GOTO   M022           ; Да
 BSF    FLAG3,OPZ      ; Установить признак опознавания  состояния кнопки
 
 MOVF   TMR1,0         ; Установим таймер минимальной длительности проверки
 ADDLW  CONSO          ; Прибавить константу [мс] к текущему значению TMR1
 MOVWF  TMRO           ; и запомнить полученное ожидаемое знач TMR1 в TMRO
 GOTO   M024           ; Продолжить
 
M022
 MOVF   TMR1,0         ; Изменённое состоян кнопки "режим" длится уже 100мс?
 XORWF  TMRO,0         ; Сравнить значение TMRO с TMR1
 BTFSS  STATUS,Z       ; Прошло 100мс?  (Z="1"?)
 GOTO   M024           ; Нет, продолжить
 
 ; Прошло 100 мс опознавания, в течение этого времени состояние кнопки
 ; (PORTB,KR) не изменилось и оставалось противоположным признаку состоя-
 ; ния, обновим  (инвертируем) признак состояния кнопки "режим" [FLAG3,SST]
 
 CLRF   TEMP0          ; Обнулить TEMP0
 BSF    TEMP0,SST      ; Бит TEMP0,SST установить в "1"
 MOVF   TEMP0,0        ; Загрузить TEMP0 в W
 XORWF  FLAG3,1        ; Получим инверсию одного бита FLAG3,[PKR]
 
M023
 BCF    FLAG3,OPZ      ; Обнулить признак опознавания состояния кн
 
M024
 BTFSC  FLAG3,PZK      ; Запрет проверки кнопки "режим"?
 GOTO   M03            ; Запрет
 BCF    PORTB,TZ       ; Нет запрета, разрешить триггер пьезодатчика
 GOTO   M04
M03
 MOVF   TMR2,0         ; Выяснить, после установки запрета уже прошло 60мс?
 XORWF  TMRZP,0        ; Сравнить значение TMRZP с TMR1
 BTFSC  STATUS,Z       ; Прошло 200мс? (Результат сравнения =0?)
 BCF    FLAG3,PZK      ; Да, прошло - обнулить запрет
 
M04
 CLRWDT                ; Обнулить сторожевой таймер (иначе он прервёт прогр)
 MOVF   TMR1,0         ; Можно-ли разрешить проверку датчика двери?
 XORWF  TMRZW,0        ; Сравнить значение TMRZW с TMR1
 BTFSC  STATUS,Z       ; Результат сравнения =0?
 BCF    FLAG3,PZD      ; Да, время запрета закончилось - обнулить запрет
 
  ;--------------- Обработка короткого звукового сигнала ------------------
 
 BTFSS  FLAG2,KSR      ; Включен признак короткого звук сигнала?
 GOTO   M370           ; Нет, обойти
 MOVF   TMR1,0         ; Для сравнения TMR1 и TMRSN1 значение TMR2 в W
 XORWF  TMRSN1,0       ; Пора выключить звук сигн постановки в дежурн режим?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M370           ; Нет, 0.2с не закончились
 BCF    PORTA,SR       ; Выключить звук сигнал (сирену)
 BCF    FLAG2,KSR      ; Выключить признак короткого звук сигнал
M370
 BTFSS  FLAG1,IPR      ; признак изменения индикации -включенo?
 GOTO   M06            ; нет
 BCF    FLAG1,IPR      ; Да, выключить признак изменения ндикации
 MOVF   TMR2,0         ; Загрузить значение TMR2 в W
 ADDLW  CONB           ;
 MOVWF  TMRB           ; Установить таймер быстрого мигания
 MOVF   TMR2,0         ; Загрузить значение TMR2 в W
 ADDLW  CONM           ;
 MOVWF  TMRM           ; Установить таймер медленного мигания
 
 BCF    PORTB,LR       ; выключить индикацию питания -красный
 BCF    PORTB,LG       ; выключить индикацию питания -зелёный
 BTFSC  FLAG1,INO      ; признак индикации питания- потушены оба светодиода?
 GOTO   M10            ; Да
 BTFSS  FLAG1,ING      ; Нет. Признак нндикации - "зелёный"?
 GOTO   M05            ; Нет, признак нндикации "красный"
 BSF    PORTB,LG       ; Иначе, включить индикацию - "зелёный"
 GOTO   M10            ;
 
M05                    ;
 BSF    PORTB,LR       ; включить индикацию питания -красный
 GOTO   M10            ;
 
M06                    ;
 BTFSC  FLAG1,INO      ; Признак ндикации - "потушено"?
 GOTO   M10            ; Да
 BTFSS  FLAG1,IMG      ; Включен признак МИГАНИЯ индикации?
 GOTO   M10            ; Нет
 BTFSS  FLAG1,IMB      ; Включен признак БЫСТРОГО мигания индикации?
 GOTO   M07            ; Нет, а значит должно быть МЕДЛЕННОЕ миг индикации
 
 ;--------------------- быстрое мигание индикации -----------------------
 
 MOVF   TMR2,0         ; Иначе, для сравнения TMR2 и TMRB значение TMR2 в W
 XORWF  TMRB,0         ; Пора потушить (зажечь) индикатор?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M10            ; Нет, результат сравнения не равен нулю
 MOVF   TMR2,0         ; Результат сравнения равен нулю
 ADDLW  CONB           ;
 MOVWF  TMRB           ; Загрузить TMRB новым значением TMR2
 GOTO   M08            ;
 
 ;--------------------- медленное мигание индикации -----------------------
 
M07
 MOVF   TMR2,0         ; Для сравнения TMR2 и TMRM, значение TMR2 загрузи в W
 XORWF  TMRM,0         ; Пора потушить (зажечь) индикатор?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M10            ; Нет, результат сравнения не равен нулю
 MOVF   TMR2,0         ; Результат сравнения равен нулю
 ADDLW  CONM           ;
 MOVWF  TMRM           ; Загрузить TMRB новым значением TMR2
 
 ;------инвертировать (потушить или зажечь) красный или зелёный светодиод -
 
M08
 BTFSS  FLAG1,ING      ; Признак нндикации - "зелёный"?
 GOTO   M09            ; Нет, к инвертированию красного светодиода
 
 CLRF   TEMP0          ; подготовка к инвертированию бита LG порта B
 BSF    TEMP0,LG       ; TEMP0 обнулен, а место бита LG устанавливаем в "1"
 MOVF   TEMP0,0        ; грузим в регистр W TEMP0
 XORWF  PORTB,1        ; исключающее или W и PORTB, результат в PORTB
 GOTO   M10            ; В результате получилась инверсия бита (LG) порта B
                       ; не изменяющая остальные биты порта
M09                    ; начало инвертирования красного светодиода
 CLRF   TEMP0          ; подготовка к инвертированию бита LR порта B
 BSF    TEMP0,LR       ; TEMP0 обнулен, а место бита LR устанавливаем в "1"
 MOVF   TEMP0,0        ; грузим в регистр W TEMP0
 XORWF  PORTB,1        ; исключающее или W и PORTB, результат в PORTB
                       ; В результате получилась инверсия бита (LR) порта B
 
 BTFSC  PORTA,PS       ; есть сетевое (основное) питание?
 GOTO   M162           ; нет
 BSF    FLAG1,PPS      ; Есть сетевое питание, включить признак
 GOTO   M10
M162
 BTFSS  FLAG1,PPS      ; Нет сетевого, признак сетевого включен?
 GOTO   M10            ; Выключен
 BCF    FLAG1,PPS      ; Пропало сетевое питание, выключить признак
 MOVLW  CONSKSR        ; Установить длительность звукового сигнала
 CALL   PKSR           ; Подать звуковой сигнал пропадания сетевого питания
 
M10
 BTFSS  FLAG0,OFF      ; Признак режима устройства - "выключено"?
 GOTO   M17            ; Нет, искать текущий режим
 BTFSC  FLAG0,PRH      ; "Выключено". Признак ИЗМЕНЕНИЯ режима включен?
 GOTO   M01            ;  Да, к установке режима
 
 ;---------- режим OFF, уточнение состояния индикатора питания -------------
 
 BTFSS  PORTA,PS       ; есть сетевое (основное) питание?
 GOTO   M12            ; да
 BTFSS  FLAG1,INR      ; Нет сетевого признак ндикации питания- красный?
 GOTO   M11            ; нет
 BTFSS  FLAG1,IMG      ; Красный. Включен признак МИГАНИЯ индикации?
 GOTO   M16            ; Признак МИГАНИЯ выключен, к обработке режима "OFF"
M11
 CLRF   FLAG1          ; Обнулить флаг индикации
 BSF    FLAG1,INR      ; Установить признак ндикации - красный
 BSF    FLAG1,IPR      ; Установить признак перехода ндикации
 GOTO   M16            ; К обработке режима "OFF"
M12
 BTFSC  PORTA,PG       ; резервное (батарейное) питание есть?
 GOTO   M14            ; Нет
 BTFSS  FLAG1,ING      ; признак индикации зеленый?
 GOTO   M13            ; Нет
 BTFSS  FLAG1,IMG      ; Включен признак МИГАНИЯ индикации?
 GOTO   M16            ; Нет. К обработке режима "OFF"
M13
 CLRF   FLAG1          ; Обнулить флаг индикации
 BSF    FLAG1,ING      ; Установить признак ндикации - "зелёный"
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 GOTO   M16            ; К обработке режима "OFF"
M14
 BTFSS  FLAG1,ING      ; Признак индикации ЗЕЛЁНЫЙ?
 GOTO   M15            ; Нет
 BTFSS  FLAG1,IMG      ; Зелёный. Включен признак МИГАНИЯ индикации?
 GOTO   M15            ; Нет.
 BTFSS  FLAG1,IMB      ; Включен признак БЫСТРОГО мигания индикации?
 GOTO   M16            ; Нет. К обработке режима "OFF"
M15
 CLRF   FLAG1          ; Обнулить флаг индикации
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 BSF    FLAG1,ING      ; Установить признак индикации - "ЗЕЛЁНЫЙ"
 BSF    FLAG1,IMG      ; Установить признак МИГАНИЯ индикации
 
 ;-------------------  обработка режима "OFF" ----------------------------
M16
 BTFSS  FLAG3,PU       ; Проверить, отпущена-ли кнопка "режим"
 GOTO   M120           ; Да, продолжить
 BTFSS  FLAG3,SST      ; Нет. Проверить, нажата-ли кнопка "режим"
 BCF    FLAG3,PU       ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
 GOTO   M02            ;
M120
 BTFSS  FLAG3,SST      ; Проверить, нажата-ли кнопка "режим"
 GOTO   M02            ; Кнопка "режим" не нажата
 CLRF   FLAG0          ; Кнопка нажата. Обнулить регистр флагов режима
 BSF    FLAG0,PRH      ; Включить признак ИЗМЕНЕНИЯ режима
 BSF    FLAG0,OFF1     ; Включить признак режима "OFF1"
 CLRF   FLAG1          ; Обнулить регистр флагов индикации
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 BSF    FLAG1,INR      ; Установить признак индикации - "КРАСНЫЙ"
 BSF    FLAG1,IMG      ; Установить признак МИГАНИЯ индикации
 BSF    FLAG1,IMB      ; Установить признак БЫСТРОГО мигания индикации
 BSF    FLAG3,PU       ; Установить ПРИЗНАК НАЖАТОЙ
 GOTO   M02            ; Повторять, но в режиме "OFF1"
M17
 BTFSS  FLAG0,OFF1     ; Признак режима устройства - "OFF1"?
 GOTO   M23            ; Нет. Определить текущий режим
 
 ;------------------ включен признак режима "OFF1" ------------------------
 
 BTFSS  FLAG0,PRH      ; Включен признак ИЗМЕНЕНИЯ режима?
 GOTO   M20            ; Нет
 BCF    FLAG0,PRH      ; Включен признак ИЗМЕНЕНИЯ режима, - обнулить его
 MOVF   TMR2,0         ;
 ADDLW  CONO           ; Для задержки установки дежурного режима при выходе
 MOVWF  TMRZ           ; установить таймер (TMRZ) режима "OFF1" на 8с
M18
 BSF    FLAG2,SNP      ; Установить признак ПЕРЕХОДА звука
 BCF    FLAG3,DTD      ; Для уточнения признака состояния датчика двери обнул
 BTFSC  PORTA,DD       ; Дверь закрыта?
 BSF    FLAG3,DTD      ; Нет. Установить призн сост датч двери в "1"
 BSF    FLAG2,SOFF1    ; Установить признак звука SOFF1 в "1"
 BCF    FLAG2,SOFF2    ; Обнулить признак звука SOFF2
 
 BTFSC  PORTA,DD       ; Дверь закрыта?
 GOTO   M02            ; Нет, открыта, признак SOFF1 остается в "1"
 BSF    FLAG2,SOFF2    ; Закрыта. Установить признак звука SOFF2
 BCF    FLAG2,SOFF1    ; Обнулить признак звука SOFF1
 GOTO   M02            ; Повторять с самого начала
M20
 MOVF   TMR2,0         ;
 XORWF  TMRZ,0         ; Закончилась задержка времени OFF1 (8с)
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M21            ; Нет
 
 ;----------- Закончилась задержка времени OFF1 (8с) ----------------------
 
MM20
 CLRF   FLAG0
 CLRF   FLAG1
 BSF    FLAG0,PRH      ; Установить признак ПЕРЕХОДА режима
 BSF    FLAG0,OHR      ; Установить признак режима "ДЕЖУРНЫЙ"
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 BSF    FLAG1,INR      ; Установить признак индикации - "КРАСНЫЙ"
 BSF    FLAG1,IMG      ; Установить признак МИГАНИЯ индикации
 GOTO   M02            ; К началу
M21
 BTFSS  FLAG3,PU       ; Проверить, отпущена-ли кнопка "режим"?
 GOTO   M130           ; Да
 BTFSC  FLAG3,SST      ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
 GOTO   M132           ; Кнопка "режим" ещё нажата, ждать отпускания
 BCF    FLAG3,PU       ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M130
 BTFSC  FLAG3,SST      ; Проверить, нажата-ли кнопка "режим"
 GOTO   M22            ; Кнопка "режим" нажата.
 
 ;---------- Изменилось-ли состояние датчика двери? ------------
 
M132
 CLRF   TEMP0          ; Для того, чтоб проверить, изменилось-ли состояние
 BTFSC  FLAG3,DTD      ; датчика двери, загрузим TEMP0 значением бита DTD
 INCF   TEMP0,0        ; Ниже TEMP0 загружен либо "1" (нарушен), либо "0"
 CLRF   TEMP1          ; А состояние двери загрузим в TEMP1
 BTFSC  PORTA,DD       ; Дверь закрыта?
 INCF   TEMP1,0        ; Ниже TEMP1 загружен либо "1", либо "0"
 MOVF   TEMP1,0        ; Загрузить TEMP1 в W
 XORWF  TEMP0,0        ; Сравнить TEMP0 и W
 BTFSS  STATUS,Z       ;
 GOTO   M18            ; Состояние датчика двери изменилось- уточнить звук
 GOTO   M02            ; Состояние датчика двери не изменилось
 
 ;---------------- Нажата кнопка в режиме "OFF1" --------------------------
 
M22
 CLRF   FLAG0          ; Обнулить регистр флагов режима
 BSF    FLAG0,PRH      ; Включить признак ИЗМЕНЕНИЯ режима
 BSF    FLAG0,OFF      ; Включить признак режима "OFF"
 BSF    FLAG3,PU       ; Включить признак нажатой кнопки
 GOTO   M02
M23
 BTFSS  FLAG0,OHR      ; Признак режима устройства - "дежурный"?
 GOTO   M26            ; Нет, уточнить дальше текущий режим
 
 ;------------- текущий режим устройства - "дежурный" (охрана) -----------
 
 BTFSS  FLAG0,PRH      ; Признак ИЗМЕНЕНИЯ режима включен?
 GOTO   M24            ; Нет, проверять датчики и кнопку
 BTFSC  FLAG3,PZD      ; Запрет проверки датчика двери?
 GOTO   M02            ; Запрет, подождать
 
 BCF    FLAG0,PRH      ; Выключить признак изменения режима.
 CLRF   FLAG3          ; Обнулить регистр признаков звука
 BTFSC  PORTA,DD       ; Датчик двери нарушен?
 GOTO   M22            ; Да, к установлению режима "OFF"
M360
 BSF    FLAG2,PKSR     ; Включить признак звукового сигнала
 MOVLW  CONS1          ;  Включить короткий звуковой сигнал (сирену), подтве-
 CALL   PKSR           ; ждающий успешную установку в дежурный режим охраны
 GOTO   M02            ; Повторять всё сначала, режим-дежурный
M24
 BTFSC  PORTA,DD       ; Датчик двери нарушен?
 GOTO   M25            ; Да
 BTFSS  FLAG3,PU       ; Проверить, отпущена-ли кнопка "режим"?
 GOTO   M140           ; Да
 BTFSC  FLAG3,SST      ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
 GOTO   M142           ; Кнопка "режим" ещё нажата, ждать отпускания
 BCF    FLAG3,PU       ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M140
 BTFSC  FLAG3,SST      ; Проверить, нажата-ли кнопка "режим"
 GOTO   M22            ; Кнопка "режим" нажата
 
 ;---------- Обработка сигнала пьезодатчика в дежурном режиме -----------
 
M142
 BTFSC  FLAG2,PST      ; Пьезосторож включен?
 GOTO   M144           ; Да
 BTFSS  PORTB,DZ       ; Пьезосторож выключен, пьезодатчик включен?
 GOTO   M02            ; Нет
 BSF    FLAG2,PST      ; Пьезодатчик включен. Включить пьезосторож
 
 MOVF   TMR2,0         ; Загрузить значение TMR2 в W
 ADDLW  CONSPZ         ; Прибавиь значение CONSPZ к W (примерно для 10с)
 MOVWF  TMRPZ          ; Устан таймр пьезо (длительность контроля колич стукв)
 BSF    FLAG2,STPZ     ; Установить старое состояние пьезо в "1"
 CLRF   SHPZ           ; Обнулить счетчик пьезо  (число для включения сирены)
 CLRF   SHPZ1          ; Обнулить счетчик пьезо1 (число для вклч коротк звук)
 GOTO   M02            ;
M144
 MOVF   TMR2,0         ; Для сравнения TMR2 и TMRPZ значение TMR2 в W
 XORWF  TMRT,0         ; Закончилось контрольное время?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M146           ; Нет, контрольное время не закончилось
 BCF    FLAG2,PST      ; Закончилось контрольное время, выключить пьезосторож
 GOTO   M02            ;
M146
 BTFSC  PORTB,DZ       ; Пьезодатчик включен?
 GOTO   M148           ; Включен
 BCF    FLAG2,STPZ     ; Выключен. Обнулить старое состояние пьезо
 GOTO   M02            ;
M148
 BTFSC  FLAG2,STPZ     ; Старое состояние пьезо = "0"?
 GOTO   M02            ; Нет, "1"
 BSF    FLAG2,STPZ     ; Признак старого состояние пьезо установить в "1"
 INCF   SHPZ,1         ; Увеличить счетчик срабатываний пьезодатчика
 
 INCF   SHPZ1,1        ; Увеличить счетчик1 срабатываний пьезодатчика
 MOVF   SHPZ1,0        ; Загрузить значение счетчика1 в W
 XORLW  CONSSP1        ; Cравнить с константой CONSSP1 (03). Счётчик =03?
 BTFSS  STATUS,Z       ;
 GOTO   M158           ; Нет, значение счетчика меньше CONSSP1 (3)
 CLRF   SHPZ1          ; Значение счетчика равно CONSSP1, обнулить счетчик
 MOVLW  CONSDZ         ; Стар сост пьезо = "0", задаём длительность звук сигн
 CALL   PKSR           ; Включить короткий звуковой сигнал
M158
 MOVF   SHPZ,0         ; Загрузить значение счетчика в W
 XORLW  CONSSP         ; Cравнить с константой CONSSP (10). Счётчик =10?
 BTFSS  STATUS,Z       ;
 GOTO   M02            ; Нет, значение счетчика меньше CONSSP (10)
 BCF    FLAG2,PST      ; Кол-во срабатываний пьезо=10. Выключить пьезосторож
 BCF    FLAG2,KSR      ; Выключить признак короткого звук сигнал
 GOTO   M28            ; К установке режима "тревога"
 
M25  ;--------- Нарушен датчик двери в дежурном режиме -------------------
 
 CLRF   FLAG0          ; Обнулить регистр признаков режима
 CLRF   FLAG1          ; Обнулить регистр признаков индикации
 BSF    FLAG0,PRH      ; Включить признак изменения режима.
 BSF    FLAG0,TR0      ; Установить признак режима "тревога0"
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА индикации
 BSF    FLAG1,INO      ; Установить признак индикации -"потушен"
 GOTO   M02            ; Повторять всё сначала, режим- "тревога0"
M26
 BTFSS  FLAG0,TR0      ; Признак режима утройства - "тревога0"?
 GOTO   M30            ; Нет, уточнить дальше текущий режим
 
 ;------------- включен признак режима "тревога0" -----------------------
 
 BTFSS  FLAG0,PRH      ; Признак ИЗМЕНЕНИЯ режима включен?
 GOTO   M27            ; Нет
 BCF    FLAG0,PRH      ; Обнулить признак изменения режима
 MOVF   TMR2,0         ;
 ADDLW  CONI           ; Увеличить текущее значение TMR2 на константу для 8с
 MOVWF  TMRT           ; Установить таймер запрета сирены на 8с при входе
 GOTO   M02            ; Повторять
M27
 MOVF   TMR2,0         ; Для сравнения TMR2 и TMRB значение TMR2 в W
 XORWF  TMRT,0         ; Пора включать "сирену"?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M29            ; Нет, результат сравнения не равен нулю
 
 ;------------- включение режима "тревога" (включение сирены) --------------
 
M28
 CLRF   FLAG0          ; Обнулить регистр флагов режима
 BSF    FLAG0,PRH      ; Включить признак ИЗМЕНЕНИЯ режима
 BSF    FLAG0,TR       ; Включить признак режима "тревога"
 CLRF   FLAG1          ; Обнулить регистр флагов индикации
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 BSF    FLAG1,INO      ; Установить признак индикации - "ПОТУШЕН"
 GOTO   M02            ; Повторять, пока не нажмут долго кнопку "режим"
M29
 BTFSS  FLAG3,PU       ; Проверить, отпущена-ли кнопка "режим"?
 GOTO   M150           ; Да
 BTFSC  FLAG3,SST      ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
 GOTO   M02            ; Кнопка "режим" ещё нажата, ждать отпускания
 BCF    FLAG3,PU       ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M150
 BTFSS  FLAG3,SST      ; Проверить, нажата-ли кнопка "режим"
 GOTO   M02            ; Кнопка "режим" не нажата
M152
 CLRF   FLAG0          ; Кнопка нажата. Обнулить регистр флагов режима
 BSF    FLAG0,PRH      ; Включить признак ИЗМЕНЕНИЯ режима
 BSF    FLAG0,TR1      ; Включить признак режима "тревога1"
 CLRF   FLAG1          ; Обнулить регистр флагов индикации
 BSF    FLAG1,IPR      ; Установить признак ПЕРЕХОДА ндикации
 BSF    FLAG1,ING      ; Установить признак индикации - "ЗЕЛЁНЫЙ"
 BSF    FLAG1,IMG      ; Установить признак МИГАНИЯ индикации
 BSF    FLAG1,IMB      ; Установить признак БЫСТРОГО мигания индикации
 GOTO   M02            ; Повторять, пока не отпустят кнопку (и TMROFF1]
M30
 BTFSS  FLAG0,TR1      ; Признак режима устройства - "тревога1"?
 GOTO   M32            ; Нет. Уточнить дальше текущий режим
 
 ;------------- включен признак режима "тревога1" -----------------------
 
 BTFSS  FLAG0,PRH      ; Включен признак ИЗМЕНЕНИЯ режима?
 GOTO   M31            ; нет
 BCF    FLAG0,PRH      ; Иначе обнулить признак ИЗМЕНЕНИЯ режима
 MOVF   TMR2,0         ;
 ADDLW  CONK           ;
 MOVWF  TMRK           ; Установить таймер "TMRK" времени нажатия кнопки
 GOTO   M02            ;
M31
 MOVF   TMR2,0         ;
 XORWF  TMRK,0         ; Закончилось-ли контрольное время нажатия кнопки "реж?
 BTFSC  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M22            ; Да, к установке режима "OFF"
 BTFSC  FLAG2,PZK      ; Запрет 40мс?
 GOTO   M02            ; Да, подождать
 BTFSS  PORTB,KR       ; Иначе, кнопка "режим" отпущена?
 GOTO   M02            ; Нет, повторить сначала
 GOTO   M28            ; Рано отпущена-включить режим "тревога"(сирену)
M32
 BTFSS  FLAG0,TR       ; Признак режима утройства - "тревога"?
 GOTO   M10            ; Нет, уточнить дальше текущий режим
 
 ;--------------обработка включенного режима "тревога" -------------------
 
 BTFSS  FLAG0,PRH      ; Признак ИЗМЕНЕНИЯ режима включен?
 GOTO   M33            ; Нет
 MOVF   TMR2,0         ; Да, установить TMRS0 [40c]
 ADDLW  CONS           ;
 MOVWF  TMRS0          ;
 BCF    FLAG3,S1       ; выключить признак прерывистой работы сирены
 BCF    FLAG0,PRH      ; Выключить признак ИЗМЕНЕНИЯ режима
 BSF    PORTA,SR       ; Включить сирену
 GOTO   M02            ;
M33
 BTFSS  FLAG3,PU       ; Проверить, отпущена-ли кнопка "режим"?
 GOTO   M330           ; Да
 BTFSC  FLAG3,SST      ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
 GOTO   M332           ; Кнопка "режим" ещё нажата, продолжить
 BCF    FLAG3,PU       ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M330
 BTFSC  FLAG3,SST      ; Проверить, нажата-ли кнопка "режим"
 GOTO   M152           ; Кнопка "режим" нажата, к установке режима "ТРЕВОГА1"
M332                   ; Кнопка "режим" вновь не нажата (или не отпущена)
 BTFSS  FLAG3,S1       ; Сирена звучит уже больше 40с?
 GOTO   M34            ; Нет, меньше
 MOVF   TMR2,0         ; Сирена звучит уже больше 40с
 XORWF  TMRS1,0        ; Закончилось время переключения сирены 12с?
 BTFSS  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M36            ; Нет
 MOVF   TMR2,0         ; Да, переустановить TMRS1
 ADDLW  CONP           ;
 MOVWF  TMRS1          ;
 
  ;---------- инвертируем выход управления включением сиреной --------
 
 CLRF   TEMP0          ; подготовка к инвертированию бита SR порта A
 BSF    TEMP0,SR       ; TEMP0 обнулен, а место бита SR устанавливаем в "1"
 MOVF   TEMP0,0        ; грузим в регистр W TEMP0
 XORWF  PORTA,1        ; исключающее или W и PORTA, результат в PORTA
 GOTO   M36            ; В результате получилась инверсия бита (SR) порта A
M34
 MOVF   TMR2,0         ; Для сравнения TMR2 и TMRS0 значение TMR2 в W
 XORWF  TMRS0,0        ; Сирена звучит уже 40с?
 BTFSC  STATUS,Z       ; Результат сравнения равен нулю?
 GOTO   M35            ; Да
 MOVF   TMR2,0         ; Нет. Результат сравнения не равен нулю
 ADDLW  CONP
 MOVWF  TMRS1          ; Переустановить TMRS1
 GOTO   M02            ;
M35
 BSF    FLAG3,S1       ; Установить признак времени после 20с звуч сирены
M36
 BTFSC  PORTA,DD       ; Датчик двери нарушен?
 GOTO   M02            ; Да, продолжать звук "сирены"
 BCF    FLAG3,S1       ; Обнулить признак времени после 20с звучания сирены
 MOVLW  CONW1          ; Загрузить в W мс запрета проверки датчика двери
                       ; Для устранения эффекта дребезга контактов
 CALL   PZDD           ; Установить запрет (FLAG3,PZD =1 и TMRZW на Wмс)
 BCF    PORTA,SR       ; Выключить сирену
 GOTO   MM20           ; К установке дежурного режима
 
 END
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2014, 11:00
Ответы с готовыми решениями:

Разработать программу для контроллера стиральной машины
помогите разработать программу Режимы: Cotton – 120 минут 95 градусов Wool – 60 минут 40 градусов Quick wash – 30 минут 95 градусов...

Разработать программу для решения системы уравнений численными методами
Разработать программу для решения системы уравнений численными методами. Программа должна обеспечивать: - ввод начального приближения...

Разработать программу для решения системы уравнений численными методами
Разработать программу для решения системы уравнений численными методами. ввод начального приближения выбор метода решения (простая...

1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16372 / 7684 / 1080
Регистрация: 11.11.2010
Сообщений: 13,758
15.05.2014, 11:07
Цитата Сообщение от Иосиф Посмотреть сообщение
Подскажите, в правильном направлении мы двигаемся?
Иосиф,
абсолютно в неправильном направлении. Нажмите на кнопку и попросите модераторов перенести тему в раздел "контроллеры" и впредь, прежде чем размещать темы, ознакомьтесь со структурой форума
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2014, 11:07
Помогаю со студенческими работами здесь

Имитация роботы охранной системы
Нужна програма которая имитирует роботу охранной системы в помещении. Подскажите хоть с чего начать, может у кого есть хоть что-то. Кто...

Подозрение на взлом охранной системы
Проблема заключается в том что есть подозрения на то что снимают квартирную охрану. Примет о посещении масса. Вот только в голову совсем не...

Разработка простой охранной системы
Здравствуйте! Написала программу по заданию: &quot;Разработка простой микропроцессорной охранной системы Система может принимать...

Разработать иерархию не менее 2 классов, и программу Разработать программу для реализации игры пятнашки. Разработать 2-3
Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы...

Нарисовать граф работы охранной системы
Автомобильная охранная система всегда находится в одном из трех состояний: ОХРАНА (ОХ), СНЯТО С ОХРАНЫ (ССО) и ТРЕВОГА (Т). В режим ОХ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru