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

SED1335,PIC18F4550 и LCD320x240

Я сам лично никогда не задавался вопросом рисования пунктирных линий, щас подумал - алгоритм мне представился довольно простым, если есть желание - выкладывайте вашу процедуру для обычных линий, видоизменим под пунктир... ;)

Да, картинка красивая... единственно не понятен смысл значка в правом нижнем углу... на нем что вообще нарисовано? (похоже на ворону на камне :) )

 

ворона на камне :lol: да ето же бонсай, для души :beer:

 

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

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


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

Посмотрел с интересом, спасибо! Через время.. чувствую, придётся мне делать нечто подобное, вот я тогда за вами побегаю.. ;)

Сейчас появляются всевозможные матрицы по ценам до 50 долларов, так что многие задачи для хобби и для работы становятся оправданными.

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


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

to andreichk.

Добрый день. Уменя вопрос по схемотехнике. Чем вы подсветку питали? У вас ведь CCFL подсветка?

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


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

Вот, собственно, у меня получилась такая процедурка:

 

/*
входные параметры:
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 можно тоже вынести в список входных параметров - и задавать ему начальное значение, тогда можно будет начинать , например, с середины пунктира ;)

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


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

Посмотрел с интересом, спасибо! Через время.. чувствую, придётся мне делать нечто подобное, вот я тогда за вами побегаю.. ;)

Сейчас появляются всевозможные матрицы по ценам до 50 долларов, так что многие задачи для хобби и для работы становятся оправданными.

ну побегайте

 

to andreichk.

Добрый день. Уменя вопрос по схемотехнике. Чем вы подсветку питали? У вас ведь CCFL подсветка?

http://www.bue.de/tabdata/datasheet/ds_en_inv-l10a.pdf

 

 

Ок, штрихпунктир прорисовывается без косяков,отличная работа Илья.Только теперь я с ужасом представляю себе, что вызов этой процедуры для прорисовки всей сетки нужно будет сделать более 160ти раз, причём с разным шагом и координатами.Стоит ли овчинка выделки?

Изменено пользователем andreichk

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


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

Ок, штрихпунктир прорисовывается без косяков,отличная работа Илья.Только теперь я с ужасом представляю себе, что вызов этой процедуры для прорисовки всей сетки нужно будет сделать более 160ти раз, причём с разным шагом и координатами.Стоит ли овчинка выделки?

Что-то вы сильнор преувеличиваете ;)

Помоему код будет вполне компактным. Я так понимаю, координата (0,0) у вас в верхнем левом углу. Сообщите координату правой нижней точки окна в котором выводиться сигнал.

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


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

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 вы точно сэкономите

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


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

c небольшой доработкой,приданием ей ещё бОльшей универсальности и дополнительными вызовами процедура отрисовала сетку и сэкономила 22% памяти ПИКа :a14:

 

Вызовы процедур, отрисовки сетки(рамки и пр.)

 

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

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


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

c небольшой доработкой,приданием ей ещё бОльшей универсальности и дополнительными вызовами процедура отрисовала сетку и сэкономила 22% памяти ПИКа.

 

Найдите отличия

 

Ну что же, поздравляю! Новая картинка мне даже нравиться больше ;)

 

Высвободившуюся память можно заюзать под какую-нибудь цифровую обработку сигналов (как вы и говорили, например FFT) B)

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


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

а скажите мне, преобразование Фурье к осциллографу имеет применение?

 

нашёл вот в сети какой-то страшенный код.Скажите, это оно? И что с ним делать?

 

/*************************************************************************

Быстрое преобразование Фурье

 

Алгоритм проводит быстрое преобразование Фурье комплексной

функции, заданной 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;

a[i-1] = tempr;

a = 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-tempi;

a[i-1] = a[i-1]+tempr;

a = a+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

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


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

искал что-нибудь по теме почитать- наткнулся на это.Тут на форуме комната смеха есть? :lol:

http://ru.fileaward.com/oscillometer_spectrum_analyzer.html

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


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

а скажите мне, преобразование Фурье к осциллографу имеет применение?

Если хотите строить спектр сигнала, то без FFT не обойтись ;)

 

нашёл вот в сети какой-то страшенный код.Скажите, это оно? И что с ним делать?

Вполне похоже. но только этот алгоритм для комплексной функции. А ваш сигнал - действительная величина. Следовательно вам нужно вот это:

http://alglib.sources.ru/fft/realfft.php

 

Там же написано что получится на выходе.

 

искал что-нибудь по теме почитать- наткнулся на это.Тут на форуме комната смеха есть?

http://ru.fileaward.com/oscillometer_spectrum_analyzer.htm

Мда..... 400 у.е. за такую хрень.... интересно, а как этот чувак получает динамический диапазон в 190 дБ на звуковой плате компьютера???? :(

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


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

Ок , оставим пока товарища Фурье в сторонке покурить и попробуем разобраться в следующей проблеме.Значит так,включаю сегодня осциллограф, а на экране вижу вместо сильно растянутого меандра вот эту жуть. Частота на входе 320 кГц, синронизация по фронту, то есть всё как обычно.Никакие нажатия на кнопки ничего не меняют, но по прошествии минут пяти картинка восстановилась, синхронизировалась и начал нормально срабатывать переключатель развёртки. Что это , разогрев микросхем или Барабашка у меня завёлся? :help:

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


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

Что это , разогрев микросхем или Барабашка у меня завёлся? :help:

Сложно что-либо сказать, не зная как у вас вообще все это устроенно....

У вас переключается частота оцифровки сигнала? Каким образом?

Что означают 2 цифры uSec/div (из названия смысл понятен, но почему тогда они разные... или это просто для 2х каналов? ) Тогда, судя по этим цифрам (сравнивая с предыдущей) на экран должен укладываться ровно 1 период меандра (0.8 против 0.4 uSec/div).

А ваша картинка больше похожа на уменьшенную частоту оцифровки (картинка мелькала, или стояла на месте?)

Если же это результат потери синхронизации, может у вас триггер синхронизации был выставлен не правильно?

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


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

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