<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[缘份天空]]></title>
<link>http://www.zjidea.com/blog/</link>
<description><![CDATA[记录我生活与工作中的点滴]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[lzq02541@qq.com(相逢萍水)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>缘份天空</title>
	<url>http://www.zjidea.com/blog/images/logos.gif</url>
	<link>http://www.zjidea.com/blog/</link>
	<description>缘份天空</description>
</image>

			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-12-09-ST.html</link>
			<title><![CDATA[编写ST单片机程序得注意I/O赋值问题]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Fri,09 Dec 2011 13:38:16 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=502</guid>
		<description><![CDATA[最近把ATMEL的单片机换成了ST的，一切看起来还比较顺利。<br/><br/>不过前几天写的一个程序出现了问题，程序时不时的会自动复位。<br/><br/>这个问题我查了三天都没有查出什么问题，不过到昨天，问题点被我找出来了！！<br/><br/>问题的原因及解决方法如下：<br/><br/>这个程序我需要在定时器中改变I/O口的输入输出方向，就是同一Pin上的脚一会设置为输入，一会要设置为输出口，当设置为输出时，我把CR2对应的输出速率设置为10Mhz。<br/><br/>从上面讲的看起来似乎没什么问题，但程序运行一会后复位（这个复位是看门狗超时引起）。光从程序复位来看，一定会以为程序哪个地方写得不对，程序跳转不对，进入了死循环。一开始我也这么认识，把程序从头看到尾都没找到这个地方，实在是想不明白哪会有问题。<br/><br/>实在没办法后，借来仿真器，一步步执行看程序，最后定位在定时器中断里改变DDR值后，还没来得及更改CR2寄存器，程序就进入了引脚的外部中断去了，而我又没用到外部中断，没有处理程序，因此程序就反复进入这中断直到看门狗复位程序。<br/><br/><br/>问题解决办法：<br/><br/>1.把没用到的中断优先及降到最低，使它没机会执行。这个是最好的我觉得。<br/><br/>2.如果中断优先寄存器你不想去改变，保持默认值，那你把CR2的摆率不要设10M,用2M就可以了。<br/><br/>3.如果你CR2要用到10M的摆率，那你在改变DDR前，先把CR2对应的值设为0<br/><br/>通过上面三个中的一个，你就可以解决问题<br/><br/><br/>不管你用C还是汇编，如果你需要经常切换I/O口的方向，那么你就得注意这个问题。<br/><br/>写程序，建议把没用到的寄存器稍微处理下，保持默认值在某些情况下可能会出现问题，还是小心为好啊！<br/><br/><br/><br/><br/><br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-09-13-multiply.html</link>
			<title><![CDATA[二进制乘法原理]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Tue,13 Sep 2011 19:49:52 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=501</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二进制乘法就是左移（进位）8次，每次最高位为1则把被乘数加进去，8位移完就得出乘积了<br/><br/>　　实际上和我们做10进制的乘法是一样的，只不过这里的进制是2罢了<br/>　　<br/>　　比如5×6，转成二进制就是0101×0110<br/>　　十进制乘法大家都会做，公式就是<br/>　　<br/>　　我们他当成十进制101×110来计算下看看<br/>　　 4位乘积＝被乘数×千位被＋被乘数×百位＋被乘数×十位＋被乘数×个位<br/>　　既0101×0110＝101×0000＋101×100＋101×10＋101×0 <br/>　　变化下：<br/>　　 4位乘积＝被乘数×千位数×1000＋被乘数×百位数×100＋被乘数×10位数×10＋被乘数×个位数<br/>　　既0101×0110＝101×（0×1000）＋101×（1×100） ＋101×（1×10）＋101×0<br/>　　<br/>　　再变化下：<br/>　　 4位乘积＝被乘数×千位数×10×10×10＋被乘数×百位数×10×10＋被乘数×10位数×10＋被乘数×个位数<br/>　　既0101×0110＝101×（0×10×10×10）＋101×（1×10×10）＋101×（1×10）＋101×0<br/>　　 ＝（（（101×0）×10）＋（101×1））×10＋（101×1））×10＋101×0<br/>　　<br/>　　我们可以看到，实际上乘法结果就是被乘数乘以每一位乘以模（10）的N次方的累计和（其实左移位就是进位啦，看得出来吗？）<br/>　　<br/>　　而换成2进制的话很简单，把10读成二进制2就行了，结果还是：<br/>　　 4位乘积＝被乘数×千位数×10×10×10＋被乘数×百位数×10×10＋被乘数×10位数×10＋被乘数×个位数<br/>　　既0101×0110＝101×（0×10×10×10）＋101×（1×10×10）＋101×（1×10）＋101×0<br/>　　 ＝（（（101×0）×2）＋（101×1））×2＋（101×1））×2＋101×0<br/>　　 <br/>　　 由于乘2就是移位（进位），把上面的公式中乘2换成左移位就行了<br/>　　<br/>　　PS：<br/>　　由于二进制只有0和1，乘2可以用左移一位来实现，也可以“自己加自己”来实现的，很多CPU的左移指令和“自己加自己”一样<br/>　　<br/>　　<br/>　　用软件乘法要耗费很多CPU时间，只要CPU有硬件乘法器，当然是用硬件的啦，那会快很多的。<br/><br/>下面这段汇编程序是用在PIC单片机上的，需要的参考下吧.<br/>其中，R0,R1,XL,XH都是定义的变量，R0,R1为要相乘的两个数，结果放在XHXL中<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://www.zjidea.com/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent"><br/><br/>_MUL8 CLRF XL&nbsp;&nbsp;&nbsp;&nbsp; ;XHXL = R0*R1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLRF XH<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVLW 8<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVWF ZL<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVFW R0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLRC<br/>_MUL80 RRF R1,F<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BTFSC STATUS,C<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDWF XH,F<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RRF XH,F<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RRF XL,F<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECFSZ ZL,F<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GOTO _MUL80<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/computer/2011-09-05-computer.html</link>
			<title><![CDATA[关于电脑num lock 的设置]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[电脑诊所]]></category>
			<pubDate>Mon,05 Sep 2011 21:58:49 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=500</guid>
		<description><![CDATA[昨天给自己的帐户加了个密码，没想到开电脑后发现怎么输入密码都是错误的，一时不得其解，密码分明是对的，怎么就是说密码错误呢！！<br/><br/><br/>后来左看右看，发现了键盘上的那个‘‘num lock’’灯亮着了，我的是本本，打开了这个灯的话，那有些按键值就要变了，马上关闭，登陆成功！<br/><br/>不过问题并没有解决，重起后又默认打开了，真是件烦恼事，每次开电脑后都要关数字键，再输密码。<br/><br/>有问题咱就得解决，网上也看了些方法，但好像都不大行得通，可能是没找对方法吧，后来请教一同事，才得以解决，方法如下：<br/><br/>重起电脑，到输入密码界面时，关闭数字键，然后关机重起，这样就解决了！<br/><br/>num lock这个是电脑保存最后一次的设置的，但我不明白为什么关了之后不能进入电脑，反而要关机重起。。。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-05-23-AVR_lesson5.html</link>
			<title><![CDATA[AVR入门教程5----定时器0]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Mon,23 May 2011 11:18:37 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=498</guid>
		<description><![CDATA[这一课我们讲定时器0<br/><br/>定时器0的计数方向是向上增长的，计数达到0xFF后又会从0开始计数。当计数变为0时，定时器中断标志寄存器中的TOV0将会置位，如果总中断和定时器0溢出中断都开启了的话，程序将会进入中断服务程序，TOV0只能软件清零。<br/><br/>另外，如果想提高定时器的分辨率的话，可以将新值写入计数器。<br/><br/>对于定时器0，我们有两种方式来控制，一种是查询法，另外一种是中断法。<br/><br/>下面我们分别用这两种方式来写定时器0的程序，使接在PC0端口上的LED闪烁，原理图我们还是用上一节的<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/1201142311935.jpg" border="0" alt=""/><br/><br/><strong>查询法：</strong><br/><br/>查询法主要就是一直查询TOV0有没有变1，如果为1，那就是定时时间已经到了，清零溢出标志位TOV0，设置新计数值。<br/><br/>相关代码如下：<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code30678);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.zjidea.com/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code30678><br/><br/>;******* 配置定时器0 ******************<br/>;我们定时时间为64ms,我们整个系统时钟是内部4M,如下计算<br/>; <br/>; t=(1/4M)*1024*T = 0.064s<br/>; ==&gt; T=250,所以定时器初值为5<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCNT0,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$05&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCCR0,xl&nbsp;&nbsp;&nbsp;&nbsp;;定时器0时钟为系统时钟的1024分频<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clr zl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clr zh<br/><br/>main:&nbsp;&nbsp;in xl,TIFR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbrs xl,TOV0&nbsp;&nbsp; ;判断是否溢出<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp main1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCNT0,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cbr xl,1&lt;&lt;TOV0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TIFR,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc zl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;定时器溢出，ZL加1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpi zl,8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;64ms*8=512ms<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brcs main1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;还没到0.5S，跳转<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc zh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;0.5s加1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clr zl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;zl重新开始计数<br/>main1: sbrc zh,0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp main2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbi portc,0&nbsp;&nbsp;&nbsp;&nbsp; ;PC0输出高电平，LED灭<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp main<br/>main2: cbi portc,0&nbsp;&nbsp;&nbsp;&nbsp; ;PC0输出低电平，LED亮<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp main<br/><br/></div></div><br/><br/><br/><strong>中断法：</strong><br/><br/>中断控制也很简单，只要设置好相应的寄存器，打开相应的中断，并且设置好了中断的入口地址，那中断肯定就没有问题，这里不多讲，看下面的代码<br/><br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code4379);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.zjidea.com/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code4379><br/><br/>;**** 设置中断入口地址 *****************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .org OVF0addr&nbsp;&nbsp; ; Overflow0 Interrupt Vector Address<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp ISR_TC0<br/><br/>;******* 配置定时器0 ******************<br/>;我们定时时间为64ms,我们整个系统时钟是内部4M,如下计算<br/>; <br/>; t=(1/4M)*1024*T = 0.064s<br/>; ==&gt; T=250,所以定时器初值为5<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCNT0,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$05&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCCR0,xl&nbsp;&nbsp;&nbsp;&nbsp;;定时器0时钟为系统时钟的1024分频<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$01<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TIMSK,xl&nbsp;&nbsp;&nbsp;&nbsp;;允许定时器0溢出中断<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sei&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;打开总中断<br/><br/><br/>;******中断服务程序 ***************<br/>ISR_TC0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in xl,sreg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;保存SREG值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi yl,5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;重新赋初值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out TCNT0,yl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc zl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpi zl,8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;累加并判断是否到0.5s<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; brcs ISR_TCe<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clr zl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;0.5s,重新统计<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc zh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;zh 0.5s加一<br/>ISR_TCe:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out sreg,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reti<br/><br/></div></div><br/><br/><br/>编译程序，然后下载程序到目标板，你就可以看到LED亮0.5s,灭0.5s。<br/><br/>你也可以把程序加载到Proteus中仿真，效果一样的。<br/><br/>Proteus仿真文件可以在教程3下载，仿真文件是一样的，只不过是改下加载的程序。<br/><br/><br/>完整程序代码下载（只有中断法的代码）：<br/><br/><span id="down_zee21cqrpo"></span><script language="javascript" type="text/javascript">doAjax('?action=Antidown&id=1&downurl=download%2Easp%3Fid%3D1&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E6%96%87%E4%BB%B6','down_zee21cqrpo');</script><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-04-25-AVR_lesson4.html</link>
			<title><![CDATA[AVR入门教程4----外部中断]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Mon,25 Apr 2011 15:16:43 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=496</guid>
		<description><![CDATA[今天我们来学习外部中断的处理。<br/><br/><strong>关于中断，我们可以理解成这样的：</strong><br/>你坐在办公室里处理一些平常的工作，比较说在电脑前写一篇会议稿，突然，你的上司进来叫你一起去开会，你马上保存好会议稿，跟着上司去开会，等开会完后，你回到办公室打开会议稿继续工作。<br/><br/>在电脑前写一篇会议稿：这可以当成是单片机没进中断前的执行的任务<br/><br/>上司进来叫你一起去开会：一个中断发生<br/><br/>保存会议稿：中断发生时，保护好现场，<br/><br/>跟着上司去开会：在中断里执行些特殊任务<br/><br/>开会完后，你回到办公室打开会议稿继续工作：中断返回，继续原来的工作<br/><br/><br/>呵呵，这样讲，不知道大家能不能理解。<br/><br/>外部中断通过引脚INT0、INT1 触发。只要使能了中断，即使引脚INT0..1 配置为输出，只要电平发生了合适的变化，中断也会触发。通过设置MCU 控制寄存器MCUCR，中断可以由下降沿、上升沿，或者是低电平触发。<br/><br/>当外部中断使能并且配置为低电平触发( INT0/INT1)时，只要引脚电平为低，中断就会产生，因此要防止重复进入中断，你可以在一定时间里只允许一次中断的进入。这低电平触发中断，我一般只用来唤醒系统，唤醒后我就禁止外部中断。<br/><br/>另外，我们还得了解下中断向量，你可以下载本站的<img src="http://www.zjidea.com/blog/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.zjidea.com/blog/attachments/month_1104/ATmega8_cn.pdf" target="_blank">ATmega8的中文资料</a>，然后翻到第43页，可以看到Atmega8的中断向量表，总共有19个中断源，你想要用哪个中断，你就得在该地址处放个跳转指令，跳到该中断的处理子程序去。前两个我们没用到中断，所以我直接在地址0外开始写代码，从今天开始，我们就得跳过这一段地址了。<br/><br/>开始我们的程序<br/>原理图我们还用教程3的，如下图：<br/><img src="http://www.zjidea.com/blog/attachments/month_1104/1201142311935.jpg" border="0" alt=""/><br/><br/>按键接在外部中断0引脚上，所以我们要设置外部中断0。当按键按一下，触发一次中断，在中断里判断上次LED是亮还是灭，如果上次LED亮，则熄灭LED；如果上次LED灭，则点亮LED。<br/><br/><br/>按照以前的步骤，我们新建一个工程，然后编写程序代码，主要代码如下，完整代码请在文章最后下载。<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code50486);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.zjidea.com/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code50486><br/><br/>.cseg<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .org $0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;从地址0处开始存放代码,地址0也是芯片复位后的入口地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;复位，跳转<br/>;******* vector definition ************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .org INT0addr&nbsp;&nbsp; ; External Interrupt0 Vector Address<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp ISR_INT0&nbsp;&nbsp; ; 有外部中断发生时，跳转中断处理程序<br/>;******* 外部中断0的中断处理程序 ******<br/>ISR_INT0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push xl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;把XL值推入堆栈保存起来<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in xl,sreg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把SREG寄存器的内容保存到XL中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbic portc,0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp INT01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LED原来不亮,跳转<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbi portc,0&nbsp;&nbsp;&nbsp;&nbsp; ;PC0输出高电平，LED灭<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rjmp INT0E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;退出中断<br/>INT01: cbi portc,0&nbsp;&nbsp;&nbsp;&nbsp; ;PC0输出低电平，LED亮<br/><br/>INT0E: out sreg,xl&nbsp;&nbsp;&nbsp;&nbsp; ;把中断前的SREG值还原<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop xl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把中断前的XL的值还原<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reti&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;退出中断<br/><br/>reset:<br/>;******* 设置堆栈指针 *****************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,low(RAMEND)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xh,high(RAMEND)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out spl,xl <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out sph,xh<br/><br/>;******* 配置I/O口 ********************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把PC0配置为输出，其它引脚都为输入<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out ddrc,xl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbi portc,0&nbsp;&nbsp;&nbsp;&nbsp; ;初始化时，使LED不亮<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$00<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out ddrd,xl&nbsp;&nbsp;&nbsp;&nbsp; ;把D口配置为输入,我们只用到PD2,用按键触发中断<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,1&lt;&lt;2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out portd,xl&nbsp;&nbsp;&nbsp;&nbsp;;使能PD2的上拉电阻<br/><br/>;******* 配置外部中断 *****************<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$02<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out mcucr,xl&nbsp;&nbsp;&nbsp;&nbsp;;选择外部中断0下降沿产生中断请求<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldi xl,$40<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out gicr,xl&nbsp;&nbsp;&nbsp;&nbsp; ;外部中断0请求使能<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sei&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;使能总中断<br/><br/>main:&nbsp;&nbsp;rjmp main<br/><br/></div></div><br/><br/>编译程序，然后下载程序到目标板，你就可以看到程序效果了。<br/><br/>你也可以把程序加载到Proteus中仿真，效果一样的。<br/><br/>Proteus仿真文件可以在教程3下载，仿真文件是一样的。<br/><br/><br/>完整程序代码下载：<br/><br/><img src="http://www.zjidea.com/blog/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.zjidea.com/blog/attachments/month_1104/r2011425151629.rar" target="_blank">点击下载此文件</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-04-23-AVR_lesson3.html</link>
			<title><![CDATA[AVR入门教程3----I/O操作，按键输入]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Sat,23 Apr 2011 12:25:46 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=495</guid>
		<description><![CDATA[通过AVR入门教程2的学习，我们掌握了I/O口输出，今天我们学习I/O口的输入。<br/><br/>今天的电路图在教程2的基础上增加了一个按键，如下图<br/><img src="http://www.zjidea.com/blog/attachments/month_1104/1201142311935.jpg" border="0" alt=""/><br/><br/>要判断一个按键有没有按下，我们得看知道这个端口上的电平有没有变化。从上图我们可以知道，当按键按下时，按键导通，PD2端口接地，此时PD2上的电平将变低，也就是0.<br/><br/>当按键松开后，PD2上的电平要变成高电平才可以正确判断一个按键，因此，我们得做个内部上拉。<br/><br/><span style="color:Red">上面的原理图没有加电阻及电容，只是为了做实验用，如果你想用到实际的项目中，那你得相应的加电阻及一些电容。</span><br/><br/><br/>按照以前的步骤，我们新建一个工程，然后编写程序代码，具体代码如下：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code34059);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.zjidea.com/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code34059><br/>;把Atmega8的头文件包含进来<br/>.include &#34;m8def.inc&#34;<br/><br/>.cseg<br/>.org $0&nbsp;&nbsp;&nbsp;&nbsp; ;从地址0处开始存放代码,地址0也是芯片复位后的入口地址<br/>ldi xl,low(RAMEND)<br/>ldi xh,high(RAMEND)<br/>out spl,xl&nbsp;&nbsp;;设置堆栈指针<br/>out sph,xh<br/><br/>ldi xl,$01&nbsp;&nbsp;;把PC0配置为输出，其它引脚都为输入<br/>out ddrc,xl<br/>ldi xl,$00<br/>out ddrd,xl ;把D口配置为输入<br/>ldi xl,1&lt;&lt;2<br/>out portd,xl ;使能PD2的上拉电阻<br/><br/>ldi xl,$01<br/>out portc,xl ;PORTC设置为1，PC0输出高电平，发光二极管不亮<br/><br/>loop:&nbsp;&nbsp;sbic pind,2 ;判断PD2是不是低电平<br/>rjmp Nokey&nbsp;&nbsp;;不是，没有按键按下，跳出<br/>nop<br/>nop<br/>nop<br/>sbic pind,2 ;第二次判断PD2是不是低电平<br/>rjmp Nokey&nbsp;&nbsp;;没有按键按下，跳出<br/>clr xl<br/>out portc,xl ;有按键按下，点亮发光二极管<br/>rjmp loop<br/>Nokey: ldi xl,$01<br/>out portc,xl ;没有按键按下，发光二极管不亮<br/>rjmp loop&nbsp;&nbsp;&nbsp;&nbsp;;跳转到loop，重新判断<br/><br/><br/></div></div><br/><br/><br/>接下来是编译程序及调试了，请按以前步骤进行程序的编译及软件仿真调试。如果你有目标板及调试器，你也可以下载到目标上进行调试，我手上没有那些调试器，我一般是把程序烧写到目标板上看效果，反正程序量也不算大，ATmega8也就8K中量。<br/><br/>这个程序我在Proteus 7.5 sp3中进行仿真了，程序运行后，你可以按下按键，可以看到PC0上的LED亮起来了，松开按键时，LED灭了。<br/><br/><br/>我的程序代码及Proteus仿真文件：<br/><br/><span id="down_8wetrmeotp"></span><script language="javascript" type="text/javascript">doAjax('?action=Antidown&id=3&downurl=download%2Easp%3Fid%3D3&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E6%96%87%E4%BB%B6','down_8wetrmeotp');</script><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-04-22-AVR_lesson2.html</link>
			<title><![CDATA[AVR入门教程2----I/O操作，点亮发光二极管]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Fri,22 Apr 2011 22:15:42 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=494</guid>
		<description><![CDATA[通过上一课的学习，我们学会了怎么新建一个工程。今天我们开始学习编写程序代码及软件仿真。<br/><br/><strong>相关知识的了解</strong><br/><br/>Atmega8每个端口引脚都具有三个寄存器位： DDRn、 PORTn 和PINn<br/><br/>DDRn 用来选择引脚的方向。DDRn 为&#34;1“ 时， Pxn 配置为输出，否则配置为输入。<br/><br/>引脚配置为输入时，若PORTn 为&#34;1“，上拉电阻将使能。如果需要关闭这个上拉电阻，可以将PORTn 清零，或者将这个引脚配置为输出。复位时各引脚为高阻态，即使此时并没有时钟在运行。<br/><br/>当引脚配置为输出时，若PORTn 为&#34;1“，引脚输出高电平(&#34;1“)，否则输出低电平(“0“)。<br/><br/><br/>了解了上面的信息后，我们知道，如果要将一个端口输出一个高电平，则该端口的引脚方向先设置为1，配置为输出，然后将该口的PORT寄存器设为1，此时，该商品就可以输出一个高电平了，同理，如果要输出低电平，我们得将该端口配置为输出，然后将该口的PORT寄存器设为0,这样，该端口就可以输出低电平了。<br/><br/>如果我们需要读取外部电路的一些信息时，比如我们想知道一端口上的按键按下了没有，这时我们就得把该端口配置为输入，即把DDRn设为0，根据需要开启/关闭上拉电阻，通过读PINx寄存器，我们就可以知道该端口上的电平状况如何。<br/><br/>这个实验的电路很简单，只是在PC0上接一个发光二极管，我们的目的就是让这个发光二极管点亮。相关电路图如下<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/z2011422213730.jpg" border="0" alt=""/><br/><br/>下面我们开始编写我们的第一个程序。<br/><br/>按照昨天的步骤，我们新建一个工程，然后编写程序代码，具体代码如下：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code98811);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.zjidea.com/blog/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code98811><br/><br/>;把Atmega8的头文件包含进来<br/>.include &#34;m8def.inc&#34;<br/><br/>.org $0&nbsp;&nbsp;&nbsp;&nbsp; ;从地址0处开始存放代码,地址0也是芯片复位后的入口地址<br/>ldi xl,low(RAMEND)<br/>ldi xh,high(RAMEND)<br/>out spl,xl&nbsp;&nbsp;;设置堆栈指针<br/>out sph,xh<br/><br/>ldi xl,$01&nbsp;&nbsp;;把PC0配置为输出，其它引脚都为输入<br/>out ddrc,xl<br/><br/>clr xl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>out portc,xl ;PORTC设置为0，PC0输出低电平，发光二极管点亮<br/>loop:&nbsp;&nbsp;rjmp loop&nbsp;&nbsp;&nbsp;&nbsp;;程序在此处死循环<br/><br/></div></div><br/><br/>程序代码就上面几条语句，写完后，我们就开始编译程序了。<br/><br/>点击AVR Studio的莱单项“Build”里的“Build”，或者直接按‘F7’编译程序，最后我们将看如图所示的信息<br/><img src="http://www.zjidea.com/blog/attachments/month_1104/w2011422215629.jpg" border="0" alt=""/><br/><br/>0个错误，0个警告。如果你的程序编译有错误，软件将会提示你有几个错误及错误的在第几行，你根据提示将错误改正后再编译，直到编译通过。<br/><br/>程序编译通过之后，我们可以把程序下载到目标板上看效果了。这里我们不下载到目标板上，用软件仿真看下效果就可以了。<br/><br/>点击AVR Studio的莱单项“Debug”里的“Start Debugging”，程序将进入调试模式，如下图<br/><img src="http://www.zjidea.com/blog/attachments/month_1104/8201142222322.jpg" border="0" alt=""/><br/><br/>键盘上按‘F11’，单步执行程序，最后程序停留在‘loop:&nbsp;&nbsp;rjmp loop’处，一直在这里死循环，此时你可以看右边‘I/O view’里的‘DDRC’及‘PORTC’的值，是不是和我们设置的一样，PC0口输出低电平，PC0端口上的发光二极管点亮。<br/><img src="http://www.zjidea.com/blog/attachments/month_1104/c201142222950.jpg" border="0" alt=""/><br/><br/><br/>怎么样，这个程序是不是很简单 ：）<br/><br/>我把我的整个程序都上传，如果你写的编译不通过，你可以下载我的这个试下<br/><br/><span id="down_yxta2cw5nf"></span><script language="javascript" type="text/javascript">doAjax('?action=Antidown&id=4&downurl=download%2Easp%3Fid%3D4&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E6%96%87%E4%BB%B6','down_yxta2cw5nf');</script><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-04-21-avr_lesson1.html</link>
			<title><![CDATA[AVR入门教程1----新建工程]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Thu,21 Apr 2011 22:00:49 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=493</guid>
		<description><![CDATA[开始我们的第一课，新建一个工程。这里我就不讲编辑编译软件AVR studio的下载及安装了，如果有不明白的，请自行在网上搜索相关内容好好了解下。<br/><br/>1.双击打开软件AVR studio,界面如下<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/q2011421215313.jpg" border="0" alt=""/><br/><br/>2.点击 “Project Project wizard”,然后弹出项目向导框，如图<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/42011421215323.jpg" border="0" alt=""/><br/><br/>3.我们点击 “New Project”,准备新建一个工程，由于我们准备用汇编，所以接下来我们选择“Atmel AVR Assembler”,然后填写相关的内容，完成后如下图所示<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/62011421215334.jpg" border="0" alt=""/><br/><br/>4.点“Next”，选择调试平台及芯片类型，我们选择“AVR Simulator,及Atmega8”,如图<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/52011421215343.jpg" border="0" alt=""/><br/><br/>5.点“Finish”完成新建工程向导，这样我们就新建好了一个工程，如图所示<br/><br/><img src="http://www.zjidea.com/blog/attachments/month_1104/f2011421215351.jpg" border="0" alt=""/><br/><br/><br/>新建一个工程很简单吧，工程建好后，接下来我们就可以开始写程序代码了，不过这里我们只学新建工程，程序代码我们就留到下一篇再来讲。]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/electron/2011-04-21-AVR.html</link>
			<title><![CDATA[关于AVR入门学习教程]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[MCU编程]]></category>
			<pubDate>Thu,21 Apr 2011 21:45:28 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=492</guid>
		<description><![CDATA[从06年毕业到现在快五年了，在这五年当中，第一年是做硬件的，从第二年开始到现在，我一直从事着单片机编程的工作，算算应该是老江湖了，写个入门教程应该不是误人子弟了吧~~~<br/><br/>我这教程里用到的芯片是Atmega8，用的编程语言是汇编，如果后续有时间的话可能也会出个C语言版的吧。为什么我要选这个芯片和汇编语言呢？这是因为我这单位基本上是用Atmega8，且程序我一直都是用汇编写的。<br/><br/>如果有朋友想学AVR编程的话，可以跟着我这教程来，一步步的带你入门！<br/><br/>希望你能成功！<br/><br/><span style="color:Red"><br/>注意，在这教程中，有些原理图我没有加电阻及电容，只是为了展示一些器件的接法，如果你想在实际的项目中运用，那你得加上想应的电阻及电容，不然在有些情况下会出问题的 <img src="http://www.zjidea.com/blog/images/smilies/Face_02.gif" border="0" style="margin:0px 0px -2px 0px" alt=""/><br/><br/>另外，程序示例代码也没有经过优化，代码也很简单，只是为了让大家更容易入门，如果想用到实际项目中，得在这些程序基础上进行修改。<br/></span><br/><br/>需要Atmega8的中文资料的请下载：<br/><br/><img src="http://www.zjidea.com/blog/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.zjidea.com/blog/attachments/month_1104/ATmega8_cn.pdf" target="_blank">点击下载此文件</a><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.zjidea.com/blog/article/diary/2011-04-15.html</link>
			<title><![CDATA[无题]]></title>
			<author>lzq02541@qq.com(相逢萍水)</author>
			<category><![CDATA[心情坐标]]></category>
			<pubDate>Fri,15 Apr 2011 19:49:42 +0800</pubDate>
			<guid>http://www.zjidea.com/blog/default.asp?id=491</guid>
		<description><![CDATA[好久都没来这写东西了，一个是感觉最近平时生活没啥什么可写的，二是程序方面的想写也写不出什么来，因为ARM还在入门，好多东西还没学会。另外一个是公司准备换用芯片，把AVR芯片换下，换上ST的芯片，可ST的单片机我没用过，现在还在抓紧时间看芯片资料。<br/><br/>关于ARM，现在感觉学习得有点头绪了，前些天刚把串口这一部分调通，这样想看什么数据时就可以通过串口把数据全部发出来 <img src="http://www.zjidea.com/blog/images/smilies/Face_02.gif" border="0" style="margin:0px 0px -2px 0px" alt=""/>。接下来的打算是先从各个模块开始，把各模块的功能调通，然后弄个操作系统进去跑跑。<br/><br/>而公司换芯片的事，我得加紧时间了，硬件方面已经开始着设计硬件电路，我这软件如果不加快点步伐，恐怕要拖后腿了！ <img src="http://www.zjidea.com/blog/images/smilies/Face_09.gif" border="0" style="margin:0px 0px -2px 0px" alt=""/>]]></description>
		</item>
		
</channel>
</rss>

