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

 
 
30 страниц V  « < 2 3 4 5 6 > »   
Closed TopicStart new topic
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
andreichk
сообщение Mar 16 2008, 20:14
Сообщение #46


Знающий
****

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



вот такой вид приняла означенная процедура опроса кнопок.теперь все кнопки вызывают правильные команды и выдаютправильные значения на ЖКИ
Цитата
//######################################################################
//Непосредственно обработчик прерываний

#int_timer0
void timer0_isr(void){
set_timer0(0); // TMR0IF=0;// Очистим флаг прерывания
//...... Этими кнопками изменяем показания SEC/DIV Канал А ....
if (input(OUT_A_UP))
{
while(input(OUT_A_UP));XX++;
}
else if (input(OUT_A_DOWN))
{
while(input(OUT_A_DOWN));XX--;
}
if(XX>8) XX=1;
if(XX<1) XX=8; //ограничиваем ХХ от 1 до 8
//.................Другие кнопки........................
key=0;
if (!input(TASTE_EN)) return ;//если кнопка не нажата - уходим
while(input(TASTE_EN));
while(!input(TASTE_EN));//а также ждем начало следующей передачи
while(input(TASTE_EN))//пока активно RA5
{
while(!input(Code_Out))//ждём фронт
{
if (!input(TASTE_EN)) break;//проверяем: если передача закончилась то выходим
}
if (!input(TASTE_EN)) break;//проверяем: если передача закончилась то выходим
while(input(Code_Out));//ждём спад
key++;
}
} //--------------------------OK
//######################################################################

Спасибо за оказанную помощь .
Илье особый a14.gif и уважуха beer.gif

Сообщение отредактировал andreichk - Mar 16 2008, 20:16


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 19 2008, 20:46
Сообщение #47


Знающий
****

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



Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать.
Решил пока привести пример написания процедуры рисования кривой на экране.Покритикуйте плиз, может что-нить улучшить можно.


Цитата
//############### Рисуем фронт #################################
void front(unsigned int8 x,unsigned int8 y_anf,unsigned int8 y_end)
{unsigned int8 y;
for (y = y_anf ; y > y_end; y--)
{
pixel(x,y,1);
}
} //--------------------------OK
//################ Рисуем спад #####################################

void spad(unsigned int8 x,unsigned int8 y_anf,unsigned int8 y_end)
{unsigned int8 y;
for ( y = y_anf ; y < y_end ; y++ )
{
pixel(x,y,1);
}
} //--------------------------OK
//#####################################################################

void pix_A(unsigned int8 y_pos_A) // рисуем кривую, типа синусоиды и пр.
{unsigned int8 x, y , yy ;//
unsigned int16 xx;
Output_bit(PLCD_FIFO_RES ,0); //PIN_C0// сброс FIFO в "0"
Output_bit(PLCD_FIFO_RES ,1); //PIN_C0// и разрешение на считывание
Output_bit(READ_FIFO_B ,1); //PIN_C1 запрет канала B
// слабая попытка синхронизации
do{ Output_bit(READ_FIFO_A ,0);//PIN_C2
adcA=input_b();
Output_bit(READ_FIFO_A ,1);//PIN_C2
}while( adcA == 0);
do{ // ещё одна попытка синхронизации
Output_bit(READ_FIFO_A ,0);//PIN_C2
adcA=input_b();
Output_bit(READ_FIFO_A ,1); //PIN_C2
}while(input_b()== adcA ); //уже лучше,но всё равно плохо
//--------------- предварительная запись в буфер ---------------------

for(xx=0;xx<1024;xx++){ // канал A
Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
adcA=input_b(); //чтение порта В
adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
adcA = 255 - adcA; // разворот на 180° по вертикали
Buff_[xx] = adcA; //записываемся в буфер
Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
} xx=0;
switch(syncA){ //синхронизация буфера по фронту или по спаду
case 1 :while( Buff_[xx++] > sync_volume_A);break; //по фронту
case 2 :while( Buff_[xx++] <= sync_volume_A+115);break; //по спаду
}
//значительно лучше в совокупности с двумя предыдущими

if( xx >= 255 ) xx = xx - 255; //приводим к int8
//--------------- собственно кривая ---------------------------
for(x=1;x<255;x++){
yy = y;
y = Buff_[xx++] + y_pos_A;
if (yy>y) front(x,yy,y); // Рисуем фронт A
if (yy<y) spad(x,yy,y); // Рисуем спад A
adcA=y-y_pos_A;
pixel(x,y,1); // Рисуем вершину A
}
} //--------------------------OK
//####################################################################


Сообщение отредактировал andreichk - Mar 19 2008, 20:57


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 20 2008, 03:56
Сообщение #48


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

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



Цитата(andreichk @ Mar 20 2008, 04:46) *
Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать.
Решил пока привести пример написания процедуры рисования кривой на экране.Покритикуйте плиз, может что-нить улучшить можно.


Что касаемо улучшения - то в первую очередь нужно оптимизировать самые "тормозные места" - и в первую очередь это циклы.

Я бы процедуру отрисовки переписал иначе:
Код
void pix_A(unsigned int8 y_pos_A) // рисуем кривую, типа синусоиды и пр.
{  unsigned int8 x, y , yy;
   Output_bit(PLCD_FIFO_RES ,0); //PIN_C0// сброс FIFO в "0"
   Output_bit(PLCD_FIFO_RES ,1); //PIN_C0// и разрешение на считывание
   Output_bit(READ_FIFO_B ,1); //PIN_C1 запрет канала B
   // слабая попытка синхронизации
   do{ Output_bit(READ_FIFO_A ,0);//PIN_C2
      adcA=input_b();
      Output_bit(READ_FIFO_A ,1);//PIN_C2
   }while( adcA == 0);
   do{ // ещё одна попытка синхронизации
      Output_bit(READ_FIFO_A ,0);//PIN_C2
      adcA=input_b();
      Output_bit(READ_FIFO_A ,1); //PIN_C2
   }while(input_b()== adcA ); //уже лучше,но всё равно плохо
   //-------------------- синхронизация ---------------------------
   while(1){
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      adcA=input_b(); //чтение порта В
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
      adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
      adcA = 255 - adcA; // разворот на 180° по вертикали
      if (syncA==1){
         if(adcA>sync_volume_A) continue;
         else break;
      }else if (syncA==2){
         if(adcA<=sync_volume_A+115) continue;
         else break;
      }
    }
   //--------------- собственно кривая ---------------------------
   for(x=1;x<255;x++){
      yy = y;
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      adcA=input_b(); //чтение порта В
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
      adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
      y = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг
      if (yy>y) front(x,yy,y); // Рисуем фронт A
      if (yy<y) spad(x,yy,y); // Рисуем спад A
      pixel(x,y,1); // Рисуем вершину A
   }
}


В итоге мы избавились от лишнего цикла. А также освободили 1Кб RAM

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

В частности мне совсем непонятна строка:
Код
if( xx >= 255 ) xx = xx - 255; //приводим к int8

Перед этой строчкой в xx лежит индекс в буфере указывающий на место синхронизации (пересечение sync_volume_A в нужном направлении). Если я правильно понял нужно просто отрисоваь буфер с этого места на экране. Это и произойдет, если xx<255. А в противном случае вы отнимете 255 и точка синхронизации окажется в конце отрисовки... Не получиться ли у вас, что картинка начнет скакать?

Сообщение отредактировал Илья - Mar 20 2008, 04:02
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 20 2008, 18:36
Сообщение #49


Знающий
****

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



if( xx >= 255 ) xx = xx - 255; //приводим к int8

тут , как я себе представляю, смысл в том, чтобы хх укладывалось в интервал от 0 до 255, так как сам буфер в 4 раза больше. хх- это координата точки и поскольку момент захвата синхронизации может наступить за пределами этого диапазона, то эта конструкция всё равно установит этот момент в начало.
потому что в цикле начала отрисовки for(x=1;x<255;x++){
лежит другая переменная.

ЗЫ.попробовал ваш код- он работает, но если нет сигнала, то на экране не прорисовывается прямая, как в обычном осциллографе.Как-то не привычно, создаётся впечатление, что что-то не работает.

Сообщение отредактировал andreichk - Mar 20 2008, 19:05


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 20 2008, 19:53
Сообщение #50


Знающий
****

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



кстати вопрос имею- чем два раза IF лучше одного SWITCH?
это я про синхронизацию


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 21 2008, 03:07
Сообщение #51


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

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



Цитата
if( xx >= 255 ) xx = xx - 255; //приводим к int8
тут , как я себе представляю, смысл в том, чтобы хх укладывалось в интервал от 0 до 255, так как сам буфер в 4 раза больше. хх- это координата точки и поскольку момент захвата синхронизации может наступить за пределами этого диапазона, то эта конструкция всё равно установит этот момент в начало.
потому что в цикле начала отрисовки for(x=1;x<255;x++){
лежит другая переменная.

Хоть убейте не догоняю хода вашей мысли.... Зачем xx укладываться от 0 до 255? она же int16, да и буффер размером 1024 байта... Если мы нашли точку синхронизации - надо от нее и рисовать, зачем же ее изменять???

Ну ладно допустим вы хотите чтобы xx лежал от 0 до 255, то все равно ваша конструкция ошибочна: ведь если xx будет больше 512 или 768 то отняв 256 вы не получите требуемого диапазона!

Цитата(andreichk @ Mar 21 2008, 03:53) *
кстати вопрос имею- чем два раза IF лучше одного SWITCH?
это я про синхронизацию

В данном случае разницы нет, но я специально так написал, чтобы затем предложить вам переобозначить значение переменной типа синхронизации (syncA), пусть
SyncA=1 синхронизация по фронту
SyncA=0 синхронизация по спаду

тогда проверку можно будет переписать так:
Код
      if (syncA){
         if(adcA>sync_volume_A) continue;
         else break;
      }else{
         if(adcA<=sync_volume_A+115) continue;
         else break;
      }

А это уже экономия на одной лишней проверке. если учесть что эта операция выполняется на каждой итерации цилкла - получится приличное чилсло тактов процессора.

Цитата
ЗЫ.попробовал ваш код- он работает, но если нет сигнала, то на экране не прорисовывается прямая, как в обычном осциллографе.Как-то не привычно, создаётся впечатление, что что-то не работает.

А в вашем коде она прорисовывалась?

Предлагаю сделать так: Завести переменную, котороая будет зануляться перед каждой попыткой синхронизации, и затем инкрементироваться в цикле. А при превышении n-го количества попыток, тупо отрисовывала текущий сигнал и выходила из цикла.

Следовательно код будет такой:

Код
//!!!SyncA=1  синхронизация по фронту!!!
//!!!SyncA=0  синхронизация по спаду!!!

void curve_A(unsigned int8 y_pos_A); //добавить функцию в прототипы

#define TIMEOUT             10000

void pix_A(unsigned int8 y_pos_A) // рисуем кривую, типа синусоиды и пр.
{  unsigned int16 n=0;
   Output_bit(PLCD_FIFO_RES ,0); //PIN_C0// сброс FIFO в "0"
   Output_bit(PLCD_FIFO_RES ,1); //PIN_C0// и разрешение на считывание
   Output_bit(READ_FIFO_B ,1); //PIN_C1 запрет канала B
   // слабая попытка синхронизации
   do{ Output_bit(READ_FIFO_A ,0);//PIN_C2
      adcA=input_b();
      Output_bit(READ_FIFO_A ,1);//PIN_C2
      if (n++>TIMEOUT) {curve_A(y_pos_A); return;}
   }while( adcA == 0);
   n=0;
   do{ // ещё одна попытка синхронизации
      Output_bit(READ_FIFO_A ,0);//PIN_C2
      adcA=input_b();
      Output_bit(READ_FIFO_A ,1); //PIN_C2
      if (n++>TIMEOUT) {curve_A(y_pos_A); return;}
   }while(input_b()== adcA ); //уже лучше,но всё равно плохо
   //-------------------- синхронизация ---------------------------
   n=0;
   while(1){
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      adcA=input_b(); //чтение порта В
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
      adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
      adcA = 255 - adcA; // разворот на 180° по вертикали
      if (n++>TIMEOUT) {curve_A(y_pos_A); return;}
      if (syncA){
         if(adcA>sync_volume_A) continue;
         else break;
      }else{
         if(adcA<=sync_volume_A+115) continue;
         else break;
      }
    }
    curve_A(y_pos_A);
}

//--------------- собственно кривая ---------------------------
void curve_A(unsigned int8 y_pos_A){
   unsigned int8 x, y , yy;
   for(x=1;x<255;x++){
      yy = y;
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      adcA=input_b(); //чтение порта В
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
      adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
      y = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг
      if (yy>y) front(x,yy,y); // Рисуем фронт A
      if (yy<y) spad(x,yy,y); // Рисуем спад A
      pixel(x,y,1); // Рисуем вершину A
   }
}


значение TIMEOUT нужно определить опытным путем (я написал для примера) а можно и завести и глобальную переменную под это дело - дабы динамически изменять во время работы

Сообщение отредактировал Илья - Mar 21 2008, 03:09
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 21 2008, 11:25
Сообщение #52


Знающий
****

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



вначале буфер был размером в 512 кб и всё как раз там укладывалось,а сделано это было для того, чтобы момент синхронизации попадал в диапазон от 0 до 255, если он наступал за его пределом(экран-то размером 255 пикс. по горизонтали).Это потом я увеличил буфер(сам не знаю зачем)

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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 21 2008, 12:23
Сообщение #53


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

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



Цитата(andreichk @ Mar 21 2008, 19:25) *
ОК, последний предложенный код работает, синхронизация в норме, при отстутствии сигнала рисуется прямая линия с мелкими шумовыми вкраплениями.Думаю, что этот момент завершён. Спасибо за помощь


Вери Гуд wink.gif

Удаленная отладка - конечно прикольная вещь, но жутко интересно посмотреть как ваше устройство работает в живую... жаль что не увижу sad.gif

Сам всегда мечтал сделать свой осциллограф - поэтому и заинтересовался вашим постом, но никто не предлагает такой задачи... а заниматься этим от нечего делать - нету времени sad.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 21 2008, 13:55
Сообщение #54


Знающий
****

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



не вопрос- научусь в Гугль видео выкладывать- обязательно сделаю, так что увидите. Тут есть ещё чего поотлаживать, напр. запихнуть сетку в ЕЕПРОМ и при включении рисовать её на экран оттуда.Можно будет ещё 10кб меса сэкономить.Есть желание дальше копаться?
В перспективе можно будет ещё спектроанализатор поизобретать, да мало ли чего......


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 21 2008, 15:50
Сообщение #55


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

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



Цитата(andreichk @ Mar 21 2008, 21:55) *
Тут есть ещё чего поотлаживать, напр. запихнуть сетку в ЕЕПРОМ и при включении рисовать её на экран оттуда.


Непонял, а что сложного в векторном рисовании сетки? (с помощю линий)
Зачем ее по пикселам из памяти считывать?
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 22 2008, 00:59
Сообщение #56


Знающий
****

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



я про такое даже не слышал, поэтому просто нарисовал сетку в бмп-формате, разложил на байты и загрузил в проц.Места она заняла ок.10кб, вот я и подумал, что может её в еепром затолкать?


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 22 2008, 01:58
Сообщение #57


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

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



Цитата(andreichk @ Mar 22 2008, 08:59) *
я про такое даже не слышал, поэтому просто нарисовал сетку в бмп-формате, разложил на байты и загрузил в проц.Места она заняла ок.10кб, вот я и подумал, что может её в еепром затолкать?


Еще раз посмотрел на вашу сетку - в принципе немного попариться и можно нарисовать векторно.
Насколько я понял линии вы рисовать умеете (нет ничего сложного) написать еще алгоритм рисования пунктирных линий с задаваемым шагом пунктира. И все, сетку спокойно можно будет собрать из этих процедур wink.gif

А по поводу иконок - речи нет надо битмапы юзать
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 22 2008, 08:27
Сообщение #58


Знающий
****

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



линии, прямоугольники и кружки рисовать умеем, а штрихпунктиры нет.Даже не представляю себе такие формулы


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 22 2008, 10:32
Сообщение #59


Знающий
****

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



прямоугольник и видеосигнал


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 22 2008, 13:53
Сообщение #60


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

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



Цитата
линии, прямоугольники и кружки рисовать умеем, а штрихпунктиры нет.Даже не представляю себе такие формулы


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

Цитата
прямоугольник и видеосигнал

Да, картинка красивая... единственно не понятен смысл значка в правом нижнем углу... на нем что вообще нарисовано? (похоже на ворону на камне smile.gif )
Go to the top of the page
 
+Quote Post

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

 


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


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