Код: Выделить всё
; ПОЖАРНАЯ СИГНАЛИЗАЦИЯ НА 11 ДАТЧИКОВ,
; МОДУЛЯТОР ПЕРЕДАТЧИКА.
; РАЗРАБОТАЛ ПОПОВ Е.С,.
; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ.
; ИЖЕВСК
;
; ПРОГРАММА = OXPANAPD.ASM
; ВЕРСИЯ: 11-04-03.
; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00.
;
#include p16f84a.inc
__CONFIG 3FF0H
;=====
; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32768 ГЦ.
;=====
; RB0=1, RB1=2, RB2=3, RB4=4, RB5=6, RB6=7, RB7=8,
; RA0=9, RA1=10, RA2=11 - ВХОДЫ ДАТЧИКОВ.
; RA3-ВЫХОД МОДУЛЯЦИИ, RA4-ВЫХОД ВКЛЮЧЕНИЯ НЕСУЩЕЙ.
;=====
; СПЕЦ РЕГИСТРЫ.
;=====
INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR.
TIMER0 EQU 01H ;TMR0.
OPTIONR EQU 81H ;OPTION (RP0=1).
PC EQU 02H ;СЧЕТЧИК КОМАНД.
STATUS EQU 03H ;РЕГИСТР СОСТОЯНИЯ АЛУ.
FSR EQU 04H ;РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ.
PORTA EQU 05H ;ПОРТ А ВВОДА/ВЫВОДА.
PORTB EQU 06H ;ПОРТ В ВВОДА/ВЫВОДА.
TRISA EQU 85H ;НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А.
TRISB EQU 86H ;НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В.
INTCON EQU 0BH ;РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ.
;=======
; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ.
;=======
SC EQU 0CH ;РЕГИСТР ИНДИКАЦИИ.
COU EQU 0DH ;СЧЕТЧИК ПАУЗЫ.
;====
; ВРЕМЕННЫЕ РЕГИСТРЫ.
;====
W_TEMP EQU 0EH ;БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ.
STATUS_TEMP EQU 0FH ;БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ.
FSR_TEMP EQU 10H ;ВРЕМЕННЫЙ ДЛЯ FSR.
;=====================
; ОПРЕДЕЛЕНИЕ БИТОВ РЕГИСТРА FLAG.
;=====================
FLAG EQU 11H ;
;
; 0-> НЕСУЩАЯ ВЫКЛЮЧЕНА ПО ДАТЧИКУ.
; 1-> НЕСУЩАЯ ВКЛЮЧЕНА ЧЕРЕЗ 1 СЕКУНДУ.
;
;=======
; 1. ПУСК.
;=======
ORG 0
GOTO INIT
ORG 4
GOTO CONST
;====
; 4. ВЫВОД ИМПУЛЬСОВ МОДУЛЯЦИИ.
;====
ID2
MOVLW.2 ;АНАЛОГИЧНО ПЕРВОМУ.
MOVWF SC ;
GOTO IDZ ;
;=======
ID3
MOVLW.3
MOVWF SC
GOTO IDZ ;
;======
ID4
MOVLW.4
MOVWF SC
GOTO IDZ ;
;=======
ID5
MOVLW.5
MOVWF SC
GOTO IDZ ;
;=======
ID6
MOVLW.6
MOVWF SC
GOTO IDZ ;
;=======
ID7
MOVLW.7
MOVWF SC
GOTO IDZ ;
;=======
ID8
MOVLW.8
MOVWF SC
GOTO IDZ ;
;=======
ID9
MOVLW.9
MOVWF SC
GOTO IDZ ;
;=======
ID10
MOVLW.10
MOVWF SC
GOTO IDZ ;
;=======
ID11
MOVLW.11
MOVWF SC
GOTO IDZ ;
;=====
ID1
MOVLW.1 ;ЗАПИШЕМ НОМЕР ДАТЧИКА
MOVWF SC ;В РЕГИСТР ИНДИКАЦИИ.
IDZ
TSTF SC ;ЕСЛИ
SKPNZ ;РЕГИСТР НУЛЕВОЙ,
GOTO ID0I ;ИДЕМ НА ЗАВЕРШЕНИЕ.
DECF SC,1 ;ВЫЧТЕМ 1 ИЗ РЕГИСТРА.
BSF PORTA,3 ;ВКЛЮЧИМ ВЫХОД.
CALL ID21 ;ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ.
BCF PORTA,3 ;ВЫКЛЮЧИМ ВЫХОД.
CALL ID2O ;ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ НОЛЯ.
GOTO IDZ ;НАЧНЕМ СНАЧАЛА.
ID0I
CLRWDT
BCF PORTA,4 ;ВЫКЛЮЧИМ НЕСУЩУЮ.
BSF FLAG,0 ;ВКЛЮЧИМ ФЛАГ ВЫКЛЮЧЕНИЯ НЕСУЩЕЙ.
BTFSC FLAG,1 ;ЖДЕМ ПОКА ВКЛЮЧИТСЯ ФЛАГ ВКЛЮЧЕНИЯ НЕСУЩЕЙ.
GOTO ID0I ;ХОДИМ ПО КРУГУ.
GOTO KEY ;ПРОВЕРИМ ДАТЧИКИ.
;=========
; 5. ПАУЗА.
;=========
ID2O
MOVLW.2 ;ПАУЗА 2,69 МИЛЛИСЕКУНДЫ.
MOVWF COU ;ОБЩАЯ ДЛИНА-22 ТАКТА.
PAUSA
DECF COU,1 ;ВЫЧТЕМ 1.
TSTF COU ;ПРОТЕСТИРУЕМ НА НОЛЬ.
SKPZ ;ЕСЛИ НЕ РАВНО НУЛЮ,
GOTO PAUSA ;ПОВТОРИМ.
RETURN
ID21
MOVLW.2 ;ПАУЗА 2,69 МИЛЛИСЕКУНДЫ.
MOVWF COU ;ОБЩАЯ ДЛИНА-22 ТАКТА.
PAUSA1
DECF COU,1 ;ВЫЧТЕМ 1.
CLRWDT
NOP
NOP
TSTF COU ;ПРОТЕСТИРУЕМ НА НОЛЬ.
SKPZ ;ЕСЛИ НЕ РАВНО НУЛЮ,
GOTO PAUSA1 ;ПОВТОРИМ.
RETURN
;===========
; 3. ОПРОС ДАТЧИКОВ.
;===========
KEY
CLRWDT
BTFSS FLAG,1 ;ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧЕНА,
GOTO KEY ;ОПРОС ДАТЧИКОВ НЕ ПРОИЗВОДИТСЯ.
BTFSC PORTB,0 ;ЕСЛИ ДАТЧИК РАЗОРВАН,
GOTO ID1 ;ИДЕМ ФОРМИРОВАТЬ ИМПУЛЬС МОДУЛЯЦИИ.
BTFSC PORTB,1
GOTO ID2
BTFSC PORTB,2
GOTO ID3
BTFSC PORTB,3
GOTO ID4
BTFSC PORTB,4
GOTO ID5
BTFSC PORTB,5
GOTO ID6
BTFSC PORTB,6
GOTO ID7
BTFSC PORTB,7
GOTO ID8
BTFSC PORTA,0
GOTO ID9
BTFSC PORTA,1
GOTO ID10
BTFSC PORTA,2
GOTO ID11
BCF FLAG,0
GOTO KEY ;ЕЩЕ РАЗ ПРОВЕРИМ ДАТЧИКИ.
;== ============
; 6. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.
;==================
CONST
MOVWF W_TEMP ;СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И
MOVFW STATUS ;STATUS,
MOVWF STATUS_TEMP ;
MOVFW FSR ;FSR.
MOVWF FSR_TEMP ;
CALL S1 ;ПРИБАВИМ 1 В СЧЕТЧИК.
RECONST ;ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ.
BCF INTCON,2 ;СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА.
MOVFW STATUS_TEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ:
MOVWF STATUS ;STATUS,
MOVFW FSR_TEMP ;
MOVWF FSR ;FSR,
MOVFW W_TEMP ;W.
RETFIE ;ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ.
;==========
; 7. ВКЛЮЧЕНИЕ НЕСУЩЕЙ.
;==========
S1
BTFSC FLAG,1 ;ЕСЛИ НЕСУЩАЯ БЫЛА ВКЛЮЧЕНА,
GOTO S10 ;ТО ИДЕМ ВЫКЛЮЧАТЬ.
BSF PORTA,4 ;ВКЛЮЧИМ НЕСУЩУЮ,
BSF FLAG,1 ;ПОСТАВИМ ФЛАГ ВКЛЮЧЕНИЯ.
BTFSC FLAG,0 ;ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧАЛАСЬ ПО ДАТЧИКУ,
RETURN ;ИМПУЛЬС НЕ ФОРМИРУЕТСЯ.
CALL ID2O ;ПАУЗА, РАВНАЯ НУЛЮ.
BSF PORTA,3 ;ВКЛЮЧИМ ВЫХОД.
CALL ID21 ;ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ.
BCF PORTA,3 ;ВЫКЛЮЧИМ ВЫХОД.
CALL ID2O ;ПАУЗА, РАВНАЯ НУЛЮ.
BCF PORTA,4 ;ВЫКЛЮЧИМ НЕСУЩУЮ.
RETURN
S10
BCF FLAG,1 ;СБРОСИМ ФЛАГ ВКЛЮЧЕНИЯ НЕСУЩЕЙ.
BTFSC FLAG,0 ;ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧАЛАСЬ ПО ДАТЧИКУ,
RETURN ;ИМПУЛЬС НЕ ФОРМИРУЕТСЯ.
BSF PORTA,4 ;ВКЛЮЧИМ НЕСУЩУЮ,
CALL ID2O ;ПАУЗА, РАВНАЯ НУЛЮ.
BSF PORTA,3 ;ВКЛЮЧИМ ВЫХОД.
CALL ID21 ;ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ.
BCF PORTA,3 ;ВЫКЛЮЧИМ ВЫХОД.
CALL ID2O ;ПАУЗА, РАВНАЯ НУЛЮ.
BCF PORTA,4 ;ВЫКЛЮЧИМ НЕСУЩУЮ.
RETURN
;====
; 2. ИНИЦИАЛИЗАЦИЯ.
;====
INIT
BSF STATUS,RP0 ;ПЕРЕХОДИМ В БАНК 1.
MOVLW B'00000100';ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32...100,
MOVWF OPTION_REG^80H;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВКЛЮЧЕНЫ.
MOVLW B'10100000' ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА.
MOVWF INTCON ;
MOVLW B'00000111' ;RA3,RA4-НА ВЫХОД, RA0-RA2-ВХОД.
MOVWF TRISA^80H
MOVLW B'11111111' ;RB0-RB7-НА ВХОД.
MOVWF TRISB^80H
BCF STATUS,RP0 ;ПЕРЕХОДИМ В БАНК 0.
CLRF TMR0 ;ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ
CLRF FLAG
CLRF PORTA
CLRF COU
GOTO KEY ;ИДЕМ НА ОПРОС ДАТЧИКОВ.
;==========
END
;