|
|
  |
SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c |
|
|
|
Apr 5 2008, 10:31
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Код //--------------- собственно кривая A --------------------------- void curve_A(unsigned int16 n,unsigned int8 y_pos){ unsigned int8 x=1 , y , yy , syncF=0, Nn=0;//Зануляем значение периода for(ever){ if (n++>8192){// Если дошли до сюда, значит не удалось найти период Nn=0;return;// Занулим частоту (типа не посчитали... ) } #asm BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить #endasm y=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить #endasm y = (y > 200) ? 200 : y;// ограничитель до выбранной величины y = (255 - y); // разворот на 180° по вертикали if(syncF==0) { // Первый этап Nn++; if (syncA){ if(y>sync_volume_A) syncF=1; }else{ if(y<sync_volume_A+115) syncF=1; } }else if(syncF==1){// Второй этап Nn++; if (syncA){ if(y<sync_volume_A) syncF=2; }else{ if(y>sync_volume_A+115) syncF=2; } } if(x==255){// Успешно нашли период //Если закончили отрисовку,посчитаем частоту frequenz(FclockA/Nn,194, 230);Nn=0;return; } //........................................................ if(x<255){//Рисуем, пока не вышли за пределы экрана y+= y_pos; //сдвигаем для отображения if (yy>y) front(x,yy,y); // Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину x++; yy=y; } } }//--------------------------OK //#################################################
--------------------
|
|
|
|
|
Apr 5 2008, 10:39
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Ваш подход неправильный. Вы проверяете X и даже не проверяете, посчиталась ли на днный момент частота. Т.е. если частота еще не успела посчитаться (сигнал развернут так, что период длиннее экрана) То на экран выведеться ошибочная частота, равная периоду экрана а не сигнала. Если же вы всетаки хотите отдельный if то придется сделать так: Код if((x==255)&&(syncF==2)){// Успешно нашли период //Если закончили отрисовку,посчитаем частоту frequenz(FclockA/Nn,194, 230);Nn=0;return; }
|
|
|
|
|
Apr 7 2008, 21:42
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил. Код #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr
four2(double data[] , int nn, int isign ) { int n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta; double tempr,tempi; double p2;p2=8*atan(1); n=nn << 1; j=0; for (i=0;i<n;i+=2) { if (j > i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=n >> 1; while (m >= 2 && j >= m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=2*mmax; theta=-p2/(isign*mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=0;m<mmax;m+=2) { for (i=m;i<n;i+=istep) { j=i+mmax; tempr=wr*data[j]-wi*data[j+1]; tempi=wr*data[j+1]+wi*data[j]; data[j]=data[i]-tempr; data[j+1]=data[i+1]-tempi; data[i] += tempr; data[i+1] += tempi; } wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax=istep; } }
#undef SWAP
--------------------
|
|
|
|
|
Apr 8 2008, 06:44
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 8 2008, 05:42)  Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил. Да оно. Только как видите оно оперирует с числами с плавающей запятой. поэтому вам нужно сделать массив типа float из 256 байт, который будет занимать 1024 байта. - Как раз влезет в ваш проц. (наверное все double в процедуре следует исправить на float)
|
|
|
|
|
Apr 8 2008, 07:13
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
буфер сделал и он влез(даже ещё 30% RАМ осталось). теперь что с ним делать? И ещё вопрос имею, что это и как им пользоваться? Код #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr
--------------------
|
|
|
|
|
Apr 8 2008, 07:37
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 8 2008, 15:13)  буфер сделал и он влез(даже ещё 30% RАМ осталось). теперь что с ним делать? Перед преобразованием в него нужно занести 256 значений из FIFO буффера. Цитата И ещё вопрос имею, что это и как им пользоваться? Код #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr Да это просто макрос. Который меняет местами 2 элемента. Сделан чисто для лучшей читаемости кода
|
|
|
|
|
Apr 8 2008, 07:42
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать Код void spectrum_analizator(unsigned int8 y_pos) {unsigned int8 x=0,y,yy; setCursorAddress(0x2581); clear_graphic();delay_ms(100);
#asm BCF 0x0F8B,0 //Output_bit(PLCD_FIFO_RES,0);//PIN_C0 сброс FIFO в "0" BSF 0x0F8B,0 //Output_bit(PLCD_FIFO_RES,1);//PIN_C0 и разрешение на считывание BSF 0x0F8B,1 //Output_bit(READ_FIFO_B,1);//PIN_C1 запрет канала B #endasm for(x=0;x<255;x++){ #asm BCF 0x0F8B,2//LATC2=0; #endasm Buf[x]=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1; #endasm } for(x=0;x<255;x++){ Buf_FFT[x]=SWAP(Buf[x]);// } for(x=0;x<255;x++){ yy=y; y = Buf_FFT[x];// y = (y > 200) ? 200 : y; //ограничитель до выбранной величины if (yy>y) front(x,yy,y);// Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину } }
--------------------
|
|
|
|
|
Apr 8 2008, 07:56
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 8 2008, 15:42)  ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать Непонял, это вообще что такое вы написали???? Заместо этого: Код Buf_FFT[x]=SWAP(Buf[x]);// Надо Код Buf_FFT[x]=Buf[x]; А где само преобразование фурье-то? П.С. Для стабильности показаний, конечно же лучше буффер тоже синхронизировать
|
|
|
|
|
Apr 8 2008, 08:13
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 8 2008, 16:03)  вообще я думал, что это оно и есть  Вот же оно: four2(double data[] , int nn, int isign ) Вы сами же его и привели
|
|
|
|
|
Apr 8 2008, 08:26
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 8 2008, 16:17)  и куды его втыкать? я точно свихнусь с этим аппаратом  После того, как заполните массив Buf_FFT[] вызываете функцию: four2(Buf_FFT,512,1)Извиняюсь, надо так: Код four2(Buf_FFT,128,1) Потом надо будет еще кое чего подшаманить чтобы получить настоящий спектр... я помоему как -то ссылку уже давал....
|
|
|
|
|
Apr 8 2008, 08:36
|

Знающий
   
Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143

|
сделал так, только он теперь рисует точно такую же картинку как просто осциллограф. Код for(x=0;x<255;x++){ #asm BCF 0x0F8B,2//LATC2=0; #endasm Buf[x]=255 - input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1; #endasm } for(x=0;x<255;x++){ Buf_FFT[x]=Buf[x];// } four2(Buf_FFT[x],512,1); for(x=0;x<255;x++){ yy=y; y = Buf_FFT[x] + y_pos;// y = (y > 200) ? 200 : y; //ограничитель до выбранной величины if (yy>y) front(x,yy,y);// Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину } }
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|