Перейти к содержанию
    

SED1335,PIC18F4550 и LCD320x240

//--------------- собственно кривая 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
//#################################################

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш подход неправильный. Вы проверяете X и даже не проверяете, посчиталась ли на днный момент частота. Т.е. если частота еще не успела посчитаться (сигнал развернут так, что период длиннее экрана) То на экран выведеться ошибочная частота, равная периоду экрана а не сигнала.

 

 

Если же вы всетаки хотите отдельный if то придется сделать так:

   if((x==255)&&(syncF==2)){// Успешно нашли период
              //Если закончили отрисовку,посчитаем частоту
              frequenz(FclockA/Nn,194, 230);Nn=0;return;
   }

 

;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил.

 

Да оно. Только как видите оно оперирует с числами с плавающей запятой. поэтому вам нужно сделать массив типа float из 256 байт, который будет занимать 1024 байта. - Как раз влезет в ваш проц.

 

(наверное все double в процедуре следует исправить на float)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

буфер сделал и он влез(даже ещё 30% RАМ осталось).

теперь что с ним делать?

И ещё вопрос имею, что это и как им пользоваться?

#define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

буфер сделал и он влез(даже ещё 30% RАМ осталось).

теперь что с ним делать?

Перед преобразованием в него нужно занести 256 значений из FIFO буффера.

 

И ещё вопрос имею, что это и как им пользоваться?

#define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr

Да это просто макрос. Который меняет местами 2 элемента. Сделан чисто для лучшей читаемости кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать

 

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);           // Рисуем вершину
         
                }     
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать

Непонял, это вообще что такое вы написали????

Заместо этого:

 Buf_FFT[x]=SWAP(Buf[x]);//

Надо

Buf_FFT[x]=Buf[x];

 

А где само преобразование фурье-то?

 

П.С. Для стабильности показаний, конечно же лучше буффер тоже синхронизировать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Buf_FFT[x]=SWAP(Buf[x]);//

 

А где само преобразование фурье-то?

вообще я думал, что это оно и есть :07:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вообще я думал, что это оно и есть :07:

Вот же оно:

 

four2(double data[] , int nn, int isign )

 

Вы сами же его и привели :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и куды его втыкать? :wacko:

я точно свихнусь с этим аппаратом :07:

После того, как заполните массив Buf_FFT[]

вызываете функцию:

four2(Buf_FFT,512,1)

 

Извиняюсь, надо так:

four2(Buf_FFT,128,1)

 

Потом надо будет еще кое чего подшаманить чтобы получить настоящий спектр... я помоему как -то ссылку уже давал....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделал так, только он теперь рисует точно такую же картинку как просто осциллограф.

 

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);           // Рисуем вершину
         
                }     
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...