Уважаемые гуру, прошу помощи! Пришлось таки из-за нехватки места под массивы перевести систему сбора данных с PIC18F4553 на PIC24FJ256GB206, и тут такое началось! Вот сокращенный текстик на CCS C:
#include ‹24FJ256GB206.h›
#FUSES ICSP3
#FUSES NOWDT
#FUSES NOJTAG //JTAG disabled
#FUSES NOCKSNOFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES PLL1 //No PLL PreScaler
#FUSES PR_PLL //Primary Oscillator with PLL
#FUSES XT //Crystal osc ‹= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
//#FUSES FRC_PLL //Internal Fast RC oscillator with PLL
//#FUSES PLL96MHZ
#use delay(clock=32000000)
#define r1 PIN_G6 // вывод 4
#define r2 PIN_G7 // вывод 5
#define FFT_N 128 // число точек на периоде FFT
void voltmeter(void);
static unsigned int16 count = 0;
static unsigned char usb_en = 0;
union {
int8 XI[FFT_N * 2 + 2];
char usb_data[FFT_N * 2 + 2];
} cc;
static int16 YI[FFT_N];
typedef union
{
struct {
unsigned char lo;
unsigned char hi;
}st;
int16 all;
}tun;
tun uu;
#define V0 (int)(4096*2.45)/4.89 // значение, соотв. нулю на входе.
void voltmeter(void)
{
if (count ‹ FFT_N) {
if (input(r1)) output_low (r1);
else output_high (r1);
set_adc_channel(0); // читаем напряжение по входу A0
uu.all = Read_ADC() - V0;
cc.XI[count+count] = uu.st.hi;
cc.XI[count+count+1] =uu.st.lo;
count++;
if (input(r1)) output_low (r1);
else output_high (r1);
}
else {
count = 0;
}
}
void main()
{
setup_spi( FALSE );
setup_spi2( FALSE );
setup_adc_ports(sAN0 | sAN1);
setup_adc(ADC_CLOCK | ADC_TAD_MUL_16);
while (TRUE) {
if (input(r2)) output_low (r2);
else output_high (r2);
voltmeter();
if (input(r2)) output_low (r2);
else output_high (r2);
}
}
Работает от внешнего кварца 4 МГц, форма колебаний на его ножках близка к синусоиде, как-будто включено умножение на 24 и должно быть внутри деление на 3, т.е. тактовая частота д.б. 32 Мгц (так в документации). Но на практике частоту обращения к подпрограмме voltmeter в которой происходит одно АЦП и несколько присвоений никакими силами не удается сделать выше 11 кГц!?
Аналогичные результаты получаются и при тактировании от внутреннего генератора. При этом способе на ножках осциллятора наблюдаются колебания частотой 16 Мгц (хотя д.б. 4 Мгц), как-будто бы логичная попытка поделить их на 4 и тем самым запустить умножение на 24 приводит только к снижению частоты обращения к АЦП в те же 4 раза. Посмотрите на фотографию с осциллографа на которой видны колебания на ножках r1, до и после начала АЦП и r2 - до и после вызова процедуры voltmeter. Получается, что время, потраченное на выполнение всей этой процедуры меньше, чем на одно АЦП! Т.е. целое меньше его части! Налицо нарушение причинно-следственных связей! Не это ли свидетельство наступившего конца света?
Но даже если оставить это любопытное явление на совести конвейера с просмотром вперед (хотя информации об этом я нигде не видел), то понимание того, что делает процессор приблизительно 90 мкс, выполняя несколько коротких команд (само АЦП, если опять-же верить осциллограмме длится ок. 2,5 мкс, а весь цикл около 98 мкс), для меня жизненно важно. Сроки горят! Вся РАН просто пылает...
Либо я в чем-то не прав, либо причинно-следственные связи... Гуру, помогите! Заранее благодарен.