|
SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c |
|
|
|
Jan 25 2008, 21:00
|

Знающий
   
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
 |
Ответов
(120 - 134)
|
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); // Рисуем вершину } }
--------------------
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|