打印

学习老X匠人,将革命进行到底---打造史上最“烂”的VGA示波器

[复制链接]
10363|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyiyi|  楼主 | 2010-4-16 19:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
                   DIY一台史上最“烂”的示波器!
         题记:既然不能做到最好,那么就让我们设法做到最烂吧,呵呵。
                                ----引用匠人语录,版权归匠人所有。

前言:
看到21IC上绝顶高手牛人老X、匠人PK对决《史上最“烂”的示波器!》,老许看后心动,久久不能平静,决心向老X、匠人学习,学习其先进的思维方式、高超的编程技巧,决定加入21IC论坛最红火的队伍中来,将革命进行到底,采用一颗更“烂”更便宜的51单片机----MPC82E54,打造一台更“烂”分辩率更高又是正常方向显示的VGA示波器!以最小系统,直接驱动CRT显示器,去打造一款“史上”(同时也是“世上”)最“烂”的VGA示波器。
在此,感谢路必康公司,赠送了做实验的笙泉51单片机及下载器。
项目还在DIY过程中,由于时间有限,计划在6月1日儿童节之前完工,借此向和老许一样,从小喜欢电子的儿童们献上一份薄礼。
回头咱们慢慢展开这个故事,沿袭老许DIY项目的一贯作风,全部赤裸裸的彻底开源,包括原理图、编程思路、学习心得、源程序代码、制作总结等一切资料。

相关帖子

来自 2楼
xwj| | 2010-4-28 20:53 | 只看该作者
Re:
1、老x根本就不是用的插值算法,每一列都是一次采样的数据,屏幕上就是真实的144次采样数据!这个变压器的输出波形就是这样的,或许电网电压的波形就是这种形状,上次横着显示是也是这种波形,还准备说下电网品质的问题,后来忘记了。
2、下图的梯形波是因为输入太大超出电源电压了,当然会削顶,还大些甚至会变成矩形波形,因为变压器的输出是9VAC,峰值会有13V,远远大于单片机的5V。
3、152*160点阵显示没什么困难,甚至更大些都没问题,只是波形复杂时最右边的波形会有点描不完整,所以才定的144*160点阵,要更大也可以,但会有其他影响,而不是极限原因。
4、老x的程序基本上是全部C语言,只有关键的地方采用汇编以减少无谓的中间传递,从程序代码只有1202字节就可用看出,绝不会是太复杂的程序,但优化的思想却不是简单的事,可不是那么容易被超越的哦~:)
5、同步不是用硬件同步的,而是通过数据同步。由于数据采样率设计成分频可调的,所以每一行都会有可能采样,并有可能处理同步,所以必然会占用显示区域的时间,影响可显示范围,这点还可以稍微优化下,但也是以牺牲内存为代价的。
6、缺点也有,正常方向显示后多消耗了很多时间,刷新速率当然就不会是实时的了,因而造成采样也是一桢一桢的。由于采样的非连续性,波形同步效果明显不如横向显示,这点其实也可以优化一下;
7、这东西,没做过就不知道会有多难、多伤脑筋,希望更多的人来挑战、超越一把!
当然,是你自己先做过、优化过才行哦~~:)
而老x的程序由于程序可读性太好,优化思想太巧妙,老x都舍不得拿出来了,由于怕拿出来大家就不肯自己去懂脑子了,所以老x藏起来了哈,等哪天顶的人多了、玩的人多了再放出来;P

使用特权

评论回复
板凳
strang| | 2010-4-16 19:31 | 只看该作者
哈哈,沙发。。。

使用特权

评论回复
地板
川页| | 2010-4-16 21:26 | 只看该作者
沙发没了……顶许工

使用特权

评论回复
5
麻辣鸭脖子| | 2010-4-16 22:16 | 只看该作者
鼓励,下文呢

使用特权

评论回复
6
huangqi412| | 2010-4-16 22:42 | 只看该作者
:o  坐等,如果是一贯作风,貌似是提篮子全部让别人做...

使用特权

评论回复
7
古道热肠| | 2010-4-16 22:56 | 只看该作者
呵呵,一个月一眨眼的功夫过去了,能出果子最好,出不来也情有可原。俺那还有一堆中颖的单片机,等您成功了,也来移植一个玩玩。

使用特权

评论回复
8
a1z26| | 2010-4-16 23:00 | 只看该作者
1# xuyiyi


反胃。

使用特权

评论回复
9
原野之狼| | 2010-4-16 23:55 | 只看该作者
潜力贴 占位

使用特权

评论回复
10
xuyiyi|  楼主 | 2010-4-17 07:27 | 只看该作者
谢谢热肠等众21IC网友的支持。
   下文将述说老许在向二位高手学习过程中,一点体会和心得,提供给和老许一样,喜爱老X、匠人制作的《史上最“烂”的示波器!》的菜鸟初入门者参考,老许坚信,只能你和老许一样,多读N遍二位高手写的**,多看N遍的《匠人手记》中“手记3  编程思路漫谈”,也能充分吸收领会二位高手高超的编程技巧、先进的思维方式,做出这么个给少年儿童玩耍的“小玩意----史上最“烂”的示波器!”。

使用特权

评论回复
11
xuyiyi|  楼主 | 2010-4-17 07:29 | 只看该作者
第一章 VGA显示器显示原理
    本章的详细内容请参阅 匠人 所著**:
DIY一台史上最“烂”的示波器!(连载中……)   
https://bbs.21ic.com/viewthread.php?tid=150419&highlight=%2B%E7%A8%8B%E5%BA%8F%E5%8C%A0%E4%BA%BA

    下面摘录了一点VGA显示器最基本的显示原理,工作时序,供参考。

(1)VGA彩色显示器简介
    这是曾经最常用的一种显示器类型,可以显示256种颜色,接收R、G、B三个模拟信号。
    VGA彩色显示器还可以运行单色应用软件。其分辨率为640×480,行频为31.5kHz,场频为60Hz。  

(2)VGA显示接口原理
    计算机显示器的显示有许多标准,常见的VGA彩色显示器一般由CRT(阴极射线管)构成,彩色是由G、R、B(绿:Green,红:Red,蓝:Blue)3基色组成。显示是采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB 3基色,合成一个彩色像素。扫描从屏幕的左上方开始,从左到右,从上到下,逐行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫描。
    对于普通的VGA显示器,其引出线共含5个信号:G、R、B(3基色信号)、HS(行同步信号)、VS(场同步信号)。
    在5个信号时序驱动时,VGA显示器要严格遵循"VGA工业标准",即640Hz×480Hz×60Hz模式。通常用的显示器都满足工业标准,因此设计VGA控制器时要参考显示器的技术规格。

(3)VGA彩色显示器行扫描、场扫描的工作时序图
    下图为VGA行扫描、场扫描的时序图。
    VGA工业标准所要求的频率:时钟频率:25.175MHz(像素输出的频率);行频:31469Hz;场频:59.94Hz。

VGA行扫描、场扫描时序图.JPG (81.36 KB )

VGA行扫描、场扫描时序图.JPG

使用特权

评论回复
12
xuyiyi|  楼主 | 2010-4-17 07:30 | 只看该作者
(4)VGA颜色编码

    下表为VGA常用七基色颜色编码
颜色   黑   蓝   红   紫   绿   青   黄   白
--------------------------------------------------
G      0    0    0    0    1    1    1    1
R      0    0    1    1    0    0    1    1
B      0    1    0    1    0    1    0    1
--------------------------------------------------

(5)VGA显示接口详解接

VGA显示接口详解.JPG (79.42 KB )

VGA显示接口详解.JPG

使用特权

评论回复
13
andy2003hu| | 2010-4-17 09:16 | 只看该作者
期望有实际意义的东西贴上

使用特权

评论回复
14
-兔子-| | 2010-4-17 14:38 | 只看该作者
腚一下,如果成功了,俺出100元高价购买一套。

使用特权

评论回复
15
xuyiyi|  楼主 | 2010-4-17 15:10 | 只看该作者
第二章 《老X用51单片机做的VGA示波器(第二版)——正常方向显示!》实现原理分析

以下文字引用老X雷人语录,原出处详见:
*老x用51单片机做的VGA示波器(第二版)——正常方向显示!
https://bbs.21ic.com/viewthread.php?tid=166725&highlight=%2Bxwj

老x再次挑战极限,看看谁能超越???
.......
曾经,当老X看到匠人发的《主题:DIY一台史上最“烂”的示波器!》时,一不小心吹了个牛:
“老X可以用几块钱的51可以每行300个点,信不信?”
......
于是,老X在消灭了不知多少个脑细胞、浪费了不知多少的休息时间之后,终于...终于把它做出来了!
显示器正常方向显示!
波形完全正常!
完全使用单片机的片内资源:256+1024字节片内RAM,
分辨率144*160(比上次的少一点点,再多就没有足够时间采样和旋转、处理数据了)
当然,ADC自然也是单片机自带的咯~

-----------------------------------------------------------------------------------------

  老X是机电全能的职业超一流高手,一不小心吹了个牛:“老X可以用几块钱的51可以每行300个点,信不信?”
  目前还没有达到每行300个点这一既定目标,只做到了每行144个点,老X的能力比老许强N倍,老许是没有能力做
到每行300个点,赤脚追赶都追不上,只能依靠天才人物老X去实现了。
  老许想通过本章节来学习老X先进超乎常人不同寻常的思维方式、高超的编程技术和技巧,先将老X的创造发明:
分辨率为144*160的VGA示波器仿制克隆出来,然后吸收消化,在二位大师的基础上,搞点小改小动小优化之类的,如采用内存和RAM更小更便宜的51芯片MPC82E54代替老X使用的MPC82G516,将144*160分辩率再提高一点,再适当加入点彩色元素,使老X匠人的创造发明:《DIY一台史上最“烂”的示波器!》成为一台名符其实的更“烂”更低档便宜的有彩色显示的VGA示波器。

(1)单片机的选择
  根据老X自述,51单片机老X采用深圳路必康公司提供的Megawin(笙泉)MPC82G516单片机。
  MPC82G516单片机主要功能如下:
■ 一般8051功能
     - 8051兼容的指令集
     - 256字节随机存取储存器RAM
     - 64K外部的数据存储器空间
     - 四个8个位双向I/O口
     - 三个16个位定时器/计数器
     - 全双工 UART
     - 14中断源,4个优先级
     - 节能模式:空闲模式,掉电模式
■ 高速 1-T 结构 80C51 内核
■ 片上 64K Flash 程序存储器
■ 片上 1024 字节扩展RAM (XRAM)
■ 额外可位寻址的 I/O 口, P4
■ I/O口结构类型
     - 准双向输出
     - 开漏输出
     - 仅输入
     - 推挽式的输出
■ 额外的外部中断 /INT2 & /INT3
■ Timer2减计数能力
■ 增强 UART 功能
     - 帧错误侦测
     - 自动地址匹配
■ 第二个 UART和配套的波特率产生器
■ 6单元PCA (可编程计数器阵列)
     - 捕捉模式
     - 16位软件定时器模式
     - 高速输出模式
     - PWM (脉冲宽度调变器) 模式
■ SPI 接口 (主/从模式)
■ 10位8通道ADC转换器
■ 8输入辅助键盘中断
■ 外部中断唤醒掉电模式
■ 3个可编程时钟输出
■ 看门狗定时器
■ 双数据指针
■ 低速外部存储器的MOVX时间延展
■ 可配置系统时钟减少耗电量
■ 电源监视功能:掉电检测和上电标志
■ ISP (在系统编程) & ICP (在电路编程) 更新程序存储器
■ IAP (在应用编程) 为应用程序写非易失性数据
■ ICE 的OCD (片上调试) 接口
■ Flash 寿命: 20,000次擦写循环
■ 时钟频率: 最高 24MHz
■ 电源: 2.4V~3.6V (3.3V 系统), or 2.7V~5.5V ( 5V or 宽电压范围系统)
■ 温度等级: -40 to +85 C
■ 封装: PDIP40, PLCC44, PQFP44, LQFP48 and SSOP28
附:笙泉MPC82G516A八位微处理器用户手册

MPC82G516A 8位微处理器中文用户手册(第三版).pdf

1.56 MB

使用特权

评论回复
16
xuyiyi|  楼主 | 2010-4-17 15:12 | 只看该作者
本帖最后由 xuyiyi 于 2010-4-17 15:13 编辑

(2)老X做的VGA示波器分辨率验证及扫描实现原理分析
先上一幅老X拍的经典VGA示波器显示图


由图中可以看出,横向18个小格,纵向20个小格(其中最下一格未显示),每一小格容纳8个点,即老X做的VGA示波器横向分辨率为18x8=144点,纵向分辨率为20x8=160点,总体分辨率为144*160点阵。

使用特权

评论回复
17
xuyiyi|  楼主 | 2010-4-17 15:15 | 只看该作者
本帖最后由 xuyiyi 于 2010-4-17 16:35 编辑

另外,从下图可以看出,老X做的经典VGA示波器横向为2点一显示,144点显示数据占据了VGA显示器288点,占了整个VGA显示器横向(640点)左边近一半的地方。而纵向两个显示点之间有空隙,证明老X未输出显示点阵,由于整个屏幕纵向全屏显示(640点),而老X的纵向分辩率仅为160点,因此,老X设计时是输出一行144点数据,停止二行数据输出,再输出下一行144点数据,停止二行数据输出,依次类推,直至160行数据全部输出完毕。

使用特权

评论回复
18
S448| | 2010-4-17 16:23 | 只看该作者
MPJ

使用特权

评论回复
19
xuyiyi|  楼主 | 2010-4-17 16:39 | 只看该作者
按照老X自述:
  显示器正常方向显示!
  波形完全正常!
  完全使用单片机的片内资源:256+1024字节片内RAM,
  分辨率144*160(比上次的少一点点,再多就没有足够时间采样和旋转、处理数据了)
  当然,ADC自然也是单片机自带的咯~

再联想到以前老X介绍的技巧:
  老x用的是随便找出来的STC的“号称1T”的单周期51,为什么是“号称1T”呢?
  因为这玩意,置位或清除个IO(位)全都要4个周期,任何比较跳转也至少要4个周期(还有更多的),读、写一个数也都要好几个周期,这个"1T"看了真是让人无语...
  所以老x根本就不是用的置位、清除IO、或延时的方法,而是用了别的技巧

匠人总结分析的结果:
  不是用的置位、清除IO、或延时的方法,难不成你用移魂(移位)大 法 (又被禁用字了一回!)?


我们不难得出结论:
  牛人老X使用的是移魂(移位)大 法 -----串行口工作方式0 !
查询《笙泉MPC82G516A八位微处理器用户手册》可得知,串行口工作方式0 输出波特率可选择为系统时钟频率的十二分之一,或者 二分之一,也就是Fosc/12 或 Fosc/2 。

  VGA工业标准所要求的频率: 时钟频率:25.175MHz(像素输出的频率); 行频: 31469Hz; 场频: 59.94Hz 。
  老X采用24.576M的晶振频率(实际24.56MHz),行频32kHz(实际31.99KHz),场频60.9Hz。

  输出一位数据占用一个系统时钟周期,在采用串行口工作方式0 输出数据时,当波特率选择为系统时钟频率的二分之一,也就是 Fosc/2 时,输出一位数据约占据二个点的显示位置和时间。从而印证了老X做的经典VGA示波器横向为2点一显示,144点显示数据占据了VGA显示器288点,占了整个VGA显示器横向(640点)左边近一半的地方。而纵向两个显示点之间有空隙,证明老X未输出显示点阵,由于整个屏幕纵向全屏显示(640点),而老X的纵向分辩率仅为160点,因此,老X设计时是输出一行144点数据,停止二行数据输出,再输出下一行144点数据,停止二行数据输出,依次类推,直至160行数据全部输出完毕。

  由于整个扫描周期时间紧凑,估计老X是通过显示一行的行同步头+后半部分扫描空余时间及下面的二行未执行扫描显示的多余时间执行采样和旋转、处理数据了,先不考虑ADC采样时间,仅先考虑旋转、处理数据,VGA显示器扫描显示三行,行同步头+640点阵显示,共计(96+40)x3+640x3=2328点,即运行2328个系统时钟周期,扣除执行显示144点(需x2)的时间,即扣除144x2个系统时钟周期,还剩余2328-144x2=2040个系统时钟周期,在这过程中,共计需执行144点的数据旋转及处理,平均每点数据执行旋转及运算时间为2040/144=14.166个系统时钟周期,由于考虑到中间需插入ADC采样及其他事件处理,实际上每点数据执行旋转及运算时间还小于14个系统时钟周期,由于笙泉MPC82G516A八位单片机很多指令执行周期需好几个系统时钟周期,能做到VGA显示分辨率144*160点阵这一步,可见老X的技术实力和功底相当雄厚,值得我们大家学习。

使用特权

评论回复
20
mcuisp| | 2010-4-17 17:23 | 只看该作者
友情支持一下

使用特权

评论回复
21
yuyixuanta| | 2010-4-17 18:29 | 只看该作者
都越来越生猛了,期待中!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

2448

帖子

6

粉丝