目前的情况: 我已经实现了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,不论我如何改,我都得不到我想要的方法。希望可以指出我的错误点,谢谢!
user6236381:
有可以帮忙解答一下吗
Kevin Shi:
回复 user6236381:
您好!
感谢使用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
user6236381:
回复 Kevin Shi:
好的好的,太谢谢您了,非常感谢,我先测试…..
user6236381:
回复 Kevin Shi:
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
按照您上面的五条建议,我做了修改: 以下为我的代码,
但是通过上述设置,我发现,我的投影图像 依旧存在些问题:
上面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个图案: 难道这个指令,需要重复设置两次吗?
)
拜托了
Kevin Shi:
回复 user6236381:
您好!
可以尝试做如下修改吗?
1.0x5B修改为{0X5B,0x09.0x00,0x09,0x00,0x01,0x01}
2. 修改第6张图片的0x06为0x02
3.0×78保持{0x78,0x00,0x01}
4.提供imgAddress的值
Best regards
user6236381:
回复 Kevin Shi:
Kevin Shi
您好:
imgAddress 的数字如下
inlinebyte 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++){bytecommenStep[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++){bytecommenStep[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这个指令,没有发挥作用?
Kevin Shi:
回复 user6236381:
您好!
您可以不用将所有的代码都copy上来,因为很难阅读,只需要将相应寄存器的配置贴上来就可以了,这样比较清晰。
为了更好理解问题,请帮忙回答如下问题:
1.0×78寄存器配置成{0x78,0x00,0x01}和{ 0x78,0x01,0x00 }两种情况是否象相同?正常情况下应该是反的
2.请确认固件中的image0和image1是对应的image,顺序没有反
在确认后,是否可以做如下测试
将第一pattern的配置中的0x06改为0x02,也就是说不swap
Best regards
user6236381:
回复 Kevin Shi:
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这个指令上. 不知道为何这个指令没有产生该有的效果?
Kevin Shi:
回复 user6236381:
您好!
请问是在使用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
另外,请问目前是使用外部触发模式对吗?相机的曝光时间是怎么设置的?
user6236381:
回复 Kevin Shi:
您好: 按照GUI指导,我重新调整了顺序, 依旧和上述情况一样. 0x78的指令上的功能, 依旧没有起作用.
疑惑一: 请问,trriger_out_1, trriger_out_2,trriger_in_1,trriger_in_2,的设置,对0x78这个指令会产生影响吗?(我看了文档,貌似不会)
疑惑二:
a:是否是0x78这个寄存器损坏了(如果损坏,是否有办法检测到了?)
b: 或者 这个寄存器被占用了 ,
以上两个原因:也会导致这个指令不能执行?
是外部触发模式,相机的曝光时间,我们设置的一般是大于 每帧投影的时间.
TI中文支持网
以上我拍摄了两组: (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这个指令,没有发挥作用?




