楼主: wangkj

显卡的最新进展

[复制链接]
发表于 2009-9-24 19:28:56 | 显示全部楼层
我有个屏保程序,老王应该弄上去,你这个走的太难看了~~
 楼主| 发表于 2009-9-25 11:27:39 | 显示全部楼层
兄弟,把你的屏保程序给我,我试试看,不过,不能超过5K,我的单片机,只有5k空间。

这次,还差一点点,左边多了2个像素,偶尔会写错数据。本来是很正规的方格,多来些线条干扰。估计是那个条件没控制好。不过,数据fifo的输入数量,和读取数量已经正确了。
照片280.jpg
照片283.jpg
照片284.jpg
照片285.jpg
照片286.jpg
 楼主| 发表于 2009-9-25 11:28:27 | 显示全部楼层
那些多余的小横线,就是bug,查找中。
发表于 2009-9-25 12:37:45 | 显示全部楼层
一段时间想在机顶盒里加一个简单的屏保程序,想起来win下有一个小球在画面上弹来弹去的屏保……
于是就想些一个这样的屏保程序,在网上搜了一把也没找到,就自己写了,开始的思路是写一个通用的y=k*x的函数,这个小logo就按照函数弹,但是那一个麻烦阿,后来的思路转变写成了下面的模样…事实证明开始的时候是自己把问题复杂化。
函数不包含图片的刷新函数,这个可以根据自己的环境写,修改x,y的步进调整线的斜率,修改初始坐标,也可以随即化,主要是写的屏保的小算法……

俺小虾米班门弄斧了哈哈…………
很多电视机也有这样的屏保,因为是盒子里面的程序不能模拟就不能传图片了……

大家有什么好的算法上传俩,这玩意这费了我N多脑细胞…………晕


目标:实现一个logo在桌面内随机直线行走碰见边缘反弹

#define     LOGO_DIAPLMENT                     64      //每次位移的像素
#define     SCREENSAVE_WIDTH                640    //大屏幕的宽、高
#define     SCREENSAVE_HIGH                   480
#define     LOGO_WIDTH                           190     //logo的宽、高
#define     LOGO_HIGH                              80

void screensave (){

       static  int pos_count_x = pos_count_y = 0;

       static  int x_last_state = y_last_state = 1;//初始状态      

         if (pos_count_x < LOGO_DIAPLMENT)
                x_last_state = 1;
         else if (pos_count_x >= SCREENSAVE_WIDTH - LOGO_WIDTH - LOGO_DIAPLMENT)
                x_last_state = 2;

        if (pos_count_y < LOGO_DIAPLMENT)
                y_last_state = 1;
         else if (pos_count_y >= SCREENSAVE_HIGH - LOGO_HIGH - LOGO_DIAPLMENT)
                y_last_state = 2;
      


            if (y_last_state == 1)
                pos_count_y += LOGO_DIAPLMENT;
            else
                pos_count_y -= LOGO_DIAPLMENT;

           if (x_last_state == 1)
                pos_count_x += LOGO_DIAPLMENT;
            else
                pos_count_x -= LOGO_DIAPLMENT;

}
发表于 2009-9-25 12:40:22 | 显示全部楼层
一共才几行程序把你那个“中文测试”模块镶嵌进去。只要把写图片和擦图片的函数加进去就行
就会出现一个弹来弹去的程序。。。。肯定比较好看

主要算法,4行
 楼主| 发表于 2009-9-25 13:15:03 | 显示全部楼层
你这里好多中文字符,咋搞的?
直接贴过来就乱码了。
 楼主| 发表于 2009-9-25 13:24:11 | 显示全部楼层
void screensave(void){

       static  int pos_count_x =0 , pos_count_y=0;

       static  int x_last_state =1,  y_last_state = 1;//初始状态      

         if (pos_count_x < LOGO_DIAPLMENT)
                x_last_state = 1;
         else if (pos_count_x >= SCREENSAVE_WIDTH - LOGO_WIDTH - LOGO_DIAPLMENT)
                x_last_state = 2;

        if (pos_count_y < LOGO_DIAPLMENT)
                y_last_state = 1;
         else if (pos_count_y >= SCREENSAVE_HIGH - LOGO_HIGH - LOGO_DIAPLMENT)
                y_last_state = 2;
      


            if (y_last_state == 1)
                pos_count_y += LOGO_DIAPLMENT;
            else
                pos_count_y -= LOGO_DIAPLMENT;

           if (x_last_state == 1)
                pos_count_x += LOGO_DIAPLMENT;
            else
                pos_count_x -= LOGO_DIAPLMENT;


                      for(y=500;y<768;y+=24)
           for(i=0;i<24;i++)                 //显示图片,汉字测试
           {
             cursor(100+y,y+i);                 //光标移动一次,连续输入数据,速度较快
                for (j=0;j<88/8;j++)  
           for (k=0;k<8;k++)
            {
              if (((pic[i*(88/8)+j]<<(k)&0x80)==0x80))
                 { spi_write16(0xffff); }
              else
                 { spi_write16(0x0);    }            
            }
            }


}
 楼主| 发表于 2009-9-25 13:24:41 | 显示全部楼层
改了一半,算了,不想了,还是找俺自己的bug吧。
发表于 2009-9-25 15:43:16 | 显示全部楼层
你就用个坐标就完事~
先把旧图片擦掉,新坐标画图~~~~
 楼主| 发表于 2009-9-25 16:17:44 | 显示全部楼层
等俺有空了,改改试试看。
 楼主| 发表于 2009-9-25 17:25:11 | 显示全部楼层
今天调整的不错,剩下很少的错误了。这是调整后的真实拍摄图片,只有少量几个错误的小点。横线方向貌似不连续的线,是数码相机和电脑分辨率差造成的。实际上是非常连续的。只有偶尔出现的几个红色点上错误的,照片上几乎看不出来。另外一个问题,就是写图像时,屏幕抖动。
照片287.jpg
照片289.jpg
照片290.jpg
 楼主| 发表于 2009-10-12 13:08:39 | 显示全部楼层
最新的现实效果,还是有些花点,屏基本不闪,算法改动很大。
照片324.jpg
 楼主| 发表于 2009-10-12 13:10:54 | 显示全部楼层
红色数字的含义:一行红色,表示的是像素位置,对齐的黄色竖线距离50点,蓝色20点,红色10点。右下的数字,表示方格线的间距,单位是像素数。这个是间距23的方格。
发表于 2009-10-12 14:46:52 | 显示全部楼层
其实这个项目就是个RAM DAC,  没有2D/3D/SSE,OPGL等功能
也就是最简单的显卡了。区别是RGB与VGA输出的不同。
显卡的缓存至少有2M,4M的SDRAM/DDRAM上真彩的基本条件。

没有好的,宽带硬件RAM DAC,失真应该比较严重,估计。

最后 还是很佩服楼主的精神的。从无到有,从设计的意念。。。。
 楼主| 发表于 2009-10-12 15:39:04 | 显示全部楼层
我这个是8M的显存,才2-3元的sdram,难度也就是因为这个。
fifo模式读写,无等待周期,只用很少的宏单元,这就是难度。
有难度,不容易被仿制才是好产品。
sdram搞定了,fifo搞定了,vga搞定。
加起来,就是这个结果,还差一点,但基本能用了。如果谁想参与,可以帮我设计pcb先。
俺相信也能搞定。
其实,%1电阻,用RGB 565格式,误差是6%,3%,6%完全在精度范围内,就是这几个电阻的选值
一直不知道该选多少,目前是:0.5k,1k,2k,4k,8k。
发表于 2009-10-13 09:54:03 | 显示全部楼层
其实网上介绍这个CPLD VGA的资料也很多的~~
 楼主| 发表于 2009-10-14 09:32:33 | 显示全部楼层
现在有个非常犹豫的事情,这可能是我自己决策错误,
本来以为,换actel的这个cpld用两个月就能搞定,现在三个月过去了,
事情还不圆满,有些问题还是不是很清楚,部分代码还得重新写。
不知道何时能完成,或许一周,或许2-3个月。最多肯定不会到年底。

如果用epm240,也可以搞定640*480 真彩模式,用
 楼主| 发表于 2009-10-14 09:40:33 | 显示全部楼层
STC的单片机,本身可以产生晶振信号,VGA 640x480@60 Hz Industry standard (pixel clock 25.175 MHz),用这个频点的两腿晶振,就很容易,低成本做出来,但缺点是需要等待,必须用busy信号在回扫区写入数据。优点是及其便宜。
本身stc单片机就几块钱,epm240都是烂大街的片子,非好便宜也非常好买。这个应该很快可以做出来。这种带等待周期的模式,对于我而言,非常容易。

如果回到3个月之前,我肯定会选择后面放方法,但是,研发就是这样,很多问题,只有做了才能发现,这种现象也很正常。

现在做的这个方案,是给mini2440配套用的,当然,也可以支持任意的其他arm(硬件略微修改),分辨率可以做到1920*1200,当然,verilog程序也非常精巧,因为精巧,时序也非常不好安排,总是出现一些小问题。而且epm240的方案,非常简单,程序复杂程度比这个小很多很多。用a3p060的方案,这么难搞,是当初无法估计的--这个片子从来没用过。
发表于 2009-10-16 12:27:42 | 显示全部楼层
帮你顶一个,不错的东西。
 楼主| 发表于 2009-10-20 11:17:12 | 显示全部楼层
基本好啦,左边多一条线。
没有花点,不闪屏,非常好。有的汉字是写图片,有的汉字是写点。所以有的汉字上面多点东西,那是以前写屏留下的痕迹。
另外,显示器不太干净,看这挺好,拍出来多了几个白点。
照片332.jpg
照片333.jpg
照片336.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表