реклама на сайте
подробности

 
 
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
andreichk
сообщение Jan 25 2008, 21:00
Сообщение #1


Знающий
****

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



Привет народ.Вот решил я слепить себе нечто из указанных в теме компонентов.Нарисовал и изготовил макетку, красиво всё распаял и написал из надёрганных в сети кусков маленькую програмку для управления ЖКИ. Вначале, после нудного изучения даташитов никак не мог инициализировать ЖКИ, но потом разобрался что к чему и наконец он начал подавать признаки жизни и засветился.
Компилятор, который я пользую - CCS, имеет в своём составе файл SED1335.C , но как я не пытался приспособить его, так и не смог.Порывшись в сети,я нашёл другой файл с таким же названием, но вроде бы не для ПИКов, а для чего-то другого.Однако , слегка подшаманив его, я смог встроить его в прогу и он заставил таки выдавать на экран символы в текстовом режиме(даже с возможностью размещения в заданое место) и переключаться в графический режим.
И на этом всё и закончилось.
Все попытки нарисовать линию или круг или просто точку,несмотря на множество примеров, я так и не смог. Позаимствовав из старого файла процедуру

void glcd_pixel(int16 x, int16 y, int1 color)
{
int8 data;
int16 addr;
// Calculate the byte address containing the pixel
addr = GLCD_GRAPHICS_ADDR + (GLCD_WIDTH/8 * y + x/8);
// Read the byte of data at the address
data = getData(addr);
// Turn the pixel on or off
if(color == ON)
bit_set(data, 7 - x%8);
else
bit_clear(data, 7 - x%8);
// Write the new data byte to display memory
setData(addr, data);
}


я попробовал нарисовать на экране пиксель, но он вроде как нарисовался но разместился не в тех координатах, которые я указывал.Как я понимаю, за размещение отвечает строка
//GLCD_GRAPHICS_ADDR- нач. адрес- 1200, GLCD_WIDTH- кол во символов в строке- 320
addr = GLCD_GRAPHICS_ADDR + (GLCD_WIDTH/8 * y + x/8);
Может кто из вас раскомментирует эту странную формулу и подправит её, если она неправильная.

Сообщение отредактировал andreichk - Jan 25 2008, 21:03


--------------------
Go to the top of the page
 
+Quote Post
30 страниц V  « < 7 8 9 10 11 > »   
Start new topic
Ответов (120 - 134)
andreichk
сообщение Apr 5 2008, 10:31
Сообщение #121


Знающий
****

Группа: Свой
Сообщений: 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
//#################################################


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 5 2008, 10:39
Сообщение #122


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



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


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


wink.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 5 2008, 10:52
Сообщение #123


Знающий
****

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



Ок,исправил как велел сенсей maniac.gif twak.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 5 2008, 11:22
Сообщение #124


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 5 2008, 18:52) *
Ок,исправил как велел сенсей maniac.gif twak.gif

lol.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 7 2008, 21:42
Сообщение #125


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 8 2008, 06:44
Сообщение #126


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 8 2008, 05:42) *
Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил.


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

(наверное все double в процедуре следует исправить на float)
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 8 2008, 07:13
Сообщение #127


Знающий
****

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



буфер сделал и он влез(даже ещё 30% RАМ осталось).
теперь что с ним делать?
И ещё вопрос имею, что это и как им пользоваться?
Код
#define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 8 2008, 07:37
Сообщение #128


Частый гость
**

Группа: Свой
Сообщений: 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 элемента. Сделан чисто для лучшей читаемости кода
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 8 2008, 07:42
Сообщение #129


Знающий
****

Группа: Свой
Сообщений: 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);           // Рисуем вершину
        
                }    
}


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 8 2008, 07:56
Сообщение #130


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 8 2008, 15:42) *
ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать

Непонял, это вообще что такое вы написали????
Заместо этого:
Код
Buf_FFT[x]=SWAP(Buf[x]);//
Надо
Код
Buf_FFT[x]=Buf[x];


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

П.С. Для стабильности показаний, конечно же лучше буффер тоже синхронизировать
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 8 2008, 08:03
Сообщение #131


Знающий
****

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



Цитата
Buf_FFT[x]=SWAP(Buf[x]);//

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

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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 8 2008, 08:13
Сообщение #132


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 8 2008, 16:03) *
вообще я думал, что это оно и есть 07.gif

Вот же оно:

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

Вы сами же его и привели wacko.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 8 2008, 08:17
Сообщение #133


Знающий
****

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



и куды его втыкать? wacko.gif
я точно свихнусь с этим аппаратом 07.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 8 2008, 08:26
Сообщение #134


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 8 2008, 16:17) *
и куды его втыкать? wacko.gif
я точно свихнусь с этим аппаратом 07.gif

После того, как заполните массив Buf_FFT[]
вызываете функцию:
four2(Buf_FFT,512,1)

Извиняюсь, надо так:
Код
four2(Buf_FFT,128,1)


Потом надо будет еще кое чего подшаманить чтобы получить настоящий спектр... я помоему как -то ссылку уже давал....
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 8 2008, 08:36
Сообщение #135


Знающий
****

Группа: Свой
Сообщений: 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);           // Рисуем вершину
        
                }    
}


--------------------
Go to the top of the page
 
+Quote Post

30 страниц V  « < 7 8 9 10 11 > » 
Closed TopicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01521 секунд с 7
ELECTRONIX ©2004-2016