Разработка микропроцессорной системы АОНа на базе микроконтроллера
p align="left">LD R6,#00HCALL 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 Приложение Б
Схема принципиальная электрическая АОН
Страницы: 1, 2, 3
|
|