📄 auto.c
字号:
Purpose : adjust ADC phase value
Input :
Output : Word PhaseValue ADC phase value
External : Byte TruBuf[] i2c i/o buffer
Byte SlvAdr i2c slave address
Byte ByteCnt i2c i/o byte count
Byte maxLeftValue maximum left color value
Byte maxRightValue maximum right color value
Return :
***************************************************************************/
Bool auto_phase_adjust()
{
#if (GOOD_AUTO==0)
#if (SMOOTH_PHASE==2) /* find high ASOD and smooth curve phase */
Byte i,j,k,l;
Long IDATA total,aplval,aplval1;
Long IDATA aplary[5];
auto_set_asod();
total = 0;
for( i=0; i<5; i++ )
aplary[i] = 0;
for( i=k=0; i<36; i++ )
{
if( isVGAabsent() ) return FALSE; //break;
auto_adc_phase( i%32 );
auto_short_delay(2);
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval = 0;
for(j=0; j<3; j++)
aplval = aplval * 256 + TrmBuf[j];
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j!=4 )
{
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval1 = 0;
for(j=0; j<3; j++)
aplval1 = aplval1 * 256 + TrmBuf[j];
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j==4 )
{
aplval = aplval1;
}
else
{
if( aplval > aplval1 )
aplval = aplval1 / 2;
else
aplval = aplval / 2;
}
}
#if FINETUNE_PHASE
if( auto_get_width() > autoInfo[ModeCounter].width_def )
aplval = (aplval*3) / 4;
auto_set_asod();
#endif
aplary[i%5] = aplval;
aplval = 0;
for(j=l=0; j<5; j++)
{
aplval += aplary[j];
if (aplary[j]>=aplary[l]) l = j;
}
aplval = aplval-(aplary[l]-aplval/5); // Alf
if( aplval > total )
{
total = aplval;
k = i;
}
}
PhaseValue = (k+30) % 32;
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#elif (SMOOTH_PHASE==1) /* find high ASOD and smooth curve phase */
Byte i,j,k;
Long IDATA aplval0,aplval1,aplval2;
Long IDATA aplary[3];
auto_set_asod();
aplval2 = 0;
for( i=0; i<34; i++ )
{
if( isVGAabsent() ) break;
auto_adc_phase( i%32 );
auto_short_delay(2);
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval0 = 0;
for(j=0; j<3; j++)
aplval0 = aplval0 * 256 + TrmBuf[j];
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j!=4 )
{
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval1 = 0;
for(j=0; j<3; j++)
aplval1 = aplval1 * 256 + TrmBuf[j];
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j==4 )
{
aplval0 = aplval1;
}
else
{
if( aplval0 > aplval1 )
aplval0 = aplval1 / 2;
else
aplval0 = aplval0 / 2;
}
}
#if FINETUNE_PHASE
if( auto_get_width() > autoInfo[ModeCounter].width_def )
aplval0 = aplval0 / 2;
auto_set_asod();
#endif
aplary[i%3] = aplval0;
if( i >= 2 )
{
j = (i - 1) % 3;
k = (i + 1) % 3;
if( aplary[j] > aplary[k] )
aplval1 = aplary[j] - aplary[k];
else
aplval1 = aplary[k] - aplary[j];
if( aplary[j] > aplval0 )
aplval1 += (aplary[j] - aplval0);
else
aplval1 += (aplval0 - aplary[j]);
aplval1 = aplval1 * 4; /* enlarge the effect of difference */
if( aplary[j] > aplval1 )
aplval1 = aplary[j] - aplval1; /* Sum - Difference */
else
aplval1 = 0;
if( aplval1 > aplval2 )
{
PhaseValue = (i - 1) % 32;
aplval2 = aplval1;
}
}
}
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#else /* find highest ASOD phase */
Byte i,j,k;
Long IDATA aplval0,aplval1,aplval2;
aplval1 = 0;
PhaseValue = autoBval;
k = (PhaseValue + 29) % 32;
for( i=0; i<7; i++ ) /* check phase boundary(-3..+3) */
{
if( isVGAabsent() ) break;
auto_adc_phase( k );
auto_short_delay(2);
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval0 = 0;
for(j=0; j<3; j++)
{
aplval0 = aplval0 * 256 + TrmBuf[j];
}
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j!=4 )
{
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval2 = 0;
for(j=0; j<3; j++)
aplval2 = aplval2 * 256 + TrmBuf[j];
for(j=0; j<4; j++)
if( TrmBuf[j]!=TrmBuf[4+j] ) break;
if( j==4 )
{
aplval0 = aplval2;
}
else
{
if( aplval0 > aplval2 )
aplval0 = aplval2 / 2;
else
aplval0 = aplval0 / 2;
}
}
if( aplval0 > aplval1 )
{
aplval1 = aplval0;
PhaseValue = k; /* best phase, maximum ASUM */
}
k = (k+1) % 32;
}
if( PhaseValue==0 ) PhaseValue = 1;
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#endif
#else /* GOOD_AUTO==1 */
#if (SMOOTH_PHASE==2) /* find high ASOD and smooth curve phase */
Byte i,j,k,l;
Long IDATA total,aplval;
Long IDATA aplary[5];
auto_set_asod();
total = 0;
for( i=0; i<5; i++ )
aplary[i] = 0;
for( i=k=0; i<36; i++ )
{
if( isVGAabsent() ) break;
auto_adc_phase( i%32 );
auto_short_delay(2);
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,8);
aplval = 0;
for(j=0; j<3; j++)
aplval = aplval * 256 + TrmBuf[j];
#if FINETUNE_PHASE
if( auto_get_width() > autoInfo[ModeCounter].width_def )
aplval = (aplval*3) / 4;
auto_set_asod();
#endif
aplary[i%5] = aplval;
aplval = 0;
for(j=l=0; j<5; j++)
{
aplval += aplary[j];
if (aplary[j]>=aplary[l]) l = j;
}
aplval = aplval-(aplary[l]-aplval/5); // Alf
if( aplval > total )
{
total = aplval;
k = i;
}
}
PhaseValue = (k+30) % 32;
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#elif (SMOOTH_PHASE==1) /* find high ASOD and smooth curve phase */
Byte i,j,k;
Long IDATA aplval0,aplval1,aplval2;
Long IDATA aplary[3];
auto_set_asod();
aplval2 = 0;
for( i=0; i<34; i++ )
{
if( isVGAabsent() ) break;
auto_adc_phase( i%32 );
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,4);
aplval0 = 0;
for(j=0; j<3; j++)
aplval0 = aplval0 * 256 + TrmBuf[j];
#if FINETUNE_PHASE
if( auto_get_width() > autoInfo[ModeCounter].width_def )
aplval0 = aplval0 / 2;
auto_set_asod();
#endif
aplary[i%3] = aplval0;
if( i >= 2 )
{
j = (i - 1) % 3;
k = (i + 1) % 3;
if( aplary[j] > aplary[k] )
aplval1 = aplary[j] - aplary[k];
else
aplval1 = aplary[k] - aplary[j];
if( aplary[j] > aplval0 )
aplval1 += (aplary[j] - aplval0);
else
aplval1 += (aplval0 - aplary[j]);
aplval1 = aplval1 * 4; /* enlarge the effect of difference */
if( aplary[j] > aplval1 )
aplval1 = aplary[j] - aplval1; /* Sum - Difference */
else
aplval1 = 0;
if( aplval1 > aplval2 )
{
PhaseValue = (i - 1) % 32;
aplval2 = aplval1;
}
}
}
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#else /* find highest ASOD phase */
Byte i,j,k;
Long IDATA aplval0,aplval1,aplval2;
aplval1 = 0;
PhaseValue = autoBval;
k = (PhaseValue + 29) % 32;
for( i=0; i<7; i++ ) /* check phase boundary(-3..+3) */
{
if( isVGAabsent() ) break;
auto_adc_phase( k );
auto_wait_asod();
auto_get_zurac(ZRC_ASUM,4);
aplval0 = 0;
for(j=0; j<3; j++)
{
aplval0 = aplval0 * 256 + TrmBuf[j];
}
if( aplval0 > aplval1 )
{
aplval1 = aplval0;
PhaseValue = k; /* best phase, maximum ASUM */
}
k = (k+1) % 32;
}
if( PhaseValue==0 ) PhaseValue = 1;
auto_adc_phase(PhaseValue);
if( isVGAabsent() ) return FALSE;
return TRUE;
#endif
#endif
}
/***************************************************************************
Function : auto_set_hvpos
Purpose : adjust horizontal display position
Input :
Output : Word HorPositionValue horizontal position value
External : Byte TruBuf[] i2c i/o buffer
Byte SlvAdr i2c slave address
Byte ByteCnt i2c i/o byte count
Word maxLeftLine line index of maximum left color value
Byte ModeCounter VGA mode index
Return :
***************************************************************************/
void auto_set_hvpos()
{
#if (GOOD_AUTO==0)
Bool HPosOK,VPosOK;
Byte DATA i;
Word IDATA shtemp1,shtemp2,shtemp3,shtemp4;
Word IDATA svtemp1,svtemp2,svtemp3,svtemp4;
Word IDATA shtemp5,shtemp6;
HPosOK = 0;
VPosOK = 0;
auto_min_threshold( MIN_THRESHOLD );
for( i=0; i<20; i++)
{
auto_set_mline(0);
auto_wait_mline(0);
auto_get_zurac(ZRC_AVSTART,8);
if( HPosOK==0 )
{
shtemp1 = MAKEWORD(TrmBuf[5],TrmBuf[4]);
shtemp2 = MAKEWORD(TrmBuf[7],TrmBuf[6]);
}
if( VPosOK==0 )
{
svtemp1 = MAKEWORD(TrmBuf[1],TrmBuf[0]);
svtemp2 = MAKEWORD(TrmBuf[3],TrmBuf[2]);
}
auto_set_mline(0);
auto_wait_mline(0);
auto_get_zurac(ZRC_AVSTART,8);
if( HPosOK==0 )
{
shtemp3 = MAKEWORD(TrmBuf[5],TrmBuf[4]);
shtemp4 = MAKEWORD(TrmBuf[7],TrmBuf[6]);
}
if( VPosOK==0 )
{
svtemp3 = MAKEWORD(TrmBuf[1],TrmBuf[0]);
svtemp4 = MAKEWORD(TrmBuf[3],TrmBuf[2]);
}
if( HPosOK==0 )
{
if( (shtemp1==shtemp3) && (shtemp2==shtemp4) && (shtemp1!=0x07FF) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -