Здpавствуй, All!
Задача следущая. Есть мега88, она по SPI сцеплена с DDS AD9833. Приходят прерывания из вне и с таймера считывается значение. Надо генерить синус с такой же частотой. Но вот незадача, регистр частоты 28битный. Загружается он пачками по 16 бит, в которых два старших бита - адрес регистра частоты (для упрощения задачи возьмем 00).
Расчет значения регистра частоты такой: freq = (F_out/F_qartz)*2^28. Ну а требуемая частота с таймера это: F_out = FOSC/timer. Где: FOSC - частота кварца меги (в данном случае 8МГц), F_qartz = 8МГц (частота кварца ДДС), timer - 16bit значение таймера.
lsb - u08 msb - u08 timer-u16 freq -u32
Вот код, который должен терять 2 последних разряда в точности, переделывая
32битное слово (2 старших - нули) в два 14битных (с 2мя ведущими нулями у каждого)./////////////////////here goes some black magic///////////////////////////// freq = (FOSC/8000000)*(268435456/timer); freq = (freq<<2); freq = freq&0x3FFFFFFC;
lsb = (u16)(freq); lsb = (lsb>>2); lsb = lsb & 0x3FFF;
msb = (u16)(freq>>16); /////////////////////here black magic stops/////////////////////////////////
Как на ваш взгляд, будет ли это работать? И как это можно оптимизировать? Особенно интересует момент с изменением FOSC. Если я поставлю кварц на 12 МГц, то на результате это не скажется, так? Как решить вопрос? Если сначала перемножить, а потом делить, то не будет ли сверху переполнения? Все же там большие цифры..
С уважением - Alexander ... Как мне избавиться от этой тоски по вам, солнечные дни?..