This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

投影条纹乱序问题,(I2c发送指令,来达到修改投影顺序,结果出现乱序的问题)

Other Parts Discussed in Thread: DLPC350

目前的情况:  我已经实现了I2c通信,就是可以通过指令控制DLP的一些简单功能,比如开启关闭DLP投影等,现在遇到一个问题:就是重新设置投影条纹的 数量 以及 投影条纹的顺序,下面贴图,是我实际过程中代码(代码命名不是很好,只是测试。见谅):

目的:flash 内存中有 四张RGB 24bit的图像,而我需要从中每次投影4bit的图案,默认的是投射20张。

现在通过下面的指令,来控制其投射前10张。

上面的1-20是默认的正常投影模式,项目的21往后,设置完下面的代码,投射出来的条纹就是乱的,不是按1-10投射的。()

 

 

注意:代码中的,byte writei2cStop[2] = { 0x00,0x03 }; 0x00 是个地址,0x03才是后面发送的指令。而且,这些指令都可以发送成功。

我的疑惑之处就是:就按10张的条纹,下面我代码中的指令该如何指定?

 

这个是按照lightCrafter3500 GUI 自己弄出来的,希望TI 的大佬们指点,上面标注之处,主要是我不知道

DLPC350_SendPatLut();

DLPC350_SendImageLut(&splashLut[0], 1);

其指令是如何发送的?

而且,上面的代码 , 比如第n张image,的第m个pattern,不论我如何改,我都得不到我想要的方法。希望可以指出我的错误点,谢谢!

 

  • 有可以帮忙解答一下吗

  • 您好!

    感谢使用TI的DLP产品。

    因为代码比较长,我大致阅读了您的代码,有如下建议:

    1.从配置来看,每一个pattern的曝光时间都是相同的,可以不使用Variable exposure pattern模式,使用普通的固定pattern的模式即可

    2.建议参考DLPC350的programmer guide的patter display mode顺序(第四章)来配置寄存器:

    http://www.ti.com/lit/ug/dlpu010g/dlpu010g.pdf

    3.在variable exposure mode下,0x66是不需要的

    4. 在配置每个pattern的时候0x5d的byte0不知道是怎么配置的,byte2的buffer swap命令是有问题的,该命令只在需要换image的时候才置为1

    5. 每一个pattern配置结束以后不需要重新指定pattern顺序,只需要配置image的index就可以了0,1,2(0x77,0x76,0x78)

    这是我目前的建议,请尝试修改后再测试

    Best regards

  • 好的好的,太谢谢您了,非常感谢,我先测试.....
  • Kevin Shi  您好:

    我目前flash 内存中烧录了4张image  24bit图像;   

    默认投影配置为: 4bit,投影前22张.  

    现在我想通过以下指令,来控制其投影前10张 (就是 image_0 (24bit) 的6张4bit 图案; +  image_1(24bit),的前4张4bit图案.   按这种方式投射) .

     

    您说的投影的图案的byte0这个字节,从1-10,我设置的是 0x01   0x05   0x09  0x0D  0x11  0x15  0x19   0x1D  0x21  0x25

    按照您上面的五条建议,我做了修改: 以下为我的代码,

    
    

    但是通过上述设置,我发现,我的投影图像 依旧存在些问题: 12

    上面1-22 为默认投影 22张4bit图像; (

    image_0: 1-6 4bit图案

    image_1: 7-12 4bit图案

    )

    24-32 为我执行之后,投影出来的图像.发现(image_1 和 image_0的投影顺序是相反的.而且,上面的设置,导致其 image_0和image_1,各自投了5张.)

    而且: 在使用0x78 发送以下指令的时候,不论设置为

    byte writei2cStop[3] = { 0x78,0x00,0x01 }; 

    或者byte writei2cStop[3] = { 0x78,0x01,0x00 }; 其投影出来的图案顺序,也都是一样的.? 

    您可以帮我看看问题吗? (而且,对于如何去设置 第n张图像的第m个图案,实际上,这里我很迷茫: 

    byte readI2cAdress = 0x5B;
    byte writei2cStop[7] = { 0x5B, 0x04,0x00, 0x04,0x00, 0x01, 0x01 };

    尤其是这个指令,我在代码

    0x04,0x00:代表投射5个图案; 

    0x04,0x00: 显示的图案数量为5;

     0x01,从flash中读取两张图案,

    0x01,重复循环

    在这里也有个疑问: 显示的图案数量这里(0x04,0x00: 显示的图案数量为5;): 我设置为 (0x01,0x00),或者 (0x03,0x00),发现其最后投射的图案数量依旧是5(貌似改变这个投射数量的,只有0x04,0x00:代表投射5个图案;  这个指令. )

    如果想要达到我目的:投射image_0的6个图案;以及 投射第image_1中的前4个图案:  难道这个指令,需要重复设置两次吗?

    )

    拜托了

  • 您好!

    可以尝试做如下修改吗?

    1.0x5B修改为{0X5B,0x09.0x00,0x09,0x00,0x01,0x01}

    2. 修改第6张图片的0x06为0x02

    3.0x78保持{0x78,0x00,0x01}

    4.提供imgAddress的值

    Best regards

  • Kevin Shi 

    您好:

    imgAddress 的数字如下

    inline  byte getExternalPositiveImgeIndex(int ImgIndex)
    	{
    
    		switch (ImgIndex)
    		{
    		case 0:
    		{
    			return 0x00;
    		}
    		case 1:
    		{
    			return 0x01;
    		}
    		case 2:
    		{
    			return 0x05;
    		}
    		case 3:
    		{
    			return 0x09;
    		}
    		case 4:
    		{
    			return 0x0D;
    		}
    		case 5:
    		{
    			return 0x11;
    		}
    		case 6:
    		{
    			return 0x15;
    		}
    		case 7:
    		{
    			return 0x19;
    		}
    		case 8:
    		{
    			return 0x1D;
    		}
    		case 9:
    		{
    			return 0x21;
    		}
    		case 10:
    		{
    			return 0x25;
    		}
    		case 11:
    		{
    			return 0x29;
    		}
    		case 12:
    		{
    			return 0x2D;
    		}
    		case 13:
    		{
    			return 0x31;
    		}
    		case 14:
    		{
    			return 0x35;
    		}
    		case 15:
    		{
    			return 0x39;
    		}
    		case 16:
    		{
    			return 0x3D;
    		}
    		case 17:
    		{
    			return 0x41;
    		}
    		case 18:
    		{
    			return 0x45;
    		}
    		case 19:
    		{
    			return 0x49;
    		}
    		case 20:
    		{
    			return 0x4D;
    		}
    		case 21:
    		{
    			return 0x51;
    		}
    		default:
    
    			return 0x00;
    			break;
    		}
    
    	}

    代码部分,我直接贴上我修改之后的部分
    ....
    {
    
    
    			byte readI2cAdress = 0x5B;
    			byte writei2cStop[7] = { 0x5B, 0x09,0x00, 0x09,0x00, 0x01, 0x01 };
    			size_t writeLength = 7;
    			HeightByteAdd1(readI2cAdress, writei2cStop[0]);
    			bool isStop = false;
    			isStop = IsCommanSuccess(writei2cStop, writeLength, readI2cAdress);
    			_sleep(TimerSpace);
    
    }
    
    ....
    
    {
      
    
    #pragma endregion
    
    
    }
    
    .....
    {
    
    			//image index???,图像. 这个指令,极有可能,单个顺序发送.
    			byte readI2cAdress = 0x78;
    			byte writei2cStop[3] = { 0x78,0x00,0x01 };
    			size_t writeLength = 3;
    			HeightByteAdd1(readI2cAdress, writei2cStop[0]);
    			bool isStop = false;
    			//isStop = IsCommanSuccess(writei2cStop, writeLength, readI2cAdress);
    			for (int i = 1; i < writeLength; i++)
    			{
    				byte  commenStep[2] = { writei2cStop[0] , writei2cStop[i] };
    				isStop = IsCommanSuccess(commenStep, readI2cAdress);
    				_sleep(5);
    			}
    
    }
    

     以下为投影出来的序列:

    image_0 投影了前四个图案(4bit)

    image_1,投影了6个图案(4bit)

    . 和我目标image_0,投影6个,以及 image_1,投影4个.刚好是相反的.

    实际上,我将上述的指令,改成了如

    	//image index???,图像. 这个指令,极有可能,单个顺序发送.
    			byte readI2cAdress = 0x78;
    			byte writei2cStop[3] = { 0x78,0x01,0x00 };
    			size_t writeLength = 3;
    			HeightByteAdd1(readI2cAdress, writei2cStop[0]);
    			bool isStop = false;
    			//isStop = IsCommanSuccess(writei2cStop, writeLength, readI2cAdress);
    			for (int i = 1; i < writeLength; i++)
    			{
    				byte  commenStep[2] = { writei2cStop[0] , writei2cStop[i] };
    				isStop = IsCommanSuccess(commenStep, readI2cAdress);
    				_sleep(5);
    			}
    



    指令修改之后的数据



    以上我拍摄了两组:
    (1-22为默认投影方式)
    {
    image_0: 1-6;
    image_1: 7-12;
    image_2: 13-18;
    image_3: 19-22
    }

    //烧写指令之后,我拍摄了两组图像.
    23-32为一组
    33-42为一组
    发现,其投影的方式为 image_1:的6张+ image_0的前四张.
    其顺序依旧不是我想要的(image_0的6张+image_1的前四张)

    是否是我的0x78这个指令,没有发挥作用?


  • 您好!

    您可以不用将所有的代码都copy上来,因为很难阅读,只需要将相应寄存器的配置贴上来就可以了,这样比较清晰。

    为了更好理解问题,请帮忙回答如下问题:

    1.0x78寄存器配置成{0x78,0x00,0x01}和{ 0x78,0x01,0x00 }两种情况是否象相同?正常情况下应该是反的

    2.请确认固件中的image0和image1是对应的image,顺序没有反

    在确认后,是否可以做如下测试

    将第一pattern的配置中的0x06改为0x02,也就是说不swap

    Best regards

  • Kevin shi

    您好

    第一个问题:  0x78这个寄存器,我发现,我如何修改里面的顺序,投影结果都一样

    {0x78,0x00,0x01}

    {0x78,0x01,0x00}

    第二个问题:固件中的image_0 和 image_1,是我默认烧写的那个顺序中的图案.是一 一对应的

    确认上面两个结果,我将第一张pattern 修改成0x02

    此时0x78的指令顺序为:

    byte writei2cStop[3] = { 0x78,0x01,0x00 };

    指令执行之后的投影情况.

    上面的投影条纹,23-38是一组,共16张.   39又是新一组的开始(和23.bmp 这一张一样)

     第一个 pattern 设置为0x02, 

    byte writei2cStop[13] = { 0x5D,
    imgAddress,0x44,0x02,0x00,
    0xE8,0x80,0x00,0x00,
    0x40,0x0D,0x03,0x00 };

    默认第7个pattern 设置为0x06,

    byte writei2cStop[13] = { 0x5D,
    imgAddress,0x44,0x06,0x00,
    0xE8,0x80,0x00,0x00,
    0x40,0x0D,0x03,0x00 };

     按照这样的设置来投射:  第一个image_0的6张(1-6),第2个image的4张(7-10),+ (7-12) = 16 (对应上图的投影顺序就是:

    1-2-3-4-5-6-7-8-9-10-7-8-9-10-11-12  这样的顺序

    ) ,  实际投影的顺序(23-38)是和上面设置的顺序吻合的.

    后来,我将0x78的指令,设置成

    byte writei2cStop[3] = { 0x78,0x00,0x01 };

    其投影图案也和上述的相同.

    问题就出在:  0x78这个指令上.  不知道为何这个指令没有产生该有的效果? 

  • 您好!

    请问是在使用TI的EVM吗?我也不是很清楚这个原因,但是可以尝试修改命令的顺序与手册上推荐的一样:

    配置顺序:

    0x65: 0x00->stop sequence

    0x69: 0x01->set to pattern mode

    0x6F: 0x03->from flash

    0x70: 0x03->set internall or external trigger

    0x77: 0x03->variable exposure 

    0x5B...

    0x5C...

    0x5D...

    ...

    0x77: 0x00->close the mail box

    ...

    0x65 0x02->start sequence

    另外,请问目前是使用外部触发模式对吗?相机的曝光时间是怎么设置的?

  • 您好:

    按照GUI指导,我重新调整了顺序, 依旧和上述情况一样. 0x78的指令上的功能, 依旧没有起作用.

     疑惑一: 请问,trriger_out_1, trriger_out_2,trriger_in_1,trriger_in_2,的设置,对0x78这个指令会产生影响吗?(我看了文档,貌似不会)

     疑惑二:

         a:是否是0x78这个寄存器损坏了(如果损坏,是否有办法检测到了?)   

         b: 或者 这个寄存器被占用了 ,

         以上两个原因:也会导致这个指令不能执行?

    是外部触发模式,相机的曝光时间,我们设置的一般是大于 每帧投影的时间.

  • 您好!

    1.trigger信号的配置并不会影响该寄存器的工作

    2.不会出现这种情况,验证方法是使用GUI配置sequence,使用不同的image顺序验证EVM工作是否正常。

    请给我点时间分析这个问题,谢谢。

    Best regards 

  • 您好

    没事,本身已经够麻烦您的了,再次还是非常感谢您这些天的帮助.  那个问题,我再多测几次看看.