Попробую я описать.
Код:
#define SCLK_DELAY 128
void send_byte(const char byte) {
int i, j;
char tmp;
tmp = byte; /* temporary byte holder to work with */
/* Cycle for each bit in byte (MSB first) */
for (i = 0; i < 8; i++) {
if (tmp & 0x80) /* Check for most significant bit (bit15) */
/* Send '1' */
else /* Send '0' */
tmp <<= 1; /* Get next bit in bit15 */
/* do clock */
/* set SLCK = '1' */
for (j = SCLK_DELAY; j > 0; j--); /* some delay */
/* set SCLK = '0' */
for (j = SCLK_DELAY - 8; j > 0; j--); /* another delay */
}
}
void dds_init(void) {
/* Reset DDS */
/* set FSYNC = '0' */
send_byte(0x58);
send_byte(0x00);
/* set FSYNC = '1' */
/* Set inital frequency */
/* set FSYNC = '0' */
send_byte(0x33);
send_byte(freq3); /* byte 3 */
/* set FSYNC = '1' */
/* set FSYNC = '0' */
send_byte(0x22);
send_byte(freq2); /* byte 2 */
/* set FSYNC = '1' */
/* set FSYNC = '0' */
send_byte(0x31);
send_byte(freq1); /* byte 1 */
/* set FSYNC = '1' */
/* set FSYNC = '0' */
send_byte(0x20);
send_byte(freq0); /* byte 0 */
/* set FSYNC = '1' */
/* Go to operational mode */
/* set FSYNC = '0' */
send_byte(0xc0);
send_byte(0x00);
/* set FSYNC = '1' */
}
Частота задается в freq3...0.
Предоставляю вам самим написать остальные функции.
В приведенном выше листинге строки с "Send '1'", "Send '0'", "set SLCK = '1'", "set SLCK = '0'", "set FSYNC = '1'", "set FSYNC = '0'" нужно заменить на команды вывода в порт для соответствующей ножки. Как дергать ножками AVR на Си, надеюсь, знаете?
Желаю удачи!
----
dmitry