楼主: wangkj

显卡的最新进展

[复制链接]
发表于 2009-9-10 10:23:19 | 显示全部楼层
 楼主| 发表于 2009-9-10 16:45:55 | 显示全部楼层

今天又有点进展--发现写入数据错误的原因了

sdram clk 上升沿之前,数据必须准备好,
而不是上升沿时,同时准备数据。
这个是测试代码,所以,只有1/4的数据是正确的。
        for(j=0;j<768;j++)
         for(i=0;i<1024;i++)
          {
            cursor(i,j);
            delay1ms();
            spi_write16(0);
          }

本来是全黑数据,结果,只有1/4的是全黑的。也就是1/4是正确的。
明天得改变整个程序的结构。
用fifo就是繁琐,为了性能,俺忍了。继续努力。
照片195.jpg
 楼主| 发表于 2009-9-10 16:47:07 | 显示全部楼层
for(j=0;j<768;j++)
                  {
                    cursor(j+20,j);
                        delay1ms();
                    spi_write16(0x3f<<5);
                  }
        for(j=0;j<768;j++)
                  {
                    cursor(j+30,j);
                        delay1ms();
                    spi_write16(0xf800);
                  }
        for(j=0;j<768;j++)
                  {
                    cursor(j+40,j);
                        delay1ms();
                    spi_write16(0xffff);
                  }
这几条彩线,位置都对,颜色部分对。比昨天好多了,昨天是全错。
发表于 2009-9-10 17:15:12 | 显示全部楼层
发表于 2009-9-11 09:00:28 | 显示全部楼层
狂顶!
 楼主| 发表于 2009-9-15 16:45:56 | 显示全部楼层

这次,刷新对了,但是写入数据不对

数据没有写入,明天检查,这是090904改版以来,头一次刷新正常。
这次结构做了很大调整。

估计是某个变量没控制好。明天好好检查。
照片196.jpg
 楼主| 发表于 2009-9-15 16:48:47 | 显示全部楼层
显示的数据是090904的程序写入的,
sdram其实几分钟不刷新数据都不会丢失。只是可能有几个错误数据,大部分是没问题的。
如果真的想sdram数据消失的话,只能等一天。这时候,读出来的就是混乱数据了。

读取的数据,和读取方式还有关系,不同的读取方式,读取是的乱码非常不同。

但是,如果是正常数据,不同的操作方式,回读的就是正常的了。

估计是sdram中的电荷电压处于临界态,不同读取方式,电压不同,比较结果不同所致。
发表于 2009-9-16 12:10:50 | 显示全部楼层
很不错!加油!
 楼主| 发表于 2009-9-16 13:32:59 | 显示全部楼层
原来的采用epm570的已经完全成功驱动1024*768,无等待状态输入。
epm240没有实际焊接,但支持480*272的编译结果是93%逻辑占用,应该可以用。
如果采用epm240和busy信号,应该支持640*480 25Mhz点频应该没问题,
这应该是最低成本方案,可采用stc1052 3元的单片机,采用25M晶体,从
 楼主| 发表于 2009-9-16 13:35:30 | 显示全部楼层
单片机的clk_out输出的震荡信号同时驱动8元的epm240,外加2元的sdram,总共成本应该能控制到15-20元。

如果谁有大量需要,咱可以考虑,这个低成本方案,我实在想不出来必要性。
否则,还是考虑新能更好的a3p060方案吧,这个更通用。性价比更好。这个得等一段时间。我正在努力调试中。
有时候,成本不是最主要的,主要的是有钱赚。
 楼主| 发表于 2009-9-16 13:37:22 | 显示全部楼层
我放弃epm570是因为只想支持一种cpld,不想同时支持几种,1024×768性能没有差异。
但更高分辨率,或者做更复杂的事情,epm570就不够了。
现在,同样价格的a3p060我才用到了50%的资源,哪怕支持到1920*1200也不会增加几个单元。
剩下的单元,可以做更多的事情。
发表于 2009-9-17 08:53:21 | 显示全部楼层
 楼主| 发表于 2009-9-18 17:17:32 | 显示全部楼层
这是最新结果,写数据不闪屏了,写入的第二个数据是对的。第一个可能是色彩数据可能和光标位置相同。写的数据好像少了几个。
快速刷屏,屏幕非常稳定,上午是狂闪。刚刚修正的这个bug.
希望下周能完成调试。
照片199.jpg
照片200.jpg
照片201.jpg
照片202.jpg
 楼主| 发表于 2009-9-21 11:11:48 | 显示全部楼层

单色连续数据写入已经正常

斜线如果成白色,如果单色色块不多那么几个像素,就完全正常了。
继续调试,周末虽然没干活,但一直再思考。今天这是刚刚改进的控制程序。
3.JPG
 楼主| 发表于 2009-9-21 15:54:43 | 显示全部楼层

汉字测试

有些糊,但是大致还算正确。
照片255.JPG
1.jpg
 楼主| 发表于 2009-9-23 09:48:49 | 显示全部楼层
这次,写入位置和颜色完全正确了,只是多了些拖尾,这是sdram写入信号没处理好。
照片258.JPG
 楼主| 发表于 2009-9-23 14:41:47 | 显示全部楼层
更进一步的改进,效果更好了。继续改进中。
照片259.JPG
照片260.JPG
 楼主| 发表于 2009-9-23 14:42:29 | 显示全部楼层
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);//0xffff;
              else
                 spi_write16(0x0);               
            }
            }                   
        for (j=0;j<768;j++)
                {
                                  cursor(514,j);
                                  spi_write16(0x1f);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }
        for (j=0;j<768;j++)
                {
                                  cursor(1,j);
                                  spi_write16(0x1f);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }
        for (j=0;j<768;j++)
                {
                                  cursor(1018,j);
                                  spi_write16(0x1f);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }

                for(k=0;k<100;k+=5)
                {
                  for (j=0;j<768;j++)
                {
                                  cursor(j,j+k);       
                                  if (k<5)
                                        spi_write16(0x07e0);//green
                                  else
                                  if (k<5*2)
                                        {
                                          spi_write16(0xf800); //blue
                                          spi_write16(0xf800); //blue
                                          spi_write16(0xf800); //blue
                                        }
                                  else
                                  if (k<5*3)
                                        spi_write16(0x1f); //red
                                  else
                                  if (k<5*4)
                                        spi_write16(0x0821); //灰
                                  else
                                  if (k<5*5)
                                        spi_write16(0xffff);//白               
                                  else
                                        spi_write16(0xff);//黄色               
                                }
                }


            cursor(0,645);       
        for (j=0;j<1024;j++)
                {
                                  spi_write16(0x1f);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }
            cursor(0,648);       
        for (j=0;j<1024;j++)
                {
                                  spi_write16(0x821);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }
        for (i=0;i<100;i++)
            {
                 cursor(462,334+i);       
         for (j=0;j<100;j++)
                {
                                  spi_write16(0x0ffff);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                                }
                }
                for (j=0;j<25000;j++) {delay1ms();}
                for (j=0;j<25000;j++) {delay1ms();}
                cursor(0,0);
                for(i=0;i<768;i++)
                for (j=0;j<1024;j++)
                   spi_write16(0);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。

                for (j=0;j<25000;j++) {delay1ms();}
   
                       
                for(k=5;k<6;k++)
                {
                  cursor(0,0);//clear screen
                  for(i=0;i<768;i++)
                for (j=0;j<1024;j++)
                if ((i==j)||(i==j+k*5)||(i%k==0)||(j%k==0)||(i==0)||(j==0)||(j==1023)||(i==767))
                  spi_write16(0xffff);   //for(n=0;n<1;n++);清屏 延时用2足够了,如果硬件规格高,可以省略。
                else
/*                  spi_write16(0x0);  //delay1ms(); */
                                {
                                  if (i<150)
                                        spi_write16(0x07e0);//green
                                  else
                                  if (i<2*150)
                                        spi_write16(0xf800); //blue/
                                  else
                                  if (i<3*150)
                                        spi_write16(0);
                                  else
                                  if (i<4*150)
                                        spi_write16(0xf800|0x07e0);
                                  else
                                        spi_write16(0x001f); //red/               

                                }
  
                  send_char('*');send_char(0xd);send_char(0xa);
        }  

      }
  }
 楼主| 发表于 2009-9-23 14:42:49 | 显示全部楼层
这是测试源码。
 楼主| 发表于 2009-9-24 17:29:08 | 显示全部楼层
又一点进展
照片280.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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