andreichk 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 (изменено) · Жалоба Блин, я в шоке!!! Да это просто супер как она сейчас рисует.На всех пределах показывает нормальную кривую. По поводу замены мат.части- наверное этого не произойдёт,так как наверняка это сопряжено с переделкой подложки, на такое я пойтить не могу, как как не вижу особого смысла в дальнейших затратах.Проект-то ведь любительский.Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит. Илье очередной :a14: и :beer: ЗЫ. отдельное :tort: за прояснение работы ФИФО. Изменено 2 апреля, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит. Илье очередной :a14: и :beer: ЗЫ. отдельное :tort: за прояснение работы ФИФО. Желаю дальнейших творческих "узбеков" ;) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба вопрос(детский,но всё же).Что лучше , создать общую процедуру рисования для обоих каналов, или две раздельные? Не поверите, прямо сейчас позвонили в дверь и принесли только вчера заказанные ФИФО 8кб. теперь они уже в работе, однако пока не наблюдаю никаких изменений наверное будет ваще супер, если на экран одновременно с кривыми ещё и значение частоты выводить Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба вопрос(детский,но всё же).Что лучше , создать общую процедуру рисования для обоих каналов, или две раздельные? Я бы зделал четыре варианта: 1. Раздельная синхронизация и отрисовка по каждому каналу (как сейчас работает у вас) 2. Синхронизация по каналу А 3. Синхронизация по каналу B 4. Сделать на пике вход внешней синхронизации Не поверите, прямо сейчас позвонили в дверь и принесли только вчера заказанные ФИФО 8кб. теперь они уже в работе, однако пока не наблюдаю никаких изменений А программу то под них переписали? :) наверное будет ваще супер, если на экран одновременно с кривыми ещё и значение частоты выводить Да, конечно. а в чем проблема? ;) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба на пока синхронизация у меня раздельная на каждый канал. А программу то под них переписали? а что ещё , кроме последних изменений надо переписать? Да, конечно. а в чем проблема? не знаю, за что зацепиться.Понимаю, что нужно како-нибудь таймер задействовать......... с выводом значений на экран проблем нет, а вот с остальным...... 4. Сделать на пике вход внешней синхронизации тут надо подуматьо том, надо ли оно? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба а что ещё , кроме последних изменений надо переписать? Конечно! Во первых, сдесь, как я считаю становиться не нужным таймаут, хотя можно оставить, сделав, допустим равным 1: #define TIMEOUT 1 а во вторых нужно изменить MAXN: #define MAXN 7940 не знаю, за что зацепиться.Понимаю, что нужно како-нибудь таймер задействовать......... Таймер здесь вам ничем не поможет. У вас же все гораздо проще: значения за вас уже оцифрованны и лежат в буфере. Поэтому нужно в процедуру отрисовки добавить поиск номера N который второй раз удовлетворит условию синхронизации. Как только вы его найдете, вы получите: N - количество отсчетов, характеризующих период сигнала F - частота дискретизации следовательно частота сигнала равна: F/N т.е. если на 80ти мегагерцах, N состаило 100 отсчетов, следовательно частота сигнала будет равна 800 кГц ;) тут надо подуматьо том, надо ли оно? Для сигналов, которые не получается засинхронизировать програмно - в полне надо. Тем более реализуется легко. Заходите в цикл отрисовки, ждете перепада на цифровом входе синхронизации, резетите FIFO и тут же отрисовываете :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба Поэтому нужно в процедуру отрисовки добавить поиск номера N который второй раз удовлетворит условию синхронизации. тут как мне кажется не всё так просто, так как этот момент наступает только после отрисовки всего экрана, то есть значение N будет всегда ок.255.А если на экран рисуется несколько периодов, то это значение становится неверным.Или я что-то не так понимаю? :05: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 3 апреля, 2008 Опубликовано 3 апреля, 2008 (изменено) · Жалоба попробовал таким макаром находить точку N для сравнения со значением oldA или oldB из процедуры но ничего хорошего из этого не вышло.В общем ,значение переменной N хоть и изменяет своё значение от частоты , но оно скачет как мячик, а если ещё 80МГц на него делить, то тут вообще чума полная. Сдаётся мне, что у меня опять косяк //--------------- собственно кривая --------------------------- void curve(unsigned int8 y_pos) { unsigned int8 x, y , yy, oldA,oldB ; //запоминаем первое значение точки синхронизации if(kanal){//выбор канала А #asm BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить #endasm oldA=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить #endasm }else {//выбор канала В #asm BCF 0x0F8B,1 //Output_bit(READ_FIFO_B ,0); //PIN_C1. разрешить #endasm oldB=input_b(); //чтение порта В #asm BSF 0x0F8B,1 //Output_bit(READ_FIFO_B ,1); //PIN_C1.запретить #endasm } //..................................................................... for(x=1;x<255;x++){ yy = y; if(kanal){//выбор канала А #asm BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить #endasm y=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить #endasm }else {//выбор канала В #asm BCF 0x0F8B,1 //Output_bit(READ_FIFO_B ,0); //PIN_C1. разрешить #endasm y=input_b(); //чтение порта В #asm BSF 0x0F8B,1 //Output_bit(READ_FIFO_B ,1); //PIN_C1.запретить #endasm } //****************************************************************************** if(syncA){if(y>oldA) NA++;}//считаем до тех пор, пока не найдём равенство по фронту else{if(oldA>y) NA++;}//считаем до тех пор, пока не найдём равенство по спаду if(syncB){if(y>oldB) NB++;}//считаем до тех пор, пока не найдём равенство по фронту else{if(oldB>y) NB++;}//считаем до тех пор, пока не найдём равенство по спаду //****************************************************************************** y = (y > 200) ? 200 : y;// ограничитель до выбранной величины y = (255 - y) + y_pos; // разворот на 180° по вертикали и сдвиг if (yy>y) front(x,yy,y);// Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину }adcB=adcA=y; }//--------------------------OK //#################################################################### Изменено 3 апреля, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Сдаётся мне, что у меня опять косяк Да, вы че-то конкретно намудрили... Вашу мысь я недогнал... Для начала: Код смотриться отвратно, сделайте, наконец макрос: #define ReadADC(var,chnl){ \ if(chnl){//выбор канала А \ #asm\ BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить \ #endasm \ var=input_b(); //чтение порта В \ #asm \ BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить \ #endasm \ }else{//выбор канала В \ #asm \ BCF 0x0F8B,1 //Output_bit(READ_FIFO_B ,0); //PIN_C1. разрешить \ #endasm \ var=input_b(); //чтение порта В \ #asm \ BSF 0x0F8B,1 //Output_bit(READ_FIFO_B ,1); //PIN_C1.запретить \ #endasm \ } \ } Вызывать очень просто: var - переменная в которую считать, chnl - с какого канала. Теперь о расчете частоты: float Fa,Fb; //Найденные частоты отрисовываемого сигнала float FclockA,FclockB; //Частоты тактирования FIFO //--------------- собственно кривая --------------------------- void curve(unsigned int16 n,unsigned int8 y_pos){ unsigned int8 x=1, y , yy=y_pos,syncF=0; unsigned int16 N=0; //Зануляем значение периода while(1){ if (n++>8192){// Если дошли до сюда, значит не удалось найти период if (kanal) Fa=0; else Fb=0; // Занулим частоту (типа не посчитали... ) return; } ReadADC(y,kanal); //Считываем значение в "у" с канала A или B y = (y > 200) ? 200 : y;// ограничитель до выбранной величины y = (255 - y); // разворот на 180° по вертикали if (kanal){// для канала А if(syncF==0) { // Первый этап N++; if (syncA){ if(y>sync_volume_A) syncF=1; }else{ if(y<sync_volume_A+115) syncF=1; } }else if(syncF==1){// Второй этап N++; if (syncA){ if(y<sync_volume_A) syncF=2; }else{ if(y>sync_volume_A+115) syncF=2; } }else{// Успешно нашли период if(x==255) { // Если закончили отрисовку Fa=FclockA/N; // посчитаем частоту return; } } } else{// для канала B if(syncF==0) { // Первый этап N++; if (syncB){ if(y>sync_volume_B) syncF=1; }else{ if(y<sync_volume_B+115) syncF=1; } }else if(syncF==1){// Второй этап N++; if (syncB){ if(y<sync_volume_B) syncF=2; }else{ if(y>sync_volume_B+115) syncF=2; } }else{// Успешно нашли период if(x==255) { // Если закончили отрисовку Fb=FclockB/N; // посчитаем частоту return; } } } if(x<255){//Рисуем, пока не вышли за пределы экрана y+= y_pos; //сдвигаем для отображения if (yy>y) front(x,yy,y); // Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину x++; yy=y; } } } Теперь функции нужно еще передать значение n, на котором остановилась процедура pix() чтобы процедура поиска N не вышла за границы правильных данных в FIFO буфере. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 (изменено) · Жалоба Ок, не важно, что как смотрится,но после небольшого причёсывания всё заработало //##### выводим на экран числа в графическом режиме ################## void frequenz(unsigned int8 wert,unsigned int8 x,unsigned int8 y) {//Выводим на экран значение переменной с плавающей запятой char freq[9]; switch(Fclock){ case 1: sprintf(freq, "%f",(float)( 80.0/wert ));break; //преобразуем в текст case 2: sprintf(freq, "%f",(float)( 40.0/wert ));break; case 3: sprintf(freq, "%f",(float)( 20.0/wert ));break; case 4: sprintf(freq, "%f",(float)( 10.0/wert ));break; case 5: sprintf(freq, "%f",(float)( 5.0/wert ));break; case 6: sprintf(freq, "%f",(float)( 2.5/wert ));break; case 7: sprintf(freq, "%f",(float)( 1.25/wert ));break; case 8: sprintf(freq, "%f",(float)( 0.625/wert ));break; } freq[4] = '\0'; //ограничиваем тремя знаками rect(x, y, x+25, y+7, 1,0); //стираем старое значение text57(x, y, freq, 1, 1); //выводим новое значение }//--------------------------OK //########################################################## макрос не переварился, поэтому его содержимое перекочевало обратно в процедуру //#################################################################### //--------------- собственно кривая --------------------------- void curve(unsigned int16 n,unsigned int8 y_pos){ unsigned int8 x=1, y , yy,syncF=0; unsigned int8 Nn=0; //Зануляем значение периода for(;;){ if (n++>8192){// Если дошли до сюда, значит не удалось найти период Nn=0; return;// Занулим частоту (типа не посчитали... ) } #asm BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить #endasm y=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить #endasm y = (y > 200) ? 200 : y;// ограничитель до выбранной величины y = (255 - y); // разворот на 180° по вертикали if(syncF==0) { // Первый этап Nn++; if (syncA){ if(y>sync_volume_A) syncF=1; }else{ if(y<sync_volume_A+115) syncF=1; } }else if(syncF==1){// Второй этап Nn++; if (syncA){ if(y<sync_volume_A) syncF=2; }else{ if(y>sync_volume_A+115) syncF=2; } } else{// Успешно нашли период if(x==255) {//Если закончили отрисовку,посчитаем частоту frequenz(Nn,195, 230);Nn=0;return; } } //........................................................ if(x<255){//Рисуем, пока не вышли за пределы экрана y+= y_pos; //сдвигаем для отображения if (yy>y) front(x,yy,y); // Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину x++; yy=y; } } }//--------------------------OK //######################################################### :a14: :a14: :a14: ЗЫ.правда правильные показания только при условии чёткой синхронизации Изменено 4 апреля, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба фото на память :beer: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось :05: else{// Успешно нашли период if(x==255) {//Если закончили отрисовку,посчитаем частоту frequenz(Nn,195, 230);Nn=0;return; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось :05: else{// Успешно нашли период if(x==255) {//Если закончили отрисовку,посчитаем частоту frequenz(Nn,195, 230);Nn=0;return; } А как же? Видите что стоит return ? Следовательно если частота была подсчитана до того как был отрисован экран (x<255) то выходить из процедуры не стоит. А нужно дождться когда x станет равын 255, посчитть частоту и выйти ;) правда правильные показания только при условии чёткой синхронизации А что вы хотели при таком примитвном алгоритме? ;) Для боле-менее стабильного алгоритма нужно гораздо больше заморачиваться, подключать цифровую обработку сигнала... макрос не переварился Не нравиться мне ваш компилер.... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба ну дык из цикла мы не выходим, он же другими скобками ограничен.А вот else как то непонятно зачем, если и без него неплохо. Компилятор мне тоже не нравится(вру, нравится), но другого нет Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба ну дык из цикла мы не выходим, он же другими скобками ограничен.А вот else как то непонятно зачем, если и без него неплохо. Выложите как выглядит процедура без него Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться