В общем, я так понял, что исходник на специфическом софте написан. Нашел другую статью, но опять не знаю, в чем откомпилировать. Похоже на С. Выкладываю статью и ссылку.
Код
делал я подобное устройство, летало, скорость передачи 1200, FSK соотношение частот 3/2 на AVR
канал звука больше подвержен помехам, поэтому отказался от использования. кстати увеличивать уровень звукового сигнала не надо, наоборот требуется делитель.
модулятор собран на ATmega8. для генерации несущей используется таймер
то есть при выводе 0 или 1 в таймер просто записывается соответствующее значение. вывод через порт D, в tx_buffer выводимая последовательность байт.
код модулятора:
// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{ //OCR2=0x33+0x1A; PORTD=PORTD^0b00100000;
// Place your code here
if (count_tact) count_tact--; // если счетчик тактов не ноль, уменьшаем
else
{
if ((!bit_count)&&tx_data_size) // нет бит на вывод - инициализация
{
tx_word.data_byte[0]=tx_buffer[tx_count++];
if (tx_count==tx_data_size) {
tx_count=0;
tx_data_size=0;
}
tx_word.data_byte[1]=0xFF; // стоповый бит
tx_word.data_word=tx_word.data_word*2; // сдвиг влево
tx_word.data_byte[0]=tx_word.data_byte[0]&0xFE; // стартовый бит
bit_count=11; //1 стартовый, 8-данные, 2- стоповых
}
if (bit_count) // есть биты на вывод
{
OCR2=0x33+(0x1A*(!(tx_word.data_byte[0]&0x01))); // установка таймера
count_tact=1+(tx_word.data_byte[0]&0x01); // установка счетчика тактов
/**/ PORTD=PORTD&0b11011111;
PORTD=PORTD|(0b00100000*(tx_word.data_byte[0]&0x01));
tx_word.data_word=tx_word.data_word/2; // сдвиг вправо
bit_count--;
}
}
}
демодулятор на ATtiny13 просто переводит частоту в последовательность 0 и 1, которую я подавал на COM порт компьютера (ТТЛ)
используется прерывание по компаратору и таймер для расчета периода несущей.
код:
#include <tiny13.h>
unsigned char count_capt; // захват значения счетчика
unsigned char count_tact; // счетчик тактов частоты
unsigned char bit_flag; // флаг частоты бита
unsigned char bit_capt; // захваченный бит по частоте
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
count_capt=TCNT0; // захват счетчика
TCNT0=0x00; // сброс счетчика
if ((count_capt>0x48)&&(count_capt<0x16)) count_tact=0; // ошибка приема сброс
else
{
bit_capt=(count_capt<0x33); // оценка принимаемого бита по длительности
if (bit_capt==bit_flag) // если сохраненный и захваченный такт совпадают
{
count_tact++;
if (count_tact==(1+bit_flag)) // счетчик достиг предела для значения бита
{
PORTB.2=bit_flag; // вывод бита
count_tact=0; // сброс счетчика
}
}
else
{
count_tact=0; // сброс счетчика тактов
bit_flag=bit_capt; // сохранение значения такта
}
}
}
Кстати, в приемнике перед контроллером, необходимо установить ФНЧ. я ставил активный, на операционнике. это позволит немного улучшить помехоустойчивость, а следовательно и дальность
http://forum.rcdesign.ru/f8/thread300546.html#post3910216