<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>龙天小筑 &#187; 嵌入式相关</title>
	<atom:link href="http://www.dragongod.net/category/knowleage/embed/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dragongod.net</link>
	<description>偶尔会有技术贴的个人生活小站</description>
	<lastBuildDate>Sun, 05 Feb 2012 04:12:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>近期勉强</title>
		<link>http://www.dragongod.net/2009/02/recently-study/</link>
		<comments>http://www.dragongod.net/2009/02/recently-study/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 05:14:48 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[JTAG]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[心得]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/?p=1388</guid>
		<description><![CDATA[勉强是日文。呃。

昨晚兴奋的去买了那块2440，当时很托大的跟老板说不用烧系统了，结果现在很郁闷的发现没有并口，于是附送的并口烧写线完全不能使用，不能更新BOOTLOADER，自然也就不能更换系统。瀑布的汗。研究了一上午，目前的研究结果如下：

首先，传统的U转并的线材均是针对打印机而设计的，因此对于加密狗和仿真器而言，某些信号线可能不能正确响应，从而导致不能正常使用。因此市面上的几十块钱一根的U转并线材基本是不可使用的。

然后，目前有部分公司推出了全功能并口转换器，但是价格高的惊人。单根线材需将近300大洋的价格。而在网上，则有一位德国的前辈提供了一套解决方案，据说是基于ez-usb的，目前市面上的转换器貌似也都是基于此，尽管公司宣称“硬件做了重新设计”。论其成本还是不值，尤其是并口这东西实在没有其他用处了。

<span class="readmore"><a href="http://www.dragongod.net/2009/02/recently-study/" title="近期勉强">阅读全文——共772字</a></span>]]></description>
			<content:encoded><![CDATA[<p>勉强是日文。呃。</p>
<p>昨晚兴奋的去买了那块2440，当时很托大的跟老板说不用烧系统了，结果现在很郁闷的发现没有并口，于是附送的并口烧写线完全不能使用，不能更新BOOTLOADER，自然也就不能更换系统。瀑布的汗。研究了一上午，目前的研究结果如下：</p>
<p>首先，传统的U转并的线材均是针对打印机而设计的，因此对于加密狗和仿真器而言，某些信号线可能不能正确响应，从而导致不能正常使用。因此市面上的几十块钱一根的U转并线材基本是不可使用的。</p>
<p>然后，目前有部分公司推出了全功能并口转换器，但是价格高的惊人。单根线材需将近300大洋的价格。而在网上，则有一位德国的前辈提供了一套<a href="http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/index.html">解决方案</a>，据说是基于ez-usb的，目前市面上的转换器貌似也都是基于此，尽管公司宣称“硬件做了重新设计”。论其成本还是不值，尤其是并口这东西实在没有其他用处了。</p>
<p>再然后，现在已经有USB转JTAG的方案，并且看起来很成熟，我找到的板子包括OPENJTAG、JLINK和ULINK。其中JLINK和ULINK本来都是官方的仿真器，但是都已经有山寨版了，而且相当之便宜——比如我找到的JLINK仅100大洋。对于一个USB仿真器而言，这个价格真的是白菜价了。</p>
<p>再然后，则是关于基于JTAG的BOOTLOADER下载的问题，板中提供的是三星的SJF。看了看原理，好像SJF只与JTAG有关，而与PC机接口无关。但是刚才脑中一闪，感觉又不是那么简单，因为有一篇文章提到了<a href="http://blog.chinaunix.net/u2/70540/showart_722069.html">PCI并口使用SJF的修改法</a>，文中修改代码一块，还是要改动并口的基本地址。如果使用USB的话，这一套貌似都不能使用了。具体如何做我还是一头雾水。手边也没有JLINK也不能实际试验。只能先做理论积累。等下定个JLINK，再好好研究。</p>
<p>总算开始入门了，恩。问题还真不少。不过有问题才好玩嘛，才能学到东西。回头定个JLINK，继续研究学习去。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2009/02/recently-study/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>M30固件解包原理</title>
		<link>http://www.dragongod.net/2008/06/m30-firmware-unpack-principles/</link>
		<comments>http://www.dragongod.net/2008/06/m30-firmware-unpack-principles/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 13:03:41 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[M30]]></category>
		<category><![CDATA[固件]]></category>
		<category><![CDATA[美化]]></category>
		<category><![CDATA[解包]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/443</guid>
		<description><![CDATA[囧 又发原理贴。我很恶俗啊。嗯嗯

这个原理很简单。UE打开固件，转到偏移0x728D0，就可以看见固件的索引区，即INDEX区了。里面有很多明文显示的路径名和文件名。没错。这些就是固件内包括的全部文件及其路径了。

那么解释一下，文件名很好理解。就是文件名。文件名之前的4字节，是该文件的大小，高字节在下。在这之前的4个字节，是该文件的相对偏移量，也是高字节在下。该偏移量的基准量是INDEX区的起始位置，即0x728D0。

举例来说，0&#215;72990这个地方，是固件内第一个文件的名字，叫做APPDATA\PYTABLE.bin。在其前面的4个字节是4A A3 00 00，也就是说，这个文件的大小是0x0000A34A。再前面的4个字节是00 28 00 00，也就是说，这个文件的相对偏移量是0&#215;00002800，也就是说，这个文件在固件内的绝对偏移量是0&#215;00002800＋0x728D0。

<span class="readmore"><a href="http://www.dragongod.net/2008/06/m30-firmware-unpack-principles/" title="M30固件解包原理">阅读全文——共766字</a></span>]]></description>
			<content:encoded><![CDATA[<p>囧 又发原理贴。我很恶俗啊。嗯嗯</p>
<p>这个原理很简单。UE打开固件，转到偏移0x728D0，就可以看见固件的索引区，即INDEX区了。里面有很多明文显示的路径名和文件名。没错。这些就是固件内包括的全部文件及其路径了。</p>
<p>那么解释一下，文件名很好理解。就是文件名。文件名之前的4字节，是该文件的大小，高字节在下。在这之前的4个字节，是该文件的相对偏移量，也是高字节在下。该偏移量的基准量是INDEX区的起始位置，即0x728D0。</p>
<p>举例来说，0&#215;72990这个地方，是固件内第一个文件的名字，叫做APPDATA\PYTABLE.bin。在其前面的4个字节是4A A3 00 00，也就是说，这个文件的大小是0x0000A34A。再前面的4个字节是00 28 00 00，也就是说，这个文件的相对偏移量是0&#215;00002800，也就是说，这个文件在固件内的绝对偏移量是0&#215;00002800＋0x728D0。</p>
<p>除了这8个字节和文件名以外，其他数据对解包无用。于是无视掉了。</p>
<p>就像同志们看见的，INDEX区也记录了目录。比如一上来就是APPDATA。其实也是一样的，前面的4字节是表示大小，目录的大小固定都是0。再前面的4字节记录的是偏移量，该值和该文件夹下第一个有效文件（不包括子文件夹内文件）的偏移量相同。对于APPDATA，其文件夹下第一个有效文件的偏移就是上面说的PYTABLE.BIN的偏移，因此其这4个字节也是00 28 00 00。<br />
那么解包时，读取这些数据，记录文件夹、文件名、文件大小和文件偏移。建立相应的文件夹，从相应偏移量读取相应大小的数据，并将这些数据保存在相应的文件夹内，命名为相应名字，就完成了解包了。</p>
<p>解包出来的固件，其实没啥用。。。呃。。。本意是解包后美化固件可能更为简单，但是现在发现，要组包貌似很困难。。。期待高手帮助。。。</p>
<p>以上。再度原理完毕……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/06/m30-firmware-unpack-principles/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>M30固件字库替换原理</title>
		<link>http://www.dragongod.net/2008/06/m30-replace-firmware-character-principle/</link>
		<comments>http://www.dragongod.net/2008/06/m30-replace-firmware-character-principle/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 01:05:13 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[M30]]></category>
		<category><![CDATA[固件]]></category>
		<category><![CDATA[字库]]></category>
		<category><![CDATA[替换]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/442</guid>
		<description><![CDATA[呃，这个，思路很混乱。最近比较疲劳，又有点喝多了……（台下西红柿飞来：酒鬼去死……）

（擦去脸上西红柿）咳咳。嗯。言规正传。说一下M30的字库替换原理。

M30和其他嵌入式设备一样，字体是以点阵的形式存储在机器里面的。所谓的点阵字库就是，以0、1记录点是如何显示的，并将这些点组合起来……这句话我自己都看不懂了……举例来说：菜单中的第二项上面的字是一个24×24的字，那么在固件里面，该字的存储就是一个24×24bit的一串数据，这一串里面，每一个bit是0则该点为黑，是1则该点为白色。最后，将这些点排练成一个24×24的方形，那么那些点就会组合出一个字来……貌似还是很难理解……

<span class="readmore"><a href="http://www.dragongod.net/2008/06/m30-replace-firmware-character-principle/" title="M30固件字库替换原理">阅读全文——共1743字</a></span>]]></description>
			<content:encoded><![CDATA[<p>呃，这个，思路很混乱。最近比较疲劳，又有点喝多了……（台下西红柿飞来：酒鬼去死……）</p>
<p>（擦去脸上西红柿）咳咳。嗯。言规正传。说一下M30的字库替换原理。</p>
<p>M30和其他嵌入式设备一样，字体是以点阵的形式存储在机器里面的。所谓的点阵字库就是，以0、1记录点是如何显示的，并将这些点组合起来……这句话我自己都看不懂了……举例来说：菜单中的第二项上面的字是一个24×24的字，那么在固件里面，该字的存储就是一个24×24bit的一串数据，这一串里面，每一个bit是0则该点为黑，是1则该点为白色。最后，将这些点排练成一个24×24的方形，那么那些点就会组合出一个字来……貌似还是很难理解……</p>
<p>呃，算了，点阵字库的话，大家百度一下好了。</p>
<p>实际反映出来，就是用ISE打开固件，以2.0修正版为例，将图片格式定为1位象素 2色模式，并将图片大小变为24×24，然后，跳转到0&#215;02461054偏移量，就可以看见一只“一”字，再往下翻就是“丁七万丈”等等。这就是一套点阵字库。</p>
<p>想要修改字体，就把相应字的点阵改掉就可以了。比如“一”字，我不想让他显示为一个横杠，那就改掉这24×24的图片，把它变成随便什么样的形状，那么，刷机后，凡是24×24的“一”字，都会变成你改的那个样子。</p>
<p>这就是单独修改一个字或者几个字的修改法。</p>
<p>但是，一般大家修改都是想要批量修改，就是将整个字库的字都改掉。那么一个一个修改就太累了。于是再来讲一下字库的存储格式，</p>
<p>M30里面，字库的存储是以几个名字为OUFTxx.bin的文件形式存在的，具体可参看未打包固件的\RESOURCE\LANGUAGE\CHINESE下。xx是字体的大小，有24、16、12三种。以下说明都以24的为例，其他大小的基本一样。</p>
<p>每个bin文件内，最开始是文件头，28 0A 00 00 之类 ，然后是整个字库内字的UNICODE代码，以高位在下的方式记录，就是接下来的20 00 21 00，到00 4E 01 4E，一直到84 9F 99 9F 9F 9F。这些编码取出后，查询UNICODE码表就可以得出其中用到的所有的字，就是我以前发出来的那个貌似是水帖的东西。那个就是全字库。包括英文和符号，一共2600个字符。 </p>
<p>接下来，就是点阵字库区。一个24×24的字，应该是24×24/8＝72BYTE。但是实际查看可以发现，每个字是76BYTE，中间有4BYTE的附加数据。该数据的格式貌似是00 0x 00 18。猜想其中18应该是代表24的字库，0x这个数据不定，用处也不定。但是经过某兵兄的测试，该4字节数据，只要不动他，就是正常的。所以这4BYTE数据只要照搬到我们自己修改出来的字库里面就好了。</p>
<p>另外，现有的字库替换并没有动到英文字符和符号。用ISE可以看出，英文字符和符号的编码和中文字稍微有点不同。为了避免麻烦就没有去动。不过严格按照他的样子作出来的话，应该也都是通用的。</p>
<p>所以替换字库的流程如下：首先用一些专业字模生成工具生成标准汉字字模，我用的是 字模III。当然是破解版……呃……支持正版啊！……。软件的用法就不多说。软件生成的字库是标准的一个接一个的24×24字库。所以需要写个软件处理一下，将BIN文件的头、开头的编码数据和未修改的英文字符编码数据加上，然后，从原BIN文件读取一个4BYTE的附加数据，再从生成的字库中读取72BYTE的字模数据，一个一个的组起来，由此生成一个符合标准的OUFTxx.bin。</p>
<p>然后，在固件中找到相应的OUFTxx.bin的位置，将现有的数据替换为我们自己做好的OUFTxx.bin。然后刷机。就可以完成字库替换了。</p>
<p>嗯嗯。很混乱哪。我自己都快看不懂了。不过大致就是这个样子了。</p>
<p>另：在固件中替换OUFT这个活，其实很烦。要是能把固件解包再重打包就好了。。。。。。</p>
<p>再另：求高人写个通用的生成OUFT的程序。。。呃。。我们自己写的都是简易型，拿不出手的东西。。。</p>
<p>再再另：有啥问题跟帖提问或者PM吧。。尽量给你解释。但是，本身不是语言能说清楚的，自己试试就好了。</p>
<p>再再再另：不要乱搞！这个东西很核心的。字库替换如果出错，轻则显示不正常，重可能无法开机。本人就因为漏了一字节的数据，导致机器开机不能，也不能正常方法修复，最后是拆机短接清空flash修复的……嗯。以上。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/06/m30-replace-firmware-character-principle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TI DSP中的CMD文件</title>
		<link>http://www.dragongod.net/2008/04/cmd-file-of-ti-dsp/</link>
		<comments>http://www.dragongod.net/2008/04/cmd-file-of-ti-dsp/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 03:31:43 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[CMD]]></category>
		<category><![CDATA[DSP]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/421</guid>
		<description><![CDATA[最近开始研究TI的DSP。初步接触，对CMD文件很有些头疼，经过多方学习，也和TI的一些第三方支持如北京瑞泰等接触学习了一下，终于弄明白的CMD文件的相关信息，特此共享之。

CMD的专业名称叫链接器配置文件，是存放链接器的配置信息的，我们简称为命令文件。从其名称可以看出，该文件的作用是指明如何链接程序的。

那么我们知道，在编写TI DSP程序时，是可以将程序分为很多段，比如text、bss等，各段的作用均不相同。实际在片中运行时，所处的位置也不相同。比如text代码一般应该放在flash内，而bss的变量应该放在ram内。等等。但是对于不同的芯片，其各存储器的起止地址都是不一样的，而且，用户希望将某一段，尤其是自定义段，放在什么存储器的什么位置，这也是链接器不知道的。为了告诉链接器，即将使用的芯片其内部存储空间的分配和程序各段的具体存放位置，这就需要编写一个配置文件，即CMD文件了。

<span class="readmore"><a href="http://www.dragongod.net/2008/04/cmd-file-of-ti-dsp/" title="TI DSP中的CMD文件">阅读全文——共2867字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近开始研究TI的DSP。初步接触，对CMD文件很有些头疼，经过多方学习，也和TI的一些第三方支持如北京瑞泰等接触学习了一下，终于弄明白的CMD文件的相关信息，特此共享之。</p>
<p>CMD的专业名称叫链接器配置文件，是存放链接器的配置信息的，我们简称为命令文件。从其名称可以看出，该文件的作用是指明如何链接程序的。</p>
<p>那么我们知道，在编写TI DSP程序时，是可以将程序分为很多段，比如text、bss等，各段的作用均不相同。实际在片中运行时，所处的位置也不相同。比如text代码一般应该放在flash内，而bss的变量应该放在ram内。等等。但是对于不同的芯片，其各存储器的起止地址都是不一样的，而且，用户希望将某一段，尤其是自定义段，放在什么存储器的什么位置，这也是链接器不知道的。为了告诉链接器，即将使用的芯片其内部存储空间的分配和程序各段的具体存放位置，这就需要编写一个配置文件，即CMD文件了。</p>
<p>所以，CMD文件里面最重要的就是两段，即由MEMORY和SECTIONS两个伪指令指定的两段配置。简单的说，MEMORY就是用来建立目标存储器的模型，而SECTIONS指令就是根据这个模型来安排各个段的位置。</p>
<p>MEMORY指令可以定义目标系统的各种类型的存储器，及容量。MEMORY的语法如下：</p>
<div class="hl-surround"><div class="hl-main">MEMORY <br /><br />{ <br /><br />PAGE 0 : name1[(attr)] : origin = constant,length = constant <br /><br />name1n[(attr)] : origin = constant,length = constant <br /><br />PAGE 1 : name2[(attr)] : origin = constant,length = constant <br /><br />name2n[(attr)] : origin = constant,length = constant <br /><br />PAGE n : namen[(attr)] : origin = constant,length = constant <br /><br />namenn[(attr)] : origin = constant,length = constant <br /><br />}</div></div>
<p>其中。PAGE关键词对独立的存储空间进行标记，页号n的最大值为255，实际应用中一般分为三页,PAGE 0程序存储器、PAGE 1数据存储器和PAGE 2 IO空间存储器。name为自定义的存储区间的名字，不超过8个字符，不同的PAGE上可以出现相同的名字（最好不用，免的搞混），一个PAGE内不许有相同的name。 attr的属性标识，为R表示可读；W可写X表示区间可以装入可执行代码；I表示存储器可以进行初始化，什么属性代码也不写，表示存储区间具有上述的四种属性，基本上我们都选择这种写法。origin标识了该段存储区间的起始地址，而length则是标识了该段存储区间的长度。以2407A为例，根据这个定义，参考2407A的Datasheet，可以得出2407A内存储器的标准描述为：</p>
<div class="hl-surround"><div class="hl-main">MEMORY<br />{<br />PAGE 0:							/* PROGRAM MEMORY */<br />	PM:	ORIGIN=0h,	LENGTH=08000h		/* 32k on-chip flash memory */<br />	SARAM_P:ORIGIN=08000h,	LENGTH=0800h		/* 2k saram in program space */<br />	EX1_PM:	ORIGIN=08800h,	LENGTH=07600h		/* extern ram*/<br />	B0_PM:	ORIGIN=0FF00h,	LENGTH=0100h		/* on-chip daram if cnf = 1,else<br />								extern B0 =FF00h TO FFFFh*/<br />	<br />PAGE 1:							/* DATA MEMORY */<br />	REGS:	ORIGIN=0h,	LENGTH=60h		/* memory mapped registers */<br />	BLK_B2:	ORIGIN=60h,	LENGTH=20h		/* block b2 */<br />	BLK_B0:	ORIGIN=200h,	LENGTH=100h		/* block b0,if cnf=0 */<br />	BLK_B1:	ORIGIN=300h,	LENGTH=100h		/* block b1 */<br />	SARAM_D:ORIGIN=0800h,	LENGTH=0800h		/* 2K SARAM in data space */<br />	PERIPH:	ORIGIN=7000h,	LENGTH=1000h		/* peripheral registers space */<br />	EX2_DM:	ORIGIN=8000h,	LENGTH=8000h		/* external data ram */<br />	<br />PAGE 2:<br />	IO_EX:	ORIGIN=0000h,	LENGTH=0FFF0h		/* external io mapped peripherals */<br />	IO_IN:	ORIGIN=0FFF0h,	LENGTH=0Fh		/* on-chip io mapped peripheral */<br />}</div></div>
<p>有了这个模型。我们就可以定义各个代码段在内存的具体位置了。就是使用SECTIONS伪指令。其格式为：</p>
<div class="hl-surround"><div class="hl-main">SECTIONS<br />{<br />.text:&nbsp; {所有.text输入段名}&nbsp; load＝加载地址&nbsp; run =运行地址<br />.data:&nbsp; {所有.data输入段名}&nbsp; load＝加载地址&nbsp; run =运行地址<br />.bss:&nbsp; {所有.bss输入段名}&nbsp; &nbsp; load＝加载地址&nbsp; run =运行地址<br />.other: {所有.other输入段名}&nbsp; load＝加载地址&nbsp; run =运行地址<br />}</div></div>
<p>SECTIONS必须用大写字母，其后的大括号里是输出段的说明性语句，每一个输出段的说明都是从段名开始，段名之后是如何对输入段进行组织和给段分配存储器的参数说明。以.text段的属性语句为例，“{所有.text输入段名}”这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成。接下来的load和run，链接器为每个输出段都在目标存储器里分配两个地址：一个是加载地址，一个是运行地址。通常情况下两个地址是相同的，可以认为输出段只有一个地址，这时就可以不加“run =运行地址”这条语句了；但有时需要将两个地址分开，比如将程序加载到FLASH，然后放到RAM中高速运行，这就用到了运行地址和加载地址的分别配置了。</p>
<p>load和run有一些简化写法，首先“load”关键字可以省略，“＝”可以写成“>”, “加载地址”可以是：地址值、存储区间的名字、PAGE关键词等，所以大家见到“.text:{ } > 0&#215;0080”这样的语句可千万不要奇怪。“run =运行地址”中的“ = ”可以用“>”其它的简化写法就没有了。大家不要乱用。</p>
<p>由此，一个简单的SECTIONS的代码就是：</p>
<div class="hl-surround"><div class="hl-main">SECTIONS<br />{<br />	vectors:{}&gt;	PM	PAGE 0<br />	.text:	{}&gt;	PM	PAGE 0<br />	.data:	{}&gt;	PM	PAGE 0<br />	.bss:	{}&gt;	BLK_B1	PAGE 1&nbsp; &nbsp;<br />}</div></div>
<p>这样的话，基本就可以理解CMD文件了。至于CMD的其他高级应用，暂时可以不用关心。</p>
<p>这里还需要补充说明的是：以2407A为例，0&#215;40-0&#215;43是加密位，一般编写CMD时最好错开此位，以免误加密。如果使用我这里的示例代码，那就应该在代码中以.word之类预留出加密位位置。否则一旦误加密，那。。。。本人不承担任何责任。。。呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/04/cmd-file-of-ti-dsp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>M30固件 菜单条透明原理、实现及转换工具</title>
		<link>http://www.dragongod.net/2008/04/make-m30-firmware-transport/</link>
		<comments>http://www.dragongod.net/2008/04/make-m30-firmware-transport/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 02:47:34 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[M30]]></category>
		<category><![CDATA[固件]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[透明]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/420</guid>
		<description><![CDATA[本文是群内兄弟7号兄研究出来的结果，本人只是总结了一下。呵呵。向7号同学致敬！

M30固件里面，菜单条的一个大黑边实在是很郁闷。但是实际上，可以通过美化固件，将菜单条的形状任意改变。

首先说一下原理。其实很简单的道理：M30固件里面，菜单条的形状是一个完整的矩形。但是显示出来的是圆角矩形。也就是说，有一部分图片并没有显出来。通过查看可以发现，没有显示出来的部分，颜色均为#FF00FF。那么就是说，只要是颜色为#FF00FF的像素点，固件在显示的时候，都将其做透明化处理。根据这个原理，就可以很轻松的实现任意修改固件内菜单的显示形状。

<span class="readmore"><a href="http://www.dragongod.net/2008/04/make-m30-firmware-transport/" title="M30固件 菜单条透明原理、实现及转换工具">阅读全文——共1042字</a></span>]]></description>
			<content:encoded><![CDATA[<p><strong>本文是群内兄弟7号兄研究出来的结果，本人只是总结了一下。呵呵。向7号同学致敬！</strong></p>
<p>M30固件里面，菜单条的一个大黑边实在是很郁闷。但是实际上，可以通过美化固件，将菜单条的形状任意改变。</p>
<p>首先说一下原理。其实很简单的道理：M30固件里面，菜单条的形状是一个完整的矩形。但是显示出来的是圆角矩形。也就是说，有一部分图片并没有显出来。通过查看可以发现，没有显示出来的部分，颜色均为#FF00FF。那么就是说，只要是颜色为#FF00FF的像素点，固件在显示的时候，都将其做透明化处理。根据这个原理，就可以很轻松的实现任意修改固件内菜单的显示形状。</p>
<p>但是具体实现时有一点小困难。就是在M30固件内，其图片格式是32bit的BMP，也就是一个像素点是4BYTE数据。但是一般电脑内的图片，均为24bit的BMP，其一个像素点仅为3BYTE数据。每一个像素点缺少了8bit。而且，使用的工具Image Search Editor（以下简称ISE），其对图片的导入导出也是按照24bit来进行的。所以，可能会出现外面制作好的图片，导入其中却不能使用的问题。原因就是这个样子。</p>
<p>不过，ISE内还提供了另一种方法，就是将BMP文件导出为BIN，也可以将BIN文件导入覆盖BMP。这样就能完整的保存数据。其所使用的BIN文件，其实就是去除了文件头尾的BMP文件。所以，只要有制作好的32bit的BMP，简单的处理就可以将其转换为可用的BIN。</p>
<p>那么在具体实现时，可以如下操作：首先在PS里面，新建一个293*60的图片，格式设为8bitRGB。新建完成后，先在右下角 通道 一栏中新建一个Alpha通道。完成后，就不用管了。正常的制作处理图片即可。将需要透明的点变为#FF00FF就可以。保存的时候，选BMP，并勾选 Alpha通道 选项。出来的文件应该就是一个32bit的BMP了。文件大小应该是70376字节。</p>
<p>随后，用UE之类的工具打开该文件，将文件的前54字节和最后2字节去除。文件大小变为70320字节。另存为BIN。就是一个可以使用的BIN文件了。</p>
<p>为方便使用，7号兄使用Delphi写了一个专用工具，可以实现BIN和BMP的互转，那么就不用那么麻烦的自己去用UE修改。使用该工具，就可以将文件方便的转换为需要的格式。等下7号兄就可以将该工具上传了。呵呵。</p>
<p>这样。M30内菜单的可定制性大大加强。相信大家也能做出更为个性又绚烂多彩的固件吧～^_^</p>
<p>转换工具已经上传。内附使用说明，如有不明可以留言，我尽量答复。呵呵</p>
<p><a href="http://www.dragongod.net/MyFile/M30BINTool.rar">转换工具下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/04/make-m30-firmware-transport/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intel Atom+MID</title>
		<link>http://www.dragongod.net/2008/04/intel-atom-and-mid/</link>
		<comments>http://www.dragongod.net/2008/04/intel-atom-and-mid/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 08:33:42 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[好文转贴]]></category>
		<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[科海拾贝]]></category>
		<category><![CDATA[ATOM]]></category>
		<category><![CDATA[IDF]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[MID]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/411</guid>
		<description><![CDATA[前几天一个同学说参加IDF的志愿者面试，我才知道了Intel这一年度盛事。作为CPU制造业的龙头，英老大的一举一动对业界都很有分量。这次IDF，英老大更是带来了一个伟大的小东西，应用ATOM凌动的MID设备以及台式机。

首先说下ATOM凌动。Intel于3月3日正式宣布推出迅驰凌动处理器技术“Centrino Atom”，该种处理器有两种，一种是应用在MID产品上的，其研发代号为Silverthorne；另一种是应用在华硕Eee PC与后续台式互联网终端这样的产品，其研发代号为Diamondville。貌似刚结束的IDF08上，是正式发布ATOM处理器，并同时发布其中文名凌动。

<span class="readmore"><a href="http://www.dragongod.net/2008/04/intel-atom-and-mid/" title="Intel Atom+MID">阅读全文——共1697字</a></span>]]></description>
			<content:encoded><![CDATA[<p>前几天一个同学说参加IDF的志愿者面试，我才知道了Intel这一年度盛事。作为CPU制造业的龙头，英老大的一举一动对业界都很有分量。这次IDF，英老大更是带来了一个伟大的小东西，应用ATOM凌动的MID设备以及台式机。</p>
<p>首先说下ATOM凌动。Intel于3月3日正式宣布推出迅驰凌动处理器技术“Centrino Atom”，该种处理器有两种，一种是应用在MID产品上的，其研发代号为Silverthorne；另一种是应用在华硕Eee PC与后续台式互联网终端这样的产品，其研发代号为Diamondville。貌似刚结束的IDF08上，是正式发布ATOM处理器，并同时发布其中文名<strong>凌动</strong>。</p>
<p>此次发布的凌动处理器包括5种SKU，其功耗规格在0.6瓦至2.5瓦之间，速度可以达到1.8GHz，相比之下，当今主流的移动酷睿2双核处理器的功耗在35瓦左右；其尺寸不到25平方毫米，11个处理器芯片也只有人民币一角钱硬币的大小，这使它成为英特尔历史上有史以来最小的、功耗最低的处理器。</p>
<p>英特尔同时还宣布推出针对MID平台的英特尔迅驰凌动处理器技术，该处理器技术的开发代码为“Menlow”，它包括英特尔凌动处理器、一个包含集成显卡的低功耗同伴芯片、无线通讯部件，以及更轻更薄的产品设计。</p>
<p>这些新型的芯片(设计代码为“Silverthorne”和“Dia-mondville”)将采用英特尔45纳米Hi-k金属栅极技术生产，每个细长的英特尔凌动处理器芯片的硅晶片中封装了4700万个晶体管。</p>
<p>“这是我们采用全球最小的晶体管生产出来的最小的处理器，”英特尔执行副总裁兼首席营销官SeanMaloney 说，“这一小小的奇迹是设计领域一次新的重要飞跃，它体积虽小却功能强大，足以在这些新设备上实现丰富庞杂的互联网体验。我们相信它将给业界开创新一轮的创新。” </p>
<p>恩。根据<a href="http://www.impresswatch.com.cn/itwatch/297/8064797.shtml">ImpressWatch的这篇文章</a>来看，这个小东西真的很强悍。以2.4w的功耗，可以做到1.83GHz的主频，并且有16级双流水线，性能极为强悍，而这一切仅有25个平方毫米，并且成本极低。某网站更是打出了 <a href="http://news.pconline.com.cn/hr/idf2008/0804/1259643.html">26元的处理器</a> 的标题。恩。很好很强大。</p>
<p>这个小东西出来，智能手机必然又要地震一下，看来智能手机的摩尔定律也快要生效了。事实上，据说Intel的演讲中也提到现有的400MHz的智能手机应用并不是很能满足用户体验。相信装备了ATOM的手机全面上市后，智能手机的性能将会提升很大一个层次。</p>
<p>不过，也许智能手机这个概念在Atom大面积铺开后就将不复存在，因为Intel还在推动另一项技术 MID。</p>
<p>MID，全称Mobile Internet Device，移动互联网设备。是去年春季IDF宣布的新产品。相较于英特尔先前推动的超级移动计算机（UMPC）强调是全功能的小型随身电脑，锁定移动专业人士；MID则诉求的让一般消费者也能随时随地上网汲取信息。作为介于手机和笔记本之间的一个手持设备，MID不仅具备低端笔记本的运算性能以及手机的便携性，同时还可以直接连接互联网，这将很好的满足用户在任何时间、任何地点进行自由的沟通需求。</p>
<p>而今年，Intel发布了Atom这个MID很重要的核心，同时，包括联想、华硕、明基、富士通、松下、爱国者，以及国内外好几家知名OEM、ODM厂商，均同台发布了基于英特尔凌动（Atom）处理器技术的MID产品。具体的介绍可以看<a href="http://tech.163.com/digi/08/0402/17/48HT69RL001628BV.html">网易IDF08专题的这篇文章</a>。各家的产品各有特色，但是看体积都并不大，功能却都很强悍，真的推广起来，智能手机只能载入史册，MID一统天下了～</p>
<p>这一次的IDF还真是惊喜连连，也许因为我刚入行，听见这些消息还是很振奋的，就好像去年TI峰会上听说Da Vinci架构。新技术真的很强大，应用起来前景不可限量。未来生活多美好啊……呵呵。</p>
<p>另外，貌似此次IDF08，Intel还<a href="http://tech.163.com/digi/08/0403/09/48JJBMDO001618J1.html">提到了USB3.0</a>，看来USB的又一次提速指日可待。而腾讯更是和Intel<a href="http://news.newhua.com/news1/news/2008/42/084215451893A2C053JK0C037I7DD3B4FF9JG6HG12EF2F2HKG1E303.html">联合推出了基于MID的移动QQ</a>，看来MID产品化指日可待了。恩。</p>
<p>下面是Intel Atom的LOGO，也许某天，买的手机或者电脑上，就贴着这个LOGO呢。那时候，数码生活将是怎么样的强悍哪……呵呵……<br />
<img src='http://www.dragongod.net/wp-content/uploads/2008/04/1235121_intel_news_030301.jpg' alt='1235121_intel_news_030301.jpg' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/04/intel-atom-and-mid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PIC之ICSP二</title>
		<link>http://www.dragongod.net/2008/03/pic-the-icsp-2/</link>
		<comments>http://www.dragongod.net/2008/03/pic-the-icsp-2/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 12:31:46 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[ICSP]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[复位]]></category>
		<category><![CDATA[烧写]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/400</guid>
		<description><![CDATA[最近一直在忙DSP的事情，PIC几乎没再看了。但是前两天，测试上一块产品时，发现复位不能正常使用。后来排查了一下，是ICSP时加入的二极管的问题。

现有的线路，是复位管脚出来，先过二极管，然后再连正常的复位电路。但是貌似这个样子，当点下复位键时，管脚上的高电平没有地方可以出去，使得管脚上一直保持着高电平，从而导致复位不可用。

和硬件研发研讨了一下，对电路进行了一些小小的改动，将复位开关的位置稍微变动了一下，变成下面这个情况：



<span class="readmore"><a href="http://www.dragongod.net/2008/03/pic-the-icsp-2/" title="PIC之ICSP二">阅读全文——共350字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近一直在忙DSP的事情，PIC几乎没再看了。但是前两天，测试上一块产品时，发现复位不能正常使用。后来排查了一下，是ICSP时加入的二极管的问题。</p>
<p>现有的线路，是复位管脚出来，先过二极管，然后再连正常的复位电路。但是貌似这个样子，当点下复位键时，管脚上的高电平没有地方可以出去，使得管脚上一直保持着高电平，从而导致复位不可用。</p>
<p>和硬件研发研讨了一下，对电路进行了一些小小的改动，将复位开关的位置稍微变动了一下，变成下面这个情况：<br />
<img src='http://www.dragongod.net/wp-content/uploads/2008/03/icsp.jpg' alt='icsp.jpg' /></p>
<p>这样的话，电容还是被二极管隔开。正常情况下，二极管正向偏置，复位管脚上拉。复位时，电平正常下拉到地。烧写时，复位管脚上13V的高电平使得二极管反向偏置，隔开电容负载，保证上拉速度，从而也可以正常烧写。</p>
<p>已经在现有板上测试通过，可正常复位，可正常烧写。呵呵。这样基本就算完美了吧～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/03/pic-the-icsp-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neuron芯片中SCI的应用</title>
		<link>http://www.dragongod.net/2008/01/the-sci-port-of-neuron-chip/</link>
		<comments>http://www.dragongod.net/2008/01/the-sci-port-of-neuron-chip/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 13:34:40 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[LonWorks]]></category>
		<category><![CDATA[Neuron]]></category>
		<category><![CDATA[SCI]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/394</guid>
		<description><![CDATA[前几天在做这个项目，将PIC和Neuron芯片通过SCI连接起来。不得不说ECHELON公司的文档有点不清晰。尽管文档很多，但是仅仅增加了开发者查询资料的困难程度而已。恩。

至于Neuron芯片是什么，呵呵，百度一下你就知道。大致的说就是应用于LonWorks现场总线的专用通讯芯片，内部封装了LonTalk协议的低下全部六层，用户仅需要实现第七层就可以。很方便，另一方面，也意味着不开源、封闭……呵呵，当然，这个不是我们关心的方面了。

<span class="readmore"><a href="http://www.dragongod.net/2008/01/the-sci-port-of-neuron-chip/" title="Neuron芯片中SCI的应用">阅读全文——共2424字</a></span>]]></description>
			<content:encoded><![CDATA[<p>前几天在做这个项目，将PIC和Neuron芯片通过SCI连接起来。不得不说ECHELON公司的文档有点不清晰。尽管文档很多，但是仅仅增加了开发者查询资料的困难程度而已。恩。</p>
<p>至于Neuron芯片是什么，呵呵，百度一下你就知道。大致的说就是应用于LonWorks现场总线的专用通讯芯片，内部封装了LonTalk协议的低下全部六层，用户仅需要实现第七层就可以。很方便，另一方面，也意味着不开源、封闭……呵呵，当然，这个不是我们关心的方面了。</p>
<p>从ECHELON的文档看来，好像最近才加入了SCI模块，这样就可以实现一个硬件的UART。之前的Neuron芯片虽然也提供了串行接口，但是好像是软件实现的，所以速度较慢。有硬件的移位器当然还是硬件的好。</p>
<p>然后，实际使用的话，UART仅可以进行异步通信。从名字也可以看出来么。使用IO8作为接收，IO10作为发送。在Neuron C中声明一个SCI口很简单，语法是</p>
<div class="hl-surround"><div class="hl-main">IO_8 sci [baud (const-expr)] [twostopbits] io-object-name;</div></div>
<p>其中，baud参数是用来指定波特率的，使用其中的const-expr参数来指定通讯时使用的波特率。这个const-expr是一个enum，包括SCI_300, SCI_600, SCI_1200, SCI_2400, SCI_4800, SCI_9600, SCI_19200, SCI_38400, SCI_57600, and SCI_115200这些可用的值。twostopbits如果也出现在声明句中，那么就指定通信时停止位是两位。</p>
<p>当然，程序中也可以更改波特率，使用 io_set_baud(io-obj-name, rate) 函数就可以。io-obj-name就是你定义的SCI的端口名称，rate就是列举出来的那些可用值的其中一个。要说明的是：如果在声明SCI端口时并没有指定波特率，即没有使用baud参数，那么在使用串行通信前，必须用io_set_baud来指定一个有效的波特率。</p>
<p>还有就是，这个enum是在一个默认不被包含的一个头文件里面被定义的，所以编译时可能会出现SCI_19200未被定义的错误。这时在程序的common.h或者别的头文件里面包含该头文件即可。（头文件名字忘了。。明天到公司查一下再补上……）</p>
<p>然后……这个波特率定义还真麻烦……为了能够自定义波特率，程序中一定要有这么一行参数定义</p>
<div class="hl-surround"><div class="hl-main">#pragma specify_io_clock clock-rate</div></div>
<p>其中clock-rate是你Neuron芯片外接的晶振的频率，必须是”10 MHz”，”6.5536 MHz”，”5 MHz”或者”2.5 MHz”中的一个，包括引号。</p>
<p>那么定义完成后，就可以使用SCI来进行通讯了。但是，SCI的通讯和普通IO通讯不同，熟悉的io_in和io_out是不可用的。可用的函数如下：</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">buffer</span><span style="color: Gray;">-</span><span style="color: Blue;">size</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">buffer</span><span style="color: Olive;">[</span><span style="color: Blue;">buffer</span><span style="color: Gray;">-</span><span style="color: Blue;">size</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">io_in_request</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Gray;">, </span><span style="color: Blue;">buffer</span><span style="color: Gray;">, </span><span style="color: Blue;">buffer</span><span style="color: Gray;">-</span><span style="color: Blue;">size</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">io_out_request</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Gray;">, </span><span style="color: Blue;">buffer</span><span style="color: Gray;">, </span><span style="color: Blue;">buffer</span><span style="color: Gray;">-</span><span style="color: Blue;">size</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">io_in_ready</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">io_out_ready</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">unsigned</span><span style="color: Gray;"> </span><span class="hl-types">short</span><span style="color: Gray;"> </span><span style="color: Blue;">sci_get_error</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">void</span><span style="color: Gray;"> </span><span style="color: Blue;">sci_abort</span><span style="color: Olive;">(</span><span style="color: Blue;">io</span><span style="color: Gray;">-</span><span style="color: Blue;">object</span><span style="color: Gray;">-</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>其中开始两个是buff的定义。io_in_request和io_out_request用以初始化和开始一个输入和一个输出。输入的值放在buffer里面或者输出buffer里面的值，输入或者输出的字符个数由buffer-size定义。比如，SCI接口名sciport，定义了一个unsigned short buff[20]，然后准备接收8个字符，那么就</p>
<div class="hl-surround"><div class="hl-main">io_in_request(sciport,buff,8);</div></div>
<p>至于发送方面，本人项目中没有用到，不敢乱说。呵呵。仔细研究文档+自己好好试验，肯定都能出来的。恩。</p>
<p>那么，如何判定其接收完成以进行处理动作呢？看了看文档，只是说了SCI是使用中断模式、以及提供了两个启用、禁用中断的函数，然后说在接收完buffer-size这么多数据后接收就完成。但是没有说接收完成会怎么样。好在还有一个io_in_ready。这个函数在其他情况下，返回值是指示接收是否成功完成的。不过在SCI里面，有点特殊，这个函数的返回的是当前通过SCI接收到的字符数。有了这个，就比较方便了。比如刚才的例子，我们希望每接收到8个字节就处理一下，那么就可以</p>
<div class="hl-surround"><div class="hl-main">when(io_in_ready(sciport)==8)<br />{...}</div></div>
<p>呵呵。接收部分我就发现这么多，高手也请多多指教。</p>
<p>另外，在这里也共享一段我项目里面SCI接收的代码。</p>
<div class="hl-surround"><div class="hl-main">//定义段<br />#pragma specify_io_clock &quot;10 MHz&quot;<br />IO_8 sci baud (SCI_19200) SCIPort;<br />unsigned short buff[10];<br /><br />//开机后有个定时器延时。延时结束才开始SCI接收<br />when(timer_expires(starttimer))<br />{<br />&nbsp;&nbsp; &nbsp;io_in_request(SCIPort,buff,8);<br />}<br /><br />when(io_in_ready(SCIPort)==8)<br />{<br />&nbsp;&nbsp; &nbsp;//do sth. with buff[]<br />&nbsp;&nbsp; &nbsp;.....<br />&nbsp;&nbsp; &nbsp;sci_abort(SCIPort);&nbsp; //安全起见先中断SCI<br />&nbsp;&nbsp; &nbsp;io_in_request(SCIPort,buff,8);&nbsp; &nbsp;//再度开始接收<br />}</div></div>
<p>代码测试，在3120+PIC16F73，19200,8,n,1参数下通过。可正常接收。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/01/the-sci-port-of-neuron-chip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【转】什么是嵌入式系统</title>
		<link>http://www.dragongod.net/2008/01/what-is-embed-system/</link>
		<comments>http://www.dragongod.net/2008/01/what-is-embed-system/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 07:43:04 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[转贴]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/393</guid>
		<description><![CDATA[IEEE对于嵌入式系统的定义是：An Embedded system is the devices used to control, monitor, or assist the operation of equipment, machinery or plants.嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。

在中国嵌入式系统领域，比较认同的嵌入式系统概念是：嵌入式系统是以应用为中心，以计算机技术为基础，并且软硬件可裁剪，适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成，用于实现对其他设备的控制、监视或管理等功能。

<span class="readmore"><a href="http://www.dragongod.net/2008/01/what-is-embed-system/" title="【转】什么是嵌入式系统">阅读全文——共1277字</a></span>]]></description>
			<content:encoded><![CDATA[<p>IEEE对于嵌入式系统的定义是：An Embedded system is the devices used to control, monitor, or assist the operation of equipment, machinery or plants.嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。</p>
<p>在中国嵌入式系统领域，比较认同的嵌入式系统概念是：嵌入式系统是以应用为中心，以计算机技术为基础，并且软硬件可裁剪，适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成，用于实现对其他设备的控制、监视或管理等功能。</p>
<p>嵌入式系统一般指非PC系统，它包括硬件和软件两部分。硬件包括处理器／微处理器、存储器及外设器件和I／O端口、图形控制器等。软件部分包括操作系统软件（OS）（要求实时和多任务操作）和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为；而操作系统控制着应用程序编程与硬件的交互作用。</p>
<p>嵌入式系统的核心是嵌入式微处理器。嵌入式微处理器一般就具备以下4个特点：</p>
<p>1）对实时多任务有很强的支持能力，能完成多任务并且有较短的中断响应时间，从而使内部的代码和实时内核心的执行时间减少到最低限度。</p>
<p>2）具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化，而为了避免在软件模块之间出现错误的交叉作用，需要设计强大的存储区保护功能，同时也有利于软件诊断。</p>
<p>3）可扩展的处理器结构，以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。</p>
<p>4）嵌入式微处理器必须功耗很低，尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此，如需要功耗只有mW甚至μW级。</p>
<p>嵌入式计算机系统同通用型计算机系统相比具有以下特点：</p>
<p>1、嵌入式系统通常是面向特定应用的嵌入式CPU与通用型的最大不同就是嵌入式CPU大多工作在为特定用户群设计的系统中，它通常都具有低功耗、体积小、集成度高等特点，能够把通用CPU中许多由板卡完成的任务集成在芯片内部，从而有利于嵌入式系统设计趋于小型化，移动能力大大增强，跟网络的耦合也越来越紧密。</p>
<p>2、嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。</p>
<p>3、嵌入式系统的硬件和软件都必须高效率地设计，量体裁衣、去除冗余，力争在同样的硅片面积上实现更高的性能，这样才能在具体应用中对处理器的选择更具有竞争力。</p>
<p>4、嵌入式系统和具体应用有机地结合在一起，它的升级换代也是和具体产品同步进行，因此嵌入式系统产品一旦进入市场，具有较长的生命周期。</p>
<p>5、为了提高执行速度和系统可靠性，嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中，而不是存贮于磁盘等载体中。</p>
<p>6、嵌入式系统本身不具备自举开发能力，即使设计完成以后用户通常也是不能对其中的程序功能进行修改的，必须有一套开发工具和环境才能进行开发。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2008/01/what-is-embed-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用PICSTART进行ICSP</title>
		<link>http://www.dragongod.net/2007/12/make-icsp-using-picstart/</link>
		<comments>http://www.dragongod.net/2007/12/make-icsp-using-picstart/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 12:24:14 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[ICSP]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[picstart]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/390</guid>
		<description><![CDATA[嗯，又是好久没有更新。

今次记录一下上次说的ICSP烧写线的问题，前几天，项目再度启动，将直插改为了贴片，然后，为了烧写，必然要在板上用ICSP烧了。

手头烧写器是PICSTART。在masters2007上，我也问了很多人，一般官方的回答都是：PICSTART不能ICSP，原因是驱动力太小。然后都推荐ICD2或者专业的PM3。不过，ICD2说到底不过是个调试器，拿来烧写总是有点不爽，而且手头有PICMATE，买ICD2纯属重复投资。至于PM3。。。没钱，哪位有钱的，买去……我们是没那想法……

<span class="readmore"><a href="http://www.dragongod.net/2007/12/make-icsp-using-picstart/" title="用PICSTART进行ICSP">阅读全文——共1847字</a></span>]]></description>
			<content:encoded><![CDATA[<p>嗯，又是好久没有更新。</p>
<p>今次记录一下上次说的ICSP烧写线的问题，前几天，项目再度启动，将直插改为了贴片，然后，为了烧写，必然要在板上用ICSP烧了。</p>
<p>手头烧写器是PICSTART。在masters2007上，我也问了很多人，一般官方的回答都是：PICSTART不能ICSP，原因是驱动力太小。然后都推荐ICD2或者专业的PM3。不过，ICD2说到底不过是个调试器，拿来烧写总是有点不爽，而且手头有PICMATE，买ICD2纯属重复投资。至于PM3。。。没钱，哪位有钱的，买去……我们是没那想法……</p>
<p>但是，私下和其他一些开发商交流了一下，他们说可以用PICSTART进行ICSP烧写的，并且已经成功了。所以，有成功的先例，我们就要研究并解决之。呵呵。回来之后，经过我一整天的努力，还是解决了这个小小的问题，我还是很强大的嘛，哇哈哈哈哈……</p>
<p>那么，不卖关子了，直接说一下解决方法和注意事项吧：</p>
<p>首先，原理很简单，就是把芯片对应的如下几个脚引出来：RST/ICSPDAT/ICSPCLK/VDD/VSS，然后插在烧写器的ZIP-40芯片座的相应的位置上即可。RST就是MCLR，一般是1脚，ICSPDAT和ICSPCLK就是两根数据线，一般是RB6/RB7，具体的看DATASHEET有标注，但是标注的名字可能不一样。。嗯，不过一般来说，是最后一脚和倒数第二脚。VDD和VSS就不用多说了，这里要说的是：VSS一定要引出来，因为牵涉到一个信号共地的问题，但是VDD不一定，因为PICSTART的驱动能力的确很小，所以一般都需要目标板供电，所以VDD可有可无。然后某些芯片可能有两组VSS/VDD，这时只要引出其中一组就可以了。</p>
<p>然后，关键是PCB上元件的设计，首先是ICSPCLK和ICSPDAT两个脚，最好是和外围元件之间有隔离措施，比如设计一个跳线，烧写时将跳线取下，保证这两个脚仅连接烧写信号，这是为了防止信号畸变造成的信号不可读取。因为我们的板子上面，ICSPCLK和ICSPDAT两个脚就是悬空的，所以这方面我们比较方便。但是对于使用了这两个脚的设计，最好还是隔离开比较好。这个不仅仅是使用PICSTART，使用任何烧写器进行ICSP烧写都推荐这样做。</p>
<p>然后，VDD方面，由于PICSTART驱动力着实很弱，所以一般干脆不接此脚，然后烧写时目标板也供电，即可解决。根据烧写原理揣测，供VDD是为了保证内部的ICSP模块能正常工作，那么，只要供给他5V电，他ICSP就能正常工作，至于这5V电是烧写器供的还是目标板供的，对其没有意义。不过这里也要说的是：必须是5V电，低电压的用户需要另想办法，实在不行，也跳线隔离，然后外接一个5V直流电下来……呵呵，这个只是设想，没有尝试过。原理上是可以的……至于使用ICD2和PM3来ICSP的，一般这两个设备都可以提供约100mA的电流（其实最大电流比这个值高，但是安全起见一般都标称100mA），如果目标板的电流消耗小于此值，可直接VDD连接供电，无需外接电源。直接VDD供电时，貌似VDD上不能有太大的电容负载，防止其影响上升时间，不过貌似这个在VDD上不会太有问题。</p>
<p>VSS自然不必说，接出来就行，本身就是接地的……</p>
<p>另一个关键是RST，就是MCLR。这个，根据烧写手册上说，进入烧写状态时，将会有13V的电压，烧写时，电压可达17V。所以，防电压倒灌！这个是一定一定要注意的。然后，MCHP官方的MCLR推荐电路是电阻上拉，然后有个电容接地。但是，烧写规范则是要求：该脚不得有容性负载。所以，很明显，二极管，他加了二极管。呵呵。<del datetime="2008-03-29T12:32:06+00:00">在MCLR脚出来，一根线引出去留接口，另一根线引出去，先接个二极管，然后在接正常的复位电路。这个，就是我研究一天的最大结果。有了这个二极管，基本上问题都可以解决了。</del>这样连接会导致复位不能，已经在<a href="/400">这里</a>对其进行了修改，并有相关示意图。稍微移动一下复位开关就好了。</p>
<p>这样，如上的五根线——一般用四根线，不用VDD——外围电路都搞好之后，引线出来，根据你的芯片型号，把线插到PICSTART上芯片座的相应的位置上，然后，给目标板上电，接下来，就按照正常的烧写流程来就行。呵呵。打破PICSTART不可ICSP的禁咒，就此可以实现。</p>
<p>本人使用16F914，TQFP封装，已经测试成功，目标板电流约150mA，所以目标板供电。测试烧写60次，通过率100％。嗯。呵呵。希望能对那些想用PICSTART搞ICSP的朋友们有用。那么，就到这里，再见吧～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/12/make-icsp-using-picstart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Master’s 2007 第三天学习心得</title>
		<link>http://www.dragongod.net/2007/11/master-07-learned-3rd/</link>
		<comments>http://www.dragongod.net/2007/11/master-07-learned-3rd/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 13:52:16 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[masters]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[心得]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/389</guid>
		<description><![CDATA[终于回家了——尽管在会计学院吃的好睡的好还有IPTV可以看，但是所谓JWYW不如自己的GW。不过这几天，学院的IPTV害得我一直没睡好觉。呵呵。好久没这么爽的看电视了……

嗯，好，闲话到此结束。继续最后一天的学习心得。由于昨日的突发事件，我们提前进行了DFN的学习，于是今天去听了听11075 ADC，然后第二节本来是11026 C30，但是实在觉得没意思，就去听了听11073 GUI。下午则是按照计划的11128 IAI和11045 USB。嗯。听了一天的理论啊。

<span class="readmore"><a href="http://www.dragongod.net/2007/11/master-07-learned-3rd/" title="Master’s 2007 第三天学习心得">阅读全文——共1501字</a></span>]]></description>
			<content:encoded><![CDATA[<p>终于回家了——尽管在会计学院吃的好睡的好还有IPTV可以看，但是所谓JWYW不如自己的GW。不过这几天，学院的IPTV害得我一直没睡好觉。呵呵。好久没这么爽的看电视了……</p>
<p>嗯，好，闲话到此结束。继续最后一天的学习心得。由于昨日的突发事件，我们提前进行了DFN的学习，于是今天去听了听11075 ADC，然后第二节本来是11026 C30，但是实在觉得没意思，就去听了听11073 GUI。下午则是按照计划的11128 IAI和11045 USB。嗯。听了一天的理论啊。</p>
<p>不过，今天还是没有很丰富的心得，虽然知道了很多新东西，不过，今天我的情绪好像有点不对，偏向焦躁。所以听课有点混乱。呵呵。</p>
<p>首先是ADC，实际上介绍的就是一种叫sigma-delta型的AD转换器。这种技术的AD转换原理，可以获得比一般比较式或者积分式等AD更高的信噪比和更好的精度。当然，其转换速度可能就不会很快——实际上，转换速度可能仅几十个SPS。这对于一些要求高速的应用不是很合适。但是对于一些要求精度的转换就很合适。比如，据说压力传感器的输出仅5个mA。。精度不高势必会造成称重不准。嗯。这种S-D的AD的原理，我看了半天不是很懂，好像是根据FT，得出信号的频谱图后，可以看出这种S-D的AD将采样的频率拉的很大，从而使得噪声的功率整体降低，然后再用低通滤掉高频部分，从而得到很好的信噪比。而且，这种S-D的AD一般还有频移功能，可以将噪声向高频部分驱赶，使得低频部分的噪音进一步减少。于是可以达到很高的信噪比云云。这个，抱歉，我的信号和数学都不是很好，呵呵……</p>
<p>GUI一节，讲述了MC即将推出的一款LCD驱动程序库。哦不对，是触摸屏驱动程序库。使用这套库可以很方便的在触摸屏上生成按钮、单/复选框、滚动条等标准控件，并可以方便的响应用户的触摸操作。大大简化了触摸屏程序的开发——当然，方便是有条件的，目前该驱动库仅支持两种信号的LCD控制芯片，也就是说只有内嵌该两种型号控制芯片的触摸屏才可以使用该库。并且，据说这两种芯片的屏在国内很不好买，价格也贵。汗。。不过又据说，MC正在和某知名LCD开发商合作，将会支持他们的控制芯片。这样屏就会好买很多，也便宜很多。。</p>
<p>IAI则是第三方提供的课程，讲述了某IA公司的一种IAxxxx的RF收发器模块，该模块设计理念就是让用户以最简单的方式完成RF应用——他们做到了。它们的最简单的RF应用，使用一个收发器芯片，一个晶振，最好天线附近还有一个感容带通滤波器，就可以完成了。而天线甚至可以做在PCB板上，在PCB上画出一个矩形就可以。真是赞的一塌糊涂。。而且他们还提供了运行于PIC上的一个EZMAC的库，可以在PIC中方便的使用他们的RF芯片完成RF功能。果然不愧是MC的紧密合作伙伴。当然，越是简单的东西越是昂贵。这套系统也不是很便宜。是否使用就看个人喜好了。。。</p>
<p>USB讲的就是MC芯片的USB模块。当然，还是有库，所以底层的东西基本不需要知道……但是还是讲了一些USB基础知识，比如USB1.1协议分为低速和全速，而USB2.0在这个基础上又加了高速。但是USB2.0包括USB1.1的低速和全速部分的，所以符合USB2.0的并不一定就是高速的。嗯。商家常用的噱头。然后，USB的数据传输部分，也讲了一些，还是很有意思的。不过毕竟，还是有程序库，不需要自己写底层协议。直接调用就好了。真是衷心感谢写库的大虾们……</p>
<p>嗯。为期三天的MC MASTER&#8217;S 2007终于结束了。赞。还是学到不少东西的。终于能理解为什么论坛上某位大哥要自费来参加，真的很受用。明年要是没有机会的话，我也考虑自费来参加……嗯……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/11/master-07-learned-3rd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Master’s 2007 第二天学习心得</title>
		<link>http://www.dragongod.net/2007/11/master-07-learned-2nd/</link>
		<comments>http://www.dragongod.net/2007/11/master-07-learned-2nd/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 12:37:03 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[masters]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[心得]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/388</guid>
		<description><![CDATA[今天的计划有变，下午的11126我们听了一半就跑掉了，又去提前听了11064。所以今天的学习内容是上午11120，下午11126和11064。嗯，于是明天将会去听11075、11128、11045，那个11026可能不会去听。嗯。以上。

那么开始今天的学习心得。其实今天的心得并不是很多，首先上午的11120是一个用MC芯片实现TCP/IP和RS232的转换的一个动手课，所以其实理论的东西并不是很多。所以取得的实际经验比理论多。而下午的11126实在没啥意思，所以也就没啥心得，而11064则是嵌入式系统的噪声问题，比较偏硬件，我当然也就没啥心得了。呵呵。

<span class="readmore"><a href="http://www.dragongod.net/2007/11/master-07-learned-2nd/" title="Master’s 2007 第二天学习心得">阅读全文——共1309字</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天的计划有变，下午的11126我们听了一半就跑掉了，又去提前听了11064。所以今天的学习内容是上午11120，下午11126和11064。嗯，于是明天将会去听11075、11128、11045，那个11026可能不会去听。嗯。以上。</p>
<p>那么开始今天的学习心得。其实今天的心得并不是很多，首先上午的11120是一个用MC芯片实现TCP/IP和RS232的转换的一个动手课，所以其实理论的东西并不是很多。所以取得的实际经验比理论多。而下午的11126实在没啥意思，所以也就没啥心得，而11064则是嵌入式系统的噪声问题，比较偏硬件，我当然也就没啥心得了。呵呵。</p>
<p>那么，首先是11120，使用MC芯片来实现TCP/IP。其实MC提供了一个TCP/IP协议栈的代码，使用起来还是很好用的。当然，要求芯片中也得有以太网的模块。该协议栈是C的代码。可以去MC官网下载。该协议栈功能还是比较强大的，物理层自然不必说，网络层实现了ICMP、IP和ARP协议——ICMP就是PING的协议，IP是互联网的基本协议没有什么异议，ARP则是物理解析协议，记得把IP绑到MAC上就是这个协议。然后传输层的话，自然是常用的UDP和TCP。然后应用层有NBNS/SHTP/DNS/SNMP/DHCP/TELNET/SMTP/HTTP/FTP等等协议。常有的都可以搞定。</p>
<p>当然也不要担心这么多协议，会导致协议栈的应用程序较大。因为在编译时，编译器会根据你DEFINE的一些变量来决定协议栈的部分哪些会被编译进去。所以，可以选择自己需要的部分使用就好了。嗯。赞一下。</p>
<p>那么该协议栈的调度呢，是通过一个不间断的WHILE(1)无穷循环来实现调度的。这个循环里面有若干系统的进程也可以加入用户自己的程序。但是，有一个系统进程叫StackTask，该进程务必要处在该循环体的第一位。而且其优先级也比其他进程要高。因为该循环体会进行一些解包啊什么的关键活动。而其他后面的进程的优先级基本相同，不会影响什么。但是处于习惯，用户进程一般处于该循环体的最后一位。</p>
<p>那么，这里就有个需要注意的事情，如果用户进程占用CPU较大，比如，大家经常会使用的软件循环延时，这个是非常不好的，这就会导致程序一致处在用户进程里面，导致无法出去搞到StackTask，从而导致网络数据吞吐量降低。编写时一定要注意。</p>
<p>那么后来就是在搞动手实验了。体验了一下MC的TCP/IP栈，用我们的话说叫：很好，很强大！呵呵。不过编完自己的网页还要转换为C或者BIN文件，占用宝贵的内部空间。嗯。不过的确很好，很强大。嗯。</p>
<p>那么后来的11126，其实是一个示波器的广告。而且来的AE大哥实在经验不足，所以实在没有什么听头。于是就转换了课堂，去听了听11064，DFN。这样就可以把时间腾出来明天就可以去听ADC了。呵呵。</p>
<p>DFN这节课，其实很有用的，不过时间有点不足，据说这是一节全下午的课，不过现在被压缩到2小时。所以时间比较不够。所以其实有点紧张。而且，我也实在累了，几乎没听。大致就是说了PCB怎么走线，数据怎么传等等。具体的原理，实在我也不知道了……</p>
<p>好，今天的学习笔记到此为止。呵呵。明天晚上回家再说～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/11/master-07-learned-2nd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Master’s 2007 第一天学习心得</title>
		<link>http://www.dragongod.net/2007/10/masters07-learned-1st/</link>
		<comments>http://www.dragongod.net/2007/10/masters07-learned-1st/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 14:24:06 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[masters]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/387</guid>
		<description><![CDATA[第一天学习心得如下：

第一天的下午，两门课，一个是11125 MPLAB IDE的调试，一个是11038，I2C的编程。看起来都是很基础的课。呵呵

首先是11125，MPLAB IDE的调试使用，这个听起来好像很多人都会不屑一顾，认为自己都搞PIC好久了，MPLAB调试还有啥不会的。呵呵。我本来也是这么想，不过听听课还是有发现的。主要是ICD2调试方面。当然，这可能是我没有用过ICD2的缘故，也许ICD2高手还是会不屑一顾吧。呵呵。

<span class="readmore"><a href="http://www.dragongod.net/2007/10/masters07-learned-1st/" title="Master’s 2007 第一天学习心得">阅读全文——共2472字</a></span>]]></description>
			<content:encoded><![CDATA[<p>第一天学习心得如下：</p>
<p>第一天的下午，两门课，一个是11125 MPLAB IDE的调试，一个是11038，I2C的编程。看起来都是很基础的课。呵呵</p>
<p>首先是11125，MPLAB IDE的调试使用，这个听起来好像很多人都会不屑一顾，认为自己都搞PIC好久了，MPLAB调试还有啥不会的。呵呵。我本来也是这么想，不过听听课还是有发现的。主要是ICD2调试方面。当然，这可能是我没有用过ICD2的缘故，也许ICD2高手还是会不屑一顾吧。呵呵。</p>
<p>好，闲话到此，接下来开始讨论学习心得。</p>
<p>首先说一下，ICD2之所以能够调试，原因是在广大PIC芯片里面都有一块BDM（Background Debug Module，后台调试模块），BDM平时是不工作的，但是接到调试器命令后，该模块就会开始动作， 并开始调试流程。由此也可以推断，BDM不能很大，所以其调试功能不会太强大。各位ICD2的用户也会发现吧，仅有一个断点的不爽。</p>
<p>那么，这里就要说一下BDM断点的原理：BDM会在每条指令读入时比较该指令的地址和断点地址，当发现一致时会发出一个NMI（不可屏蔽中断），从而引发一个中断。然后在该中断里面，BDM会在一个特定位置生成一些称之为DE（Debug Execution？忘了怎么拼了）的程序，这些程序负责接收上位机的指令，并进行调试活动。嗯。那么，这里就有一个问题：当BDM发现该指令是中断位置时，该指令已经进入MCU的流水线了，于是，该NMI将会在该指令完成后才能生效。也就是说，当中断时，暂停后读出的PC指针是指向下一条指令的。这一点在调试时很容易看出来。表现为断点暂停时表示PC的绿箭头指向的是下一条指令。这个现象称之为：skidding。实际上，若是在dsPIC或者PIC24F中，读出的PC是断点后的第二条指令。</p>
<p>于是，有个小问题，如果我们把断点设在一个条件跳转之类的指令位置，那么，断住之后，PC就会跳飞。表现为：停住之后表示PC指针绿箭头不知道跑哪里去了。解决方法就是：不要在这种指令处设断点(-_-b)，或者，据说添加一些NOP可以解决这个问题。实际上也是，在演示时，BTFSS后面加了两个NOP，然后单步几次，程序就又跳出来到NOP上。这个大家可以参考一下。</p>
<p>另外，还有就是，调试器有个叫做“自动单步”的功能，当在自动单步时，不会出现skidding情况。因为自动单步，只是一个软件的单步的重复。而单步的过程，BDM比较地址的时机发生在load以前。嗯。</p>
<p>然后，BDM为PIC提供的断点数量是不一样的，这点大家也都知道。一般就是8位的有1个，18F系列可能有1或者3或者5个。等等。这里就有个问题，大家知道MPLAB有个STEP OVER功能，用它可以跳过一段子程序的运行，直接跳到下一步。实际上，该功能的实现是将断点临时分配给CALL语句的下一句，从而实现STEP OVER。于是，很明显的，当断点数目已经用完时，这个是不可实现的，那么，此时的STEP OVER就会转变为一系列的自动单步的组合。这就是问题。因为大家知道，单步很慢的。如果该子程序很长，那这个STEP OVER就会很耗时间。</p>
<p>还有一个耗时间的事情是暂停调试。这个的原因是：暂停时，上位机会通过DE更新当前监视的数据。比如WATCH窗口里面的数据。这个是需要时间的。所以如果WATCH里面的变量过多的话，更新是需要很多时间的。那么，变量最多的WATCH是什么呢？MPLAB里面有两个窗口叫做：SFR和GFR，用来显示所有的GFR和SFR。这个里面的大量数据，在暂停时都需要更新的，所以如果开着这两个窗口，那么，恭喜你，暂停后你需要等好久好久。请不要着急，去泡杯咖啡吧……不过顺便说一句：MC官方也是推荐使用WATCH不要用GFR和SFR窗口。</p>
<p>这个时候的读取SFR也是有问题的。有一些副作用。比如，如果暂停时，DE更新读取那个该死的叫INDF的SFR时，INDF会自动加一。每读一次都会加一。所以，请不要把INDF加入WATCH列表。当然，INDF的问题比较特殊，MPLAB会自动屏蔽掉，即使你把它加入WATCH，也会显示不可读。还有一些SFR，MPLAB也会屏蔽。不过总有一些SFR会有问题。比如RCREG这个USART的SFR。当使用ICD2读取时是不会得到正确结果的。所以，处理SFR时，建议将SFR读入GFR，然后查看GFR的值比较好。</p>
<p>嗯。以上就是一些需要注意的地方。另外就是一些新功能，比如高级断点。18F系列的那一个断点是一个可以数据匹配和通过次数匹配的断点。而18F扩展型的一些器件有三个这样的断点。而18F的J系列，更是BT到有看门狗中断、休眠中断和跑表中断。而dsPIC的断点则有AND型断点（必须两个条件都满足才能断点）和顺序型断点（必须满足一定顺序条件才能断点）。这还是很方便的。</p>
<p>然后就是MC新出的一个叫REAL ICE的玩意，很不错哦。功能极其强大，其核心是一颗FPGA。赞。。当然价格也一样强大——500刀。。。NND。。。</p>
<p>以上就是这门基础课的收获。MC将其标为难度3还是有道理的。嗯。。不过接下来的I2C部分就实在一般了。毕竟没有用过I2C。不过有点小收获。首先，I2C的双总线上需要加上拉电阻。因为I2C的的器件默认是开路输出。</p>
<p>于是就有个小问题：如果我们要用软件模拟I2C时，使用的是普通IO口，这个IO可不是开路输出。于是，当我们用普通IO试图输出一个高电平，而本来的总线上是低电平时，会出现问题，会导致总线复位和数据混乱。而且，该IO口也容易损坏。——嗯，没有自己用过，所以无法更细致的分析，用过的人请自行分析——所以，为了避免这个情况，在使用普通IO口模拟I2C时，若需要在总线上输出高电平，请将该IO口设为输入态，输入态时，IO口对外是高阻状态，由于总线上的上拉电阻，就会在该IO口同样产生一个高电平。嗯。呵呵</p>
<p>嗯。以上就是今天基本全部收获。唉唉，会计学院这边电视有机顶盒和VOB系统，我现在一边看着《转角遇到爱》一边写日志，都有点头脑不清楚了。呵呵。大家随意看看把～明天继续～～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/10/masters07-learned-1st/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Master&#8217;s 2007</title>
		<link>http://www.dragongod.net/2007/10/masters-2007/</link>
		<comments>http://www.dragongod.net/2007/10/masters-2007/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 13:02:33 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[masters]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/386</guid>
		<description><![CDATA[什么是Microchip技术精英年会（MASTERs）？

这是为期三天的技术培训会议，也是一次专为满足当今嵌入式控制设计工程师的需要而组织的有一定技术深度的培训交流大会。通过这次会议，我们的技术人员将向您介绍Microchip的最新产品。无论是技术新手，还是资深工程师，各个技术水平的与会者都可从我们提供的若干个不同课程中找到自己感兴趣并适合自己的课程。

培训对象

如果您是在寻求解决嵌入式控制难题的方案或是一次深入的Microchip产品的技术培训的话，那您就适合来报名。通过向Microchip工程师们学习解决方案并与其进行面对面的技术交流，身为工程师和技术经理人的您将会受益匪浅。在学完整个MASTERs培训课程后，您对Microchip产品的使用能力会得到强化和充分的发挥。Microchip保留以任何理由拒绝任何个人参加的权力。我们将授予每位学完全部课程的学员一份结业证书。

<span class="readmore"><a href="http://www.dragongod.net/2007/10/masters-2007/" title="Master&#8217;s 2007">阅读全文——共2012字</a></span>]]></description>
			<content:encoded><![CDATA[<p>什么是Microchip技术精英年会（MASTERs）？</p>
<p>这是为期三天的技术培训会议，也是一次专为满足当今嵌入式控制设计工程师的需要而组织的有一定技术深度的培训交流大会。通过这次会议，我们的技术人员将向您介绍Microchip的最新产品。无论是技术新手，还是资深工程师，各个技术水平的与会者都可从我们提供的若干个不同课程中找到自己感兴趣并适合自己的课程。</p>
<p>培训对象</p>
<p>如果您是在寻求解决嵌入式控制难题的方案或是一次深入的Microchip产品的技术培训的话，那您就适合来报名。通过向Microchip工程师们学习解决方案并与其进行面对面的技术交流，身为工程师和技术经理人的您将会受益匪浅。在学完整个MASTERs培训课程后，您对Microchip产品的使用能力会得到强化和充分的发挥。Microchip保留以任何理由拒绝任何个人参加的权力。我们将授予每位学完全部课程的学员一份结业证书。<br />
上海场：上海国际会计中心<br />
日程表：<br />
2007年10月31日<br />
开始时间 结束时间 活动<br />
08:00 上午 12:00 下午 学员登记<br />
12:15 下午 01:15 下午 学院内提供午餐<br />
01:15 下午 03:15 下午 第一节课<br />
03:15 下午 03:30 下午 课间休息<br />
03:30 下午 05:30 下午 第二节课<br />
06:00 下午 06:45 下午 重要发言<br />
07:00 下午 08:30 下午 欢迎晚宴(学院内)<br />
2007年11月1日<br />
开始时间 结束时间 活动<br />
06:30 上午 08:00 上午 学院内提供早餐<br />
08:00 上午 10:00 上午 第三节课<br />
10:00 上午 10:15 上午 课间休息<br />
10:15 上午 12:15 下午 第四节课<br />
12:15 下午 01:15 下午 学院内提供午餐<br />
01:15 下午 03:15 下午 第五节课<br />
03:15 下午 03:30 下午 课间休息<br />
03:30 下午 05:30 下午 第六节课<br />
06:00 下午 07:00 下午 学院内提供晚餐<br />
2007年11月2日<br />
开始时间 结束时间 活动<br />
06:30 上午 08:00 上午 学院内提供早餐<br />
08:00 上午 10:00 上午 第七节课<br />
10:00 上午 10:15 上午 课间休息<br />
10:15 上午 12:15 下午 第八节课<br />
12:15 下午 01:30 下午 学院内提供午餐/退房<br />
01:30 下午 02:00 下午 答谢致辞及幸运抽奖<br />
02:15 下午 04:00 下午 第九节课<br />
04:00 下午 04:15 下午 课间休息<br />
04:15 下午 06:00 下午 第十节课<br />
06:00 下午 06:30 下午 培训结束</p>
<p>课程表：<br />
细节 11005 NEW : 最新的PIC®单片机产品：未来12个月 1.75 否  1<br />
细节 11009 PRC : PIC18外设配置和MPLAB® C18 C编译器的编程技巧 1.75 否  3<br />
细节 11026 C30 : MPLAB® C30 v3.0的高级特性 1.75 否  4<br />
细节 11031 FRT : Microchip 16位单片机上的FreeRTOS 3.5 是  3<br />
细节 11038 PSA : 使用PICkit™串行分析器开发I²C™ 1.75 否  3<br />
细节 11045 USB : 全速USB 1.75 否  3<br />
细节 11052 MWI : Microchip无线协议（MiWi™协议） 3.5 是  3<br />
细节 11063 EMS : Microchip 的电表解决方案  1.75 否  1<br />
细节 11064 DFN : 嵌入式系统设计中的噪声问题 1.75 否  1<br />
细节 11071 LCD : 为嵌入式工程师而准备的LCD课程 1.75 否  2<br />
细节 11072 DEE : PIC18、PIC24和dsPIC33F闪存器件的数据EEPROM仿真 1.75 否  1<br />
细节 11073 GUI : 使用PIC® MCU开发“酷酷的”图形用户界面 1.75 否  3<br />
细节 11075 ADC : 用于传感器应用的Σ-Δ ADC 1.75 否  1<br />
细节 11076 TCH : 神奇的电容式触摸传感器 1.75 否  3<br />
细节 11077 BAT : 使用PIC10F222 PIC®单片机进行电池验证 1.75 否  3<br />
细节 11095 SPH : 使用PIC24H和dsPIC33F实现G.711和G726A语音压缩 1.75 否  3<br />
细节 11120 ETH : 利用Microchip TCP/IP协议栈4.02实现以太网至RS-232转换器 3.5 是  3<br />
细节 11121 FOC : 使用dsPIC® DSC来实现PMSM带功率因子校正（PFC）的无传感器FOC 3.5 否  3<br />
细节 11122 PSP : 使用dsPIC® DSC SMPS系列的高级SMPS拓扑结构和应用 1.75 否  4<br />
细节 11123 DSP : 使用dsPIC® DSC进行信号处理：工具及应用 3.5 是  3<br />
细节 11124 P24 : PIC24F低引脚数系列的新特性 1.75 否  2<br />
细节 11125 TLS : MPLAB® IDE和开发工具：现状与未来 1.75 否  3<br />
细节 11126 MSO : 嵌入式系统的MSO调试技术 3.5 是  1<br />
细节 11128 IAI : 为您的嵌入式控制应用添加射频功能 1.75 否  2</p>
<p>嗯。本人有幸加入这场精英聚会。所以，现在小弟就在会计中心。呵呵。</p>
<p>透漏一下本人的日程：<br />
今天：11125、11038<br />
明天：11120、11120、11126、11126<br />
后天：11064、11026、11128、11045</p>
<p>和各位共勉，共同学习～呵呵～～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/10/masters-2007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DelayGen发布</title>
		<link>http://www.dragongod.net/2007/10/delaygen-released/</link>
		<comments>http://www.dragongod.net/2007/10/delaygen-released/#comments</comments>
		<pubDate>Sat, 20 Oct 2007 23:02:33 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[软件网络]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[延时]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/385</guid>
		<description><![CDATA[以前转了一篇延时的文章，呵呵。其实我写了一个VB的程序，可以根据这个来生成延时代码的。曾经在pic16上发布过的，地址：http://pic16.com/bbs/dispbbs.asp?BoardID=9&#038;ID=25231。不过发布后，实际使用中发现了很多问题，并进行了多次更新。只是一直没有时间发到网上来大家分享。今天把它整理一下发上来^_^

该程序名叫DelayGen，借用KeyGen的创意，呵呵，就是延时生成器的意思。程序根据前面转载的那篇文章的计算原理，可进行二重循环延时时间的计算，并可根据给定的延时时间来求出最佳循环参数值。同时，可以给定参数或计算结果生成8位PIC汇编代码。

<span class="readmore"><a href="http://www.dragongod.net/2007/10/delaygen-released/" title="DelayGen发布">阅读全文——共997字</a></span>]]></description>
			<content:encoded><![CDATA[<p>以前转了一篇延时的文章，呵呵。其实我写了一个VB的程序，可以根据这个来生成延时代码的。曾经在pic16上发布过的，地址：<a href="http://pic16.com/bbs/dispbbs.asp?BoardID=9&#038;ID=25231">http://pic16.com/bbs/dispbbs.asp?BoardID=9&#038;ID=25231</a>。不过发布后，实际使用中发现了很多问题，并进行了多次更新。只是一直没有时间发到网上来大家分享。今天把它整理一下发上来^_^</p>
<p>该程序名叫DelayGen，借用KeyGen的创意，呵呵，就是延时生成器的意思。程序根据前面转载的那篇文章的计算原理，可进行二重循环延时时间的计算，并可根据给定的延时时间来求出最佳循环参数值。同时，可以给定参数或计算结果生成8位PIC汇编代码。<br />
最新的1.50版可以生成C代码，该C代码在PICC编译环境下，将会编译成和汇编完全相同的代码。方便C的伙计们使用——不过8位机，没多少人用C吧，呵呵……<br />
程序在VB6.0+VISTA/WIN2000测试通过。<br />
目前版本号：v1.50 beta，更新时间：2007.12.11<br />
更新历史：<br />
v1.50 beta<br />
添加C的延时代码生成支持<br />
修正若干BUG（详细的不记得了）<br />
添加“关于”按钮<br />
v1.16<br />
（再往前的详细历史不记得了-_-b)<br />
修正计算错误，计算中参数使用浮点数代替以前的长整型，保证计算结果正确<br />
修改生成代码显示方式，取消X/Y变量及其定义，改用立即数，便于在程序中使用多个延时<br />
修改计算限制，目前时间计算可支持到X=255/Y=255/N=255，根据时间求解可支持到X=255/Y=255/N=20<br />
修改根据时间求解部分计算时代码，计算时计算按钮将暂时不可用，并且结果区显示“计算中。。。。”<br />
添加更多频率支持，目前支持4/7.3728/8/10/12/16/20MHz频率<br />
其他一些细小更新（其实是我不记得了-_-b）<br />
v1.00<br />
完成基本功能，可进行时间计算、根据时间求解及代码生成<br />
已知问题：<br />
VB6.0程序需要VB运行库，下载地址：<a href="http://www.skycn.com/soft/2944.html">http://www.skycn.com/soft/2944.html</a><br />
程序根据时间求解部分使用穷举法，求解较长延时时间时会比较慢，请耐心等待-_-b<br />
程序大小：60K<br />
下载地址：<a href="http://www.dragongod.net/MyFile/DelayGen.exe">请点击这里</a></p>
<p>UPDATE 2010-03-22</p>
<p>杯具的发现之前的链接地址写错了，已修正。</p>
<p>不知不觉三年了，PIC也好久不用，这小程序也好久不更新了，现把源代码一并附上，有兴趣的朋友自己拿去改吧。VB6工程。</p>
<p>下载地址：<a href="http://www.dragongod.net/MyFile/DelayGen.rar">请点击这里</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/10/delaygen-released/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>【转】关于PIC常用软件延时的精确计算公式</title>
		<link>http://www.dragongod.net/2007/10/pic-delay-time-calculate/</link>
		<comments>http://www.dragongod.net/2007/10/pic-delay-time-calculate/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 23:00:10 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[延时]]></category>
		<category><![CDATA[计算]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/384</guid>
		<description><![CDATA[原帖地址：http://www.pic16.com/bbs/dispbbs.asp?boardID=9&#038;ID=22973

延时在单片机应用中经常要用到，不管是测试还是正是的开发的程序中延时子程序都是随处可见。而延时又分硬件延时和软件延时。本贴所要说的延时是指常用的二重循环的软件延时，并推导出准确的计算公式，该公式能精确到一条指令都不差。因为软件延时比较耗CPU资源，所以可能用的地方不多，也没必要精确一条不差那么准，但我推导的公式也许对这有兴趣的人可能有用。

<span class="readmore"><a href="http://www.dragongod.net/2007/10/pic-delay-time-calculate/" title="【转】关于PIC常用软件延时的精确计算公式">阅读全文——共1518字</a></span>]]></description>
			<content:encoded><![CDATA[<p>原帖地址：<a href="http://www.pic16.com/bbs/dispbbs.asp?boardID=9&#038;ID=22973">http://www.pic16.com/bbs/dispbbs.asp?boardID=9&#038;ID=22973</a></p>
<p>延时在单片机应用中经常要用到，不管是测试还是正是的开发的程序中延时子程序都是随处可见。而延时又分硬件延时和软件延时。本贴所要说的延时是指常用的二重循环的软件延时，并推导出准确的计算公式，该公式能精确到一条指令都不差。因为软件延时比较耗CPU资源，所以可能用的地方不多，也没必要精确一条不差那么准，但我推导的公式也许对这有兴趣的人可能有用。</p>
<p>二重循环延时公式：T(x,y,n)=nxy+3xy+4x+5（x为外循环变量值， y为内循环变量值，n为内循环中nop指令的个数）</p>
<p>三重循环延时公式：T(x,y,z,n)=(3+n)xyz+4xy+4x+5;  (x为最外层循环变量值，y为第二层循环变量值，z为最里层循环变量值,n为内循环中nop指令的个数)</p>
<p>n重循环：T(a1,a2,..,an,n)=(3+n)a1a2..an+4(a1a2..an-1+a1a2..an-2+..+a1)+5;(a1为最外层循环变量值，a2为第二层循环变量值，其他的依次类推，an为最里层循环变量值，n为最里层循环nop指令的个数)</p>
<p>具体的延时程序格式以其测试程序见下面的程序：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">list p=16f877a,r=hex</li>
<li>&nbsp;#include&quot;p16f877a.inc&quot;</li>
<li>;***************************************</li>
<li>&nbsp;cblock 21h</li>
<li>&nbsp;&nbsp; del_count1,del_count2</li>
<li>&nbsp;endc</li>
<li>;***************************************</li>
<li>#define&nbsp; x .100</li>
<li>&nbsp;</li>
<li>#define&nbsp; y .32</li>
<li>&nbsp;</li>
<li>;***************************************</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;org&nbsp; &nbsp; &nbsp;0000h</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto&nbsp; &nbsp;main</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;org&nbsp; &nbsp; &nbsp;0008h</li>
<li>main</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;该处设一个断点，运行到此处，stopwatch应清0</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;call&nbsp; &nbsp; &nbsp;delay</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;该处再设一个断点，运行到此处的stopwatch的值应减1才为Delay的准确时间</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto&nbsp; &nbsp;$</li>
<li>;**************************************************</li>
<li>;*&nbsp; 延时时间T(x,y)=nxy+3xy+4x+5(us)假设晶振为4MHz&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</li>
<li>;*&nbsp; x为外循环变量值，y为内循环变量值。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</li>
<li>;*&nbsp; n为内循环中nop指令的个数。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *</li>
<li>;*&nbsp; 计算过程：&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</li>
<li>;*&nbsp; &nbsp; T(x,y)=2+1+1+[1+1+(1+2)*y-1+1+2]*x-1+2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</li>
<li>;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =nxy+3xy+4x+5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</li>
<li>;**************************************************</li>
<li>delay</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;movlw&nbsp; &nbsp; &nbsp; &nbsp;x</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;movwf&nbsp; &nbsp; &nbsp; del_count1</li>
<li>del01</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;movlw&nbsp; &nbsp; &nbsp; y</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;movwf&nbsp; &nbsp; &nbsp;del_count2</li>
<li>del02</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;此处的nop指令个数n可以随意添减，此处为2条，但建议1到5条为宜，再多就没意义了。</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nop</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;decfsz&nbsp; &nbsp; &nbsp;del_count2,f</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto&nbsp; &nbsp; &nbsp; &nbsp;del02</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;decfsz&nbsp; &nbsp; &nbsp;del_count1,f</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto&nbsp; &nbsp; &nbsp; &nbsp;del01</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return</li>
<li>;******************************************</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</li>
<li>&nbsp;</li>
<li>;当内循环nop指令为0个时: Tmax=T(255,255)=196100us=196.1ms</li>
<li>&nbsp;</li>
<li>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmin=T(1,1)=12us=0.012ms</li>
<li>&nbsp;</li>
<li>;故在该情况下延时范围为:(12us~196.1ms)</li></ol></div>
<p>注：因为本公式为正向推导的过程，所当确定一个需要延时的时间T时，反向推导它会有多种x,y,n的组合，但肯定有一种时最佳（既最接近）的组合，有兴趣的朋友可以写个程序来计算出这个最佳组合。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/10/pic-delay-time-calculate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PIC之端口使用</title>
		<link>http://www.dragongod.net/2007/10/the-io-port-of-pic/</link>
		<comments>http://www.dragongod.net/2007/10/the-io-port-of-pic/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 12:44:39 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[IO]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/383</guid>
		<description><![CDATA[嗯，好久没更新了。看见那位兄弟给我的留言，真是汗颜。。。呵呵

其实，有时候我是属于那种会做不会说的，所以很多东西我算是知道，但是不会表述。呵呵。总之，在这里尽量写下自己的心得就好了吧。

嗯。言规正传。今天讲讲基本的IO口。呵呵。

其实，IO口并没有什么特别好讲的。输入输出而已么。但是值得一提的是，PIC这个BT单片机的输入输出的驱动力很强悍，这个貌似是公认的。我也没用过别的，不好评判，但是别人都这么说，我也姑且听之吧。

<span class="readmore"><a href="http://www.dragongod.net/2007/10/the-io-port-of-pic/" title="PIC之端口使用">阅读全文——共1751字</a></span>]]></description>
			<content:encoded><![CDATA[<p>嗯，好久没更新了。看见那位兄弟给我的留言，真是汗颜。。。呵呵</p>
<p>其实，有时候我是属于那种会做不会说的，所以很多东西我算是知道，但是不会表述。呵呵。总之，在这里尽量写下自己的心得就好了吧。</p>
<p>嗯。言规正传。今天讲讲基本的IO口。呵呵。</p>
<p>其实，IO口并没有什么特别好讲的。输入输出而已么。但是值得一提的是，PIC这个BT单片机的输入输出的驱动力很强悍，这个貌似是公认的。我也没用过别的，不好评判，但是别人都这么说，我也姑且听之吧。</p>
<p>然后，关于很基本的IO口初始化，众所周知TRIS系列寄存器了吧，呵呵。这里有个常识：Microchip之前提供了一个叫做“TRIS”的指令，后来就变成了不推荐使用该指令，再后来新的芯片，就完全不支持该指令了。所以，如果你看的教程上还在说TRIS指令怎么怎么，请抛弃之，老老实实的换到BANK1去修改TRIS系列寄存器吧。</p>
<p>然后，由于种种原因，PIC的IO口是功能复用的。这个大家都知道，就是那些所谓的RA0/RA1啥的还可以当作AN0/T0CK1/TX等等使用么。但是这里就要注意，如果你什么功能也不想要，就想要基本的数字IO口功能，那么初始化时也要注意对使用到的IO口的复用功能也稍微注意一下，比如，PORTA系列口一般都兼有AD输入通道的功能，那么如果你并不想要用AD功能，初始化也务必对AD的相关寄存器进行一些设置，确保AD功能关闭以及PORTA分配为数字IO。因为很多芯片复位后，默认的一些组件的设置是打开的，从而占用了相应的IO口，使其丧失基本数字IO功能。为正常使用，务必进行处理。</p>
<p>当然，工作量很大，意味着你要对该IO口的复用功能要熟悉，并且要看其附属功能的设置说明。不过，这总比不能正常工作好吧～呵呵。而且，有个小技巧，Datasheet上，对IO口介绍的一章里面，都有每个PORT的初始化的例程的，这个例程就是按照该芯片将该IO置为标准数字IO来写的。比如16F91x的DS（DS41250E），在对PORTA的介绍中（P31)，进行基本介绍后就有一个示例代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">BCF STATUS,RP0 ;Bank 0</li>
<li>BCF STATUS,RP1 ;</li>
<li>CLRF PORTA ;Init PORTA</li>
<li>BSF STATUS,RP0 ;Bank 1</li>
<li>BCF STATUS,RP1 ;</li>
<li>MOVLW 07h ;Set RA&lt;2:0&gt; to</li>
<li>MOVWF CMCON0 ;digital I/O</li>
<li>CLF ANSEL ;Make all PORTA I/O</li>
<li>MOVLW F0h ;Set RA&lt;7:4&gt; as inputs</li>
<li>MOVWF TRISA ;and set RA&lt;3:0&gt;</li>
<li>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; as outputs</li>
<li>BCF STATUS,RP0 ;Bank 0</li>
<li>BCF STATUS,RP1 ;</li></ol></div>
<p>这就是一个91x芯片PORTA口初始化为标准数字IO口的标准代码。复制粘贴到你的程序中初始化段使用吧^_^</p>
<p>当然——不要忘记修改其中对TRISA的赋值以满足你自己的要求～呵呵</p>
<p>那么，从代码里面也可以看出，程序在初始化PORTA的功能和输入输出之前，首先把PORTA的值清空了。这也是MC官方推荐的，在处理相关寄存器前，尤其处理TRIS系列寄存器之前，务必将PORT系列寄存器置为一个可知状态，否则可能出现不可预料的后果——其实很好理解，芯片复位后，PORT寄存器的值是随机的，那么好，假设你的RA0口下面是一个伟大的阀门，是一个轻易不可乱开的金库之门，那么复位时你的PORTA的第0位又不幸随机为了1，那么在你设置TRISA后的一刹那，恭喜你，那个门已经打开了……等着你的黄金被拿光吧……所以，务必在设置TRIS之前，先确保PORT口状态已知。呵呵。</p>
<p>然后，顺便说一下，一般设计产品，不会把所有的IO口都用掉。那么，空闲的IO口在电路板上如何处理，也是一个问题。经过我在几个论坛和若干位高手请教之后，得出的结论如下：首先，MC的芯片，复位后所有的IO口均是输入状态。这肯定是有道理的，所以，空闲的IO口，请务必设置为输入状态。随后，一般来说，如果没有特别的需要，引脚悬空也可以。但是据说这样会引起ESD问题。所以一般推荐是一个电阻上拉到5V，或者一个电阻拉到地。如果你的产品对ESD要求较高或者你自己对板子的稳定要求较高，建议还是不要悬空，呵呵。不过我现在出的几个东西，芯片空脚都是悬空的……反正我们对ESD要求不高……呵呵</p>
<p>嗯。今天IO扯淡先到此。^_^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/10/the-io-port-of-pic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PIC之ICSP</title>
		<link>http://www.dragongod.net/2007/09/the-icsp-of-pic/</link>
		<comments>http://www.dragongod.net/2007/09/the-icsp-of-pic/#comments</comments>
		<pubDate>Sun, 16 Sep 2007 10:08:13 +0000</pubDate>
		<dc:creator>龙天</dc:creator>
				<category><![CDATA[嵌入式相关]]></category>
		<category><![CDATA[ICSP]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[心得]]></category>

		<guid isPermaLink="false">http://www.dragongod.net/382</guid>
		<description><![CDATA[呵呵，PIC讲堂再度开张。嗯。保持每周一篇，也很不错么。

今次要说的是ICSP。ICSP，全称In-Circuit Serial Programming，在线串行编程。这行英文和ICSP这四个字母，一般使用时都带有TM标记的，也就是说，这是MICROCHIP的商标。也是MC独有的吧。呵呵。

从名字可以看出来，ICSP是一种编程方法，也就是说是一种烧写手段。这种手段可以在线烧写——即不需要将芯片取下就可以在板子上烧写。而这种烧写方法使用串行的数据。在线烧写其实也不是什么新闻了，大家熟悉的TI的DSP，一向可以使用JTAG口进行烧写，那就是标准的在线烧写。

<span class="readmore"><a href="http://www.dragongod.net/2007/09/the-icsp-of-pic/" title="PIC之ICSP">阅读全文——共3236字</a></span>]]></description>
			<content:encoded><![CDATA[<p>呵呵，PIC讲堂再度开张。嗯。保持每周一篇，也很不错么。</p>
<p>今次要说的是ICSP。ICSP，全称In-Circuit Serial Programming，在线串行编程。这行英文和ICSP这四个字母，一般使用时都带有TM标记的，也就是说，这是MICROCHIP的商标。也是MC独有的吧。呵呵。</p>
<p>从名字可以看出来，ICSP是一种编程方法，也就是说是一种烧写手段。这种手段可以在线烧写——即不需要将芯片取下就可以在板子上烧写。而这种烧写方法使用串行的数据。在线烧写其实也不是什么新闻了，大家熟悉的TI的DSP，一向可以使用JTAG口进行烧写，那就是标准的在线烧写。</p>
<p>MC的ICSP，使用起来极为方便，应用ICSP进行烧写，只需要使用芯片上的5个脚就可以，其中包括VDD VSS，这两个电源一定要供上。然后就是VPP编程电压，这个是肯定的，对FLASH进行烧写，当然需要高一点的电压。随后就是输入的数据和时钟两个脚。一般是PORTB口的RB6和RB7——当然，那些不分PORT只有GPIO的芯片请参看DATASHEET找到相应的ICSP口——那么也就是说，其实，真正的和烧写数据有关的就两个脚。标准的串行的风格呢，呵呵。</p>
<p>其原理，MICROCHIP官方没有说的太多，只是对每一种芯片都给了一个Programming Specification。上面详细给出了通过ICSP方式连接芯片时，对芯片内存储空间操作的各指令的具体形式。从那些文档中推断，我们可以简单的认为在PIC芯片中，烧写模式下，FLASHROM和外部接口之间有一个“处理接口”，该接口从外部通过串行方式接收命令，移位译码后进行外部设备需要的操作，随后如需要结果的话就把结果同样串行输出。当然实际上这个所谓的接口可能只是一块电路。但是可以肯定的是，FLASH并不是暴露在外直接和外界连接的，而是先要连到ICSP模块，然后才能连上外界。</p>
<p>这就有个好处，就是加密安全性的问题。因为FLASHROM并不是直接和外界相连，所以外界如果要读取FLASHROM内部的内容，正常情况下就必须通过ICSP模块。而ICSP模块如果检测到加密位有设置的话，那就拒绝执行外部的相应的读取命令，返回全0值。但是其实，数据在芯片内部并没有被加密，所以正常的程序访问不会受到干扰。</p>
<p>呵呵，不过其实，我想现在的芯片应该都是这个原理来加密的吧。要不然让软件自己实现软解密再执行也忒有点难度了。。那么这个原理加密的芯片就有几点不好，第一就是数据在FLASHROM里面是未加密的。也就是说，数据的安全性完全取决于ICSP模块的安全性。如果ICSP模块设计有任何的考虑不周，那么程序基本就等于没加密。。事实上MICROCHIP的某些老产品的ICSP模块设计就有问题。我手里一块解密的16F73芯片，据说只是使用了一些很简单的手法就绕过了ICSP加密。。。另外，还是因为数据没有加密，所以，物理解密仍然是不可防御的。只要别人能够到达你的FLASHROM区域，那么你的程序就宣告破解了。这一点是没有办法的。目前所有的单片机都会有这样的问题。但是貌似TI的DSP在这一块做的非常好。据前辈透露：TI的DSP内核是两层，上层是应用及处理层，下层才是FLASHROM层。这样即使物理法拿出了内核，也会因为内核是两层，无法较好的去除上一层而露出下一层的FLASHROM。从而大大加强了芯片的安全性。。。当然，同时也大大加强了成本。。</p>
<p>另外要补充一点的是：ICSP这种方式，外部实现是极为简单的，只要能提供完全符合Programming Specification的信号就行。所以网上可以看见很多种骨灰级玩家自制的烧写器。使用起来和原厂的PICSTART＋之类没什么区别——事实上，也有自制PICSTART+的。。——并且，在有新芯片出来时，烧写器可以很方便的升级，只要重写一下烧写器内部芯片的代码，加入新芯片的烧写命令代码就行了。而烧写器的内部芯片。。一般也是PIC。。。可以ICSP升级。。嗯。。用ICSP升级PIC以支持新的PIC的ICSP。。是不是很像绕口令？呵呵。。</p>
<p>那么，ICSP这个东西具体应该怎么使用呢？呵呵，这个问题问的好。首先我们要解释一点就是：除了一些很老的产品如16C5X系列之外，基本所有的MICROCHIP芯片均采用ICSP技术。而且，只要采用了ICSP技术，那么烧写时肯定使用ICSP烧写。也就是说：在烧芯片时，虽然看起来是把芯片的28pin或者40pin全部放在烧写器的芯片座上的，但是实际上，起作用的也就那5个脚。。。很惊讶吧，呵呵。有时候有的东西就是这么神奇。去看看自制烧写器的原理图就明白了～</p>
<p>那么，真正用在板子上的话，就是把我们要用到的5个脚引出来，就可以使用ICSP了。但是，当然也有需要注意的地方：首先，VPP脚，就是芯片的MCLR脚，一般是1脚，在编程时会有大约13V的电压。鉴于一般设计时，会将该脚连接一5V电源电路，所以就需要注意确保，烧写的13V电压不会倒灌回5V电源电路造成损坏。而且，根据Programming Specification，烧写时VDD和VPP加电压的时序是需要保证的，所以在VPP上不要有太大的电容负载，避免造成电压上升时间过慢从而影响到烧写。另一方面，烧写器会供给芯片5V的电源，所以一般不需要自己外供电。但是一般的编程器供电能力有限，据称也就是几个mA的级别。就算PROMATE II这类自带专门ICSP口的工业级烧写器，其输出电流也不过几十个mA而已。所以，如果你的板子工作电流较大，那就需要自己供电，或者将芯片的供电电路设计成可隔离的，烧写时断开芯片的VDD和外部电源的连接，烧写器的供电仅供给芯片即可。然后，作为ICSP数据的通路，RB6和RB7在烧写时，最好也和外部电路隔离开，就是要保证其上传输的时钟和数据不被外部电路干扰而造成失真。而且，还有一点就是，使用时要保证，你的ICSP连接线和芯片是直接连接的，其间尤其不能有二极管等单向通路元件，否则会造成芯片认不出等异常现象。</p>
<p>另一方面，烧写器的连接的话，专业级的烧写器会提供ICSP接口，应该就是一个5芯的排线，可以接出插到目标板上。如果没有这种昂贵的专业烧写器，只有简单的烧写器的话，可以考虑自制一个转换线，就是一端为28或者40的双排针接头（比如一个28pin或者40pin的芯片座就是一个很好的选择），然后将这些针中对应的脚接出来，做成一个5芯排线使用。这类转接线尤其需要注意的是：第一，使用时插在烧写器上的双排针接头不要插反。。插反的话，肯定没有效果。。。第二就是，由于负载能力有限，建议线长不要超过20cm。</p>
<p>关于ICSP线的自制，我过段时间可能要做几个试验，因为公司的烧写器是PICSTART，而准备使用贴片的PIC，所以ICSP是必要的。所以转换线是必要的。。。如果成功实现我尽量把制作方法和注意事项写出来。呵呵</p>
<p>其实，ICSP给人的感觉好像就是一个集成的BOOTLOADER一样。只是ICSP在正常使用时并不需要，而不像BOOTLOADER那样正常使用时还需要把外部代码载入内存。。。而且ICSP对加密还是有一点好处的。不过感觉好像还是有点脆弱。。呵呵。。但是越新的芯片，其ICSP模块应该越安全。各位选型时也不妨注意一下。</p>
<p>最后顺便说一句，如果真的觉得ICSP很脆弱，可能非物理就能破解的话，那么我们可以使用一个狠招：ICSP的灵魂在于RB6和RB7，那么程序设计时，在程序中不要使用这两个脚。然后烧写完成后，对这两脚使用加大电流等方法直接使内部电路报废，就是把这两个脚直接烧掉。那么，恭喜你，你的芯片的FLASHROM使用软件法应该再也不能访问了，包括你自己再想烧也烧不了了。这个芯片目前就是一块外界不可访问，只能自己工作的芯片了～呵呵……</p>
<p>嗯。今次就到这里吧。其实这些资料很多都是在论坛里看见的别人的经验，我这里只是总结了一下而已。感谢那些大虾～呵呵～～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragongod.net/2007/09/the-icsp-of-pic/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

