В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MSP430
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Приложение А: подпрограмма 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

домашние кинотеатры