1
Discussion - Software / FT810 touch calibration problem
« on: February 22, 2022, 02:05:06 PM »
Hi,
I am using FT810 with 7" TFT. But i use it on portrait orientation. But i have a problem with touch orientation. It doesnt happen always but touch orientation of some devices change. Seems you see TFT screen on portrait orientation but touch system changes to landscape. Thats why you cant use touch screen. Also i calibrate system once after programming process. Flowchart of algorithm is like below;
Run system first time after programming -> (System goes to calibration mode because calibration values are zero on mcu eeprom) -> Calibrate screen -> read REG_TOUCH_TRANSFORM_X values and save to mcu eeprom -> reboot system
After rebooting system, mcu will see values on eeprom and FT810 wont be calibrated again. I read calibration values and write to REG_TOUCH_TRANSFORM_X again same values. This system was running without problem. But a few devices get this problem. My calibration code is below. Do you have any idea why i have this problem?
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR_COLOR_RGB(0,255,0));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SETROTATE));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (0)); //rotate screen portrait orientation
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset,CMD_CALIBRATE); // calibrate screen
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, DISPLAY());
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SWAP));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite16(REG_CMD_WRITE, (cmdOffset));
do
{
cmdBufferRd = ft800memRead16(REG_CMD_READ);
cmdBufferWr = ft800memRead16(REG_CMD_WRITE);
}while (cmdBufferWr != cmdBufferRd);
DEVICE_TRANSFORM_A=ft800memRead32(REG_TOUCH_TRANSFORM_A); // read calibration values
DEVICE_TRANSFORM_B=ft800memRead32(REG_TOUCH_TRANSFORM_B);
DEVICE_TRANSFORM_C=ft800memRead32(REG_TOUCH_TRANSFORM_C);
DEVICE_TRANSFORM_D=ft800memRead32(REG_TOUCH_TRANSFORM_D);
DEVICE_TRANSFORM_E=ft800memRead32(REG_TOUCH_TRANSFORM_E);
DEVICE_TRANSFORM_F=ft800memRead32(REG_TOUCH_TRANSFORM_F);
save_eeprom_transform_values(); // save calibration values to eeprom
I am using FT810 with 7" TFT. But i use it on portrait orientation. But i have a problem with touch orientation. It doesnt happen always but touch orientation of some devices change. Seems you see TFT screen on portrait orientation but touch system changes to landscape. Thats why you cant use touch screen. Also i calibrate system once after programming process. Flowchart of algorithm is like below;
Run system first time after programming -> (System goes to calibration mode because calibration values are zero on mcu eeprom) -> Calibrate screen -> read REG_TOUCH_TRANSFORM_X values and save to mcu eeprom -> reboot system
After rebooting system, mcu will see values on eeprom and FT810 wont be calibrated again. I read calibration values and write to REG_TOUCH_TRANSFORM_X again same values. This system was running without problem. But a few devices get this problem. My calibration code is below. Do you have any idea why i have this problem?
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR_COLOR_RGB(0,255,0));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SETROTATE));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (0)); //rotate screen portrait orientation
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset,CMD_CALIBRATE); // calibrate screen
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, DISPLAY());
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite32(RAM_CMD + cmdOffset, (CMD_SWAP));
cmdOffset = incCMDOffset(cmdOffset, 4);
ft800memWrite16(REG_CMD_WRITE, (cmdOffset));
do
{
cmdBufferRd = ft800memRead16(REG_CMD_READ);
cmdBufferWr = ft800memRead16(REG_CMD_WRITE);
}while (cmdBufferWr != cmdBufferRd);
DEVICE_TRANSFORM_A=ft800memRead32(REG_TOUCH_TRANSFORM_A); // read calibration values
DEVICE_TRANSFORM_B=ft800memRead32(REG_TOUCH_TRANSFORM_B);
DEVICE_TRANSFORM_C=ft800memRead32(REG_TOUCH_TRANSFORM_C);
DEVICE_TRANSFORM_D=ft800memRead32(REG_TOUCH_TRANSFORM_D);
DEVICE_TRANSFORM_E=ft800memRead32(REG_TOUCH_TRANSFORM_E);
DEVICE_TRANSFORM_F=ft800memRead32(REG_TOUCH_TRANSFORM_F);
save_eeprom_transform_values(); // save calibration values to eeprom