andreichk 0 16 марта, 2008 Опубликовано 16 марта, 2008 (изменено) · Жалоба вот такой вид приняла означенная процедура опроса кнопок.теперь все кнопки вызывают правильные команды и выдаютправильные значения на ЖКИ //###################################################################### //Непосредственно обработчик прерываний #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: Изменено 16 марта, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 19 марта, 2008 Опубликовано 19 марта, 2008 (изменено) · Жалоба Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать. Решил пока привести пример написания процедуры рисования кривой на экране.Покритикуйте плиз, может что-нить улучшить можно. //############### Рисуем фронт ################################# 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 //#################################################################### Изменено 19 марта, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 20 марта, 2008 Опубликовано 20 марта, 2008 (изменено) · Жалоба Чего-то ни одной умной мысли не лезет в голову, наверное пора отпуск брать. Решил пока привести пример написания процедуры рисования кривой на экране.Покритикуйте плиз, может что-нить улучшить можно. Что касаемо улучшения - то в первую очередь нужно оптимизировать самые "тормозные места" - и в первую очередь это циклы. Я бы процедуру отрисовки переписал иначе: 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 и точка синхронизации окажется в конце отрисовки... Не получиться ли у вас, что картинка начнет скакать? Изменено 20 марта, 2008 пользователем Илья Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 20 марта, 2008 Опубликовано 20 марта, 2008 (изменено) · Жалоба if( xx >= 255 ) xx = xx - 255; //приводим к int8 тут , как я себе представляю, смысл в том, чтобы хх укладывалось в интервал от 0 до 255, так как сам буфер в 4 раза больше. хх- это координата точки и поскольку момент захвата синхронизации может наступить за пределами этого диапазона, то эта конструкция всё равно установит этот момент в начало. потому что в цикле начала отрисовки for(x=1;x<255;x++){ лежит другая переменная. ЗЫ.попробовал ваш код- он работает, но если нет сигнала, то на экране не прорисовывается прямая, как в обычном осциллографе.Как-то не привычно, создаётся впечатление, что что-то не работает. Изменено 20 марта, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 20 марта, 2008 Опубликовано 20 марта, 2008 · Жалоба кстати вопрос имею- чем два раза IF лучше одного SWITCH? это я про синхронизацию Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 21 марта, 2008 Опубликовано 21 марта, 2008 (изменено) · Жалоба 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 нужно определить опытным путем (я написал для примера) а можно и завести и глобальную переменную под это дело - дабы динамически изменять во время работы Изменено 21 марта, 2008 пользователем Илья Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба вначале буфер был размером в 512 кб и всё как раз там укладывалось,а сделано это было для того, чтобы момент синхронизации попадал в диапазон от 0 до 255, если он наступал за его пределом(экран-то размером 255 пикс. по горизонтали).Это потом я увеличил буфер(сам не знаю зачем) ОК, последний предложенный код работает, синхронизация в норме, при отстутствии сигнала рисуется прямая линия с мелкими шумовыми вкраплениями.Думаю, что этот момент завершён. Спасибо за помощь Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба ОК, последний предложенный код работает, синхронизация в норме, при отстутствии сигнала рисуется прямая линия с мелкими шумовыми вкраплениями.Думаю, что этот момент завершён. Спасибо за помощь Вери Гуд ;) Удаленная отладка - конечно прикольная вещь, но жутко интересно посмотреть как ваше устройство работает в живую... жаль что не увижу :( Сам всегда мечтал сделать свой осциллограф - поэтому и заинтересовался вашим постом, но никто не предлагает такой задачи... а заниматься этим от нечего делать - нету времени :( Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба не вопрос- научусь в Гугль видео выкладывать- обязательно сделаю, так что увидите. Тут есть ещё чего поотлаживать, напр. запихнуть сетку в ЕЕПРОМ и при включении рисовать её на экран оттуда.Можно будет ещё 10кб меса сэкономить.Есть желание дальше копаться? В перспективе можно будет ещё спектроанализатор поизобретать, да мало ли чего...... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба Тут есть ещё чего поотлаживать, напр. запихнуть сетку в ЕЕПРОМ и при включении рисовать её на экран оттуда. Непонял, а что сложного в векторном рисовании сетки? (с помощю линий) Зачем ее по пикселам из памяти считывать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 22 марта, 2008 Опубликовано 22 марта, 2008 · Жалоба я про такое даже не слышал, поэтому просто нарисовал сетку в бмп-формате, разложил на байты и загрузил в проц.Места она заняла ок.10кб, вот я и подумал, что может её в еепром затолкать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 22 марта, 2008 Опубликовано 22 марта, 2008 · Жалоба я про такое даже не слышал, поэтому просто нарисовал сетку в бмп-формате, разложил на байты и загрузил в проц.Места она заняла ок.10кб, вот я и подумал, что может её в еепром затолкать? Еще раз посмотрел на вашу сетку - в принципе немного попариться и можно нарисовать векторно. Насколько я понял линии вы рисовать умеете (нет ничего сложного) написать еще алгоритм рисования пунктирных линий с задаваемым шагом пунктира. И все, сетку спокойно можно будет собрать из этих процедур ;) А по поводу иконок - речи нет надо битмапы юзать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 22 марта, 2008 Опубликовано 22 марта, 2008 · Жалоба линии, прямоугольники и кружки рисовать умеем, а штрихпунктиры нет.Даже не представляю себе такие формулы Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 22 марта, 2008 Опубликовано 22 марта, 2008 · Жалоба прямоугольник и видеосигнал Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 22 марта, 2008 Опубликовано 22 марта, 2008 · Жалоба линии, прямоугольники и кружки рисовать умеем, а штрихпунктиры нет.Даже не представляю себе такие формулы Я сам лично никогда не задавался вопросом рисования пунктирных линий, щас подумал - алгоритм мне представился довольно простым, если есть желание - выкладывайте вашу процедуру для обычных линий, видоизменим под пунктир... ;) прямоугольник и видеосигнал Да, картинка красивая... единственно не понятен смысл значка в правом нижнем углу... на нем что вообще нарисовано? (похоже на ворону на камне :) ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться