Имеется FTDI232, к ней подключен ИК-светодиод (с транзисторным ключом для усиления). Требуется передавать данные, на принимающей стороне AVR с ИК-приёмником TSOP1736. Проблема в том, что пока оно особо не работает. С AVR разберусь как-нибудь сам, а вот программная модуляция частоты хз как работает.
#include <stdio.h>
#include <stdlib.h>
#include <ftdi.h>
#define LED 0x08
#define FREQ (36000 * 2)
#define SPEED 1200
#define BIT_LENGTH (FREQ / SPEED)
struct ftdi_context ctx;
void send_message(unsigned char *data, size_t count) {
size_t buf_size = BIT_LENGTH * count * 8;
unsigned char *buf = malloc(buf_size);
size_t i, k = 0;
for (i = 0; i < count; i++) {
unsigned char byte = data[i];
unsigned char j;
for (j = 0; j < 8; j++) {
int n;
if (byte & (1 << (7 - j))) {
for (n = 0; n < (BIT_LENGTH / 4); n++) {
buf[k] = LED;
k++;
buf[k] = 0;
k++;
}
for (n = 0; n < (BIT_LENGTH / 4); n++) {
buf[k] = 0;
k++;
buf[k] = 0;
k++;
}
} else {
for (n = 0; n < (BIT_LENGTH / 4); n++) {
buf[k] = 0;
k++;
buf[k] = 0;
k++;
}
for (n = 0; n < (BIT_LENGTH / 4); n++) {
buf[k] = LED;
k++;
buf[k] = 0;
k++;
}
}
}
}
printf("\n");
ftdi_write_data(&ctx, buf, buf_size);
free(buf);
}
int main(int argc, char *argv[]) {
ftdi_init(&ctx);
if(ftdi_usb_open(&ctx, 0x0403, 0x6001) < 0) {
printf("Can't open FTDI device!\n");
return 1;
}
ftdi_enable_bitbang(&ctx, LED);
ftdi_set_baudrate(&ctx, FREQ / 16);
char msg[] = {0xFF};
send_message(msg, sizeof(msg));
return 0;
}
Я всё правильно делаю или нет? Частота несущей 36 КГц. Аппаратная часть передатчика точно работает - светодиод мигает (видно с помощью камеры мобильного телефона).