⚠ 11.2023: Сайт знаходиться в стані перебудови. Можливо тимчасове порушення функціонування.

Конвертор сигналів автоматичного визначника номера з формату caller-ID (цифрові АТС) у безінтервальний пакет (аналогові АТС).

Декодування з формату caller-ID див. нижче.

Генерування сигналів автоматичного визначника номера аналогових АТС (безінтервальний пакет) на асемблері для мікроконтролера PIC16F628A


Генерування сигналу виконано на двох ніжках з фільтруванням Т-подібним пасивним фільтром і наступним об'єднанням сигналів.

Була написана наступна програма на асемблері для мікроконтролера 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





Вихідний асемблерний код прошивки декодування номера у форматі Caller-ID

Декодування

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


Serhii K Home Page (c) 2003-2023
(SKNewVersion)