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

 
 
30 страниц V  « < 6 7 8 9 10 > »   
Closed TopicStart new topic
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
andreichk
сообщение Apr 2 2008, 11:01
Сообщение #106


Знающий
****

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



Блин, я в шоке!!! Да это просто супер как она сейчас рисует.На всех пределах показывает нормальную кривую.
По поводу замены мат.части- наверное этого не произойдёт,так как наверняка это сопряжено с переделкой подложки, на такое я пойтить не могу, как как не вижу особого смысла в дальнейших затратах.Проект-то ведь любительский.Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит.
Илье очередной a14.gif и beer.gif
ЗЫ. отдельное tort.gif за прояснение работы ФИФО.

Сообщение отредактировал andreichk - Apr 2 2008, 11:05


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 2 2008, 11:11
Сообщение #107


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

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



Цитата(andreichk @ Apr 2 2008, 19:01) *
Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит.
Илье очередной a14.gif и beer.gif
ЗЫ. отдельное tort.gif за прояснение работы ФИФО.


Желаю дальнейших творческих "узбеков" wink.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 2 2008, 12:39
Сообщение #108


Знающий
****

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



вопрос(детский,но всё же).Что лучше , создать общую процедуру рисования для обоих каналов, или две раздельные?

Не поверите, прямо сейчас позвонили в дверь и принесли только вчера заказанные ФИФО 8кб.
теперь они уже в работе, однако пока не наблюдаю никаких изменений

наверное будет ваще супер, если на экран одновременно с кривыми ещё и значение частоты выводить


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 2 2008, 14:14
Сообщение #109


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

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



Цитата(andreichk @ Apr 2 2008, 20:39) *
вопрос(детский,но всё же).Что лучше , создать общую процедуру рисования для обоих каналов, или две раздельные?


Я бы зделал четыре варианта:
1. Раздельная синхронизация и отрисовка по каждому каналу (как сейчас работает у вас)
2. Синхронизация по каналу А
3. Синхронизация по каналу B
4. Сделать на пике вход внешней синхронизации

Цитата
Не поверите, прямо сейчас позвонили в дверь и принесли только вчера заказанные ФИФО 8кб.
теперь они уже в работе, однако пока не наблюдаю никаких изменений


А программу то под них переписали? smile.gif

Цитата
наверное будет ваще супер, если на экран одновременно с кривыми ещё и значение частоты выводить

Да, конечно. а в чем проблема? wink.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 2 2008, 14:55
Сообщение #110


Знающий
****

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



на пока синхронизация у меня раздельная на каждый канал.
Цитата
А программу то под них переписали?

а что ещё , кроме последних изменений надо переписать?
Цитата
Да, конечно. а в чем проблема?

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

Цитата
4. Сделать на пике вход внешней синхронизации

тут надо подуматьо том, надо ли оно?


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 2 2008, 16:05
Сообщение #111


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

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



Цитата(andreichk @ Apr 2 2008, 22:55) *
а что ещё , кроме последних изменений надо переписать?

Конечно!
Во первых, сдесь, как я считаю становиться не нужным таймаут, хотя можно оставить, сделав, допустим равным 1:

#define TIMEOUT 1

а во вторых нужно изменить MAXN:

#define MAXN 7940

Цитата(andreichk @ Apr 2 2008, 22:55) *
не знаю, за что зацепиться.Понимаю, что нужно како-нибудь таймер задействовать......... help.gif

Таймер здесь вам ничем не поможет. У вас же все гораздо проще: значения за вас уже оцифрованны и лежат в буфере. Поэтому нужно в процедуру отрисовки добавить поиск номера N который второй раз удовлетворит условию синхронизации. Как только вы его найдете, вы получите:
N - количество отсчетов, характеризующих период сигнала
F - частота дискретизации
следовательно частота сигнала равна: F/N
т.е. если на 80ти мегагерцах, N состаило 100 отсчетов, следовательно частота сигнала будет равна 800 кГц wink.gif

Цитата
тут надо подуматьо том, надо ли оно?

Для сигналов, которые не получается засинхронизировать програмно - в полне надо. Тем более реализуется легко. Заходите в цикл отрисовки, ждете перепада на цифровом входе синхронизации, резетите FIFO и тут же отрисовываете smile.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 3 2008, 15:30
Сообщение #112


Знающий
****

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



Цитата
Поэтому нужно в процедуру отрисовки добавить поиск номера N который второй раз удовлетворит условию синхронизации.

тут как мне кажется не всё так просто, так как этот момент наступает только после отрисовки всего экрана, то есть значение N будет всегда ок.255.А если на экран рисуется несколько периодов, то это значение становится неверным.Или я что-то не так понимаю? 05.gif


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 3 2008, 18:46
Сообщение #113


Знающий
****

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



попробовал таким макаром находить точку N для сравнения со значением oldA или oldB из процедуры
но ничего хорошего из этого не вышло.В общем ,значение переменной N хоть и изменяет своё значение от частоты , но оно скачет как мячик, а если ещё 80МГц на него делить, то тут вообще чума полная.
Сдаётся мне, что у меня опять косяк help.gif
Цитата
//--------------- собственно кривая ---------------------------
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
//####################################################################


Сообщение отредактировал andreichk - Apr 3 2008, 19:36


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 4 2008, 06:26
Сообщение #114


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

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



Цитата(andreichk @ Apr 4 2008, 02:46) *
Сдаётся мне, что у меня опять косяк help.gif

Да, вы че-то конкретно намудрили... Вашу мысь я недогнал...

Для начала:

Код смотриться отвратно, сделайте, наконец макрос:
Код
#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 буфере.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 4 2008, 15:16
Сообщение #115


Знающий
****

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



Ок, не важно, что как смотрится,но после небольшого причёсывания всё заработало


Цитата
//##### выводим на экран числа в графическом режиме ##################
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.gif a14.gif a14.gif

ЗЫ.правда правильные показания только при условии чёткой синхронизации

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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 4 2008, 17:44
Сообщение #116


Знающий
****

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



фото на память beer.gif


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 5 2008, 07:25
Сообщение #117


Знающий
****

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



вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось 05.gif
Цитата
else{// Успешно нашли период
if(x==255)
{//Если закончили отрисовку,посчитаем частоту
frequenz(Nn,195, 230);Nn=0;return;
}


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 5 2008, 09:50
Сообщение #118


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

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



Цитата(andreichk @ Apr 5 2008, 15:25) *
вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось 05.gif

else{// Успешно нашли период
if(x==255)
{//Если закончили отрисовку,посчитаем частоту
frequenz(Nn,195, 230);Nn=0;return;
}


А как же? Видите что стоит return ? Следовательно если частота была подсчитана до того как был отрисован экран (x<255) то выходить из процедуры не стоит. А нужно дождться когда x станет равын 255, посчитть частоту и выйти wink.gif


Цитата
правда правильные показания только при условии чёткой синхронизации

А что вы хотели при таком примитвном алгоритме? wink.gif Для боле-менее стабильного алгоритма нужно гораздо больше заморачиваться, подключать цифровую обработку сигнала...

Цитата
макрос не переварился

Не нравиться мне ваш компилер.... wacko.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 5 2008, 10:12
Сообщение #119


Знающий
****

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



ну дык из цикла мы не выходим, он же другими скобками ограничен.А вот else как то непонятно зачем, если и без него неплохо.
Компилятор мне тоже не нравится(вру, нравится), но другого нет


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 5 2008, 10:25
Сообщение #120


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

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



Цитата(andreichk @ Apr 5 2008, 18:12) *
ну дык из цикла мы не выходим, он же другими скобками ограничен.А вот else как то непонятно зачем, если и без него неплохо.

Выложите как выглядит процедура без него
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 05:22
Рейтинг@Mail.ru


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