}
else
{
SelfTest=0;
}
BITTIME=1;
bits_left=8; // 8-битный режим работы
mod_ready=0;
return;
}
// В случае тестового режима дальше не идем
if(mod_ready == 0) return;
BITTIME=1;
if(ModulatorGet(&out_data)==0) /* nothing to get */
{
// обнуление флагов и возврат
/* clear PF6 as TLG & PF7 as syncro_out */
asm("
ar = dm(PFDATA);
ar = clrbit 7 of ar;
ar = clrbit 6 of ar;
dm(PFDATA) = ar; ");
/* -------------------------- */
return;
}
bits_left=7; // 7-битный режим работы
mod_ready=0;
}
Программа демодуляции
Принцип демодуляции входного сигнала нашего устройства, основывается на том, что нам известны частоты поступающие от отдельного устройства приема сигнала по радиоканалу, уже отфильтрованные и поданные на вход нашего устройства. И нам необходимо выделить соответственно частоты 1785 Hz = MARK = ' 0 ' и 1615 Hz = SPACE = ' 1 ' и получить определенный код. После получении кода происходит раскодирование по таблице NBDP и передача в ЭВМ, где программа TERMINAL соответственно реагирует на данные кода.
// Demod.c
// Подключаем заголовочные файлы и объявляем локальные и глобальные // переменные
#include <drivers.h>
#include <stdlib.h>
#include <template.h>
#include <nbdp.h>
extern void out_mcr(int data);
#define DMD_KOEFF 0x019A
#define DMD_LEVEL 0x1000 /* порог срабатывания */
#define OUT_MARK 'M'
#define OUT_SPACE 'S'
#define OUT_ERR 'E'
int my_fir(int NewValue);
int my_sqrt(int NewValue);
/*-------------------------------------------------------------*/
volatile int l_in,r_in;
int Demodulator_ON=1; // Demodulator ON/OFF flag
int PH_TONE_ACC; // опорный MARK/SPACE PHASE ACC
int PH_TONE_INC = {MARK_INC, SPACE_INC};
int i,j; // временные счетчики
int R ; // временные результаты
int S ; // частичные суммы
int DL; // Delay lines for 4 bands
int DLp = 0; // DL pointer
int countN=BITLENGTH; // Cycle count
int REZ; // Результаты
int PRZLT; // Приблизительные результаты (prev. Rez)
int svMode; /* Save multiplier mode location */
int JitterOff; /* Bit syncro OFF flag */
int OutData;
void demodulator(void)
{
// Если демодулятор откл., то обнуление результатов и возврат
if(!Demodulator_ON && (dip_sw & DIP_SW1))
{
REZ = 0;
out_mcr(0);
goto CheckCycle;
}
if(SelfTest) // Если тестовый режим, то возврат
{
return;
}
// Выключение режима целочисленной арифметики
asm("dis m_mode;");
l_in = rx_buf;
// ограничить входной сигнал для устранения переполнения фильтра
r_in = _FRACT_MULTIPLY_(r_in,DMD_KOEFF);
Заполняем массив временных результатов для MARK и SPACE
PH_TONE_ACC += PH_TONE_INC;
R = _FRACT_MULTIPLY_(r_in,sin_i(PH_TONE_ACC));
R = _FRACT_MULTIPLY_(r_in,cos_i(PH_TONE_ACC));
PH_TONE_ACC += PH_TONE_INC;
R = _FRACT_MULTIPLY_(r_in,sin_i(PH_TONE_ACC));
R = _FRACT_MULTIPLY_(r_in,cos_i(PH_TONE_ACC));
//Извлекаем старые данные и добавляем новые
for(i=0;i<4;i++)
{
S = S - DL;
S = S + R;
DL = R;
}
if(DLp >= (4*BITLENGTH)) DLp=0; /* wrap DL pointer */
// Получение результата по каждому фильтру.
PRZLT = REZ; // Предварительный результат
REZ = _FRACT_MULTIPLY_(S,S) + _FRACT_MULTIPLY_(S,S);
REZ = _FRACT_MULTIPLY_(S,S) + _FRACT_MULTIPLY_(S,S);
if(dip_sw & DIP_SW2)
{
REZ = my_sqrt(REZ);
REZ = my_sqrt(REZ);
}
R = (REZ-REZ);
R = (REZ+REZ);
R = _FRACT_MULTIPLY_((_FRACT_DIVIDE_(R,R)),0x6400);
REZ = R;
/* debug solution output */
tx_buf = REZ;
/*================================================
STEP 4.
Time supervision, bit detection, etc.
================================================*/
CheckCycle:
countN--;
if(!countN)
{
if(abs(REZ) > DMD_LEVEL)
{
if(REZ > 0)
{
OutData = OUT_MARK;
asm("reset fl0; set fl2; set fl1; ");
}
else
{
OutData = OUT_SPACE;
asm(" set fl0; reset fl2; set fl1; ");
}
}
else
{
OutData = OUT_ERR;
asm(" set fl0; set fl2; reset fl1; ");
}
countN = BITLENGTH;
// отправляем на ЦАП (кодек)
NBDP_THR_RX(OutData);
}
// включение режима целочисленной арифметики
asm("ena m_mode;");
}
Дополнительные программы и функции
1. Программа nbdp_table.c
Содержит таблицу соответствия кодов ASCII и кодов формата NBDP. Перейти на страницу: 1 2 3 4 5 6 7 8 9
Советуем почитать:
Разработка эквивалентных и принципиальных схем электрического фильтра и усилителя напряжения В электротехнических, радиотехнических и телемеханических установках и устройствах связи часто ставится задача: из многих сигналов, занимающих широкую полосу частот, выделить один или н ...
Защита информации от утечки по цепям питания Циркулирующая в тех или иных технических средствах конфиденциальная информация может попасть в цепи и сети электрического питания и через них выйти за пределы контролируемой зоны. Наприм ...
Источники питания электронных устройств Применение различного рода электронных устройств для управления производственными процессами подразумевает использование электрической энергии определенного вида для их питания (постоян ...