Декодування з формату caller-ID див. нижче.
Генерування сигналу виконано на двох ніжках з фільтруванням Т-подібним пасивним фільтром і наступним об'єднанням сигналів.
Була написана наступна програма на асемблері для мікроконтролера PIC16F628A:
;
Програма генерації сигналів для аналогового АВН
;
;
;
Секция заголовка
;
;
описание опеpационных pегистpов
TMR0
EQU 01h
PC
EQU 02h
STATUS
EQU 03h
FSR
EQU 04h
;
pегистpы ввода/вывода
CNTRLPORT
EQU 05h
DATAPORT
EQU 06h
;
ячейки ОЗУ
;
Безинтервальный пакет
CLOCKA
EQU 0Ch
CLOCKAMAIN
EQU 0Dh
CLOCKB
EQU 0Eh
CLOCKBMAIN
EQU 0Fh
DIGITTIME
EQU 10h
DIGITTIMEZ
EQU 11h
;
Счетчик
COUNTER
EQU 12h
;
биты pегистpа STATUS
C
EQU 0h
DC
EQU 1h
Z
EQU 2h
PD
EQU 3h
TO
EQU 4h
RP
EQU 5h
;
упpавляющие pегистpы
TRISA
EQU
85h
TRISB
EQU 86h
;
слова инициализации для поpтов ввода/вывода
INITA
EQU B'10000000'
INITB
EQU B'00000000'
;
;
Рабочая секция
;
;
начало исполняемого кода
ORG 0
GOTO BEGIN
;
ORG 100h
BEGIN
;Инициализация
порта А
BCF STATUS,RP
;Выбор банка 0
CLRF CNTRLPORT
;Очистить регистр CNTRLPORT
MOVLW INITA
;Загpузить B'00000000' в pегистp W
BSF STATUS,RP
;Выбор банка 1
MOVWF TRISA
;Все разряды порта А установить как
выходы
;Инициализация
порта В
BCF STATUS,RP
;Выбор банка 0
CLRF DATAPORT
;Очистить регистр DATAPORT
MOVLW INITB
;Загpузить B'00000000' в pегистp W
BSF STATUS,RP
;Выбор банка 1
MOVWF TRISB
;Все разряды порта В установить как
выходы
;
BCF STATUS,RP
;Выбор банка 0
;
ReStart
BCF DATAPORT,0
;
Передача номера в линию
MOVLW 0FFh ;
Длительность
255
MOVWF DIGITTIME
; звучания
MOVLW 0Ah ;
одной цифры 7
255x7=1785 циклов
MOVWF DIGITTIMEZ
; в тактах (периодах)
MOVLW 5h
; Повторов пакета
MOVWF COUNTER ;
Povtor
;
============================ Сигнал "Початок пакету"
MOVLW 14h ;
Частота сигнала порта А (в умовних одиницях)
MOVWF CLOCKAMAIN
; Циклів сигнала
MOVWF CLOCKA ;
Циклів сигнала (лічильник)
MOVLW 0Dh ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
Циклів сигнала (лічильник)
MOVWF CLOCKBMAIN
; Циклів сигнала
CALL DIGIT ;
Процедура генерації двотональної посилки
;
============================ Передача "Категории
абонента" (1)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 18h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 7я цифра (4)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 11h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 6я цифра (7)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 0Eh ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 5я цифра (3)
MOVLW 18h ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 14h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 4я цифра (7)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 0Eh ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 3я цифра (4)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 11h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 2я цифра (2)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 14h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Передача номера - 1я цифра (4)
MOVLW 1Fh ;
Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN
;
MOVWF CLOCKA ;
MOVLW 11h ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN
;
CALL DIGIT ;
Процедура генерации двутональной посылки
;
============================ Сигнал "Конец пакета"
MOVLW 14h ;
Частота сигнала порта А (в умовних одиницях)
MOVWF CLOCKAMAIN
; Циклів сигнала
MOVWF CLOCKA ;
Циклів сигнала (лічильник)
MOVLW 0Dh ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
Циклів сигнала (лічильник)
MOVWF CLOCKBMAIN
; Циклів сигнала
CALL DIGIT ;
Процедура генерації двотональної посилки
;
============================ Конец посылки номера, тепер
пауза
BCF DATAPORT,3
; Обнулить линию А
BCF DATAPORT,4
; Обнулить линию В
DECFSZ COUNTER,1
GOTO Povtor
BSF DATAPORT,0
; Сигнал "Finish" вкл.
GOTO NOMSENDEND
;
============================ Процедура генерації
двотональної посилки
DIGIT
DECFSZ CLOCKA,1
; CLOCKA-1, якщо =0, то
GOTO JAMPA
GOTO INVERTA ;
перейти на процедуру інвертування
JAMPA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INVERTAEND
DECFSZ CLOCKB,1
; CLOCKA-1, якщо =0, то
GOTO JAMPB
GOTO INVERTB ;
перейти на процедуру інвертування
JAMPB
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INVERTBEND
DECFSZ DIGITTIME,1 ;
CLOCKA-1, якщо =0, то
GOTO DIGIT ;
перейти на начало
MOVLW 0FFh ;
255
MOVWF DIGITTIME
; в DIGITTIME
DECFSZ DIGITTIMEZ,1 ;
CLOCKA-1, если =0, то
GOTO DIGIT
MOVLW 07h ;
255
MOVWF DIGITTIMEZ
; в DIGITTIME
RETURN
INVERTA
MOVLW B'00100000'
XORWF DATAPORT,1
NOP
;
MOVWF CNTRLPORT
MOVF CLOCKAMAIN,0
MOVWF CLOCKA
GOTO INVERTAEND
INVERTB
MOVLW B'00010000'
XORWF DATAPORT,1
NOP
;
MOVWF CNTRLPORT
MOVF CLOCKBMAIN,0
MOVWF CLOCKB
GOTO INVERTBEND
NOMSENDEND
;
;
END
Програма написана для
мікроконтролера PIC16F84A, 4МГц. Ця частина
програми, в якості тесту, видає в лінію
номер з категорією 1. Сигнал видається
методом "Безінтервальний пакет"
Для кодування цифр нижче приведена таблиця:
Цифра | Частота1 | Частота2 | Період1 | Період2 | Циклів1 | Циклів2 | Циклів1 | Циклів2 |
Гц | Гц | мкс | мкс | шт | шт | шт, HEX | шт, HEX | |
0 | 1300 | 1500 | 769,23 | 666,67 | 17 | 14 | 11 | 0E |
1 | 700 | 900 | 1428,6 | 1111,1 | 31 | 24 | 1F | 18 |
2 | 700 | 1100 | 1428,6 | 909,09 | 31 | 20 | 1F | 14 |
3 | 900 | 1100 | 1111,1 | 909,09 | 24 | 20 | 18 | 14 |
4 | 700 | 1300 | 1428,6 | 769,23 | 31 | 17 | 1F | 11 |
5 | 900 | 1300 | 1111,1 | 769,23 | 24 | 17 | 18 | 11 |
6 | 1100 | 1300 | 909,09 | 769,23 | 20 | 17 | 14 | 11 |
7 | 700 | 1500 | 1428,6 | 666,67 | 31 | 14 | 1F | 0E |
8 | 900 | 1500 | 1111,1 | 666,67 | 24 | 14 | 18 | 0E |
9 | 1100 | 1500 | 909,09 | 666,67 | 20 | 14 | 14 | 0E |
Повтор | 1300 | 1700 | 769,23 | 588,24 | 17 | 13 | 11 | 0D |
Нач/кон | 1100 | 1700 | 909,09 | 588,24 | 20 | 13 | 14 | 0D |
Длительность одного цикла, мкс | 23 | |||||||
Коеффициент деления: | 2 |
Значення в таблицю попадають наступним чином:
Період = (1/частота)*1e6, мкс
Циклів = період/<тривалість 1 циклу генерації меандра>, мкс
Неправильно прорахував робочу частоту мікроконтролера, тому ввів поправочний коефіцієнт 2:
Циклів=Циклів/2
LIST p=16F628
#include "P16F628.INC"
; __CONFIG 3F61h
radix
DEC
;
w equ 0
f equ 1
BitCnt equ 2Dh
Samp equ 2Eh
SampT2
equ 2Fh
RxByte equ 30h ; принятый байт
TotalBitCnt equ 31h ; Общие кол.
принятых бит
Byte equ 32h ; принятый и декодированный байт
BytesCnt equ
33h ; Количество принятых байт
DataLen equ 34h ; Количество байт в сообщении
RxError equ 32h ; Тест "Захват канала"
RxLast equ 33h
Schetchik
equ 34h ; Счетчик
SRxBits equ 40h ; Синхронизания. Количество принятых
бит
SRxBytes equ 41h ; ...принятых байт
Counter equ 42h;
DigitCount
equ 43h;
DigitStart equ 44h;
DisplayDat equ 45h; ; Регистр для
загрузки данных на дисплей
DIGITTIME equ 46h ; Переменные для
двухчастотной генерации
DIGITTIMEZ equ 47h ;
Povtorov equ 48h ;
CLOCKAMAIN equ 49h ;
CLOCKA equ 4Ah ;
CLOCKB equ 4Bh ;
CLOCKBMAIN equ
4Ch ;
PrevDigit equ 4Dh ; Предыдущая цифра в посылке АОНа
Digit01
equ 20h
Digit02 equ 21h
Digit03 equ 22h
Digit04 equ 23h
Digit05 equ
24h
Digit06 equ 25h
Digit07 equ 26h
Digit08 equ 27h
Digit09 equ 28h
Digit10 equ 29h
Digit11 equ 2Ah
Digit12 equ 2Bh
ByteCnt equ 2Ch
Logic equ 2Dh;
IgBytes equ 2Eh;
ByteAddr equ 2Fh;
ZeroCnt
equ 70h ; Количество раз перехода синусоиды
; через "0" после старта
очередного бита
LogInt equ 79h ; Врем. байт для логич. опер. (при прерывании)
IntW equ 7Dh ; Буфер для w при прерывании
IntStat equ 7Eh ; Буфер для Status
при прерывании
; В последней ячейке банка 0
AON equ 7Fh ; Статус
работы
A_DTMF equ 0h ; Бит0. Признак режима АОН-DTMF
A_FSK equ 1h ; Бит1.
Признак режима АОН-FSK
A_NewRx equ 2h ; Бит2. FSK Новый принятый бит
A_Carrer equ 3h ; Бит3. FSK Захваченна "Несущая" (Carrer)
A_BS equ 4h ; Бит4.
FSK статус: бит определен/не определен
A_RxBit equ 5h ; Бит5. FSK Очередной
принятый бит
A_PrRx equ 6h ; Бит6. FSK Предыдущий принятый бит
A_Timer equ
7h ; Бит7. FSK Флаг таймера 1200 (сброс по окончании такта)
CID equ 80h ;
Масив для раздела "Прием CallerID"
C_SINHR equ 0h ; Флаг синхронизации (во
время приема старт/стоп)
C_DATA equ 1h ; Признак приема даты
C_NOM equ 2h
; Признак приема номера
C_NONOM equ 3h ; Признак отсуствия номера
C_OTHER
equ 4h ; Признак приема неизвестного пакета
C_LEN equ 5h ; Признак приема
общей длины сообщения
C_NEXT equ 6h ; Ждем следующего параметра
StopFlag equ 81h ; Флаг для остановки приема FSK
;**************
;
Отладка
RAMaddr equ 0A0h ; Банк 1
;FlashByte equ 0A0h ; Банк 1
;FlashAddr
equ 0A1h
;CycleCount equ 0A2h
;************** ; длительность полупериода
после компаратора
; длительность полупериода (между переходами sin
через ноль)
#define TauL 4Eh ;25h ; - минимальная ;
#define TauH 0F9h
;71h ; - максимальная
#define TauN 8Fh ;8Ah;75h ; - средняя (частотная
граница 0/1)
#define Carrer 0D0h ;0D0 ; Частота следования битов (1200)
#define TauPolovina Carrer/2 ; 1/2 длительности бита
#define Correct 03h ;3h
; Добавлять 1h (4мкс) через хх бит
#define FazaMin 30h ; ; Макс.
отставание частоты 1200
#define FazaMax Carrer-FazaMin ; Макс. прережение
частоты 1200
;**************
; Отладка
#define StartAddr 0A9h
#define FinAddr 0EFh
;**************
;=====================================================
;
; RxFSK - Модуль
приема FSK сигнала от системы АОН АТС
;
http://sergeyk.kiev.ua/
;=====================================================
org 0
goto
start ; (Start)
;=====================================================
; Подпрограмма обработки прерывания
;=====================================================
org 4h
;-----------------------; Начало обработки прерывания
AON_FSK ; Предполагаем,
что источник прерывания
; компаратор или таймер TMR2
movwf IntW ;
Сохряняем содержимое регистра
; w на время обработки прерывания
movf
STATUS,0; Сохряняем содержимое регистра
movwf IntStat ; STATUS на время
обработки прерывания
bcf STATUS,RP0 ; Банк 0
btfsc PIR1,TMR2IF ;
Прерывание было от TMR2?
goto FSK1200 ; да, перходим!
btfsc PIR1,CMIF ;
Прерывание от компаратора?
goto Compar ;
goto NoCarrer ;
Препеполнение таймера TMR0
retfie
NoCarrer ; Произошло
переполнение таймера TMR0
; это может произойти пи пропадании сигнала
bcf AON,A_Carrer ; Сбрасываю бит "Несущая"
bcf INTCON,T0IF ; Сбрасываю
прерывание от TMR0
goto FinInt ; и уходим в конец прерывания.
FSK1200 ; Если мы сюда попали, значит прошло 832мкс
; т.е. прошел 1 бит FSK
;************ Debug
; btfss PORTB,6
; goto $+3
; bcf PORTB,6
;
goto $+2
; bsf PORTB,6
; nop
;************ Debug
;************
; Новый алгоритм!
;************
bcf AON,A_BS ; Сбрасываю "Бит
определен"
bcf PIR1,TMR2IF ; Сбрасываю флаг прерывания
incfsz
SRxBits,1 ; Увеличиваю общее количество
; принятых бит (синхронизация/стабилизация)
nop
clrf ZeroCnt ; Сбрасываю колич. "SIN через ноль"
;*********************
bcf AON,A_RxBit ; Шукаю глюки :(
bcf PORTB,3
;*********************
bsf STATUS,RP0
movlw Carrer
movwf PR2
bcf
STATUS,RP0
bcf AON,A_Timer
goto FinInt
;***
Compar ;
Обработка прерывания от компаратора
movf TMR0,w ; Считываем значение таймера
TMR0
movwf Samp ; в регистр Samp
clrf TMR0 ; Сбрасываю таймер
;************ Debug
; bsf PORTB,6 ; Мигаем "прерывание"
;************
Debug
;************************************************************
;
Режим отладки! Записываем в Flash память значение Samp
; btfss INTCON,T0IF ;
Если прерывание возникло не от TMR0
; call SampToRAM ; записываем в OЗУ
длительность посылки
;************************************************************
movf
CMCON,F ; Устранение несоответствия
bcf PIR1,CMIF ; Сброс флага запроса на
прерывание
bcf AON,A_PrRx ; Сохраняем предыдущий
btfsc AON,A_RxBit ;
принятый бит
bsf AON,A_PrRx ;
; проверяем на попадание в "зону"
; movlw TauL ; проверяем условие Samp<TauL
; subwf Samp,W ; если Samp
меньше минимального значения
; btfss STATUS,C; времени для лог.1 то считаем
это
; goto Pomeha ; "помехой" и не учитываем
; movlw TauH ; Проверяем
условие Samp>TauH
; movwf LogInt ; если Samp больше максиального значения
; movf Samp,W ; времени для лог.0 то считаем это
; subwf LogInt,W; "помехой"
и не учитываем
; btfss STATUS,C
; goto Pomeha
; Если мы еще здесь,
значит сигнал
; соответствует лог.0 или 1 стандарта FSK,
; либо программа
работает совсем не правильно:(
; Для определения нужного значения,
;
делим интервал на 2 части.
bcf AON,A_RxBit ; Устанавливаю бит RxBit в
0
movlw TauN ; if Samp>TauN
movwf LogInt ; Если меньше среднего,
значит
movf Samp,W ; лог.1, тогда
subwf LogInt,W
btfss STATUS,C
bsf
AON,A_RxBit ; устанавливаю бит NewRx в 1
incfsz ZeroCnt,1 ; Увеличиваю
количество переходов
; синусоиды через ноль.
;************ Debug
;
btfss PORTB,5
; goto $+3
; bcf PORTB,5
; goto $+2
; bsf PORTB,5
;
nop
;************ Debug
;************ Debug
btfss AON,A_RxBit
goto $+3
bsf PORTB,4
goto $+2
bcf PORTB,4
nop
;************ Debug
;************
; Новый алгоритм
;************
movlw
TauPolovina ; Если пршло более 1/2 периода сигнала
movwf LogInt ; (1/2 от
1200бит/с).
movf TMR2,W
subwf LogInt,W ;
btfss STATUS,C
call SetBit
goto FinInt
;************
; Сохраняем принятый бит в байте
;************
SetBit
btfsc AON,A_BS ; этот бит онпределен?
return
btfss T2CON,TMR2ON ; если таймер стоит, нам нечего сдесь делать!
return
;************ Debug
btfss AON,A_RxBit
goto $+3
bsf PORTB,3
goto
$+2
bcf PORTB,3
nop
;************ Debug
bsf AON,A_BS ;
Устанавливаю "Бит определен"
btfss AON,A_RxBit ; Проверяем последний
принятый бит
goto Set0 ; по длительности периода между "нулми"
goto Set1 ;
и соотв. переходим на (0) или (1)
Set1 ; Установка лог.1 в принятый байт
movf BitCnt,W
iorwf RxByte,1 ; Устанавливаем бит в 1
bcf STATUS,C
RLF
BitCnt,1 ; сдвигаем указатель на следующий бит
;************ Debug
bsf
PORTB,3
;************ Debug
goto SetEND
Set0 ; Установка лог.0
в принятый байт
bcf STATUS,C
RLF BitCnt,1 ; сдвигаем указатель на
следующий бит
;************ Debug
bcf PORTB,3
;************ Debug
; goto SetEND
SetEND
return
FinInt
movf
IntStat,w ; Восстановление контекста
movwf STATUS
swapf IntW,F ; Тут
приходится хитрить, чтобы сохранить бит Z
swapf IntW,W ; (movf его может
изменить, а swapf - нет)
; bcf INTCON,T0IF ; Сброс флага запроса на
прерывание
retfie
;=====================================================
; Основная программа
;=====================================================
start
;-------------------------------; Первичная подготовка
bcf STATUS,RP0 ; Банк
0
bcf STATUS,RP1 ; Банк 0
clrf INTCON ; Запрет всех прерываний
;-------------------------------; Иницилизация модуля компараторов
bcf
STATUS,RP0 ; Банк 0
clrf PORTA ; Иницилизация порта А
movlw B'00000101' ;
movwf CMCON ; активен 2й компаратор (1(+)&18(-) ноги)
bsf STATUS,RP0 ; Банк 1
bsf TRISA,0 ; Установка направления выводов
bsf TRISA,1 ; PA 0,1,2 - входы
bsf TRISA,2 ;
bcf STATUS,RP0 ; Банк 0
movf PORTA,F ; Приводим в
соответствие
movf PORTB,F ; защелки портов
bsf PORTA,1 ; Настройка -
выводы RA1, RA2 как входы
bsf PORTA,2 ;
bsf STATUS,RP0 ; Банк 1
clrf VRCON ; Источник опорного напряжение выключен
bsf PIE1,6 ; Прерывание от
компараторов разрешаем, но пока
; запрещены прерывания от периферии и вообще
все
bcf STATUS,RP0 ; Банк 0
BCF PIR1,CMIF ; Сбросить флаг прерывания
;-------------------------------; Подготовка портов ввода-вывода
; Порт A
Мы уже настроимли в модуле компараторов
; Порт В
bsf STATUS,RP0 ;
Банк 1
movlw b'00001011' ;
movwf TRISB ;
bcf STATUS,RP0 ; Банк 0
; Предполагаем, что основное время микронотроллер будет находится в режиме
; "sleep", и выводитсься из него при появлении любого сигнала в линии.
;
bsf INTCON,PEIE ; Включаем прерывания
; bsf INTCON,GIE
; Проверяем,
является ли сигнал, сигналом вызова (появление лог.1 на PB0)
; btfsc PORTB,7
; goto PrepareFSK_CID
;-------------------------------;
Подготовка к приему сигналов АОНа стандарта FSK
PrepareFSK_CID
bcf
INTCON,PEIE ; Выключаем прерывания
bcf INTCON,GIE
;-------------------------------; Подготовка таймера TMR0 (подсчет времени
;
периода FSK)
bsf STATUS,RP0 ; Банк 1
; (для обращения к спецрегистру
OPTION)
bcf STATUS,IRP ; Банк 0 и 1 (косвенная адресация)
bcf
OPTION_REG,T0CS ; Внутренний тактовый сигнал для TMR0
bcf OPTION_REG,PSA ;
Включение предделителя перед TMR0
; bsf OPTION_REG,PS0 ; 1 Предделитель
;
bcf OPTION_REG,PS1 ; 0 включен на 1:4
; bcf OPTION_REG,PS2 ; 0
PS2,PS1,PS0=001
; bcf OPTION_REG,PS0 ; 0 Предделитель
; bsf
OPTION_REG,PS1 ; 1 включен на 1:8
; bcf OPTION_REG,PS2 ; 0 PS2,PS1,PS0=010
bcf OPTION_REG,PS0 ; 0 Предделитель
bcf OPTION_REG,PS1 ; 0 включен на
1:2
bcf OPTION_REG,PS2 ; 0 PS2,PS1,PS0=000
bcf STATUS,RP0 ; Банк 0
bsf INTCON,T0IE ; Вкл. прерывания при переполнении
CLRF TMR0 ; Сброс таймена
;-----------------------; Подготовка таймера TMR2
; Подсчет опроной
частоты 1200Гц
bcf STATUS,RP0 ; Банк 0
bsf T2CON,TMR2ON ; Таймер
включен
bsf T2CON,T2CKPS0 ; 1 Предделитель
bcf T2CON,T2CKPS1 ; 0 включен
на 1:4
bsf STATUS,RP0 ; Установка верхней границы счета
movlw Carrer ;
D0*4=832мкс; (а должно быть 833.333 мкс)
movwf PR2 ; На каждом цикле отстаем
на 1.333 мкс
bsf PIE1,TMR2IE ; Разрешение прерываний при переполнении
TMR2
bcf STATUS,RP0 ; Банк 0
CLRF TMR2 ; Сброс таймена
movlw b'11000110' ; Отображаем метку "Работаю!"
movwf PORTB
bsf
STATUS,RP0
; clrf CycleCount
bcf STATUS,RP0
bsf STATUS,RP0 ;
Банк 1 **** Для отладки. Запись в Flash
; clrf FlashAddr ; **** Для отладки.
Запись в Flash
bcf STATUS,RP0 ; Банк 0 **** Для отладки. Запись в Flash
call PAUSE20
call PAUSE20
call PAUSE20
; movlw 0bh
; movwf
DisplayDat
; call Display ; Виводжу символ на дисплей!
;
; call PAUSE20
;
; movlw 01h
; movwf DisplayDat
; call Display ; Виводжу символ на
дисплей!
;
; call PAUSE20
;
; movlw 02h
; movwf DisplayDat
;
call Display ; Виводжу символ на дисплей!
;
; call PAUSE20
;
; movlw
03h
; movwf DisplayDat
; call Display ; Виводжу символ на дисплей!
; /*****************************
; call SendNomByAON
;
/*****************************
;***** ; Ожидаем сигнал вызова
call
DisplayTest
btfss PORTB,0 ; Ждем лог.1 от сигнала вызова
goto $-1 ;
При его появлении - старт!
movlw 10h
movwf DisplayDat
call Display
; Виводжу символ на дисплей!
;***** ; Ожидаем импульс со входа
компаратора
btfss CMCON,C2OUT ; Ждем лог.1
goto $-1 ; При его
появлении - старт!
btfsc CMCON,C2OUT ; Ждем лог.0
goto $-1 ; При его
появлении - старт!
btfss CMCON,C2OUT ; Ждем лог.1
goto $-1 ; При его
появлении - старт!
movlw 0h
movwf DisplayDat
call Display ;
Виводжу символ на дисплей!
; call PAUSE20
;9D
clrf ZeroCnt ;
Сбрасываем на 0 количество раз
; перехода синусоиды через "0" после
;
старта очередного бита
clrf TMR0 ; Сбрасываем таймер
clrf TMR2
movf
CMCON,w
bcf PIR1,CMIF
bcf INTCON,2 ; T0IF
movlw 0f5h ; Для отладки!
movwf ByteCnt ;
;-------------------------------; Прием
последовательности "Захват канала"
; "Chanel seizure" (010101010101010101010)
; Включение прерывания от копраратора
movf CMCON,F ; Чтение CMCON для
устранения несоответствия
BCF PIR1,CMIF ; Сбросить флаг прерывания
компаратора
BCF PIR1,TMR2IF ; Сбросить флаг прерывания TMR2
bsf STATUS,RP0
; Банк 1
bsf PIE1,CMIE ;
bcf STATUS,RP0 ; Банк 0
bsf INTCON,PEIE ;
Включаем прерывания
bsf INTCON,GIE
movlw b'00000001'
movwf BitCnt
clrf RxByte
bcf STATUS,RP0 ; Банк 0
;=====================================================
; Прием
последовательности "Захват канала". (10101010)
;=====================================================
; clrf PORTB
bsf
AON,A_Carrer ; Устанавливаю флаг "Есть несцщая"=1
RxCS
bsf PORTB,0
call Correct1200 ; Модуль корректировки частоты 1200 Гц
btfss
AON,A_Carrer ; Проверяем, есть ли несущая
goto start ; если пропала, то
переходим в самое
; начало программы (start)
movlw 0h ; Проверяем
количество принятых
xorwf BitCnt,W ; бит. Если 8, то проверяем, что
btfsc
STATUS,Z ; это за сигнал.
goto $+2
goto RxCS
movlw 0FFh ; Если
приняты все лог.1,
xorwf RxByte,W ; тогда переходим ко второй
bcf PORTB,0
; фазе.
btfsc STATUS,Z ;
goto RxONEs
movlw b'00000001' ; Готовим
очередные 8 бит
movwf BitCnt
clrf RxByte
; movlw RxByte
; movwf
PORTB ; Сигнал "ошибка!"
goto RxCS ; Зацыкливаемся
;=====================================================
; Прием
последовательности "Захват канала". (11111111)
;=====================================================
RxONEs
bcf
T2CON,TMR2ON ; Таймер 2 выключен
; movlw 3Dh ; Установка таймера,
; movwf
TMR2 ; с учетом задержки пуска.
bsf STATUS,RP0 ; Банк 1
decfsz PR2,1
decfsz PR2,1
decfsz PR2,1
bcf STATUS,RP0 ; Банк 0
; clrf PORTB
bsf PORTB,2
;*******************************
call SampInit
bcf
STATUS,RP0 ; Банк 0
;*******************************
WainONEs
;*******************************
; bcf PORTB,4
;*******************************
; btfsc AON,A_RxBit ; Ждем появления первого
принятого
; goto WainONEs ; нуля.
;
; movf Samp,w ; Установка таймера,
; movwf TMR2 ; с учетом задержки пуска.
;
; ; Так! Приняли первый "ноль".
Это
; ; стартовый бит. Поехали!
;
; bsf T2CON,TMR2ON ; Таймер 2
включен
;
; bcf PORTB,2 ;
; bsf PORTB,3 ; Начало приема номера
(сигнал)
;=====================================================
;
Главный модуль АОНа. Прием номера.
;=====================================================
StartRxNom
;****
movlw 01h
movwf ByteCnt
; goto ReceiveData
;=====================================================
; Прием сообщения от
АТС. Ждем начала передачи номера
;=====================================================
ReceiveData
clrf
BytesCnt ; Очищаем количество принятых байт
clrf DataLen ; Очищаем количество
байт в сообщении
clrf CID
bsf CID,C_LEN
clrf StopFlag ; Флаг для
остановки приема FSK посылки. По таймеру
; "1200" прибавляется 1 к StopFlag.
Когда StopFlag
; станет больше 10, можно считать окончание приема.
; Флаг
сбрасывается в 0 при приеме стартового/стопового
; бита.
; ***
goto
Lrx
NextByte
call ReceiveStartBit ; Прием стартового бита
;************ Debug
bsf PORTB,1
;************ Debug
call ReceiveByte ;
Прием 8 бит
;************ Debug
bcf PORTB,1
;************ Debug
movf
RxByte,w ; Сохраняем принятый байт
movwf Byte
Lrx call ReceiveStopBit ;
Прием стопового бита
; Обрабатываем принятый байт
; movf CID,w
;
movwf PORTB
;****
call SampToRAM
bcf STATUS,RP0 ; Банк 0
bsf
STATUS,RP0 ; Банк 1
;if RAMaddr=0EFh
movlw FinAddr
xorwf RAMaddr,W
bcf STATUS,RP0 ; Банк 0
btfsc STATUS,Z
goto Save
;****
btfss
AON,A_Carrer ; Проверяем, есть ли несущая
goto AnaliseCID ; если пропала, то
переходим
; на анализ принятого
goto NextByte
btfsc CID,C_LEN
; Если приняли "длину сообщения"
goto CID_LEN
btfsc CID,C_NEXT ; Если
приняли "Тип сообщения"
goto CID_NEXT
btfsc CID,C_DATA ; Если приняли
"Дата и время"
goto CID_DATA
btfsc CID,C_NOM ; Если приняли "Номер
абонента"
goto CID_NOMER_Rx
; goto TxNom ; Переходим на процедуру
передачи номера
Save
bcf INTCON,GIE ; Запретить прерывания. По
тормозам!!!
call RAMToFlash
goto $
CID_LEN ; Принято длину
сообщения
; в данной программе мы эту информацию
; игнорируем
clrf CID
bsf CID,C_NEXT
goto NextByte
CID_NEXT ; Принято заголовок "Тип
сообщения"
; смотрим...
clrf BytesCnt ; Очищаем количество принятых
байт
clrf DataLen ; Очищаем количество байт в сообщении
movlw 01h ;
01h - передача даты и времени.
xorwf Byte,W ;
btfsc STATUS,Z ;
goto
CID_DATA
movlw 02h ; 02h - передача номера
xorwf Byte,W ;
btfsc
STATUS,Z ;
goto CID_NOMER
goto NextByte
CID_DATA ; Прием даты и
времени. В данной
; программе, информацию игнорируем.
bsf CID,C_DATA
movlw 09h ; Принимаем 9 байт
xorwf Byte,W ; 1 байт - длина
btfsc
STATUS,Z ; 8 байт - данные
goto CID_DATA_FIN
incfsz BytesCnt,1 ;
Увеличиваем количество принятый байт
goto NextByte
CID_DATA_FIN
clrf CID
bsf CID,C_NEXT
goto NextByte
CID_NOMER ; Прем номера
абонента
bsf CID,C_NOM
bsf CID,C_LEN
clrf BytesCnt ; Очищаем количество
принятых байт
clrf DataLen ; Очищаем количество байт в сообщении
goto
NextByte
CID_NOMER_Rx
btfsc CID,C_LEN
goto CID_NOMER_LEN
;
Принимаем цифру номера и сохраняем :)
movf DataLen,w ; Сравниваем
количество принятых
xorwf BytesCnt,W ; байт с общим количеством
btfsc
STATUS,Z ;
goto CID_NOM_FIN
CID_NOMER_LEN
bcf CID,C_LEN
movf Byte,w
movwf DataLen
goto NextByte
CID_NOM_FIN
clrf CID
goto NextByte
;/***
;CID equ 80h ; Масив для раздела "Прием
CallerID"
;C_DATA equ 01h ; Признак приема даты
;C_NOM equ 02h ; Признак
приема номера
;C_NONOM equ 03h ; Признак отсуствия номера
;C_OTHER equ 04h
; Признак приема неизвестного пакета
;C_LEN equ 04h ; Признак приема общей
длины сообщения
;C_NEXT equ 05h ; Ждем следующего параметра
;ж/**
;BytesCnt
;DataLen
; movf Byte,w
; movwf PORTB
bcf INTCON,GIE ; Запретить
прерывания. По тормозам!!!
movf Byte,w
; movwf PORTB
; movf Byte,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bsf STATUS,RP0 ;
Выбираем банк 0
call RAMToFlash
goto $
;=====================================================
; Прием стартового
бита (0)
;=====================================================
ReceiveStartBit
bcf STATUS,RP0 ; Банк 0
movlw b'00000001'
movwf BitCnt
clrf RxByte
bcf CIS,C_SINHR
bsf STATUS,RP0 ; Банк 1
decfsz PR2,1 ;
Уменьшаю верхнюю границу сраб. таймера
; decfsz PR2,1 ;
bcf STATUS,RP0 ;
Банк 0
; clrf TMR2 ; Шукаю глюки:(
bcf T2CON,TMR2ON ; Останавливаем таймер
; Шукаю глюки:(
LabRxStBit
btfss AON,A_Carrer ; Проверяем, есть ли
несущая
goto AnaliseCID ; если пропала, то переходим
; на проверку
принятой посылки
; bsf PORTB,4 ;*****
; btfsc BitCnt,0 ; Ждем
подтверждения приема бита
; goto LabRxStBit
; bsf PORTB,0 ;*****
; btfsc RxByte,0 ; Стартовый бит?
; goto ReceiveStartBit ; нет. Начинаем
сначала
; return ; да. Возвращаемся в точку вызова
btfsc AON,A_RxBit ;
Ждем появления FSK лог.0
goto LabRxStBit ;
bcf STATUS,C ; Обнуляем бит
Carry (исп. для переноса)
rrf Samp,0
movwf TMR2 ; Установка таймера
bsf T2CON,TMR2ON ; Запускаю таймер
; movlw b'00000001'
; movwf
BitCnt
bsf AON,A_Timer
;*****************
; bsf PORTB,6
nop
nop
nop
nop
nop
nop
nop
; bcf PORTB,6
;*****************
LabRxStBitFin
; Ждем окончания стартового бита
; btfsc BitCnt,0 ; Ждем
подтверждения приема бита
btfsc AON,A_Timer
goto LabRxStBitFin
return
;=====================================================
; Прием
очередных 8 бит
;=====================================================
ReceiveByte
movlw b'00000001'
movwf BitCnt
clrf RxByte
bcf
CIS,C_SINHR
LabRxByte
call Correct1200 ; Модуль корректировки частоты
1200 Гц
movlw 0h ; Проверяем количество принятых
xorwf BitCnt,W ;
бит. Если 8, то возвращаемся
btfsc STATUS,Z ; в точку вызова.
return
; bsf PORTB,5
btfss AON,A_Carrer ; Проверяем, есть ли несущая
goto
AnaliseCID ; если пропала, то переходим
; на проверку принятой посылки
goto LabRxByte ; Цыклимся:)
;=====================================================
; Прием стопового бита
(1)
;=====================================================
ReceiveStopBit
movlw b'00000001'
movwf BitCnt
clrf RxByte
bsf CIS,C_SINHR ; Установка
флага разрешения сброса
bcf T2CON,TMR2ON ; Останавливаем таймер
clrf TMR2
;*****************
; bcf PORTB,6
nop
nop
nop
; bsf PORTB,6
nop
nop
nop
; bcf PORTB,6
;*****************
LabRxStopBit
btfss AON,A_Carrer ; Проверяем, есть ли несущая
goto AnaliseCID ; если
пропала, то переходим
; на проверку принятой посылки
; btfsc
CIS,C_SINHR ; Проверяем факт "Жесткой синхронизации"
; return
; btfsc
BitCnt,0 ; Ждем подтверждения приема бита
; goto LabRxStopBit
; btfss
RxByte,0 ; Стоповый бит?
; goto ReceiveStopBit ; нет. Начинаем сначала
;
return ; да. Возвращаемся в точку вызова
btfss AON,A_RxBit ; Ждем
появления FSK лог.1
goto LabRxStopBit ; и выходим.
bcf STATUS,RP0 ;
Банк 0
bcf T2CON,TMR2ON ; Останавливаем таймер
; Шукаю глюки:(
return
;=====================================================
; Модуль корректировки частоты 1200 Гц. Автоподстройка
;=====================================================
Correct1200
;if
a=>b call eq_or_gr
movlw Correct ; Корректировка частоты 1200
subwf
SRxBits,W ; добавляя 1h (4мкс) через
btfsc STATUS,C ; каждые "Correct" FSK
бит
goto $+2
return
bsf STATUS,RP0
incfsz PR2,1
bcf STATUS,RP0
clrf SRxBits
return
;=====================================================
; Модуль корректировки
частоты 1200 Гц. Синхронизация.
; Запуск из обработчика прерывания!!!
;=====================================================
FSKfaza
; if
TMR2<FazaMin then return
movlw FazaMin ; Если TMR2<FazaMin
subwf TMR2,W ;
прибавляем 1 к PR2
bsf STATUS,RP0
btfss STATUS,C
; incfsz PR2,1
decfsz PR2,1
bcf STATUS,RP0
; if TMR2>FazaMax call greater_than
;
movlw FazaMax ; Если TMR2<FazaMin
; movwf LogInt ; вычитаем 1 из PR2
;
movf TMR2,W
; bsf STATUS,RP0
; subwf LogInt,W
; btfss STATUS,C
;
decfsz PR2,1
; bcf STATUS,RP0
btfss CIS,C_SINHR ; Проверяем флаг на
разрешение
return ; синхронизации таймета 2 и
bcf CIS,C_SINHR ;
фактического перехода 1 на 0
movlw Carrer-3h ; Переводим таймер на грань
срабатывания
movwf TMR2
; clrf ZeroCnt ; Обнуляем количество "переходов"
; bsf BitCnt,1
return
;=====================================================
; Модуль анализа
принятой последовательности байт
; CID
;=====================================================
AnaliseCID
bcf
STATUS,RP1 ;
bcf STATUS,RP0 ;
movlw 0ffh;
; movwf PORTB;
;****
; call SampToRAM
; bcf STATUS,RP0 ; Банк 0
;
; bsf
STATUS,RP0 ; Банк 1
; ;if RAMaddr=0EFh
; movlw FinAddr
; xorwf
RAMaddr,W
; bcf STATUS,RP0 ; Банк 0
; btfsc STATUS,Z
; call Save
;****
bcf INTCON,GIE ; Запретить прерывания. По тормозам!!!
call
RAMToFlash
bcf STATUS,RP0 ; Банк 0
movlw 0ffh; ; Делаем паузу!
;
movwf PORTB;
call ReadInit ; Устанавливаем указатель
bcf STATUS,RP0 ;
на первый принятый байт
call ReadNextByte ; Считываю первый байт
bcf INTCON,GIE ; Запретить прерывания. По тормозам!!!
;if Байт=80h
movlw 80h
xorwf Byte,W
btfsc STATUS,Z
goto CID_Format80
;if
Байт=04h
movlw 04h
xorwf Byte,W
btfsc STATUS,Z
goto CID_Format80
call ReadNextByte ; Считываю второй байт
;if Байт=80h
movlw 80h
xorwf Byte,W
btfsc STATUS,Z
goto CID_Format80
;if Байт=04h
movlw 04h
xorwf Byte,W
btfsc STATUS,Z
goto CID_Format80
call
ReadNextByte ; Считываю третий байт
;if Байт=80h
movlw 80h
xorwf
Byte,W
btfsc STATUS,Z
goto CID_Format80
;if Байт=04h
movlw 04h
xorwf Byte,W
btfsc STATUS,Z
goto CID_Format80
goto start ; Если
первых 3 байта не 80Н и
; не 04Н, значит это приняли не
; то. Переходим на
переиницилизацию
CID_Format80 ; Сообщение в расширенном формате
nop
CID_Format04 ; Сообщение в кратком формате (только номер)
nop
call ReadNextByte ; Считываю второй байт посылки.
; Это длина. Игнорирую.
call ReadNextByte ; Считываю третий байт посылки.
; Это тип блока.
;if Байт=01h ; 01h - это дата
movlw 01 ; длина - 8 байт
xorwf Byte,W
btfsc STATUS,Z
goto CID_Date
CID_Nom_Wait
;if Байт=02h ; 02h - это
доложданный
movlw 02 ; номер
xorwf Byte,W
btfsc STATUS,Z
goto
CID_Nomer
CID_Finish ; Больше нам тут ждать нечего.
; decfsz
PORTB,1
; goto $-1
;
; movlw 0ffh;
; movwf PORTB;
;
; decfsz
PORTB,1
; goto $-1
;
; moVlw 0ffh;
; movwf PORTB;
;
; decfsz
PORTB,1
; goto $-1
;
; movlw 0ffh;
; movwf PORTB;
;
; decfsz
PORTB,1
; goto $-1
;
; movlw 0ffh;
; movwf PORTB;
;
; decfsz
PORTB,1
; goto $-1
;
goto start ; Переходим в начало (сброс)
CID_Date ; Прием даты
bcf STATUS,RP0
; Считываем 9 байт
; (1+8
байт)
movlw 9h
movwf Counter
CID_Date_ret ; Начало цикла
call
ReadNextByte ; Считываем байт
decfsz Counter,1 ; счетчик -1
goto
CID_Date_ret ; Повтор
call ReadNextByte ; Считываем байт
goto
CID_Nom_Wait ; Когда закончим, переходим
; проверку след. "пакета"
CID_Nomer ; Прием номера
call ReadNextByte ; Считываем длину (число цифр)
bcf STATUS,RP0
movf Byte,w
movwf DigitCount ; Сохраняем число цифр
;/***************
; movwf DisplayDat
; call Display ; Виводжу символ на
дисплей!
;/****************
bsf STATUS,RP0
movf RAMaddr,w ; Сохраняем
адресс первой
bcf STATUS,RP0 ; цыфры
movwf DigitStart ;
call
SendNom ; Вызываем процедуру передачи
; номера на внешнее устройство
goto CID_Finish
;********************************************************************************
; Передача данных на внешнее устройство
;********************************************************************************
SendNom
call SendNomToDiaplay ; Вывод номера на дисплей
call
SendNomByCOM ; Передача на ПК через COM порт
; принятого номера
call
SendNomByAON ; Передача влинию номера
; двухчастотным способом
; для "Нашего
АОНа"
return ; Возврат
;********************************************************************************
; Передача на ПК через COM порт принятого номера
;********************************************************************************
SendNomByCOM
return
;********************************************************************************
; Передача влинию номера двухчастотным способом для "Нашего АОНа"
;********************************************************************************
SendNomByAON
;-------------------------------- Подготовка к приему сигнала
; запроса с линии 500Гц
;*********
bcf STATUS,RP0 ; Банк 0
;-------------------------------- Инициализация таймера TMR1
bcf T1CON,TMR1ON
; Таймер выключен
bcf T1CON,TMR1CS ; Внутрений генератор 1МГц
bcf
T1CON,T1OSCEN ; Внутрений тактовый генератор выключен
bsf T1CON,T1CKPS0 ;
Предделитель устанавливаем
bsf T1CON,T1CKPS1 ; на 1:8
clrf TMR1L
clrf
TMR1H
clrf Counter ; Здесь будем подсчитывать переполнения таймера
;-------------------------------- Ожидание снятия трубки АОНом
; факт
снятия трубки опреденяем по
; снижению напряжения в линии
AONWait
bsf
T1CON,TMR1ON ; Включаем таймер
btfss PORTB,3 ; Проверяем линию.
goto AONUp
; если низкий уровень - сняли трубку
btfsc PORTB,0 ; Проверяем, есть ли вызов
(>100В)
call ResetTimer
btfss TMR1H,7 ; Проверяем старший бит.
goto
AONWait ; если он 1, то увеличиваем счетчик
incfsz Counter,1 ; на 1.
;if Counter=15h
movlw 15h ; Если очередного вызывного сигнала
xorwf
Counter,W ; долго нет, выходим из процедуры ожидания
btfsc STATUS,Z ;
сигнала вызоыва
return
clrf TMR1L ; Пришел очередной сигнал вызова
clrf
TMR1H ; сбрасываем счетчики
goto AONWait ; иначе переходим в начало цикла
ResetTimer
clrf TMR1L ; Пришел очередной сигнал вызова
clrf TMR1H
; сбрасываем счетчики
clrf Counter ;
return
AONUp
bcf
T1CON,TMR1ON ; Выключаем таймер
;--------------------------------
Подготовка к передаче
; номера в линию
bcf PORTA,1 ; Сброс защелек на
PA1,PA2
bcf PORTA,2 ;
movlw b'00000111' ; Выключить компараторы
movwf CMCON ; теперь PORTA цифр. вход/выход
bsf STATUS,RP0 ;
bcf
TRISA,1 ; PA1,PA2 - цифровые выходы
bcf TRISA,2 ;
bcf STATUS,RP0 ;
;-------------------------------- Подготовка номера к передаче
bcf
STATUS,RP0 ; Банк 0
; movf DigitCount,w
; movwf Counter
;
; movf
DigitStart,w ; Адресс начала номера записываю
; movwf FSR ; в регистр
косвенной адрессации.
;
; ;if logic>7 ; Если количество цифр превышает 8
; movlw 7h ; устанавливаю указатель с учетом
; movwf Logic ; того, чтобы
передать 7 цифр
; movf DigitCount,W ;
; subwf Logic,W ;
; btfss
STATUS,C ;
; call SevenDigits ;
;--------------------------------
Передача номера
;/*** вставка отлаженного исходника
ReStart
;
BCF DATAPORT,0
; Передача номера в линию
MOVLW 0FFh ; Длительность 255
MOVWF DIGITTIME ; звучания
MOVLW 0Ah ; одной цифры 7 255x7=1785 циклов
MOVWF DIGITTIMEZ ; в тактах (периодах)
MOVLW 7h ; Повторов пакета
MOVWF
Povtorov ;
; ============================ Сигнал "Початок пакету"
MOVLW 12h ; Частота сигнала порта А (в умовних одиницях)
MOVWF CLOCKAMAIN
; Цикл_в сигнала
MOVWF CLOCKA ; Цикл_в сигнала (л_чильник)
MOVLW 0Ch ;
Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ; Цикл_в сигнала (л_чильник)
MOVWF CLOCKBMAIN ; Цикл_в сигнала
CALL DIGIT ; Процедура генерац_є
двотональноє посилки
Povtor
movf DigitCount,w ; Устанавливаю указатель
на последнию
movwf FSR ; цифру
movf DigitStart,w ;
addwf FSR,1 ;
movlw 0FFh ; Предыдущая цифра - не было!
movwf PrevDigit ;
;
============================ Передача "Категории абонента" (1)
MOVLW 1Dh
; Частота сигнала порта А (в У.О.)
MOVWF CLOCKAMAIN ;
MOVWF CLOCKA ;
MOVLW 16h ; Частота сигнала порта В (в умовних одиницях)
MOVWF CLOCKB ;
MOVWF CLOCKBMAIN ;
CALL DIGIT ; Процедура генерации двутональной посылки
; ============================ Передача номера - 7я цифра (4)
; MOVLW
1Dh ; Частота сигнала порта А (в У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF
CLOCKA ;
; MOVLW 10h ; Частота сигнала порта В (в умовних одиницях)
;
MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN ;
call AONprevDigit
CALL DIGIT ;
Процедура генерации двутональной посылки
; ============================
Передача номера - 6я цифра (7)
; MOVLW 1Dh ; Частота сигнала порта А (в
У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF CLOCKA ;
; MOVLW 0Dh ; Частота
сигнала порта В (в умовних одиницях)
; MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN
;
call AONprevDigit
CALL DIGIT ; Процедура генерации двутональной посылки
; ============================ Передача номера - 5я цифра (3)
; MOVLW
17h ; Частота сигнала порта А (в У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF
CLOCKA ;
; MOVLW 12h ; Частота сигнала порта В (в умовних одиницях)
;
MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN ;
call AONprevDigit
CALL DIGIT ;
Процедура генерации двутональной посылки
; ============================
Передача номера - 4я цифра (7)
; MOVLW 1Dh ; Частота сигнала порта А (в
У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF CLOCKA ;
; MOVLW 0Dh ; Частота
сигнала порта В (в умовних одиницях)
; MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN
; ;
call AONprevDigit
CALL DIGIT ; Процедура генерации двутональной
посылки
; ============================ Передача номера - 3я цифра (4)
; MOVLW 1Dh ; Частота сигнала порта А (в У.О.)
; MOVWF CLOCKAMAIN ;
;
MOVWF CLOCKA ;
; MOVLW 10h ; Частота сигнала порта В (в умовних одиницях)
; MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN ;
call AONprevDigit
CALL DIGIT ;
Процедура генерации двутональной посылки
; ============================
Передача номера - 2я цифра (2)
; MOVLW 1Dh ; Частота сигнала порта А (в
У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF CLOCKA ;
; MOVLW 12h ; Частота
сигнала порта В (в умовних одиницях)
; MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN
;
call AONprevDigit
CALL DIGIT ; Процедура генерации двутональной посылки
; ============================ Передача номера - 1я цифра (4)
; MOVLW
1Dh ; Частота сигнала порта А (в У.О.)
; MOVWF CLOCKAMAIN ;
; MOVWF
CLOCKA ;
; MOVLW 10h ; Частота сигнала порта В (в умовних одиницях)
;
MOVWF CLOCKB ;
; MOVWF CLOCKBMAIN ;
call AONprevDigit
CALL DIGIT ;
Процедура генерации двутональной посылки
; ============================
Сигнал "Конец пакета"
MOVLW 12h ; Частота сигнала порта А (в умовних
одиницях)
MOVWF CLOCKAMAIN ; Цикл_в сигнала
MOVWF CLOCKA ; Цикл_в сигнала
(л_чильник)
MOVLW 0Ch ; Частота сигнала порта В (в умовних одиницях)
MOVWF
CLOCKB ; Цикл_в сигнала (л_чильник)
MOVWF CLOCKBMAIN ; Цикл_в сигнала
CALL
DIGIT ; Процедура генерац_є двотональноє посилки
;
============================ Конец посылки номера, тепер пауза
BCF
PORTA,1 ; Обнулить линию А
BCF PORTA,2 ; Обнулить линию В
DECFSZ
Povtorov,1
GOTO Povtor
; BSF DATAPORT,0 ; Сигнал "Finish" вкл.
return ; Выход из процедуры передачи номера
; на АОН
;
============================ Процедура генерацiє двотональноє посилки
DIGIT
DECFSZ CLOCKA,1 ; CLOCKA-1, якщо =0, то
GOTO JAMPA
GOTO INVERTA ; перейти
на процедуру iнвертування
JAMPA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INVERTAEND
DECFSZ CLOCKB,1 ; CLOCKA-1, якщо =0, то
GOTO
JAMPB
GOTO INVERTB ; перейти на процедуру iнвертування
JAMPB
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INVERTBEND
DECFSZ DIGITTIME,1 ;
CLOCKA-1, якщо =0, то
GOTO DIGIT ; перейти на начало
MOVLW 0FFh ; 255
MOVWF DIGITTIME ; в DIGITTIME
DECFSZ DIGITTIMEZ,1 ; CLOCKA-1, если =0, то
GOTO DIGIT
MOVLW 07h ; 255
MOVWF DIGITTIMEZ ; в DIGITTIME
RETURN
INVERTA
btfss PORTA,1
goto $+3
bcf PORTA,1
goto $+2
bsf
PORTA,1
MOVF CLOCKAMAIN,0
MOVWF CLOCKA
GOTO INVERTAEND
INVERTB
btfss PORTA,2
goto $+3
bcf PORTA,2
goto $+2
bsf PORTA,2
MOVF CLOCKBMAIN,0
MOVWF CLOCKB
GOTO INVERTBEND
;NOMSENDEND
;
;
;/*** вставка отлаженного исходника
RETURN
;/***** конец
;------------------------------ ; Определение частот на предв. аддвожла
AONprevDigit
bsf STATUS,RP0 ; Считывание байта из памяти и
movf INDF,w ;
перемещение указателя на
bcf STATUS,RP0 ; предыдущий байт
movwf Byte ;
decf FSR,1 ;
movlw b'00001111' ; Очищаем ненужные, в данный
andwf
Byte,1 ; мемент биты
;if PrevDigit=Byte
movf PrevDigit,w ; Проверяем
код цифри и устанавливаем
xorwf Byte,W ; соответствующие значения частот
btfss STATUS,Z ; Если эта и предыдущая цифры совпали
goto $+3 ; ставим метку
"повтор"
movlw 10h ;
movwf Byte ;
movf Byte,w
movwf PrevDigit
;if Byte=0h
movlw 0h ; Проверяем код цифри и устанавливаем
xorwf
Byte,W ; соответствующие значения частот
btfss STATUS,Z ;
goto $+8 ;
movlw 10h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 0Dh
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=1h
movlw 1h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 1Dh
movwf CLOCKAMAIN
movwf CLOCKA
movlw 17h
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=2h
movlw 2h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 1Dh
movwf
CLOCKAMAIN
movwf CLOCKA
movlw 12h
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=3h
movlw 3h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 17h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 12h
movwf
CLOCKBMAIN
movwf CLOCKB
return
;if Byte=4h
movlw 4h
xorwf
Byte,W
btfss STATUS,Z
goto $+8
movlw 1Dh
movwf CLOCKAMAIN
movwf CLOCKA
movlw 10h
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=5h
movlw 5h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 17h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 10h
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=6h
movlw 6h
xorwf Byte,W
btfss
STATUS,Z
goto $+8
movlw 12h
movwf CLOCKAMAIN
movwf CLOCKA
movlw
10h
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=7h
movlw
7h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 1Dh
movwf
CLOCKAMAIN
movwf CLOCKA
movlw 0Dh
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=8h
movlw 8h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 17h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 0Dh
movwf
CLOCKBMAIN
movwf CLOCKB
return
;if Byte=9h
movlw 9h
xorwf
Byte,W
btfss STATUS,Z
goto $+8
movlw 12h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 0Dh
movwf CLOCKBMAIN
movwf CLOCKB
return
;if Byte=10h ; Сигнал "Повтор"
movlw 10h
xorwf Byte,W
btfss STATUS,Z
goto $+8
movlw 10h
movwf CLOCKAMAIN
movwf CLOCKA
movlw 0Ch
movwf CLOCKBMAIN
movwf CLOCKB
return
return ; конец
AONprevDigit
SevenDigits ; Укорачивание номера до 7 цифр
movf
DigitCount,W ; Отнимаю от общего количиства
movwf Counter ; цифр семь.
movlw 7h ;
subwf Counter,1 ;
movf DigitStart,W ; Прибавляем к адрессу
начала номера
addwf Counter,0 ; полученную разность и записываем
movwf FSR
; ее в регистр косвенной адрессации.
return
;-------------------------------- Генерация двохчастотного сигнала
TTone
;/***********************************
;*************************
; Передача тестового сигнала
; movlw
b'00011111';
; movwf PORTB
ToneRet
movlw 0FFh
movwf BitCnt
SygnalRet
btfss PORTA,1 ;
goto $+3 ; Инверсия разряда на RA1
bcf
PORTA,1 ;
goto $+2 ;
bsf PORTA,1 ;
btfss PORTA,2 ;
goto $+3 ;
Инверсия разряда на RA1
bcf PORTA,2 ;
goto $+2 ;
bsf PORTA,2 ;
;
;***********
; btfss PORTB,7 ;
; goto $+3 ; Инверсия разряда на RB1
;
bcf PORTB,7 ;
; goto $+2 ;
; bsf PORTB,7 ;
;***********
; movf
PORTB,1 ; "Сирена"
movlw 0FFh
movwf Schetchik ;
decfsz Schetchik,1
goto $-1
nop ; Техническая пауза :)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz BitCnt,1
goto SygnalRet
; decfsz
PORTB,1
; goto ToneRet
;*************************
return
;********************************************************************************
; Подготовка к чтению с начала
;********************************************************************************
ReadInit
bsf STATUS,RP0 ; Банк 1
bcf STATUS,IRP ; Косвенная адресация.
Банк 0 или 1.
movlw StartAddr
movwf RAMaddr
movwf FSR
return
;********************************************************************************
; Считывание очередного байта из ОЗУ
;********************************************************************************
ReadNextByte
bsf STATUS,RP0 ; Банк 1
bcf STATUS,IRP ; Косвенная адресация.
Банк 0 или 1.
movf RAMaddr,w
movwf FSR
nop
movf INDF,w
bcf
STATUS,RP0 ; Банк 0
movwf Byte ; Записываем в байт
;if FSR=FinAddr
movlw FinAddr
xorwf FSR,W
btfsc STATUS,Z ; Если это последний байт
; то
STATUS,Z=0
nop
bsf STATUS,RP0 ; Банк 1
incfsz RAMaddr,1 ; Передвигаемся
на следующий байт
nop
bcf STATUS,RP0 ; Банк 0
return
;********************************************************************************
; Вывод номера на дисплей
;********************************************************************************
SendNomToDiaplay
bcf STATUS,RP0 ; Банк 0
movf DigitCount,w
movwf
Counter
movf DigitStart,w ; Устанавливаю указатель
bsf STATUS,RP0 ; на
первую цифру номера
bcf STATUS,IRP ;
movwf RAMaddr ;
movwf FSR ;
bcf STATUS,RP0 ;
SendNomToDiaplayRet
call ReadNextByte ; Считываю 1
байт
bcf STATUS,RP0 ;
movf Byte,w ;
movwf DisplayDat ;
movlw 0h ; Если цифра = "0"
xorwf DisplayDat,W ; то заменяем ее на
btfss
STATUS,Z ; код 0Ah. Ему соответствует
goto $+3 ; цифра "0" на дисплее
movlw 0Ah ;
movwf DisplayDat ;
movlw 30h ; Если цифра = "0"
xorwf
DisplayDat,W ; то заменяем ее на
btfss STATUS,Z ; код 0Ah. Ему соответствует
goto $+3 ; цифра "0" на дисплее
movlw 0Ah ;
movwf DisplayDat ;
call Display ; Виводжу символ на дисплей!
decfsz Counter,1
goto
SendNomToDiaplayRet
return
;********************************************************************************
; Подготовка к записи
;********************************************************************************
SampInit
bsf STATUS,RP0 ; Банк 1
bcf STATUS,IRP ; Косвенная адресация.
Банк 0 или 1.
movlw StartAddr
movwf RAMaddr
movwf FSR
SampNext
movlw 0FFh
movwf INDF
incfsz FSR,1
;if FSR=FinAddr
movlw
FinAddr
xorwf FSR,W
btfsc STATUS,Z
return
goto SampNext
;********************************************************************************
; Сохраняем переменную Sample в ОЗУ. Используем косвенную адресацию.
;********************************************************************************
SampToRAM
bsf STATUS,RP0 ; Банк 1
;if RAMaddr=FinAddr
movlw
FinAddr
xorwf RAMaddr,W
btfsc STATUS,Z
return
movf RAMaddr,w
movwf FSR
bcf STATUS,RP0 ; Банк 0
movf Byte,w ; S A M P L E for Write
bsf STATUS,RP0 ; Банк 1
movwf INDF
incfsz RAMaddr,1
return
;********************************************************************************
; Сохраняем значения из ОЗУ во ППЗУ
;********************************************************************************
RAMToFlash
bsf STATUS,RP0 ; Банк 1
bcf STATUS,IRP
movlw StartAddr
movwf FSR
clrf EEADR ; Адрес ячейки для записи
RAMToFlashNext
movf
INDF,w
movwf EEDATA ; Байт для записи
bsf EECON1,WREN ; Разрешить
запись
; bcf INTCON,GIE ; Запретить прерывания
movlw 55h ;
movwf
EECON2 ; запись 55h
movlw 0AAh ;
movwf EECON2 ; Запись ААh
bsf
EECON1,WR ; Установить бит WR для
; начала записи
W_1
btfsc EECON1,
WR ; Ждем окончания записи
goto W_1
bcf EECON1, WREN ; Запретить запись
; bsf INTCON,GIE ; разрешить прерывания
incfsz EEADR,1
nop
incfsz FSR,1
;if RAMaddr=FinAddr
movlw FinAddr
xorwf FSR,W
btfsc STATUS,Z
return
goto RAMToFlashNext
;*********************************************************
;*********************************************************
; Вивiд iнформацiє
на дисплей - TEST
;*********************************************************
DisplayTest
; Символ " - "
bcf PORTB,5 ; HK=0
bsf PORTB,6 ; CLK=1
bsf PORTB,7 ; DI=1
nop
nop
nop
bcf PORTB,6 ; CLK=0
nop
nop
nop
nop
bsf PORTB,6 ;
nop
nop
nop
bcf PORTB,6 ; CLK=0
nop
nop
nop
nop
bsf PORTB,6 ;
nop
nop
nop
bcf PORTB,6 ; CLK=0
nop
nop
nop
nop
bsf PORTB,6 ;
nop
nop
nop
bcf PORTB,6 ;
CLK=0
nop
nop
nop
nop
nop
nop
bcf PORTB,5 ; HK=0
bcf
PORTB,6 ; CLK=0
bcf PORTB,7 ; DI=0
; Символ " F "
bsf PORTB,7 ;
DI=1
bsf PORTB,6 ; CLK=1
nop
nop
nop
nop
nop
bcf PORTB,6 ;
CLK=0
nop
nop
nop
nop
nop
nop
nop
nop
bsf PORTB,7
; DI=1
bsf PORTB,6 ; CLK=1
nop
nop
nop
nop
nop
bcf PORTB,6
; CLK=0
nop
nop
nop
nop
nop
nop
nop
nop
bcf
PORTB,7 ; DI=0
bsf PORTB,6 ; CLK=1
nop
nop
nop
nop
nop
bcf
PORTB,6 ; CLK=0
nop
nop
nop
nop
nop
nop
nop
nop
bsf PORTB,7 ; DI=1
bsf PORTB,6 ; CLK=1
nop
nop
nop
nop
nop
bcf PORTB,6 ; CLK=0
nop
bcf PORTB,7 ; DI=0
return
;*********************************************************
; Вивiд iнформацiє
на дисплей
;*********************************************************
Display
bcf STATUS,RP0
bsf PORTB,6 ; CLK=1
bcf PORTB,7 ; DI
bcf PORTB,5 ; HK=0
call PAUSE20
btfsc DisplayDat,3 ; !
bsf PORTB,7
; 7
nop
nop
nop
nop
nop
call PAUSE20
bcf PORTB,6 ; CLK=0 6
nop
nop
nop
nop
nop
nop
nop
nop
call PAUSE20
bsf
PORTB,6 ; CLK=1
bcf PORTB,7 ;
btfsc DisplayDat,2 ; !
bsf PORTB,7 ;
nop
nop
nop
nop
nop
call PAUSE20
bcf PORTB,6 ; CLK=0
nop
nop
nop
nop
nop
nop
nop
nop
call PAUSE20
bsf PORTB,6
; CLK=1
bcf PORTB,7 ;
btfsc DisplayDat,1 ; !
bsf PORTB,7 ;
nop
nop
nop
nop
nop
call PAUSE20
bcf PORTB,6 ; CLK=0
nop
nop
nop
nop
nop
nop
nop
nop
call PAUSE20
bcf PORTB,7 ;
bsf PORTB,6 ; CLK=1
btfsc DisplayDat,0 ; !
bsf PORTB,7 ;
nop
nop
nop
nop
nop
call PAUSE20
bcf PORTB,6 ; CLK=0
nop
call PAUSE20
bcf PORTB,7 ; DI=0
bsf PORTB,6 ; CLK=0
nop
return
;*********************************************************
; Пауза
;*********************************************************
PAUSE20
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
PAUSE10
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return
;*********************************************************
; Отладка:
сохранение до 12 значений й ОЗУ
;SampToRAM
; ;if a=b call Equal to
;
; movlw 0h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc
STATUS,Z
; goto ZZZZ
;
;
; movlw 1h
; movwf Logic
; movf
ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D01
;
; movlw
2h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D02
;
; movlw 3h
; movwf Logic
; movf ByteCnt,W
; xorwf
Logic,W
; btfsc STATUS,Z
; goto D03
;
; movlw 4h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D04
;
;
movlw 5h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc
STATUS,Z
; goto D05
;
; movlw 6h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D06
;
; movlw 7h
; movwf
Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D07
;
; movlw 8h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
;
btfsc STATUS,Z
; goto D08
;
; movlw 9h
; movwf Logic
; movf
ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D09
;
; movlw
10h
; movwf Logic
; movf ByteCnt,W
; xorwf Logic,W
; btfsc STATUS,Z
; goto D10
;
; movlw 11h
; movwf Logic
; movf ByteCnt,W
; xorwf
Logic,W
; btfsc STATUS,Z
; goto D11
;
;
; goto ZZZZ
;
;SaveToFlash
; ; Запись в ФЛЭШ
; movf Digit01,w
; bsf STATUS,RP0 ; Выбираем банк 1
;
movwf FlashByte
; bcf STATUS,RP0 ; Выбираем банк 1
; call SampToFlash
;
; movf Digit02,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
;
bcf STATUS,RP0 ; Выбираем банк 1
; call SampToFlash
;
; movf Digit03,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ;
Выбираем банк 1
; call SampToFlash
;
; movf Digit04,w
; bsf
STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем
банк 1
; call SampToFlash
;
; movf Digit05,w
; bsf STATUS,RP0 ;
Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем банк 1
;
call SampToFlash
;
; movf Digit06,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем банк 1
; call SampToFlash
;
; movf Digit07,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем банк 1
; call SampToFlash
;
; movf
Digit08,w
; bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf
STATUS,RP0 ; Выбираем банк 1
; call SampToFlash
;
; movf Digit09,w
;
bsf STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ;
Выбираем банк 1
; call SampToFlash
;
; movf Digit10,w
; bsf
STATUS,RP0 ; Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем
банк 1
; call SampToFlash
;
; movf Digit11,w
; bsf STATUS,RP0 ;
Выбираем банк 1
; movwf FlashByte
; bcf STATUS,RP0 ; Выбираем банк 1
;
call SampToFlash
;
;; call PAUSE
;
;; call TxNom
;
;; movf
RxByte,w
;; movwf PORTB
; goto $
;
;D01
; movf Byte,w
; movwf
Digit01
; goto ZZZZ
;D02
; movf Byte,w
; movwf Digit02
; goto
ZZZZ
;D03
; movf Byte,w
; movwf Digit03
; goto ZZZZ
;D04
;
movf Byte,w
; movwf Digit04
; goto ZZZZ
;D05
; movf Byte,w
;
movwf Digit05
; goto ZZZZ
;D06
; movf Byte,w
; movwf Digit06
;
goto ZZZZ
;D07
; movf Byte,w
; movwf Digit07
; goto ZZZZ
;D08
; movf Byte,w
; movwf Digit08
; goto ZZZZ
;D09
; movf Byte,w
;
movwf Digit09
; goto ZZZZ
;D10
; movf Byte,w
; movwf Digit10
;
goto ZZZZ
;
;D11
; movf Byte,w
; movwf Digit11
; goto ZZZZ
;
;ZZZZ
; incfsz ByteCnt,1
; nop
; return
;
;*********************************************************
;*********************************************************
; Режим отладки!
Записываем в Flash память значение Samp
;SampToFlash
;
; if FlashAddr>7Fh
call greater_than
; movlw 7Fh
; movwf LogInt
; bsf STATUS,RP0 ;
Выбираем банк 1
; movf FlashAddr,W
; bcf STATUS,RP0 ; Выбираем банк 0
;
subwf LogInt,W
; btfss STATUS,C
; return
;
; bsf STATUS,RP0 ;
Выбираем банк 1
; movf FlashByte,w
; movwf EEDATA ; Байт для записи
;
movf FlashAddr,w ;
; movwf EEADR ; Адрес ячейки для записи
;
; bsf
STATUS,RP0 ; Выбираем банк 1
; bsf EECON1,WREN ; Разрешить запись
;
;
bcf INTCON,GIE ; Запретить прерывания
; movlw 55h ;
; movwf EECON2 ;
запись 55h
; movlw 0AAh ;
; movwf EECON2 ; Запись ААh
; bsf EECON1,WR ;
Установить бит WR для
; начала записи
;W_1
; btfsc EECON1, WR ;
Ждем окончания записи
; goto W_1
; bcf EECON1, WREN ; Запретить запись
;
; bsf INTCON,GIE ; разрешить прерывания
; incfsz FlashAddr,1 ; FlashAddr
+ 1
; nop
; bcf STATUS,RP0 ; Выбираем банк 0
;
; return
;*********************************************************
;-----------------------; Процедура передачи номера
;TxNom
; Запрещаем все
прерывания
; bcf INTCON,GIE ; Глобальное запрещение прерываний
;******************************************************
; Для отладки.
Выводим принятый байт на порт В
; movwf PORTB
;***
; movf RxByte,w
; movwf Samp
; bsf STATUS,RP0 ; Банк 1 **** Для отладки. Запись в Flash
;
movlw 7Eh
; movwf FlashAddr
; bcf STATUS,RP0 ; Банк 0 **** Для отладки.
Запись в Flash
;
; call SampToFlash
;
; bsf STATUS,RP0 ; Количество
циклов 010101 :)
; movf CycleCount,w
; bcf STATUS,RP0
; movwf Samp
;
bsf STATUS,RP0 ; Банк 1 **** Для отладки. Запись в Flash
; movlw 7Ah
;
movwf FlashAddr
; bcf STATUS,RP0 ; Банк 0 **** Для отладки. Запись в Flash
;;
; call SampToFlash
;
; movf RxLast,w
; movwf Samp
; bsf
STATUS,RP0 ; Банк 1 **** Для отладки. Запись в Flash
; movlw 78h
; movwf
FlashAddr
; bcf STATUS,RP0 ; Банк 0 **** Для отладки. Запись в Flash
;
; call SampToFlash
; bsf STATUS,RP0 ; Банк 1 **** Для отладки. Запись
в Flash
; clrf FlashAddr ; **** Для отладки. Запись в Flash
; bcf
STATUS,RP0 ; Банк 0 **** Для отладки. Запись в Flash
;***
;
call SaveToFlash ; Сохраняем первые 10 проб в ППЗУ
; bsf INTCON,GIE ;
Глобальное разрешение прерываний
; return
; bcf INTCON,GIE ; Глобальное
разрешение прерываний
; GoTo RxFSK ; Переходим в начало программы
;;-----------------------; Процедура передачи номера (END)
org
07FFh
goto start
END
Код прошивки у файлі aon0v1.asm
Опубліковано
Оновлено 28.11.2023