8. Описание выбора элементной базы и работы принципиальной схемы
Схема работает по принципу активизации процессора в момент внешнего воздействия и пребывания его в режиме пониженного энергопотребления (режим STOP) в остальных случаях. Для вывода процессора из режима STOP служит сигнал логического 0 на выводе P2.7. Если на этом выводе сохраняется логический 0, то процессор не переходит в режим STOP. Активизация процессора вызывается следующими ситуациями: нажатие клавиши CLOCK или SET, падение напряжения в линии ниже уровня 20 В. Таким образом процессор активизируется после поступления звонка, при снятии трубки или просто при отключении от линии, вследствии чего при питании от батарей телефон не следует оставлять надолго отключенным от линии из-за достаточно большого тока потребления в активном режиме. Датчиком напряжения линии служит цепь собранная на элементах VD1, VD2, VD3, R1, R2, VD4, VD5, VD24. На элементах R21, VD21, VD22, VD23 собрано логическое.
И по активизации процессора от разных событий. Цепь C1, R5 служит для передачи аналогового сигнала на вход компаратора процессора AN1. На элементах VD6, VD7, R3, R4, VD8, C4, R7 собран датчик звонка формирующий напряжение на входе второго компаратора AN2. Элементы C5, R8, R9 формируют опорное напряжение для компараторов. Запросный сигнал синусоидальной формы формируется схемой на элементах R17, C8, C9. Для формирования запросного сигнала использован принцип дельта-модуляции с частотой дискретизации около 44 КГц. Исходная цифровая последовательность проходя интегрирующую цепь R17, C8 приобретает синусоидальную форму. Для передачи сигнала в линию используется схема на элементах R18, VT3, R19, R20, VT4, VD19, VD20. Для подстройки амплитуды сигнала изменяется сопротивление резистора R18. Режим по постоянному току задается резистором R20. Включение запросной цепи производится ключом DD3. Замыкание перемычкой контактов B2 и B3 приводит к выключению функции определения набора номера с параллельного телефона, что может понадобиться на блокированных линиях. Замыкание перемычкой контактов B2 и B1 включает функцию определения набора номера с параллельного телефона. Оставлять контакт B2 неподключеным нельзя. Цепи на VT1 и VT2 предназначены для перехвата сигналов нажатия клавиш SET и CLOCK. Через диоды VD15, VD16, VD17 процессор получает доступ к управлению ЖКИ параллельно с управляющей микросхемой телефона. Через резистор R11 и диод VD14 схема получает питание с разговорной части телефона. Через резистор R10 и диод VD12 схема получает питание от батареи которой снабжен телефон.
Подключение контактов. K1 - Подключение к плюсу диодного моста на плате телефона, выпрямляющего напряжение линии. K2 - Подключение +4,5 В от батареи питания телефона. K3 - свободный.
K4 - подключается к сигналу DATA ЖКИ.
K5 - подключается к сигналу CLK ЖКИ. K6 - подключается к сигналу SEL ЖКИ. K7 - подключается к сигналу KEYCLOCK ЖКИ. K8 - подключается к сигналу KEYSET ЖКИ. K9 - подключается после ключа включающего разговорную часть, но до сглаживающего дросселя. K10 и K11 подключаются непосредственно к двум проводам телефонной линии. K12 - подключается к общему проводу телефона.
Схема принципиальная электрическая АОН разработанная в Accel EDA представлена на рис. 2.
Номера записанные в память телефона для быстрого набора никак не связаны с номерами хранящимися в списке АОН и манипуляции с одними не отражаются на других.
Рис. 2 - Принципиальная схема АОНа в Accel EDA
Принципиальная схема АОНа приведена в Приложении Б.
Спецификация элементов приведена в Приложении В.
ЗАКЛЮЧЕНИЕ
В данном курсовом проекте разработано устройство - Автоматический Определитель Номера. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассемблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера. Существенно сократились размеры устройства, относительно аналогичных, собранных на базе п/п элементов и соответственно сократилось энергопотребление.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Техническая документация на микроконтроллеры Z86E0812PSC компании Microchip Technology Incorporated ООО«Микро-Чип», Москва, 2002.-184 с.
2. Проектирование цифровых устройств на однокристальных микроконтроллерах / В.В. Сташин [ и др.]. – М.: Энергоатомиздат, 1990. – 224 с.
3. Евстифеев А.В. Микроконтроллеры Microchip: практическое руководство/А.В.Евстифеев. – М.: Горячая линия – Телеком, 2002. – 296 с.
4. Ульрих В.А. Микроконтроллеры PIC16х\17хx / В.А. Ульрих. Изд. 2-е, перераб. и доп. – СПб.: Наука и техника, 2002. – 320 с.
5. Александр Елисеев (E-mail: ea@eunet.lt)
ПРИЛОЖЕНИЕ А
Листинг программы и объектный файл
TITLE Программа АОН "Panaphone"
Z8REGDEFS; Назначение символических имен
TIM_BL_H = 10H; Таймер звонка
TIM_BL_L = 11H; Таймер звонка
N_RECORD = 12H; Номер записи в списке
BLC_CLOCK = 13H; Счетчик блокировки по нажатию клавиши CLOCK
CNT_SET = 14H; Счетчик нажатия SET
CNT_CLOCK = 15H; Счетчик нажатия CLOCK
CNT_TWIX = 16H; Счетчик нажатия обоих клавиш
F_KEYS = 17H; XXXXXXXX Флаги клавиш
CONST_KEY = 10; Константа минимального количества тактов между нажатиями
CONST_BELL = 1000; Константа звонка
TET1 = 18H; 1-я ячейка тетрады
TET2 = 19H; 2-я ячейка тетрады
TET3 = 1AH; 3-я ячейка тетрады
TET4 = 1BH; 4-я ячейка тетрады
TET1_ = R8; 1-я ячейка тетрады
TET2_ = R9; 2-я ячейка тетрады
TET3_ = R10; 3-я ячейка тетрады
TET4_ = R11; 4-я ячейка тетрады
CNT_ONL = 18H; Счетчик низкой линии
PRE_N = 1CH; Предыдущая цифра
CNT_REP = 1DH; Счетчик повторов цифры
COND = 1EH; Состояние линии
MASK1 = 1FH; Маска первой цифры номера
BUF_NUM = 20H; Начало буфера номера
BEG_ST = 40H; Начало стека
BEG_COD = 40H; Начало области записи принятого кода
BEG_LST = 59H; Начало списка
END_LST = 7CH; Конец списка
BFLAG = 7FH; XXXXXXXX
; ¦¦¦¦¦¦¦¦
; ¦¦¦¦¦¦¦+------
; ¦¦¦¦¦¦+-------
; ¦¦¦¦¦+-------- Флаг неопределившегося номера
; ¦¦¦¦+--------- флаг блокировки звонка
; ¦¦¦+---------- флаг индикации категории
; ¦¦+----------- Флаг активности своего телефона
; ¦+------------ Флаг 1-й цифры
; +------------- Флаг звонка
TESTB = 7EH; Тест-байт целостности информации
CNT_B = 7DH; Счетчик длительности сигнала звонка
;+------------------------------------------------------------------+
;¦ Начало программного блока ¦
;+------------------------------------------------------------------+
CODE
GLOBAL
ABS
ORG 0
Область хранения векторов прерываний
WORD INT_P3_2L;P3.2 F-edge
WORD INT_P3_3L;P3.3 F-edge
WORD INT_P3_1L;P3.1 F-edge
WORD INT_P3_2H;P3.2 R-edge
WORD INT_T0;T0
WORD Sample;T1
; После сброса: Счетчики запрещены
; Прерывания запрещены
; Приоритеты не определены
; Указатель стека не определён
; Регистровый указатель = 0
; Порт 2 открытый сток,все входы
; Порт 3 цифровой
; Порт 0 вход
INT_P3_2L:
INT_P3_3L:
INT_P3_1L:
INT_P3_2H:
START:
; LD RP,#0FH; Активизация управления по P2.7
; LD 0BH,#00010100B; для эмулятора
LD RP,#00
LD P01M,#00000100B; Порт P0 - выход
LD P3M,#00000011B; P2 - Pull-Ups Activ
; P3 - Analog
LD P2, #11111111B; Вывод в порт 2
; ¦¦¦¦¦¦¦¦
; ¦¦¦¦¦¦¦+------ Вход клавиши SET
; ¦¦¦¦¦¦+------- Вход клавиши CLOCK
; ¦¦¦¦¦+-------- -
; ¦¦¦¦+--------- -
; ¦¦¦+---------- Датчик активности телефона
; ¦¦+----------- Управление ключом
; ¦+------------ Датчик линии
; +------------- Вход прерываний
;
LD P2M,#11001111B; Определение направления выводов порта P2
LD P0,#00000111B;
LD PRE0,#11001001B; Коэффицент деления 50
LD TMR,#00001011B; Разрешение обоих таймеров T0 с загрузкой
LD T0,#150; Переполнение таймера каждые 5 мс
LD IMR,#10010000B; Разрешение T0 и запрещение T1
BEGIN:
LD SPL,#BEG_ST
EI
CP TESTB,#55H; Проверка целостности информации
JR Z,NOT_CLEAR_RAM;
LD R4,#5
CLEAR_RAM:; Очистка ОЗУ контроллера
LD @R4,#0
INC R4
CP R4,#127
JR C,CLEAR_RAM
LD TESTB,#55H
LD MASK1,#2; Выставить маску первой цифры номера
LD CNT_B,#0
NOT_CLEAR_RAM:
AND BFLAG,#00000111B; Сброс флага звонка,определения
; пульсового набора,набранной цыфры и
; очистки буфера
CALL GO_HALT
;
;------------------------------------------------------------------------
; Основной блок
;------------------------------------------------------------------------
MAIN:
TCM P2,#00000011B
JP NZ,M1
M2_2:
TM P2,#01000000B
JR Z,M2
TM P3,#00000100B
JR NZ,M2
LD P2M,#11001111B
NOP
STOP
M2:
LD R4,#10
LD CNT_ONL,#0
M2_0: CALL GO_HALT
INC CNT_ONL; Счетчик низкой линии
TM P2,#01000000B
JR Z,M2_1
LD CNT_ONL,#0
M2_1:
DJNZ R4,M2_0
CP CNT_ONL,#8
JR UGE,M3; Переход если трубку сняли
TM BFLAG,#10000000B
JR NZ,M2
JR M2_2
M3:
AND BFLAG,#10110011B
TM BFLAG,#10000000B
JR Z,M4
AND P0,#11111110B; Захват LCD
PUSH IMR
CALL ID_NUM
OR P2,#00100000B
POP IMR
LD R7,#BUF_NUM; Вывод номера на LCD
LD R6,#0
LD R8,#8
CALL SEND_BYTE
CALL SEND_BYTE
M3_1: LD R6,@R7
CALL SEND_BYTE
INC R7
DJNZ R8,M3_1
TM BFLAG,#00000100B; Не сохранять номер если он не определился
JR NZ,M4
LD R7,#END_LST; Сдвиг списка на одну запись
LD R8,#END_LST-4
M3_2: LD R4,@R8
LD @R7,R4
DEC R7
DEC R8
CP R8,#BEG_LST
JR UGE,M3_2
LD R7,#BEG_LST; Упаковка номера в список
LD R8,#BUF_NUM
LD R9,#4
M3_3: LD R4,@R8
SWAP R4
AND R4,#0F0H
INC R8
AND @R8,#0FH
OR R4,@R8
LD @R7,R4
INC R8
INC R7
DJNZ R9,M3_3
OR P0,#00000001B; Снять захват LCD
M4: AND BFLAG,#00110011B
LD BLC_CLOCK,#0
TM P2,#00000100B
JR NZ,M4_1
AND P0,#11111110B; Захват LCD
M4_1:
CALL GO_HALT
TM P2,#01000000B; Проверка тока в линии
JR Z,M5; Переход если нет импульса в линии
LD R9,#0; Счетчик цыфры
MN4_1: LD R4,#20; Счетчик импульса
MN4_2: CALL GO_HALT
TM P2,#01000000B; Проверка тока в линии
JR Z,MN4_3; Переход если прервался импульс
DJNZ R4,MN4_2
; Выход если импульс слишком длинный
OR P0,#00000001B; Снять захват LCD
LD P2M,#11001111B
NOP
STOP
MN4_3:
LD R4,#12; Счетчик паузы
INC R9
MN4_4: CALL GO_HALT
TM P2,#01000000B; Проверка тока в линии
JR NZ,MN4_1; Переход если прервалась пауза
DJNZ R4,MN4_4
TM P2,#00000100B
JR NZ,M5
MN4_6: TM BFLAG,#01000000B; Проверить флаг первой цифры
JR NZ,MN4_7
LD R6,#00
LD R8,#10
MN4_8:CALL SEND_BYTE
DJNZ R8,MN4_8
OR BFLAG,#01000000B; Выставить флаг первой цифры
MN4_7: LD R6,R9
CALL SEND_BYTE
M5:
TM F_KEYS,#00001000B; Проверка клавиши SET
JR Z,M4_1
AND F_KEYS,#11110111B;
CALL LIST
JR M4
M1:
TM F_KEYS,#00010000B; Проверка клавиши CLOCK
JR Z,M1_1
AND F_KEYS,#11101111B; Сброс флага клавиши CLOCK
CP BLC_CLOCK,#00; Пуст ли счетчик нажатий клавиши CLOCK
JR NZ,M1_0
LD BLC_CLOCK,#2
JR M1_1
M1_0: DEC BLC_CLOCK
M1_1: TM F_KEYS,#00001000B; Проверка клавиши SET
JP Z,MAIN
;
; Режим просмотра списка
;
AND F_KEYS,#11110111B
CALL LIST
JP MAIN
;+----------------------------------------------------------------------+
;¦ Режим просмотра списка ¦
;+----------------------------------------------------------------------+
LIST:
AND F_KEYS,#11110111B
CP BLC_CLOCK,#00
JP Z,LIST1
RET
LIST1: AND P0,#11111110B; Захват LCD
LD R4,#10
LIST2: CALL GO_HALT
DJNZ R4,LIST2
LIST3: LD N_RECORD,#1
LIST4: LD R6,N_RECORD
CALL SEND_BYTE; Вывод на LCD номера записи
LD R6,#0FH; '-'
CALL SEND_BYTE
LD R7,N_RECORD; Вычисление адреса записи
DEC R7
RL R7; Умножить на 4 (длину записи)
RL R7
ADD R7,#BEG_LST; Получить адрес начала записи
LD R8,#2
;
; Вывод номера
;
LIST5:
LD R6,@R7; Вывод 8-и байтов номера
SWAP R6
AND R6,#0FH;
TM BFLAG,#00010000B; Проверить флаг индикации категории
JP NZ,LIST6
LD R6,#0; Не показывать категорию если не выставлен
LIST6:; флаг
CALL SEND_BYTE
LD R6,@R7; Вывод первой цифры номера
AND R6,#0FH
CP R6,MASK1
JP NZ,LIST7
LD R6,#0
LIST7:
CALL SEND_BYTE
INC R7; Вывод второй цифры номера
LD R6,@R7
SWAP R6
CALL SEND_BYTE
SWAP R6; Вывод третьей цифры номера
CALL SEND_BYTE
LIST8:
INC R7; Вывод остальных цифр номера
LD R6,@R7
SWAP R6
CALL SEND_BYTE
SWAP R6
CALL SEND_BYTE
DJNZ R8,LIST8
LIST9: TM F_KEYS,#00100000B; Проверка одновременного нажатия CLOCK,SET
JR Z,LIST10
AND F_KEYS,#11000111B;
JR LIST12
LIST10: TM F_KEYS,#00010000B; Проверка клавиши CLOCK
JR Z,LIST11
AND F_KEYS,#11101111B;
INC N_RECORD
CP N_RECORD,#9
JR UGT,LIST3
JR LIST4
LIST11: TM F_KEYS,#00001000B; Проверка клавиши SET
JP Z,LIST23
AND F_KEYS,#11110111B;
OR P0,#00000001B
CALL GO_HALT
CALL SEND_BYTE
RET
;
; Режим установок
;
LIST12:
; Установка флага показа категории
LD R6,#0CH
CALL SEND_BYTE
TM BFLAG,#00010000B; Проверить флаг индикации категории
LD R6,#0AH
JP Z,LIST13; Показать флаг индикации категории
LD R6,#01H
LIST13:
CALL SEND_BYTE
LD R6,#0DH
CALL SEND_BYTE
LD R6,#0
CALL SEND_BYTE
CALL SEND_BYTE
LD R6,MASK1
CALL SEND_BYTE
LD R6,#0
CALL SEND_BYTE
CALL SEND_BYTE
CALL SEND_BYTE
CALL SEND_BYTE
LIST14:
TM F_KEYS,#00001000B; Проверка клавиши SET
JR Z,LIST15
AND F_KEYS,#11110111B;
JP LIST17
LIST15:
TM F_KEYS,#00010000B; Проверка клавиши CLOCK
JR Z,LIST16
AND F_KEYS,#11101111B;
XOR BFLAG,#00010000B;
JP LIST12
LIST16: CALL GO_HALT
JP NZ,BEGIN
JR LIST14
LIST17:; Установка маски первой цифры
LD R6,#00H
CALL SEND_BYTE
TM BFLAG,#00010000B; Проверить флаг индикации категории
LD R6,#0AH
JP Z,LIST18; Показать флаг индикации категории
LD R6,#01H
LIST18:
CALL SEND_BYTE
LD R6,#00H
CALL SEND_BYTE
CALL SEND_BYTE
LD R6,#0CH
CALL SEND_BYTE
LD R6,MASK1
CALL SEND_BYTE
LD R6,#0DH
CALL SEND_BYTE
LD R6,#00H
CALL SEND_BYTE
CALL SEND_BYTE
CALL SEND_BYTE
LIST19:
TM F_KEYS,#00001000B; Проверка клавиши SET
JR Z,LIST20
AND F_KEYS,#11110111B;
JP LIST4
LIST20:
TM F_KEYS,#00010000B; Проверка клавиши CLOCK
JR Z,LIST22
AND F_KEYS,#11101111B;
INC MASK1
CP MASK1,#0AH
JR ULE,LIST21
LD MASK1,#00
LIST21:
JP LIST17
LIST22: CALL GO_HALT
JP NZ,BEGIN
JR LIST19
;
;
;
LIST23: CALL GO_HALT
JP NZ,BEGIN
JP LIST9
;
;----------------------------------------------------------------------
; END LIST
;+--------------------------------------------+
;¦ Подпрограмма HALT режима ¦
;+--------------------------------------------+
GO_HALT:
PUSH R4
NOP
HALT
EXIT_STOP:
;
; Поддержка клавиши SET
;
TM P2,#00000001B;
JR NZ,K1;
TM F_KEYS,#00000001B;
JR NZ,K3;
OR F_KEYS,#00001001B;
JR K3;
K1: AND F_KEYS,#11110110B;
;
; Поддержка клавиши CLOCK
;
K3:;
TM P2,#00000010B;
JR NZ,K4;
TM F_KEYS,#00000010B;
JR NZ,K5;
OR F_KEYS,#00010010B;
JR K5;
K4: AND F_KEYS,#11101101B;
;
; Поддержка клавиш CLOCK+SET
;
K5:;
TCM F_KEYS,#00000011B;
JR NZ,K6;
TM F_KEYS,#00000100B;
JR NZ,K7;
OR F_KEYS,#00100100B;
JR K7;
K6: AND F_KEYS,#11011011B;
K7:;
;
; Отслеживание звонка
;
TM BFLAG,#00001000B; Проверить блокировку звонка
JR NZ,K12
TM P3,#00000100B
JR Z,K10
INC CNT_B
CP CNT_B,#60; 0.3 сек для звонка
JP ULT,K12
OR BFLAG,#10000000B
LD TIM_BL_H,#^hb(CONST_BELL)
LD TIM_BL_L,#^lb(CONST_BELL)
JR K12
K10:
CLR CNT_B
LD R4,TIM_BL_H
OR R4,TIM_BL_L
JR NZ,K11
AND BFLAG,#01111111B
JR K12
K11: DECW TIM_BL_H
K12:
LD R4,COND; Сравнить предыдущее и настоящее состояния
LD COND,P2; линии
XOR R4,COND; Z - если состояния одинаковы
AND R4,#01000000B; NZ - если состояния разные
POP R4
RET
;+----------------------------------------------------------------------+
;¦ Определение номера звонящего абонента ¦
;+----------------------------------------------------------------------¦
;¦ Выход: флаг C = 0 - определение произведено ¦
;¦ C = 1 - сбой определения ¦
;¦ ¦
;+----------------------------------------------------------------------+
ID_NUM:
LD TET1,0FFH; Заполнение тетрады
LD TET2,0FFH; кодом неопределенности
LD TET3,0FFH
LD TET4,0FFH
CALL INIT_T1_500
LD IMR,#10100000B; Разрешение T1 и запрещение T0
LD R5,#4; Число запросов 3
AND BFLAG,#01111111B; Сброс звонка
LD TIM_BL_H,#0; Сбросить таймер звонка
LD TIM_BL_L,#0; Сбросить таймер звонка
AND P2,#11011111B; Занять линию
;---------------------------------------------------------------------------
; Запрос 500 Гц
;
REQ0:
CALL INIT_T1_44117
EI
LD IMR,#10100000B; Разрешение T1 и запрещение T0
LOOP1:
LD R9,#0; 6
LD R11,#BEG_COD
LOOP1_0:
LD R12,#^hb(BIT_MAP); 6
LD R13,#^lb(BIT_MAP); 6
ADD R13,R9; 6
ADC R12,#0; 10
LDC R10,@RR12; 12
LD @R11,R10
INC R11
INC R9; 6
CP R9,#11; 10
JP ULT,LOOP1_0; 12/10 MAX = 131
LD R10,#100
LOOP4:
LD R11,#BEG_COD; 6
LOOP4_0:
LD R8,#8; 6
LOOP3:
LD R12,@R11; 10
AND R12,#11011111B
LD R2,R12
RL @R11; 10
NOP; 6
HALT; 7
LOOP2: DJNZ R8,LOOP3; 12/10
INC R11; 6
CP R11,#BEG_COD+11; 10
JP ULT,LOOP4_0; 12/10 MAX = 131
; JP LOOP4
DJNZ R10,LOOP4; 12
;----------------------------------------------------------------------------
TM P2,#00000100B; Снять захват линии если активен свой телефон
JR Z,ID_NUM0;
OR P2,#00100000B;
ID_NUM0:
LD R4,#20
ID_NUM1:
PUSH R4; Ожидать ответа 0.2 сек
PUSH R5
CALL AON_processor
POP R5
POP R4
CP R8,#30
JP NC,ID_NUM2
DJNZ R4,ID_NUM1
DJNZ R5,REQ0
ID_NUM2:
LD CNT_REP,#0; Обнулить счетчик повторов
LD PRE_N,#0FFH; Предыдущая цифра не определена
LD R4,#25; Количество принимаемых кодов
LD R5,#BEG_COD; Адрес буфера принимаемых цифр
LD TET1,R9; Запись в тетраду первого кода
ID_NUM3:
PUSH R4
PUSH R5
CALL AON_processor
POP R5
POP R4
;
; Вписать цифру в тетраду
;
LD RP,#10H; Сменить банк регистров
LD TET4_,TET3_; Сместить цыфры в тетраде
LD TET3_,TET2_;
LD TET2_,TET1_;
LD TET1_,9; Записать текущую цифру
;
; Обработка тетрады
;
LD 9,TET1_
CP 9,TET2_
JP Z,ID_NUM4
LD 9,TET2_
CP 9,TET3_
JP Z,ID_NUM4
LD 9,TET3_
CP 9,TET4_
JP Z,ID_NUM4
LD 9,#0FFH
ID_NUM4:
LD RP,#00
CP PRE_N,R9; Цифра равна предыдущей ?
JP Z,ID_NUM6
CP CNT_REP,#00; Записывать цифру только после второго
JP Z,ID_NUM6; повтора
ID_NUM5:
LD @R5,R9
LD PRE_N,R9; Сохранить текущую цифру
INC R5
LD CNT_REP,#00; Обнулить счетчик повторов
DJNZ R4,ID_NUM3; Продолжать ввод пока не будет записано
JR ID_NUM8_; 25 цифр
ID_NUM6:
INC CNT_REP;
; CP R9,#0FFH; Не повторять запись цифр отличных от 0FFH
; JR NZ,ID_NUM3;
CP CNT_REP,#7;
JP UGT,ID_NUM5;
JR ID_NUM3
;
; Сборка номера
;
ID_NUM8_:
LDR4,#BEG_COD
LD R5,#6; Поиск двух кодов 0AH в области принятых
ID_NUM9:; кодов
CP @R4,#0AH; Адрес первого хранится в рег. R6
JR NZ,ID_NUM7; второго в рег. R7
LD @R5,R4;
INC R5;
CP R5,#8;
JR UGE,ID_NUM8;
ID_NUM7:;
INC R4;
CP R4,#BEG_COD+25
JR ULT,ID_NUM9
ID_NUM8:
CP R5,#8
JR Z,ID_NUM10
CP R5,#7
JR Z,ID_NUM11
;
; Заполнение буфера кодом неопределенности если не найдено ни одного
; кода 0AH
;
LDR4,#BUF_NUM
LDR5,#8
ID_NUM12:
LD @R4,#0FH
INC R4
DJNZ R5,ID_NUM12
JP ID_NUM_ERR
ID_NUM10:
LDR8,R6
LD R9,R7
JR ID_NUM13
ID_NUM11:
LD R8,R6
LD R9,R8
; ADD R9,#9
ID_NUM13:
LDR4,#8
LD R10,#BUF_NUM
DEC R8
DEC R9
ID_NUM20:
CP R8,#BEG_COD
JR ULT,ID_NUM14
CP R8,#BEG_COD+24
JR UGE,ID_NUM14
LDR6,@R8
JR ID_NUM15
ID_NUM14:
LD R6,#0FFH
ID_NUM15:
CP R9,#BEG_COD
JR ULT,ID_NUM16
CP R9,#BEG_COD+24
JR UGE,ID_NUM16
LDR7,@R9
JR ID_NUM17
ID_NUM16:
LD R7,#0FFH
ID_NUM17:
CP R7,#0FFH
JR Z,ID_NUM18
LD @R10,R7
JR ID_NUM19
ID_NUM18:
LD @R10,R6
ID_NUM19:
DEC R8
DEC R9
INC R10
DJNZ R4,ID_NUM20
;
; Удаление повторов и нулей
LD R4,#BUF_NUM
LD R5,@R4
LD R6,#8
ID_NUM22:
CP @R4,#0BH
JR NZ,ID_NUM21
LD @R4,R5
ID_NUM21:
CP @R4,#0
JR NZ,ID_NUM23
LD @R4,#10
ID_NUM23:
LDR5,@R4
INC R4
DJNZ R6,ID_NUM22
; Циклический сдвиг на одну позицию вправо
LD R4,#BUF_NUM+7
LD R5,#BUF_NUM+6
LD R8,@R4
LD R7,#7
ID_NUM24:
LD R6,@R5
LD @R4,R6
DEC R4
DEC R5
DJNZ R7,ID_NUM24
LD @R4,R8
RCF
RET
ID_NUM_ERR:
OR BFLAG,#00000100B; Флаг неопределения
RET
;+-------------------------------------------------+
;¦ Подпрограмма инициализации T1 на 500 ¦
;+-------------------------------------------------+
INIT_T1_500:
LD PRE1,#11110011B; Коэффицент деления 60
LD TMR,#00001110B; Разрешение обоих таймеров T1 с загрузкой
LD T1,#50; Переполнение таймера каждые 2 мс
RET
;+-------------------------------------------------+
;¦ Подпрограмма инициализации T1 на 44117 Гц ¦
;+-------------------------------------------------+
INIT_T1_44117:
LD PRE1,#01000111B; Коэффицент деления 17
LD TMR,#00001110B; Разрешение обоих таймеров T1 с загрузкой
LD T1,#2; Переполнение таймера каждую
RET
;+-------------------------------------------------+
;¦ Подпрограмма вывода байта на ЖКИ 'Panasoanic' ¦
;¦ Ввод: R6 - выводимый байт ¦
;¦ ¦
;¦ Изменяются R4,R5 ¦
;+-------------------------------------------------+
SEND_BYTE:
SWAP R6
LD R5,#4
SB1: RL R6
JP C,SB2; Передача 1
AND P0,#11111011B; Передача 0
JR SB3
SB2: OR P0,#00000100B
SB3:
LD R4,#15
DJNZ R4,$
AND P0,#11111101B; Передача строба
LD R4,#15
DJNZ R4,$
OR P0,#00000010B
LD R4,#15
DJNZ R4,$
OR P0,#00000100B; Снятие сигнала
LD R4,#15
DJNZ R4,$
DJNZ R5,SB1
RET
;+-------------------------------------------------------------------------+
;¦ Подпрограмма ввода информации АОН ¦
;+-------------------------------------------------------------------------+
Fr1_1 = 20H
Fr1_2 = 21H
Fr2_1 = 22H
Fr2_2 = 23H
Fr3_1 = 24H
Fr3_2 = 25H
Fr4_1 = 26H
Fr4_2 = 27H
Fr5_1 = 28H
Fr5_2 = 29H
Fr6_1 = 2AH
Fr6_2 = 2BH
AON_processor:
LD PRE1,#00010111B; Коэфф. дел. =5
LD TMR,#00001110B
LD T1,#15; Коэфф. дел. =15
; При частоте 12 МГц период счетчика 50 мкс
LD IMR,#10100000B; Разрешение T1 запрещение T0
; Производится 200 отсчетов
; На каждую эпюру отводится в таблице 25 байт
LD R4,#Fr1_1
LD R6,#0
LD R7,#6
LD R8,#8
LD R14,#^hb(TABLE); @RR14 - Адрес таблицы эпюр
LD R15,#^lb(TABLE);
LD R12,#^hb(NUM_TABLE); @RR12 - Адрес таблицы сумм
; Формирование первого байта отсчетов
AONp2: NOP
HALT;7 Ожидание времени отсчета
SCF;6
TM P3,#00000010B;10
JR NZ,AONp0;10
CCF;6
AONp0: RLC R6;6 Формирование байта отсчетов
CP R7,#0;10
JR Z,AONp1;10
LD @R4,#0;10
INC R4;6
LD @R4,#0;10
INC R4;6
DEC R7;6
AONp1:
DJNZ R8,AONp2;12 -> 103 T. 17.17 мкс
; Прием и обработка следующих байтов отсчетов
LD R11,#25;10
AONp5:
LD R4,#Fr1_1;10 Адрес буфера идентификаторов
LD R7,#6;10 Счетчик принимаемых бит
LD R8,#8;10 Счетчик циклов ввода
LD R9,R6;6 Сохранить предыдущий байт отсчетов
LD R6,#0;10 Байт отсчетов
AONp4: NOP
HALT;7
SCF;6
TM P3,#00000010B;10
JR NZ,AONp6;10
CCF;6
ONp6: RLC R6;6 Формирование байта отсчетов
CP R7,#00;10
JR Z,AONp3;10
LDC R13,@RR14;12
XOR R13,R9;6
LDC R10,@RR12;12
ADD R10,@R4;6
LD @R4,R10;10
INCW RR14;10
INC R4;6
LDC R13,@RR14;12
XOR R13,R9;6
LDC R10,@RR12;12
ADD R10,@R4;6
LD @R4,R10;10
INCW RR14;10
INC R4;6
DEC R7;6
AONp3:
DJNZ R8,AONp4;12 ->207 Продолжение цикла ввода байта
; отсчетов
DJNZ R11,AONp5;12 ->275 Продолжение ввода байтов отсчетов
; Приведение массива идентификаторов к нормальной форме
LD R13,#01
LD R14,#00
LD R15,#00
LD R4,#Fr1_1;10 Адрес буфера идентификаторов
LD R6,#6;10 Счетчик нормальных идентификаторов
LD R7,#00
AONp11:
SUB @R4,#101
JR NC,AONp7
COM @R4
AONp7: LD R5,@R4
INC R4
SUB @R4,#101
JR NC,AONp8
COM @R4
AONp8: ADD R5,@R4; Получение нормального идентификатора
INC R4
; Определение пары максимальных идентификаторов
CP R8,R5
JR NC,AONp9
LD R7,R8
LD R8,R5
LD R14,R15
LD R15,R13
JR AONp10
AONp9: CP R7,R5
JR NC,AONp10
LD R7,R5
LD R14,R13
AONp10: RL R13
DJNZ R6,AONp11
; Вычисление цифры
OR R14,R15
LD R9,#12
AONp13:
LD R12,#^hb(TABLE_NUM_AON-1)
LD R13,#^lb(TABLE_NUM_AON-1)
ADD R13,R9
ADC R12,#0
LDC R10,@RR12
CP R14,R10
JR Z,AONp12
DJNZ R9,AONp13
AONp12: DEC R9
DI
RET
;Выход *****************************
; R8 - величина первого идентификатора
; R7 - величина второго идентификатора
; R9 - принятая цифра {0..Bh}, если R9=FFh то цифра не определена
;***********************************
;
; Последовательность цифр в посылке:
; 1. Категория абонента
; 2. Единицы номера
; 3. Десятки номера
; 4. Сотни номера
; 5. Тысячи номера
; 6. 3-я цифра индекса станции
; 7. 2-я цифра индекса станции
; 8. 1-я цифра индекса станции
; 9. Начало/конец передачи
; 10. Категория абонента
;----------------------------
; Подпрограмма ввода выборки
;----------------------------
Sample:
IRET
INT_T0:
IRET
;----------------------------
TABLE_NUM_AON:;усл.номер цифра
.BYTE 18H; 0
.BYTE 03H; 1
.BYTE 05H; 2
.BYTE 06H; 3
.BYTE 09H; 4
.BYTE 0AH; 5
.BYTE 0CH; 6
.BYTE 11H; 7
.BYTE 12H; 8
.BYTE 14H; 9
.BYTE 24H; 0AH - код начала/конца
.BYTE 28H; 0BH - код повтора
BIT_MAP:
.BYTE 11111111B
.BYTE 01111111B
.BYTE 01111101B
.BYTE 00101010B
.BYTE 00001000B
.BYTE 00000000B
.BYTE 00000000B
.BYTE 00000010B
.BYTE 01110100B
.BYTE 11110110B
.BYTE 11111110B
.ORG 05D4H
;----------------------------
; Таблица АОН
TABLE:
.BYTE 0FFH,0FFH,0FFH,0FCH,0FFH,0F8H,0FFH,0F0H,0FEH,0F0H,0FCH,0E0H
.BYTE 0FEH,000H,0F0H,000H,0C0H,003H,000H,00FH,003H,01FH,00FH,07EH
.BYTE 000H,003H,001H,07FH,01FH,0FEH,0FFH,0F0H,0F8H,080H,0C0H,007H
.BYTE 007H,0FFH,0FFH,0F0H,0F0H,000H,001H,01FH,01FH,0FEH,0FCH,0E0H
.BYTE 0FFH,0F0H,0C0H,001H,007H,0FFH,0FEH,0E0H,0C0H,007H,00FH,07EH
.BYTE 0E0H,000H,007H,0FFH,0FCH,080H,001H,01FH,07EH,0F0H,0C0H,007H
.BYTE 000H,01FH,0FFH,0E0H,001H,01FH,0FCH,0E0H,003H,01FH,0F8H,0E0H
.BYTE 03FH,0FFH,000H,003H,0FFH,0F0H,003H,03FH,0F8H,080H,01FH,0FCH
.BYTE 0FFH,080H,01FH,0FFH,000H,007H,0FCH,0C0H,01FH,0FEH,081H,00FH
.BYTE 000H,001H,0FCH,080H,07FH,0FCH,007H,03FH,0C0H,007H,0F8H,0C0H
.BYTE 003H,0FFH,000H,00FH,0C0H,001H,0F8H,080H,07EH,0F0H,01FH,0FCH
.BYTE 0FFH,0F8H,07FH,0FEH,01FH,0FFH,007H,07FH,003H,01FH,081H,00FH
.BYTE 0F8H,000H,0F8H,000H,0F8H,000H,0F8H,080H,0F8H,080H,0F8H,0C1H
.BYTE 000H,00FH,000H,03FH,003H,07FH,00FH,0FFH,01FH,0FEH,03FH,0F8H
.BYTE 01FH,0FFH,0FFH,0F8H,0FEH,0C0H,0F0H,000H,0C0H,007H,003H,01FH
.BYTE 0FFH,0C0H,0E0H,000H,000H,01FH,00FH,0FEH,07EH,0F0H,0F0H,081H
.BYTE 080H,000H,003H,0FFH,0FFH,0F0H,0E0H,001H,003H,01FH,03FH,0F8H
.BYTE 001H,0FFH,0FFH,0E0H,080H,007H,01FH,0FEH,0F8H,080H,003H,01FH
.BYTE 0FFH,0FEH,080H,001H,03FH,0FEH,0E0H,001H,01FH,0FEH,0F0H,081H
.BYTE 0FCH,000H,00FH,0FFH,0E0H,000H,03FH,0FCH,0C0H,007H,03EH,0F0H
.BYTE 000H,007H,0FEH,0C0H,00FH,0FFH,0C0H,003H,07EH,0F0H,007H,03FH
.BYTE 00FH,0FFH,000H,007H,0F8H,080H,03FH,0FCH,003H,01FH,0E0H,003H
.BYTE 0FFH,0E0H,03FH,0FFH,003H,03FH,0C0H,007H,0F8H,080H,07EH,0F0H
.BYTE 0C0H,000H,0F8H,000H,0FFH,0E0H,07FH,0F8H,01FH,0FEH,007H,03FH
.BYTE 000H,07FH,000H,01FH,000H,00FH,080H,007H,0C0H,007H,0E0H,003H
.ORG 700H
;
; ТАБЛИЦА СООТВЕТСТВИЯ БАЙТА И КОЛИЧЕСТВА
; ЕДИНИЦ В НЕМ
NUM_TABLE:
.BYTE 00H,01H,01H,02H,01H,02H,02H,03H,01H,02H,02H,03H,02H,03H,03H,04H
.BYTE 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H
.BYTE 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H
.BYTE 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H
.BYTE 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H
.BYTE 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H
.BYTE 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H
.BYTE 04H,05H,05H,06H,05H,06H,06H,07H,05H,06H,06H,07H,06H,07H,07H,08H
.END
Приложение Б
Схема принципиальная электрическая АОН
... Мортон Дж. Микроконтроллеры АVR. Вводный курс /Пер. с англ. – М., Додэка –ХХ1, 2006 – 272с. 7. Техническая документация на микроконтроллеры AT89C2051 фирмы «Atmel». ООО «Микро -Чип», Москва, 2002.-184 с. ПРИЛОЖЕНИЕ А Листинг программы и объектный файл ; ЧАСЫ-ТЕРМОМЕТР-ВОЛЬТМЕТР ДЛЯ АВТОМОБИЛЯ. РАЗРАБОТАЛ ДЕРКАЧ ; ПРОГРАММА = ABTO.ASM ; ВЕРСИЯ: 20-01-07. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB ...
... Дж. Микроконтроллеры АVR. Вводный курс /Пер. с англ. – М., Додэка –ХХ1, 2006 – 272с. 7.Техническая документация на микроконтроллеры AT89C2051 фирмы «Atmel». ООО «Микро -Чип», Москва, 2002.-184 с. Приложение А Листинг программы и объектный файл ; ЧАСЫ-ТЕРМОМЕТР-ВОЛЬТМЕТР ДЛЯ АВТОМОБИЛЯ. РАЗРАБОТАЛ ДЕРКАЧ ; ПРОГРАММА = ABTO.ASM ; ВЕРСИЯ: 20-01-07. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ...
... настройки процесса работы МП. - микроконтроллер – ядро всего устройства, содержащее необходимую информацию в виде программного кода, записанного во встроенное ПЗУ, в котором прописан алгоритм работы системы. - считыватель ключей – устройство, с помощью которого система сигнализации ставится/снимается в режим охрана. 8) Конструкторские требования (габариты, установочные, присоединительные ...
... с применением полиграфических компьютерных технологий? 10. Охарактеризуйте преступные деяния, предусмотренные главой 28 УК РФ «Преступления в сфере компьютерной информации». РАЗДЕЛ 2. БОРЬБА С ПРЕСТУПЛЕНИЯМИ В СФЕРЕ КОМПЬЮТЕРНОЙ ИНФОРМАЦИИ ГЛАВА 5. КОНТРОЛЬ НАД ПРЕСТУПНОСТЬЮВ СФЕРЕ ВЫСОКИХ ТЕХНОЛОГИЙ 5.1 Контроль над компьютерной преступностью в России Меры контроля над ...
0 комментариев