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

SED1335,PIC18F4550 и LCD320x240

Блин, я в шоке!!! Да это просто супер как она сейчас рисует.На всех пределах показывает нормальную кривую.

По поводу замены мат.части- наверное этого не произойдёт,так как наверняка это сопряжено с переделкой подложки, на такое я пойтить не могу, как как не вижу особого смысла в дальнейших затратах.Проект-то ведь любительский.Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит.

Илье очередной :a14: и :beer:

ЗЫ. отдельное :tort: за прояснение работы ФИФО.

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

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


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

Единственное, что я себе позволю, так это замену ФИФО на более ёмкую, посмотрим, что это изменит.

Илье очередной :a14: и :beer:

ЗЫ. отдельное :tort: за прояснение работы ФИФО.

 

Желаю дальнейших творческих "узбеков" ;)

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


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

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

 

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

теперь они уже в работе, однако пока не наблюдаю никаких изменений

 

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

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


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

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

 

Я бы зделал четыре варианта:

1. Раздельная синхронизация и отрисовка по каждому каналу (как сейчас работает у вас)

2. Синхронизация по каналу А

3. Синхронизация по каналу B

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

 

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

теперь они уже в работе, однако пока не наблюдаю никаких изменений

 

А программу то под них переписали? :)

 

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

Да, конечно. а в чем проблема? ;)

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


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

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

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

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

Да, конечно. а в чем проблема?

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

с выводом значений на экран проблем нет, а вот с остальным...... :help:

 

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

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

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


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

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

Конечно!

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

 

#define TIMEOUT 1

 

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

 

#define MAXN 7940

 

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

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

N - количество отсчетов, характеризующих период сигнала

F - частота дискретизации

следовательно частота сигнала равна: F/N

т.е. если на 80ти мегагерцах, N состаило 100 отсчетов, следовательно частота сигнала будет равна 800 кГц ;)

 

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

Для сигналов, которые не получается засинхронизировать програмно - в полне надо. Тем более реализуется легко. Заходите в цикл отрисовки, ждете перепада на цифровом входе синхронизации, резетите FIFO и тут же отрисовываете :)

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


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

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

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

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


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

попробовал таким макаром находить точку N для сравнения со значением oldA или oldB из процедуры

но ничего хорошего из этого не вышло.В общем ,значение переменной N хоть и изменяет своё значение от частоты , но оно скачет как мячик, а если ещё 80МГц на него делить, то тут вообще чума полная.

Сдаётся мне, что у меня опять косяк :help:

//--------------- собственно кривая ---------------------------

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

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


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

Сдаётся мне, что у меня опять косяк :help:

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

 

Для начала:

 

Код смотриться отвратно, сделайте, наконец макрос:

#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 буфере.

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


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

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

 

 

//##### выводим на экран числа в графическом режиме ##################

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:

 

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

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

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


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

вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось :05:

else{// Успешно нашли период

if(x==255)

{//Если закончили отрисовку,посчитаем частоту

frequenz(Nn,195, 230);Nn=0;return;

}

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


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

вопрос имею, зачем тут else со скобками ? Я попробовал его убрать и ничего не изменилось :05:

 

else{// Успешно нашли период

if(x==255)

{//Если закончили отрисовку,посчитаем частоту

frequenz(Nn,195, 230);Nn=0;return;

}

 

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

 

 

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

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

 

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

Не нравиться мне ваш компилер.... :wacko:

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


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

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

Компилятор мне тоже не нравится(вру, нравится), но другого нет

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


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

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

Выложите как выглядит процедура без него

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


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

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