Приложение А: подпрограмма FSK приемника
CPUOFF .equ 010h
SCG0 .equ 040h
SCG1 .equ 080h
IE1 .equ 0h
IE1_P0IE1 .equ 08h
IE1_P0IE0 .equ 04h
IE1_OFIE .equ 02h
IE1_WDTIE .equ 01h
IE2 .equ 01h
IE2_BTIE .equ 80h
IE2_TPIE .equ 08h
IE2_ADIE .equ 04h
IE2_UTXRIE .equ 02h
IE2_URXIE .equ 01h
IFG1 .equ 02h
IFG1_2 .set 04h
IFG2 .equ 03h
ME1 .equ 04h
ME2 .equ 05h
P0IN .equ 010h
P0OUT .equ 011h
P0DIR .equ 012h
P0FLG .equ 013h
P0IES .equ 014h
P0IE .equ 015h
LCDCTL .equ 030h
LCDM .equ 030h ; Адрес регистра управления и режима ЖКИ
BTCTL .equ 040h
BTCTL_SSEL .equ 80h
BTCTL_Hold .equ 40h
BTCTL_DIV .equ 20h
BTCTL_FREQ1 .equ 10h
BTCTL_FREQ0 .equ 08h
BTCTL_IP2 .equ 04h
BTCTL_IP1 .equ 02h
BTCTL_IP0 .equ 01h
BTCNT1 .equ 046h
BTCNT2 .equ 047h
BTIFG .equ 080h ; Флаг прерывания BT
TCCTL .equ 042h ; Адрес управляющего регистра таймера/счетчика
TCCTL_SSEL1 .equ 080h
TCCTL_SSEL0 .equ 040h
TCCTL_ISCTL .equ 020h
TCCTL_TXE .equ 010h
TCCTL_ENCNT .equ 008h
TCCTL_RXACT .equ 004h
TCCTL_TXD .equ 002h
TCCTL_RXD .equ 001h
TCPLD .equ 043h ; Адрес регистра предварительной загрузки таймера/счетчика
TCDAT .equ 044h ; Адрес таймера/счетчика
TPD .equ 04eh
TPD_B16 .equ 080h
TPD_CPON .equ 040h
TPE .equ 04fh
TPE_0 .equ 01h
TPE_1 .equ 02h
TPE_2 .equ 04h
TPE_3 .equ 08h
TPE_4 .equ 10h
TPE_5 .equ 20h
TPE_TPSSEL2 .equ 40h
TPE_TPSSEL3 .equ 80h
TPCTL .equ 04Bh
TPCTL_EN1FG .equ 01h
TPCTL_RC1FG .equ 02h
TPCTL_RC2FG .equ 04h
TPCTL_EN1 .equ 08h
TPCTL_ENA .equ 10h
TPCTL_ENB .equ 20h
TPCTL_TPSSEL0 .equ 40h
TPCTL_TPSSEL1 .equ 80h
TPCNT1 .equ 04Ch
TPCNT2 .equ 04Dh
SCFI0 .equ 050h
SCFI1 .equ 051h
SCFQCTL .equ 052h
CBCTL .equ 053h
CBE .set 1
AIN .equ 0110h
AEN .equ 0112h
ACTL .equ 0114h
ACTL_CSTART .equ 0001h
ACTL_SVCC_OFF .equ 0000h
ACTL_SVCC_ON .equ 0002h
ACTL_2 .equ 0004h
ACTL_3 .equ 0008h
ACTL_4 .equ 0010h
ACTL_5 .equ 0020h
ACTL_SEL_A0 .equ 0000h
ACTL_SEL_A1 .equ 0004h
ACTL_SEL_A2 .equ 0008h
ACTL_I_SRC_A0 .equ 0000h
ACTL_I_SRC_A1 .equ 0040h
ACTL_RNG_B .equ 0200h
ACTL_RNG_AUTO .equ 0800h
ACTL_POWER_UP .equ 0000h
ACTL_POWER_DOWN .equ 1000h
ACTL_CLK_MCLK .equ 0000h
ACTL_CLK_MCLK_2 .equ 2000h
ACTL_CLK_MCLK_3 .equ 4000h
ADAT .equ 0118h
ADIFG .equ 04h
WDTCTL .equ 0120h
WDTHold .equ 80h
WDT_wrkey .equ 05A00h
STACK .set 300h ; Начальное значение системного стека 280h
***********************************************
* Фильтры
***********************************************
WDF_PARMS .usect ”FILTMEM”,10,0200h
IN_Z .set 0
Z1_1 .set 2
Z1_2 .set 4
Z3_1 .set 6
Z3_2 .set 8
end_of_parms .usect ”FILTMEM”,2
data_word .usect ”FILTMEM”,2
last_sample .usect ”FILTMEM”,2
bit_lead_lag .usect ”FILTMEM”,2
cycle_counter .usect ”FILTMEM”,1 ; Пользовательская сервисная программа
;****************************************************************
; Они используются для FSK демодуляции
; при прерывании от 8- битного таймера
;****************************************************************
************************
* DYNAMIC: Регистры маркировки (используемые WDF) не должны использоваться
* для перемещения.
************************
currenty .set R6 ; Используется WDF
currentx .set R7 ; Используется WDF
IROP1 .set currenty ; Используется WDF
IROP2L .set R7 ; Используется WDF
IRACL .set R8 ; Используется WDF
IRBT .set R9 ; Используется WDF
lastx .set R10
bit_data .set R11 ; Используется WDF
mem_ptr .set R15 ; Используется WDF
************************
* STATIC
************************
bit_sync_timer .set R12 ;
global_status .set R13 ;
bits_count .set R14 ;
INTERRUPT_TOGGLE .set 1
FALLING .set 2
CLOCK .set 4
;**************************************************
;Инициализация системы
;**************************************************
;RAM_NORMAL_DEMOD
.sect ”RAM_CODE”,02f0h
Start
.sect ”ADC”,0f000h ; 0214h ;0F000h
mov #STACK,SP ; Инициализация системного указателя стека
mov #(WDTHold+WDT_wrkey),&WDTCTL ; Остановка сторожевого таймера
clr.b &IFG1 ;очистка всех флагов прерываний
clr.b &IFG2
mov.b #(17*5)–1,&SCFQCTL ; MCLK=32768*17*5 - > получаем
; производительность 2.8 MIPs
mov.b #4,&SCFI0 ; Установка частоты RC генератора, равной 2xFreq
mov.b #–205,&TCPLD ;328/2 ; сброс нарастающих/спадающих фронтов
bis.b #TPD_B16,&TPD ; операционный усилитель
bis.b #11111110b,&P0DIR ; установка портов P0.7–P0.1 на работу в режиме выходов
;P0.0 используется в качестве входа сигнала RING
mov.b #(TCCTL_SSEL1+TCCTL_ISCTL+TCCTL_ENCNT),&TCCTL
bic.b #IE2_BTIE,&IE2 ;отключение прерывания основного таймера
bic.b #IE1_P0IE0,&IE1 ;отключение прерывания от P0.0
bic.b #IE2_TPIE,&IE2 ;отключение прерывания универсального таймера
bis.b #TPE_0+TPE_1+TPE_2+TPE_3+TPE_5,&TPE
;TP_0 используется для сигнала Hook
;TP_1 используется для управления RAMP генератором
;TP_2 используется для тестирования схемы
;TP_3 перекрывает биты синхронизации
;TP_5 – бит данных
mov #1,bit_sync_timer
mov.b #3,cycle_counter
call #clear_all_parameters
;<–––––––––––– активизация демонстрации FSK!!!!
bis.b #IE1_P0IE1,&IE1
eint
WAIT_LOOP: ; неопределенное ожидание
;выход из цикла по прерыванию
jmp WAIT_LOOP
TIM8_Int:
;********************************************
; Выборка входного сигнала
;********************************************
NORMAL_DEMOD:
bit #INTERRUPT_TOGGLE,global_status ;!!!!!
jz filters
do_ADC
bic #INTERRUPT_TOGGLE,global_status
SLP_A_D:
mov.b #(TPCTL_TPSSEL1+TPCTL_TPSSEL0),&TPCTL
;использование MCLK в качестве входного сигнала, останавливающего счет
bis.b #TPE_2+TPE_1,&TPD ; сброс RAMP
; только TPE_2, используемый для тестирования схемы, может прервать.
mov.b &TPCNT1,currenty ; обнуление MSByte
mov.b &TPCNT2,currentx ;обнуление MSByte
swpb currentx
bis currenty,currentx ;объединение для формирования 16- битного результата
;эха выборки на выходе
clr.b &TPCNT1
clr.b &TPCNT2
;активизация счетчика
mov.b #TPCTL_ENA+TPCTL_ENB+TPCTL_TPSSEL1+TPCTL_TPSSEL0,&TPCTL
bic.b #TPE_2+TPE_1,&TPD ; перезапуск RAMP
_0DB:
rla currentx
rla currentx
rla currentx
;****************************************************
; Проверка того, что входное напряжение < VCC/4
;****************************************************
*****************************************************************************
* Результаты анти-смещения
* ответ = входной сигнал + (0.875 * lasty) – lastx;
* lasty = ответ;
* lastx = входной сигнал;
*****************************************************************************
mov currentx,currenty
sub lastx,currenty
mov currentx,lastx
;****************************************
; Здесь коэффициент усиления настроен на оптимальное значение размаха 1 В
; при более высоком значении может потребоваться его уменьшение
; при помощи внешнего резистивного делителя
;****************************************
; rra currenty
rra currenty
rra currenty
mov &last_sample,IROP2L
mov currenty,&last_sample
and #0ffh,currenty
and #0ffh,IROP2L
**************************************************
* подпрограмма перемножения восьмибитных чисел со знаком
**************************************************
clr IRACL
tst.b currenty
jge L$101
swpb IROP2L
sub IROP2L,IRACL
swpb IROP2L
L$101
tst.b IROP2L
jge MACU8
swpb currenty
sub currenty,IRACL
swpb currenty
MACU8
mov #1,IRBT
L$002
bit IRBT,currenty
jz L$01
add IROP2L,IRACL
L$01 rla IROP2L
rla.b IRBT
jnc L$002
mov IRACL,R9 ; подготовка для LP фильтра в следующем цикле
***************************************************
* Выполнение синхронизации фронтов
***************************************************
bit #FALLING,global_status ;!!!!!!!!!
jz detect_rising
detect_falling:
tst bit_data ;последний фронт был нарастающим, поэтому
; проверяем для спадающего
jge update_bit_sync_timer ; не спадающий, выполняем следующую команду
bic #FALLING,global_status ; определен спадающий фронт, в следующем цикле
; необходимо отследить нарастающий
jmp new_edge_detected
detect_rising:
tst bit_data
jn update_bit_sync_timer
bis #FALLING,global_status
;************************************************************************************
; Было обнаружено изменение фронта, сейчас для определенности синхронизируем
; бит synch таймера, опережение или отставание
; ____ Выборка 3
; /
; Опережение Отставание
; __/|\__ /|\ ______
; | | | | |
; | | | | |
; _| | |___|___|
; Новый фронт был обнаружен, теперь необходимо синхронизировать встроенный программный
; генератор, работающий на частоте 1200 бод, с внешним фронтом. Внутренние данные
; синхронизации содержатся в бите BIT2 регистра TPD и используются для определения
;опережения или отставания. Так как имеется дребезг входных синхроимпульсов, то мы не
; используем информацию о запаздывании или опережении для немедленного обновления. Вместо
; этого мы осуществляем "низкочастотную фильтрацию" результата для добавления или
; вычитания его из счетчика только после того, как его абсолютное значение превысит порог,
который мы установили.
;************************************************************************************
new_edge_detected
bit.b #CLOCK,global_status ;!!!!!!!!!
jz lagging
leading:
add #1,bit_lead_lag
jmp update_bit_sync_timer
lagging:
sub #1,bit_lead_lag
;********************************************************************************
; Формирование бита синхронизации
; 6/6800+5/6800+6/6800=3/1200
; Это внутренний синхроимпульс, который должен определять скорость 1200 бод, но он
; имеет дребезг, так как формирование сигнала с частотой 1200 Гц осуществляется путем
; деления сигнала с частотой 6 800 Гц. В регистр bit_sync_timer загружается 6, а потом 5,
; а потом 6 и т.д.
;********************************************************************************
update_bit_sync_timer:
sub #1,bit_sync_timer
jz load_new_timer_value ; если таймер достиг нуля, то загружается новое значение
; фронт синхроимпульса сбрасывается
cmp #3,bit_sync_timer ;
jnz done_bit_sync
bis.b #TPE_3,&TPD
bis.b #CLOCK,global_status ; фронт синхроимпульса устанавливается в середине цикла
; для выполнения выборки данных, но это не используется в
cmp #20,bit_data
jge data_is_space ; данной программе.
; В этой точке устанавливается C
data_is_mark
bic.b #TPE_5,&TPD
clrc
jmp count_down_bits
done_bit_sync:
reti
data_is_space
bis.b #TPE_5,&TPD
setc
count_down_bits
rrc data_word
reti
load_new_timer_value:
bic.b #TPE_3,&TPD
bic.b #CLOCK,global_status ;очистка бита внутренней синхронизации.
mov #6,bit_sync_timer
sub.b #1,cycle_counter ;определение положения для следующего цикла – 5 или 6
jnz do_6_counts
do_5_counts
mov.b #3,cycle_counter
mov #5,bit_sync_timer ; если значение равно 5, то нам надо компенсировать
; опережение
cmp #–7,bit_lead_lag ;
jl compensate_lag
reti
do_6_counts:
cmp #7,bit_lead_lag ; если значение равно 6, то нам
; надо компенсировать отставание
jge compensate_lead
reti
compensate_lag
add #1,bit_sync_timer
mov #0,bit_lead_lag
reti
compensate_lead
sub #1,bit_sync_timer
mov #0,bit_lead_lag
reti
**************************************************
* Выполнение алгоритма этого цикла происходит за 113 циклов
**************************************************
;*****************************************************
; Параметры нового фильтра выборок
; Freq_Stop (частота затухания): 2.5 кГц, Attenuation_Stop
; (подавление на частоте затухания): 40 дБ
; Freq_Pass (верхняя частота полосы пропускания): 1.4 кГц,
; Attenuation_Pass (подавление на верхней частоте): 1 дБ
; Порядок фильтра = 5
;*****************************************************
filters:
bis #INTERRUPT_TOGGLE,global_status
mov #WDF_PARMS,mem_ptr
.word 4f16h
.word 0000h
.word 498fh
.word 0000h
.word 4f17h
.word 0008h
.word 8607h
.word 4708h
.word 1108h
.word 4806h
.word 1108h
.word 1108h
.word 1108h
.word 1108h
.word 1108h
.word 8806h
.word 8f16h
.word 0008h
.word 4f9fh
.word 0006h
.word 0008h
.word 468fh
.word 0006h
.word 8706h
.word 4f17h
.word 0004h
.word 8907h
.word 4708h
.word 1108h
.word 1108h
.word 1108h
.word 4809h
.word 1108h
.word 1108h
.word 1108h
.word 8809h
.word 5f19h
.word 0004h
.word 8907h
.word 4f9fh
.word 0002h
.word 0004h
.word 478fh
.word 0002h
.word 8906h
mov R6,bit_data
;**************************************************************
; Данные с выхода фильтра сохраняются в регистре R6
; Содержимое регистра R6 переводится в аналоговое значение после
; некоторых аппаратных ограничений
;**************************************************************
add #80h,R6
tst R6
jge non_negative
mov #0,R6
non_negative
cmp #0ffh,R6
jlo non_ceiling
mov #0ffh,R6
non_ceiling
mov.b R6,&P0OUT
exit_D_A
reti
;***************************************************
; очистка всех параметров, лишних для гребенчатого фильтра
;***************************************************
clear_all_parameters:
mov #0,r6
mov #0,r7
mov #0,r8
mov #0,r9
mov #0,r10
mov #0,r11
mov #0,r12
mov #0,r13
mov #0,r14
mov #0,r15
mov #WDF_PARMS,r4
clear_parms_loop
mov #0,0(r4)
incd r4
cmp #end_of_parms,r4
jnz clear_parms_loop
ret
;*****************************************************************
;**** Адреса векторов прерывания:
.sect ”Int_Vect”,0ffe0h ;03e0h ; 0FFE0h
.word Start ;P0.27
.word Start ;BT
.word Start ;
.word Start ;
.word Start ;универсальный таймер
.word Start ;АЦП
.word Start ;
.word Start ;
.word Start ;
.word Start ;
.word Start ;сторожевой таймер
.word Start ;
.word TIM8_Int ;P0.1
.word Start ;P0.0
.word Start ;RSTI/OF
.word Start ;PUC/WDT
Приложение B: подпрограмма FSK передатчика
CPUOFF .equ 010h
SCG0 .equ 040h
SCG1 .equ 080h
IE1 .equ 0h
IE1_P0IE1 .equ 08h
IE1_P0IE0 .equ 04h
IE1_OFIE .equ 02h
IE1_WDTIE .equ 01h
IE2 .equ 01h
IE2_BTIE .equ 80h
IE2_TPIE .equ 08h
IE2_ADIE .equ 04h
IE2_UTXRIE .equ 02h
IE2_URXIE .equ 01h
IFG1 .equ 02h
IFG2 .equ 03h
ME1 .equ 04h
ME2 .equ 05h
P0IN .equ 010h
P0OUT .equ 011h
P0DIR .equ 012h
P0FLG .equ 013h
P0IES .equ 014h
P0IE .equ 015h
LCDCTL .equ 030h
LCDM .equ 030h ; адрес регистра управления и режима ЖКИ
BTCTL .equ 040h
BTCTL_SSEL .equ 80h
BTCTL_Hold .equ 40h
BTCTL_DIV .equ 20h
BTCTL_FREQ1 .equ 10h
BTCTL_FREQ0 .equ 08h
BTCTL_IP2 .equ 04h
BTCTL_IP1 .equ 02h
BTCTL_IP0 .equ 01h
BTCNT1 .equ 046h
BTCNT2 .equ 047h
BTIFG .equ 080h ; флаг прерывания BT
TCCTL .equ 042h ; адрес управляющего регистра таймера/счетчика
TCCTL_SSEL1 .equ 080h
TCCTL_SSEL0 .equ 040h
TCCTL_ISCTL .equ 020h
TCCTL_TXE .equ 010h
TCCTL_ENCNT .equ 008h
TCCTL_RXACT .equ 004h
TCCTL_TXD .equ 002h
TCCTL_RXD .equ 001h
TCPLD .equ 043h ; адрес регистра предварительной загрузки таймера/счетчика
TCDAT .equ 044h ; адрес таймера/счетчика
TPD .equ 04eh
TPD_B16 .equ 080h
TPD_CPON .equ 040h
TPE .equ 04fh
TPE_0 .equ 01h
TPE_1 .equ 02h
TPE_2 .equ 04h
TPE_3 .equ 08h
TPE_4 .equ 10h
TPE_5 .equ 20h
TPE_TPSSEL2 .equ 40h
TPE_TPSSEL3 .equ 80h
TPCTL .equ 04Bh
TPCTL_EN1FG .equ 01h
TPCTL_RC1FG .equ 02h
TPCTL_RC2FG .equ 04h
TPCTL_EN1 .equ 08h
TPCTL_ENA .equ 10h
TPCTL_ENB .equ 20h
TPCTL_TPSSEL0 .equ 40h
TPCTL_TPSSEL1 .equ 80h
TPCNT1 .equ 04Ch
TPCNT2 .equ 04Dh
SCFI0 .equ 050h
SCFI1 .equ 051h
SCFQCTL .equ 052h
CBCTL .equ 053h
AIN .equ 0110h
AEN .equ 0112h
ACTL .equ 0114h
ACTL_CSTART .equ 0001h
ACTL_SVCC_OFF .equ 0000h
ACTL_SVCC_ON .equ 0002h
ACTL_2 .equ 0004h
ACTL_3 .equ 0008h
ACTL_4 .equ 0010h
ACTL_5 .equ 0020h
ACTL_SEL_A0 .equ 0000h
ACTL_SEL_A1 .equ 0004h
ACTL_SEL_A2 .equ 0008h
ACTL_I_SRC_A0 .equ 0000h
ACTL_I_SRC_A1 .equ 0040h
ACTL_RNG_B .equ 0200h
ACTL_RNG_AUTO .equ 0800h
ACTL_POWER_UP .equ 0000h
ACTL_CLK_MCLK .equ 0000h
ACTL_CLK_MCLK_2 .equ 2000h
ACTL_CLK_MCLK_3 .equ 4000h
ADAT .equ 0118h
ADIFG .equ 04h
WDTCTL .equ 0120h
WDTHold .equ 80h
WDT_wrkey .equ 05A00h
STACK .set 3d0h ;280h запуск системного стека
*****************************************************************************
* константы:
* delta_phase = (freq/sam_freq)*65536
*****************************************************************************
_1300_Hz .equ 01155h
_2100_Hz .equ 01c00h
DELTA_PHASE .equ 1
*****************************************************************************
* Фильтры
*****************************************************************************
sinne_value .usect ”FILTMEM”,2,200h
tx_cycle_counter .usect ”FILTMEM”,2
tx_cycle_ptr .usect ”FILTMEM”,2
;подпрограмма обслуживания пользователя
delta_phase .set R6
phase_ptr .set R7
tx_data_ptr .set R8
tx_data_mask .set R9
DELAY_COUNTER .set R10
global_status .set R11
reg_1 .set R12
reg_2 .set R13
reg_3 .set R14
TX_DONE .set 1
FALLING .set 2
CLOCK .set 4
HUNT .set 8
_20MS .set 136
_1PT5S .set 28800
;**************************************************
;Инициализация системы
;**************************************************
Start .sect ”ADC”,0f000h ;0214h ;0F000h
mov #STACK,SP ;инициализация системного указателя стека
mov #(WDTHold+WDT_wrkey),&WDTCTL ; остановка сторожевого таймера
clr.b &IFG1 ;очистка всех флагов прерываний
clr.b &IFG2
mov.b #(75)–1,&SCFQCTL ; MCLK=32768*17*4 получаем 2.45 MIPS
mov.b #4,&SCFI0 ;установка частоты RC генератора 2xFreq
mov.b #–128,&TCPLD ;32768*75/128 = 19200 выборок/секунду
mov.b #(TCCTL_SSEL1+TCCTL_ISCTL+TCCTL_ENCNT),&TCCTL
mov.b #IE1_P0IE1,&IE1 ;разрешение 8- битного таймера
bis.b #11111111b,&P0DIR ;установка портов P0.7–P0.0 на работу в качестве выходов
eint
;**** Основная программа:
Loop ;ожидание прерывания
mov #TX_DATA_TABLE,tx_data_ptr
mov #08000h,tx_data_mask
mov #0,phase_ptr
mov #1,tx_cycle_counter
bic #TX_DONE,global_status
call #fetch_new_output_bit
call #fsk_modulation
wait_for_tx_done
bit #TX_DONE,global_status
jz wait_for_tx_done
Loop2:
jmp Loop2
TIM8_Int:
NORMAL_MOD:
call #fsk_modulation
;***************************************************************************
; Эта часть программы формирует сигнал на выходе P0OUT, к которому должен быть
; подключен 8- битная R–2R цепочка. Она используется для отслеживания
; отфильтрованного значения, но если необходимо использовать порт для формирования
; сигнала FSK передатчика, то она должна быть отключена
;***************************************************************************
D_A
mov sinne_value,reg_1
mov.b reg_1,&P0OUT ; MSB содержится в седьмом бите.
reti
;****************************************************************************
; Таблица слежения
;****************************************************************************
fsk_modulation:
add delta_phase,phase_ptr
; таблица содержит 128 элементов, 4*128 = 512 =+/– 256
;извлекаются старшие 9 бит
mov phase_ptr,reg_1
;таблица косинусов 3- и 4- ого квадрантов переносятся на 1- и 2- ой
;квадранты
tst reg_1
jge no_tx_abs
xor #0ffffh,reg_1
add #1,reg_1
no_tx_abs:
swpb reg_1 ;LSB (МЗБ) результата в MSB (СЗБ) регистра reg_1,
;8 MSB бит в
; младшем байте регистра reg_1
bit #8000h,reg_1
rlc reg_1 ;C в бит bit0, 8 MSB бит в биты 1–8
bic #0fe00h,reg_1
;формат Q8
first_two_quadrant:
cmp #128,reg_1
jn first_quadrant
second_quadrant
mov #256,reg_2
sub reg_1,reg_2
mov.b cos_table(reg_2),reg_2
xor #0ffffh,reg_2
add #1,reg_2
jmp output_sample
first_quadrant ; 0–127 градусов
mov.b cos_table(reg_1),reg_2
output_sample:
add #80h,reg_2
mov reg_2,sinne_value ; результат в переменной sinne_value
;**************************************************************************
;начало сервисной подпрограммы fetch_new_out_bit
;**************************************************************************
fetch_new_output_bit:
dec tx_cycle_counter
jnz NO_RESET_TX_PTR
; при производительности 19200 выборок/сек div16 = 1200 бод
mov #16,tx_cycle_counter
load_next_cycle:
mov #_2100_Hz,delta_phase ;примите это сначала
mov tx_data_ptr,reg_1
bit @reg_1,tx_data_mask
jnz TX_BIT_IS_1
TX_BIT_IS_0:
mov #_1300_Hz,delta_phase
TX_BIT_IS_1:
rra tx_data_mask
BIC #8000h,tx_data_mask
jnc NO_TX_PTR_UPDATE
mov #8000h,tx_data_mask
add #2,tx_data_ptr
mov tx_data_ptr,reg_1
tst 0(reg_1)
jnz NO_RESET_TX_PTR
mov #TX_DATA_TABLE,tx_data_ptr
bis #TX_DONE,global_status
NO_TX_PTR_UPDATE
NO_RESET_TX_PTR
ret
;**************************************************************************
; конец сервисной подпрограммы fetch_new_out_bit
;**************************************************************************
TX_DATA_TABLE
.word 05555h
.word 05555h
.word 05555h
.word 05555h
.word 05555h
.word 05555h
.word 0FFFFh
.word 0FFFFh
.word 0FFFFh
.word 0FFFFh
.word 0FC07h
;****************************************************************************
; это имело множество битов меток
; содержание: 5 байт, 1 3 5 7 9
;****************************************************************************
.word 0FC0Bh
.word 0FC03h
.word 0FC07h
.word 0FC0Bh
.word 0FC0Fh
.word 0FC13h
.word 0
cos_table:
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07fh
.byte 07eh
.byte 07eh
.byte 07eh
.byte 07eh
.byte 07dh
.byte 07dh
.byte 07dh
.byte 07ch
.byte 07ch
.byte 07ch
.byte 07bh
.byte 07bh
.byte 07ah
.byte 07ah
.byte 07ah
.byte 079h
.byte 079h
.byte 078h
.byte 077h
.byte 077h
.byte 076h
.byte 076h
.byte 075h ;cos 23.2031
.byte 075h
.byte 074h
.byte 073h
.byte 073h
.byte 072h
.byte 071h
.byte 070h
.byte 070h
.byte 06fh
.byte 06eh
.byte 06dh
.byte 06ch
.byte 06ch
.byte 06bh
.byte 06ah
.byte 069h
.byte 068h
.byte 067h
.byte 066h
.byte 065h
.byte 064h
.byte 063h
.byte 062h
.byte 061h
.byte 060h
.byte 05fh
.byte 05eh
.byte 05dh
.byte 05ch
.byte 05bh
.byte 05ah
.byte 059h
.byte 058h
.byte 057h
.byte 055h
.byte 054h
.byte 053h
.byte 052h
.byte 051h
.byte 04fh
.byte 04eh
.byte 04dh
.byte 04ch
.byte 04ah
.byte 049h
.byte 048h
.byte 047h
.byte 045h
.byte 044h
.byte 043h
.byte 041h
.byte 040h
.byte 03fh
.byte 03dh ;cos 61.1719
.byte 03ch
.byte 03ah
.byte 039h
.byte 038h
.byte 036h
.byte 035h
.byte 033h
.byte 032h
.byte 030h
.byte 02fh
.byte 02eh
.byte 02ch
.byte 02bh
.byte 029h
.byte 028h
.byte 026h
.byte 025h
.byte 023h
.byte 022h
.byte 020h
.byte 01fh
.byte 01dh
.byte 01ch
.byte 01ah
.byte 018h
.byte 017h
.byte 015h
.byte 014h
.byte 012h
.byte 011h
.byte 00fh
.byte 00eh
.byte 00ch
.byte 00ah
.byte 009h
.byte 007h
.byte 006h
.byte 004h
.byte 003h
.byte 001h ;cos 89.2969
;*****************************************************************
;**** адреса векторов прерывания :
.sect ”Int_Vect”,0ffe0h ;03e0h ; 0FFE0h
.word Start ;P0.27
.word Start ;BTIM_Int ;BT
.word Start ;
.word Start ;
.word Start ;UTIM_Int ;универсальный таймер
.word Start ;АЦП
.word Start ;
.word Start ;
.word Start ;
.word Start ;
.word Start ;сторожевой таймер
.word Start ;
.word TIM8_Int ;P0.1
.word Start ;P0.0
.word Start ;RSTI/OF
.word Start ;PUC/WDT
домашние кинотеатры
|