|
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
--------------------
|
|
|
|
|
 |
Ответов
(60 - 74)
|
Mar 22 2008, 14:31
|

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

|
Цитата(Илья @ Mar 22 2008, 14:53)  Я сам лично никогда не задавался вопросом рисования пунктирных линий, щас подумал - алгоритм мне представился довольно простым, если есть желание - выкладывайте вашу процедуру для обычных линий, видоизменим под пунктир...  Да, картинка красивая... единственно не понятен смысл значка в правом нижнем углу... на нем что вообще нарисовано? (похоже на ворону на камне  ) ворона на камне  да ето же бонсай, для души Цитата void line(int16 x1, int16 y1, int16 x2, int16 y2, int1 color)
{ int16 dy, dx; signed int8 addx=1, addy=1; signed int16 P, diff;
int16 i=0; dx = abs((signed int16)(x2 - x1)); dy = abs((signed int16)(y2 - y1));
if(x1 > x2) addx = -1; if(y1 > y2) addy = -1;
if(dx >= dy) { dy *= 2; P = dy - dx; diff = P - dx;
for(; i<=dx; ++i) { pixel(x1, y1, color);
if(P < 0) { P += dy; x1 += addx; } else { P += diff; x1 += addx; y1 += addy; } } } else { dx *= 2; P = dx - dy; diff = P - dy;
for(; i<=dy; ++i) { pixel(x1, y1, color);
if(P < 0) { P += dx; y1 += addy; } else { P += diff; x1 += addx; y1 += addy; } } } }//--------------------------OK //####################################################
Сообщение отредактировал andreichk - Mar 22 2008, 14:36
--------------------
|
|
|
|
|
Mar 22 2008, 18:27
|

Группа: Новичок
Сообщений: 13
Регистрация: 18-03-08
Из: Рига
Пользователь №: 36 001

|
Посмотрел с интересом, спасибо! Через время.. чувствую, придётся мне делать нечто подобное, вот я тогда за вами побегаю..  Сейчас появляются всевозможные матрицы по ценам до 50 долларов, так что многие задачи для хобби и для работы становятся оправданными.
|
|
|
|
|
Mar 22 2008, 20:23
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 8-02-07
Пользователь №: 25 165

|
to andreichk. Добрый день. Уменя вопрос по схемотехнике. Чем вы подсветку питали? У вас ведь CCFL подсветка?
|
|
|
|
|
Mar 23 2008, 04:32
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Вот, собственно, у меня получилась такая процедурка: Код /* входные параметры: color - с чего начинать (1- с пунктира, 0 -с промежутка) Len1 - длина пунктира (в пикселах) Len0 - длина промежутка (в пикселах) */ void pline(int16 x1, int16 y1, int16 x2, int16 y2, int1 color, int8 Len1, in8 Len0){ int16 dy, dx; signed int8 addx=1, addy=1; signed int16 P, diff; int16 i=0; int8 count=0;
dx = abs((signed int16)(x2 - x1)); dy = abs((signed int16)(y2 - y1)); if(x1 > x2) addx = -1; if(y1 > y2) addy = -1; if(dx >= dy){ dy *= 2; P = dy - dx; diff = P - dx; for(; i<=dx; ++i){ pixel(x1, y1, color); if(color){ if (++count>=Len1) {count=0;color=0;} }else{ if (++count>=Len0) {count=0;color=1;} } if(P < 0){ P += dy; x1 += addx; }else{ P += diff; x1 += addx; y1 += addy; } } }else{ dx *= 2; P = dx - dy; diff = P - dy; for(; i<=dy; ++i){ pixel(x1, y1, color); if(color){ if (++count>=Len1) {count=0;color=0;} }else{ if (++count>=Len0) {count=0;color=1;} } if(P < 0){ P += dx; y1 += addy; }else{ P += diff; x1 += addx; y1 += addy; } } } } В принципе переменную count можно тоже вынести в список входных параметров - и задавать ему начальное значение, тогда можно будет начинать , например, с середины пунктира
|
|
|
|
|
Mar 23 2008, 13:41
|

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

|
Цитата(Шпиндель @ Mar 22 2008, 19:27)  Посмотрел с интересом, спасибо! Через время.. чувствую, придётся мне делать нечто подобное, вот я тогда за вами побегаю..  Сейчас появляются всевозможные матрицы по ценам до 50 долларов, так что многие задачи для хобби и для работы становятся оправданными. ну побегайте Цитата(alexsl @ Mar 22 2008, 21:23)  to andreichk. Добрый день. Уменя вопрос по схемотехнике. Чем вы подсветку питали? У вас ведь CCFL подсветка? http://www.bue.de/tabdata/datasheet/ds_en_inv-l10a.pdfОк, штрихпунктир прорисовывается без косяков,отличная работа Илья.Только теперь я с ужасом представляю себе, что вызов этой процедуры для прорисовки всей сетки нужно будет сделать более 160ти раз, причём с разным шагом и координатами.Стоит ли овчинка выделки?
Сообщение отредактировал andreichk - Mar 23 2008, 13:17
--------------------
|
|
|
|
|
Mar 23 2008, 14:59
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 23 2008, 21:41)  Ок, штрихпунктир прорисовывается без косяков,отличная работа Илья.Только теперь я с ужасом представляю себе, что вызов этой процедуры для прорисовки всей сетки нужно будет сделать более 160ти раз, причём с разным шагом и координатами.Стоит ли овчинка выделки? Что-то вы сильнор преувеличиваете  Помоему код будет вполне компактным. Я так понимаю, координата (0,0) у вас в верхнем левом углу. Сообщите координату правой нижней точки окна в котором выводиться сигнал.
|
|
|
|
|
Mar 24 2008, 05:52
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 23 2008, 23:13)  X-256, Y-239 Решил сделать универсальную процедуру рисования сетки: Код /* Процедура рисует сетку координаты лев. верхнего угла (0,0) координаты прав. нижнего угла (x,y) step - шаг сетки в пикселах len - длина половинных меток в пикселах */ void setka(int16 x,int16 y,int8 step,int8 len){ int8 xm=x/2,ym=y/2; BYTE ds=0, //Приращение для сетки ds2=step/2; //Приращение для половинных меток // Рисуем сетку и половинные метки while((ds<xm)||(ds<ym)||(ds2<xm)||(ds2<ym)){// пока не вышли за пределы квдрата if(ds<ym){// Горизонтальные линии pline(0,ym+ds,x,ym+ds,0,1,1); pline(0,ym-ds,x,ym-ds,0,1,1); } if(ds<xm){// Вертикальные линии pline(xm+ds,0,xm+ds,y,1,1,1); pline(xm-ds,0,xm-ds,y,1,1,1); } if(ds2<xm){ line(xm+ds2,0,xm+ds2,len,1); line(xm+ds2,ym-len,xm+ds2,ym+len,1); line(xm+ds2,y,xm+ds2,y-len,1); line(xm-ds2,0,xm-ds2,len,1); line(xm-ds2,ym-len,xm-ds2,ym+len,1); line(xm-ds2,y,xm-ds2,y-len,1); } if(ds2<ym){ line(0,ym+ds2,len,ym+ds2,1); line(xm-len,ym+ds2,xm+len,ym+ds2,1); line(x,ym+ds2,x-len,ym+ds2,1); line(0,ym-ds2,len,ym-ds2,1); line(xm-len,ym-ds2,xm+len,ym-ds2,1); line(x,ym-ds2,x-len,ym-ds2,1); } ds+=step; ds2+=step; } // Границы сетки line(0,0,0,y,1); line(0,0,x,0,1); line(0,y,x,y,1); line(x,0,x,y,1); } Для вашего случая нужно вызывать со следующими параметрами: Код setka(256,239,30,2); П.С. функция line втречается всего 20 раз  скомпилированная процедура будет занимать явно меньше 1kB, так что 9kB вы точно сэкономите
|
|
|
|
|
Mar 24 2008, 12:24
|

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

|
c небольшой доработкой,приданием ей ещё бОльшей универсальности и дополнительными вызовами процедура отрисовала сетку и сэкономила 22% памяти ПИКа Вызовы процедур, отрисовки сетки(рамки и пр.) Цитата pline(8,1,250,1,1,1,14);//штрих-пунктирная линия setka(256,239,30,2,2);//сетка pline(8,119,250,119,1,1,14);//штрих-пунктирная линия Line_(8,120,247,120,1 );//центральная горизонтальная линия pline(8, 121, 256,121,1, 1,14);//штрих-пунктирная линия pline(8,238,250,238,1,1,14);//штрих-пунктирная линия pline(127,0,127,239,1,1,14);//средняя штрих-пунктирная линия Line_(128,2,128,237,1 );//центральная вертикальная линия pline(129,0,129,239,1,1,14);//средняя штрих-пунктирная линия pline(1,0,1,238,1,1,14);//левая штрих-пунктирная линия pline(255,0,255,238,1,1,14);//правая штрих-пунктирная линия rect(0, 0, 256, 239, 0,1);//рамка Цитата /* Процедура рисует сетку координаты лев. верхнего угла (0,0) координаты прав. нижнего угла (x,y) step - шаг сетки в пикселах len - длина половинных меток в пикселах len0 - длина половинных пустых меток в пикселах */ char ds2; void setka(int16 x,int16 y,int8 step,int8 len,int8 len0){ int8 xm,ym; char ds; ds=0; //Приращение для сетки ds2=step/2; //Приращение для половинных меток xm=x/2;ym=(y/2) + 1; // Рисуем сетку и половинные метки while((ds<xm)||(ds<ym)||(ds2<xm)||(ds2<ym)){// пока не вышли за пределы квдрата if(ds<ym){// Горизонтальные линии pline(0,ym+ds,x,ym+ds,0,1,len0); pline(0,ym-ds,x,ym-ds,0,1,len0); } if(ds<xm){// Вертикальные линии pline(xm+ds,0,xm+ds,y,1,1,len0); pline(xm-ds,0,xm-ds,y,1,1,len0); } if(ds2<xm){ line(xm+ds2,0,xm+ds2,len,len0); line(xm+ds2,ym-len,xm+ds2,ym+len,len0); line(xm+ds2,y,xm+ds2,y-len,len0); line(xm-ds2,0,xm-ds2,len,len0); line(xm-ds2,ym-len,xm-ds2,ym+len,len0); line(xm-ds2,y,xm-ds2,y-len,len0); } if(ds2<ym){ line(0,ym+ds2,len,ym+ds2,len0); line(xm-len,ym+ds2,xm+len,ym+ds2,len0); line(x,ym+ds2,x-len,ym+ds2,len0); line(0,ym-ds2,len,ym-ds2,len0); line(xm-len,ym-ds2,xm+len,ym-ds2,len0); line(x,ym-ds2,x-len,ym-ds2,len0); } ds+=step; ds2+=step; } // Границы сетки line(0,0,0,y,len0); line(0,0,x,0,len0); line(0,y,x,y,len0); line(x,0,x,y,len0); }//-------------------------- //##################################################################### Найдите отличия( когда я говорил о 160ти вызовах, я имел ввиду именно это) На форму сигналов и правую часть не обращайте внимания
Сообщение отредактировал andreichk - Mar 24 2008, 13:11
--------------------
|
|
|
|
|
Mar 24 2008, 14:33
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 24 2008, 20:24)  c небольшой доработкой,приданием ей ещё бОльшей универсальности и дополнительными вызовами процедура отрисовала сетку и сэкономила 22% памяти ПИКа.
Найдите отличия Ну что же, поздравляю! Новая картинка мне даже нравиться больше  Высвободившуюся память можно заюзать под какую-нибудь цифровую обработку сигналов (как вы и говорили, например FFT)
|
|
|
|
|
Mar 24 2008, 17:05
|

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

|
а скажите мне, преобразование Фурье к осциллографу имеет применение? нашёл вот в сети какой-то страшенный код.Скажите, это оно? И что с ним делать? Цитата /************************************************************************* Быстрое преобразование Фурье
Алгоритм проводит быстрое преобразование Фурье комплексной функции, заданной nn отсчетами на действительной оси.
В зависимости от переданных параметров, может выполняться как прямое, так и обратное преобразование.
Входные параметры: nn - Число значений функции. Должно быть степенью двойки. Алгоритм не проверяет правильность переданного значения. a - array [0 .. 2*nn-1] of Real Значения функции. I-ому значению соответствуют элементы a[2*I] (вещественная часть) и a[2*I+1] (мнимая часть). InverseFFT - направление преобразования. True, если обратное, False, если прямое. Выходные параметры: a - результат преобразования. Подробнее см. описание на сайте. *************************************************************************/ void fastfouriertransform(char *a,int nn,char inversefft) { int ii = 0; int jj = 0; int n = 0; int mmax = 0; int m = 0; int j = 0; int istep = 0; int i = 0; int isign = 0; double wtemp = 0; double wr = 0; double wpr = 0; double wpi = 0; double wi = 0; double theta = 0; double tempr = 0; double tempi = 0;
if( inversefft ) { isign = -1; } else { isign = 1; } n = 2*nn; j = 1; for(ii=1; ii<=nn; ii++) { i = 2*ii-1; if( j>i ) { tempr = a[j-1]; tempi = a[j]; a[j-1] = a[i-1]; a[j] = a[i]; a[i-1] = tempr; a[i] = tempi; } m = n/2; while( m>=2 & j>m ) { j = j-m; m = m/2; } j = j+m; } mmax = 2; while( n>mmax ) { istep = 2*mmax; theta = 2*PI/(isign*mmax); wpr = -(2.0*sqrt(Sin(0.5*theta))); wpi = Sin(theta); wr = 1.0; wi = 0.0; for(ii=1; ii<=mmax/2; ii++) { m = 2*ii-1; for(jj=0; jj<=(n-m)/istep; jj++) { i = m+jj*istep; j = i+mmax; tempr = wr*a[j-1]-wi*a[j]; tempi = wr*a[j]+wi*a[j-1]; a[j-1] = a[i-1]-tempr; a[j] = a[i]-tempi; a[i-1] = a[i-1]+tempr; a[i] = a[i]+tempi; } wtemp = wr; wr = wr*wpr-wi*wpi+wr; wi = wi*wpr+wtemp*wpi+wi; } mmax = istep; } if( inversefft ) { for(i=1; i<=2*nn; i++) { a[i-1] = a[i-1]/nn; } } }
Сообщение отредактировал andreichk - Mar 24 2008, 17:37
--------------------
|
|
|
|
|
Mar 25 2008, 05:58
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 25 2008, 01:05)  а скажите мне, преобразование Фурье к осциллографу имеет применение? Если хотите строить спектр сигнала, то без FFT не обойтись  Цитата нашёл вот в сети какой-то страшенный код.Скажите, это оно? И что с ним делать? Вполне похоже. но только этот алгоритм для комплексной функции. А ваш сигнал - действительная величина. Следовательно вам нужно вот это: http://alglib.sources.ru/fft/realfft.phpТам же написано что получится на выходе. Цитата искал что-нибудь по теме почитать- наткнулся на это.Тут на форуме комната смеха есть? http://ru.fileaward.com/oscillometer_spectrum_analyzer.htmМда..... 400 у.е. за такую хрень.... интересно, а как этот чувак получает динамический диапазон в 190 дБ на звуковой плате компьютера????
|
|
|
|
|
Mar 26 2008, 02:34
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 26 2008, 01:09)  Что это , разогрев микросхем или Барабашка у меня завёлся?  Сложно что-либо сказать, не зная как у вас вообще все это устроенно.... У вас переключается частота оцифровки сигнала? Каким образом? Что означают 2 цифры uSec/div (из названия смысл понятен, но почему тогда они разные... или это просто для 2х каналов? ) Тогда, судя по этим цифрам (сравнивая с предыдущей) на экран должен укладываться ровно 1 период меандра (0.8 против 0.4 uSec/div). А ваша картинка больше похожа на уменьшенную частоту оцифровки (картинка мелькала, или стояла на месте?) Если же это результат потери синхронизации, может у вас триггер синхронизации был выставлен не правильно?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|