📄 lcd_auto.c
字号:
{
unsigned char idata ucDetect, ucPhase, ucResult;
unsigned long idata ulTemp0, ulTemp1, ulTemp2;
/*
//reduce the bandwidth of ADC to prevent overshoot
if(ucMode_Curr <= MODE_1280x1024x75HZ)
RTDSetByte(ADC_REG_TEST_E9, 0x08);
else if(ucMode_Curr < MODE_1024x0768x70HZ)
RTDSetByte(ADC_REG_TEST_E9, 0x00);
else
RTDSetByte(ADC_REG_TEST_E9, 0x10);
*/
if (ERROR_SUCCEED != Measure_PositionN(NM)) return ERROR_ABORT;
// Set auto-tracking window
Data[0] = 6;
Data[1] = Y_INC;
Data[2] = H_BND_STA_L_75;
Data[3] = (unsigned char)(usH_Start + MEAS_H_STA_OFFSET - 2);
Data[4] = (unsigned char)(usH_End + MEAS_H_END_OFFSET + 1);
Data[5] = ((unsigned char)((usH_Start + MEAS_H_STA_OFFSET - 2) >> 4) & 0x70) | ((unsigned char)((usH_End + MEAS_H_END_OFFSET + 1) >> 8) & 0x0f);
Data[6] = 0;
RTDWrite(Data);
RTDSetByte(DIFF_THRED_7E, 0x30);
ulTemp0 = 0;
ucDetect = 0x7b;
do
{
ucResult = COLORS_RED;
ucPhase = COLORS_RED;
do
{
RTDSetByte(MARGIN_B_7D, ucPhase);
RTDSetByte(AUTO_ADJ_CTRL_7F, ucDetect);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(1);
if (ulTemp0 < ((unsigned long *)Data)[1])
{
ulTemp0 = ((unsigned long *)Data)[1];
ucResult = ucPhase;
if (0x8000 < ulTemp0) break;
}
if (COLORS_GREEN == ucPhase)
ucPhase = COLORS_BLUE;
else if (COLORS_RED == ucPhase)
ucPhase = COLORS_GREEN;
else
break;
}
while (1);
if (0 != ulTemp0 || 0x7b != ucDetect) break;
ucDetect = 0x77;
}
while (1);
// Abort if no suitable color is found
if (0 == ulTemp0) return ERROR_NOTACTIVE;
// Select color for auto-phase tracking
RTDSetByte(MARGIN_B_7D, NM | ucResult);
// Find suitable threshold
// We use phase 8 and 24 to find out it
ucPhase = 0x20;
Set_Phase(ucPhase);
ucResult = 0x28;
NM = 0x00;
do
{
do
{
ucResult += 0x20;
RTDSetByte(DIFF_THRED_7E, ucResult);
RTDSetByte(AUTO_ADJ_CTRL_7F, ucDetect);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(1);
if ((unsigned long)0x1000 > ((unsigned long *)Data)[1])
{
ucResult -= 0x20;
break;
}
}
while (0x88 > ucResult);
if (0x88 == ucResult)
{
NM = ucResult;
break;
}
else
{
if (0x20 == ucPhase)
{
NM = ucResult;
ucPhase = 0x60;
Set_Phase(ucPhase);
}
else
{
if (NM < ucResult) NM = ucResult;
break;
}
}
}
while (1);
// Set threshold
if(NM < 136) NM = 136;
RTDSetByte(DIFF_THRED_7E, NM);
// Set phase 31
Set_Phase(0x7c);
Delay_Xms(1);
RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(3);
ulTemp2 = ((unsigned long *)Data)[3];
// Set phase 0
Set_Phase(0x00 | ucDetect);
Delay_Xms(1);
RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(2);
ulTemp1 = ((unsigned long *)Data)[2];
ulTemp0 = 0;
ucResult = 0x04;
ucPhase = 0x04;
do
{
Set_Phase(ucPhase);
Delay_Xms(1);
RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(1);
((unsigned long *)Data)[0]
= ulTemp2 + ulTemp1 + ((unsigned long *)Data)[1]
- ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2)
- ((ulTemp1 > ((unsigned long *)Data)[1] ? ulTemp1 - ((unsigned long *)Data)[1] : ((unsigned long *)Data)[1] - ulTemp1) / 2);
if (ulTemp0 < ((unsigned long *)Data)[0])
{
ulTemp0 = ((unsigned long *)Data)[0];
ucResult = ucPhase - 0x04;
}
ulTemp2 = ulTemp1;
ulTemp1 = ((unsigned long *)Data)[1];
ucPhase = ucPhase + 0x04;
}
while (0x7c != ucPhase);
((unsigned long *)Data)[0]
= ulTemp2 + ulTemp1 + ((unsigned long *)Data)[3]
- ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2)
- ((ulTemp1 > ((unsigned long *)Data)[3] ? ulTemp1 - ((unsigned long *)Data)[3] : ((unsigned long *)Data)[3] - ulTemp1) / 2);
((unsigned long *)Data)[1]
= ulTemp1 + ((unsigned long *)Data)[3] + ((unsigned long *)Data)[2]
- ((((unsigned long *)Data)[3] > ulTemp1 ? ((unsigned long *)Data)[3] - ulTemp1 : ulTemp1 - ((unsigned long *)Data)[3]) / 2)
- ((((unsigned long *)Data)[3] > ((unsigned long *)Data)[2] ? ((unsigned long *)Data)[3] - ((unsigned long *)Data)[2] : ((unsigned long *)Data)[2] - ((unsigned long *)Data)[3]) / 2);
if (ulTemp0 < ((unsigned long *)Data)[0])
{
ulTemp0 = ((unsigned long *)Data)[0];
ucResult = 0x78;
}
if (ulTemp0 < ((unsigned long *)Data)[1])
{
ulTemp0 = ((unsigned long *)Data)[1];
ucResult = 0x7c;
}
ucPhase = (ucResult - 0x08) & 0x7c;
Set_Phase(ucPhase);
ulTemp0 = 0;
ulTemp1 = 0;
ulTemp2 = 0;
((unsigned long *)Data)[2] = 0;
((unsigned long *)Data)[3] = 0;
NM = 4;
do
{
ucDetect = COLORS_RED;
do
{
RTDSetByte(MARGIN_B_7D, ucDetect);
RTDSetByte(AUTO_ADJ_CTRL_7F, 0x77);
Wait_Finish();
if (ERROR_SUCCEED != Data[0]) return Data[0];
Read_Auto_Info(1);
/*
if (2 <= NM) ulTemp0 += ((unsigned long *)Data)[1];
if (3 >= NM && 1 <= NM) ulTemp1 += ((unsigned long *)Data)[1];
if (2 >= NM) ulTemp2 += ((unsigned long *)Data)[1];
*/
switch (NM)
{
case 4 :
ulTemp0 += ((unsigned long *)Data)[1];
break;
case 3 :
ulTemp1 += ((unsigned long *)Data)[1];
break;
case 2 :
ulTemp2 += ((unsigned long *)Data)[1];
break;
case 1 :
((unsigned long *)Data)[2] += ((unsigned long *)Data)[1];
break;
default :
((unsigned long *)Data)[3] += ((unsigned long *)Data)[1];
break;
}
}
while (ucDetect--);
ucPhase = (ucPhase + 0x04) & 0x7c;
Set_Phase(ucPhase);
}while (NM--);
ulTemp0 = ulTemp0 + ulTemp1 + ulTemp2
- ((ulTemp1 > ulTemp0 ? ulTemp1 - ulTemp0 : ulTemp0 - ulTemp1) / 2)
- ((ulTemp1 > ulTemp2 ? ulTemp1 - ulTemp2 : ulTemp2 - ulTemp1) / 2);
ulTemp1 = ulTemp1 + ulTemp2 + ((unsigned long *)Data)[2]
- ((ulTemp2 > ulTemp1 ? ulTemp2 - ulTemp1 : ulTemp1 - ulTemp2) / 2)
- ((ulTemp2 > ((unsigned long *)Data)[2] ? ulTemp2 - ((unsigned long *)Data)[2] : ulTemp2 - ((unsigned long *)Data)[2]) / 2);
ulTemp2 = ulTemp2 + ((unsigned long *)Data)[2] + ((unsigned long *)Data)[3]
- ((((unsigned long *)Data)[2] > ulTemp2 ? ((unsigned long *)Data)[2] - ulTemp2 : ulTemp2 - ((unsigned long *)Data)[2]) / 2)
- ((((unsigned long *)Data)[2] > ((unsigned long *)Data)[3] ? ((unsigned long *)Data)[2] - ((unsigned long *)Data)[3] : ((unsigned long *)Data)[3] - ((unsigned long *)Data)[2]) / 2);
// Using the largest value for phase
if (ulTemp0 > ulTemp1)
{
ucResult = (ulTemp0 > ulTemp2) ? (ucResult - 0x04) & 0x7c : (ucResult + 0x04) & 0x7c;
}
else if (ulTemp2 > ulTemp1)
{
ucResult = (ucResult + 0x04) & 0x7c;
}
stMUD.PHASE = ucResult;
Set_Phase(stMUD.PHASE);
/*
//restore the bandwidth setup of ADC
if(ucMode_Curr < MODE_1024x0768x70HZ)
RTDSetByte(ADC_REG_TEST_E9, 0x08);
else
RTDSetByte(ADC_REG_TEST_E9, 0x10);
*/
return ERROR_SUCCEED;
}
unsigned char Auto_Config(void)
{
unsigned char Result, Noise, Curr_PosH, Curr_PosV, Curr_Clock, Curr_Phase;
bAutoInProgress = 1;
Curr_PosH = stMUD.H_POSITION; // Save current stMUD.H_POSITION
Curr_PosV = stMUD.V_POSITION; // Save current stMUD.V_POSITION
Curr_Clock = stMUD.CLOCK; // Save current stMUD.CLOCK
Curr_Phase = stMUD.PHASE; // Save current stMUD.PHASE
if (ucV_Max_Margin < stMUD.V_POSITION)
{
stMUD.V_POSITION = ucV_Max_Margin;
Set_V_Position();
}
// RTDCodeW(ADC_DEFAULT);
///////////////////////////////
// Measure NOISE_MARGIN //
///////////////////////////////
Result = Min_Noise_Margin();
Noise = Data[0];
//--------Auto_Clock-----------
if (ERROR_SUCCEED == (Result & 0x80))
{
stMUD.CLOCK = (stMUD.CLOCK) & 0xfc; // stMUD.CLOCK must be times of 4
if (stMUD.CLOCK != Curr_Clock) Set_Clock();
///////////////////////////////
// Adjust Clock //
///////////////////////////////
Result = Auto_Clock_Do(Noise);
if (ERROR_SUCCEED != (Result & 0x80))
{
if (stMUD.CLOCK != Curr_Clock)
{
// Fail to find out suitable clock. Restore original clock and H position.
stMUD.H_POSITION = Curr_PosH;
stMUD.CLOCK = Curr_Clock;
Set_Clock();
Set_H_Position();
}
}
else
{
stMUD.H_POSITION = usH_Start + 128 + 64 - usIPH_ACT_STA - (stMUD.CLOCK >> 1);
if (ucH_Max_Margin < stMUD.H_POSITION)
stMUD.H_POSITION = ucH_Max_Margin;
else if (ucH_Min_Margin > stMUD.H_POSITION)
stMUD.H_POSITION = ucH_Min_Margin;
Set_H_Position();
}
}
//---------Auto_Phase-----------
if (ERROR_SUCCEED == (Result & 0x80))
{
Result = Auto_Phase_Do(Noise);
if (ERROR_SUCCEED != (Result & 0x80))
{
// Restore Phase
stMUD.PHASE = Curr_Phase;
Set_Phase(stMUD.PHASE);
if (ERROR_NOTACTIVE == Result) Result = ERROR_SUCCEED;
}
}
//---------Auto_Position-----------
if (ERROR_SUCCEED == (Result & 0x80))
{
///////////////////////////////
// Adjust (H/V)Position //
///////////////////////////////
Result = Auto_Position_Do(Noise);
// Because Auto_Position_Do() never returns bit-7 error, we don't have to check here.
}
else
{
stMUD.V_POSITION = Curr_PosV;
Set_V_Position();
}
if (ERROR_SUCCEED == (Result & 0x80)) Save_MUD(ucMode_Curr);
// Restore ADC Gain/Offset
SetADC_GainOffset();
bAutoInProgress = 0;
return Result;
}
unsigned char Auto_Balance(void)
{
unsigned char Result, Curr_PosV;
bAutoInProgress = 1;
Curr_PosV = stMUD.V_POSITION; // Save current stMUD.V_POSITION
if (ucV_Max_Margin < stMUD.V_POSITION)
{
stMUD.V_POSITION = ucV_Max_Margin;
Set_V_Position();
}
// Do ADC gain/offset adjust
Result = Tune_Balance();
// Restore vertical position
if (Curr_PosV != stMUD.V_POSITION)
{
stMUD.V_POSITION = Curr_PosV;
Set_V_Position();
}
if (ERROR_SUCCEED != Result)
{
// Restore ADC Gain/Offset
Load_GUD2();
SetADC_GainOffset();
}
else
{
/* stGUD0.CONTRAST = 50;
stGUD0.RTD_R_CONTRAST = 50;
stGUD0.RTD_G_CONTRAST = 50;
stGUD0.RTD_B_CONTRAST = 50;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -