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

SED1335,PIC18F4550 и LCD320x240

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

//######################################################################

//Непосредственно обработчик прерываний

#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: и уважуха :beer:

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

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


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

Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать.

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

 

 

//############### Рисуем фронт #################################

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

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


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

Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать.

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

 

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

 

Я бы процедуру отрисовки переписал иначе:

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 и точка синхронизации окажется в конце отрисовки... Не получиться ли у вас, что картинка начнет скакать?

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

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


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

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

 

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

потому что в цикле начала отрисовки for(x=1;x<255;x++){

лежит другая переменная.

 

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

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

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


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

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

это я про синхронизацию

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


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

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 вы не получите требуемого диапазона!

 

кстати вопрос имею- чем два раза 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 нужно определить опытным путем (я написал для примера) а можно и завести и глобальную переменную под это дело - дабы динамически изменять во время работы

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

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


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

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

 

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

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


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

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

 

Вери Гуд ;)

 

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

 

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

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


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

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

В перспективе можно будет ещё спектроанализатор поизобретать, да мало ли чего......

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


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

Тут есть ещё чего поотлаживать, напр. запихнуть сетку в ЕЕПРОМ и при включении рисовать её на экран оттуда.

 

Непонял, а что сложного в векторном рисовании сетки? (с помощю линий)

Зачем ее по пикселам из памяти считывать?

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


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

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

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


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

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

 

Еще раз посмотрел на вашу сетку - в принципе немного попариться и можно нарисовать векторно.

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

 

А по поводу иконок - речи нет надо битмапы юзать

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


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

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

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


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

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

 

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

 

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

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

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


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

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