Цитата
if( xx >= 255 ) xx = xx - 255; //приводим к int8
тут , как я себе представляю, смысл в том, чтобы хх укладывалось в интервал от 0 до 255, так как сам буфер в 4 раза больше. хх- это координата точки и поскольку момент захвата синхронизации может наступить за пределами этого диапазона, то эта конструкция всё равно установит этот момент в начало.
потому что в цикле начала отрисовки for(x=1;x<255;x++){
лежит другая переменная.
тут , как я себе представляю, смысл в том, чтобы хх укладывалось в интервал от 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;
}
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
}
}
//!!!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 нужно определить опытным путем (я написал для примера) а можно и завести и глобальную переменную под это дело - дабы динамически изменять во время работы