《AVR单片机嵌入式系统原理与应用实践》勘误与修正(2010/04/10 新增加14处) 并继续
说明:今天得到北航出版社的消息,该书去年10月出版,第一次印了5000册,现在库存还有300册(感谢大家的支持!),准备加印。
我已经将书中的错误整理成DOC和PDF文件,发到出版社,加印的书中错误就会少多了。
现在将doc文件上传(119处),方便已经购书的朋友自己做修正(抱歉了。)
点击此处下载 ourdev_352992.doc(文件大小:974K) (原文件名:AVR单片机嵌入式系统原理与应用实践_勘误表.doc)
08/07/22,补充修改2(21处),感谢ep02的指正。点击此处下载 ourdev_355191.doc(文件大小:30K) (原文件名:AVR单片机嵌入式系统原理与应用实践_勘误表(2).doc)
08/07/23,补充修改3(11处),感谢ep02的指正。点击此处下载 ourdev_355970.doc(文件大小:31K) (原文件名:AVR单片机嵌入式系统原理与应用实践_勘误表(3).doc)
作者本人在此对于关心和支持本书的广大读者和网友,尤其是那些本着认真负责的态度,指出本书中错误之处的朋友,表示真诚的感谢!
同时作者再次向阿莫先生和“我们的AVR”致谢,为大家提供了一流的相互交流学习的平台和空间。
======================================================================================================
通告(2008.9.5):
第2次加印3000册已经上市,上面的151处错误已做了改正。
======================================================================================================
通告(2009.6.6):
在第2次加印版的基础上,还发现19处错误。这些错误在第1、2次印刷本中都存在的,请购买过本书的读者点击此处下载 ourdev_451169.doc(文件大小:103K) (原文件名:《AVR单片机嵌入式系统原理与应用实践》一书勘误修正表(4).doc),自己做修改。抱歉了。
以上19个错误将在第3次印刷版中被改正。
作者本人在此对于关心和支持本书的广大读者和网友,尤其是那些本着认真负责的态度,指出本书中错误之处的朋友,表示真诚的感谢!
他们是本贴198、200、201、202、206、207、209、222楼的朋友。
=======================================================================================================
通告(2010.4.10):
尽管已经第3次加印了,但在网友的帮助下,又发现14处错误。这些错误在第1、2、3次印刷本中都存在的,请购买过本书的读者点击此处下载 ourdev_545387.rar(文件大小:17K) (原文件名:《AVR单片机嵌入式系统原理与应用实践》一书勘误修正表(5).rar) 自己做修改。抱歉了。
以上14个错误将在第4次印刷版中被改正(个人希望有第4次印刷本)。
作者本人再次对关心和支持本书的广大读者和网友,尤其是那些本着认真负责的态度,指出本书中错误之处的朋友,表示真诚的感谢!
==========================================================================================================
通告(2010.7.28):
刚收到出版社的邮件,由于北航出版社《AVR单片机嵌入式系统原理与应用实践》一书库存不多,而且最近定购书比较多(为下学期做教材),所以他们已经再次加引了3000册。(本书总印数达到14000册)
由于时间紧张,而且原来出版社负责与我联系的人员离开,所以本次加印没有做任何的修改。
特此通告各位。
第3次加印后书中的14处的错误需要修改(见239楼通告贴)只能等下次了。
作者本人再次对关心和支持本书的广大读者和网友,尤其是那些本着认真负责的态度,指出本书中错误之处的朋友,表示真诚的感谢!并希望大家继续提出问题,以便有可能在后面的加印中改正。
问题贴请继续发到楼下,谢谢! 书还没见到,看勘误表过过瘾! 第一个错误真的很难发现的!佩服马老师! 是啊,第一个错误我对比了半天才看出来。看来,马老师的书尽可以大胆、放心地购买了。 cltemail ,我也是一样,看了半天才看来. 请问哪有卖的? j是哈 书什么时候能到 好买一本 书已收到,已按楼主更正 AVR 冷偏我不敢苟同 无锡的新华书店 AVR单片机书比51的多 没数过 10+种 可能阿莫低估了阿莫们为ATMEL做出的贡献 哈哈 【10楼】 binglin 炳哥哥
不是吧???我在深圳这么近都没到,你在江门都收到了?没理由啊 哦,你不说我还真忘了,快去订单处告诉MM们已收到货. 呵呵,快递员送到另外一栋去了,让我多等了一会儿,书收到了,还收到了阿莫送的CD,太感谢了! 谁说无锡新华书店AVR的书比51的多啊,我可是几乎每周都去那里搜索,看的。可能连5种都没有。51类的是最多的,其次是PIC也有好多本。C8051F有几本,MSP430有1或2本,凌阳的也有,ARM,嵌入式也有不少。 17楼少于5种我请你吃饭 如何? 建议马老师要求出版社在第二次印刷的时候更正里面的错误,这样这本书就更完美了 本书第一次印刷为5000本,如果市场反映好的话出版社会加印的。但这种纯技术书销量不会太大的,毕竟不是“品三国”呀^_^。
尽管本书是以AVR做主线的纯正教课书,但由于目前国内高校中还是上51的多,采用本书的人也不会多到那里去的。因此我并不抱乐观的态度。
如果出版社要第二次印刷的话,会与我联系,做些更正工作的。
最近1-2年中,关于AVR的技术书籍相对多了一点,但包括以前出版的,总量也就20本左右吧,绝对是不能与51的书相比的。
本书前11章可在本站中下载,但我个人认为后面的2篇更能体现本书的特点。作为教课书,书中的例子都是比较简单和经过简化的,但重要的是其设计思想和处理方法,这些是核心的东西。掌握了核心的东西,不管是用AVR,还是51、PIC,都能得心应手。
再次感谢大家对本书关注,以及对我工作的评价和建议,包括批评和拍砖^_^ 咳,出版前校对不下5遍,可是还有错误。这几天会抽时间再检查1次。
前4章已经看过了,错误的地方已经贴在1楼。看来后面还要补充的。 6章21页例子:
void display(void)
{
char temp,i;
for(i=0;i<=5;i++)
{
temp = led_7];
if (point_on && (i==2 || i==4))
HC164_send_byte(temp | 0x80);
else
HC164_send_byte(temp);
PORTC = position;//多余
delay_ms(2);//多余
PORTC = 0xff;//多余
}
}
。。。。。。。。。
个人认为:
PORTC = position;
delay_ms(2);
PORTC = 0xff;
为多余,容易让读者不好理解,例子要能够完美的再现问题的解决. 23楼:这是在没有介绍和使用T/C的动态扫描显示函数,在后面的章节中还会出现,配合T/C的使用,将会有变化,并且越来越精练。
但就这个程序讲,你并没有说明为什么是“多余”,你是否去掉试过了?出现什么情况?还是凭你的想象?我下面有很多的思考,你能正确的回答吗?看来你还需要努力的^_^ 针对23楼的问题,给出我的解答。
1。首先这个程序是一个刚开始的学习例程,在还没有学习使用T/C的情况下,采用软件延时完成的。在我的书中明确的提出,尽量不要采用软件延时的做法(除非是几个us的延时),对于ms级以上的延时应该使用T/C。
2。实际上,很多教科书中的例子中大量使用了软件延时,典型的就是键盘的消抖。在一个实际的应用系统中,采用软件延时不是一种非常好的方法,除了影响MCU的效率,还会带来一些其它的弊病。但还是很多人使用软件延时,受害不浅。在我书的第8章介绍了T/C的使用后,就不使用软件延时,凡对于ms级的延时使用T/C处理。个别例子中采用了软件延时,也只是为了简化程序,突出重要的地方。
3。回到上面的例子,设计思路是25ms主程序一次循环,其中12ms应用与LED动态扫描,13ms留给做其它的工作。这样,LED的扫描频率为40次,不会闪烁。12ms必须平均分配给6个LED,每个2ms,保证亮度均匀。
4。23楼贴出的函数是LED扫描函数,调用一次,完成6个LED各点亮2ms,执行时间为12ms。
5。下面就3句“多余”的语句做说明:
for循环为6次,功能是每次点亮一位LED。
a.前面的语句是送出相应位的段码,送出后该位并没有点亮。
b.PORTC = position;是控制该位的I/O输出低电平,这样就点亮了一位LED
c.delay_ms(2);这个延时是点亮后保持2ms。如果将其变成delay_ms(1),LED的亮度就会降低,当然留做其它事情的时间就多了。
d.PORTC = 0xff;是关闭所有的LED,作用是防止LED显示的拖尾现象。
去掉该句会产生什么现象呢:假定当前显示第3位,数字是1,点亮2ms;然后程序循环,送出第4位的段码(比如是数字8);由于第3位的位控还是0电平,实际上第3位显示8了,当然时间很短,因为后面马上是第4位点亮了。实际上,第3位上显示1,保持了2ms,然后短暂的显示8,再熄灭掉,这就是拖尾的现象。
可能会说,一般观察不到拖尾现象,可以去掉。但在这个例子中,就是不考虑拖尾情况,也不能去掉。考虑点亮第6位LED后,如果不关闭显示,程序去做其它事情了。这样第6的LED就不是点亮2ms了,而是13+2=15ms了。在外部的效果上,这一位的亮度比其它5个LED要亮的多。
6。我在书中,对这些问题都提出了思考,让读者考虑这些语句的作用,并自己验证。什么叫参考别人的程序,应该是彻底了解别人程序的设计思路,明了每一句语句的作用。只有这样,才能看到其好的方面,或不好的方面。如果认为不好,自己做相应的修改。
7。到第8章、第9章,可以看到动态扫描函数也相应的改动了,没有“delay”了。按键扫描中,就不使用什么“软件延时消抖”了,这个95%的教课书中的方法,误导了很多人。延时消抖的思想是对的,但采用delay死延时的处理方法是不明智的。
8。参考别人的程序实际上也是一把双韧剑。拿到好的程序,可以使你豁然明了,掌握了正确的思路和程序设计方法。而拿到不好的程序,如果自己消化功能不好的话,就会被其框死,自己永远得不到提高。所以对于初学者讲,选择一本好的教材和参考书非常重要,在正确的方法引导下,建立了好的基本思路和分析问题的方法,这样才能为今后正确参考别人的程序打好基础。 谢谢马老师回答,
请注意,你这使用的是串转并,然后通过LED显示的例子,例子的最大的特点是使用少的2根IO口实现多位LED的显示,你这时候通过实现动态有什么意义了,而且多花了PORTC口(固然可以节电),工程运用不会这样的,串转并一般情况就是节省IO口和动态扫描花费的CPU时间.
PORTC = position;//多余
delay_ms(2);//多余
PORTC = 0xff;//多余 我明白了,估计你没有仔细的看本章整个的内容,把这段程序理解成是静态显示的输出了。
1。在一开始我介绍了串转并的8路静态LED显示的设计,使用8片164,有电路图。但你贴的程序不是为此服务的。
2。接下来介绍了6位LED动态扫描方式,用PA口输出段码,PC口控制位,使用了14个I/O口。
3。而你所贴的程序是第三个例子,为了少用I/O口,加了1片164,使用了PA口2个I/O,但还是输出段码,仍然是动态扫描方式。这个方案是介于1和2的折中办法,增加少量芯片,留出更多的I/O口。
4。在后面的思考中,还要求考虑再增加1片芯片(如138),节省PC口的设计。
5。这些方法我都在产品设计中使用过,不是从节电出发,而是考虑成本。因为增加硬件是要成本的,如果I/O口够用,动态方式最省成本。但有时I/O还少一点,那么第3方案就是折中的方案。
6。至于静态显示和动态显示各自的优点和不足,已经在书中讲的很明白了。 马老师,您是专家,我是学生,不过我还是坚持我的意见.
3。而你所贴的程序是第三个例子,为了少用I/O口,加了1片164,使用了PA口2个I/O,但还是输出段码,仍然是动态扫描方式。这个方案是介于1和2的折中办法,增加少量芯片,留出更多的I/O口。
下面是我的意见:
使用164以后,如果不从节电考虑.就不需要再使用动态扫,花CPU时间不说,还花掉几个IO脚(动态扫描),本来两个IO脚解决的问题(串口),您这样还要浪费多几个IO脚(不论138等解码.只是多和少). 1。应该要肯定程序没有问题,三句语句也不是多余的,是吗?
2。然后再讨论使用哪种方式显示的问题。
如果在这种情况下,使用2个8位口采用动态扫描点亮8个LED,但系统还需要4个I/O做其它使用,那么就需要在下面2种方案中选择了。
1。M16、8片164。特点:多出14个I/O(再用掉4个,多余10个无用),静态扫描,CPU化时间少,程序设计简单。
2。M16、1片164。特点:多出6个I/O(再用掉4个,多余2个无用),动态扫描,CPU化时间多,程序设计复杂些。
看看价格:其它一样用M16,LED等。但第一个方案比第2个方案多用7片164。假定1片164为0.6,7片为4.2元。(7倍材料的运输费,7片164占PCB板的面积要大(PCB也贵),焊接点多费用也多,这些就不算了)如果你的产品年销1W,成本就多了4W。假如你是老板,你选择那个?
3。这是教材,还有个目的是让学生掌握更多的方法。如果你掌握了164的串出+动态扫描设计的话,那么对于164串出+静态显示的程序应该更简单的吧。 要我是老板,我把LED部分一个公板,CON4上面有CLK,DATA,VCC,GND,提供一个SDK包,以后复用 有呀,在16章的TWI中,最后就是介绍了一片可以管理8个led+64个键盘的芯片,与AVR只要3根连线的应用。 电子版没有,哎,如果能下载就好了 如果都贴在网上,偶就没有版权了。帖一部分也是偶的广告宣传策略^_^ 马老师,在书的P534页,表A-16的第五行的熔丝状态配置CKSEL=000;SUT=01 , 应该为CKSEL=0001,SUT=01吧? 34楼:谢谢了,是漏掉数字了,我会改在上面。
查过了,你说是对,我原稿上有的,印刷排版漏了。
你已经看完了?提提意见吧,或还有什么地方不对。 马老师:我没看多少,有以下几个问题,不是知道是不是错误,请指正
1、P14 第十行 工作电压范围宽(2.7V~6.0V)现在AVR的picoPOWER系列是最低1.8V也可能是我理解错误……
2、P15 ATtiny85 的系统时钟最高是20M不是1M……
以下是官网上的资料
http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_179880.jpg to【36楼】 jenkinsxu: 500Hz的脉冲信号送到PD3了吗?
to【37楼】 kingofkings: 谢谢! 马老师:P259页,第5行,“在一个PWN周期中”,是不是应该为:“在一个PWM周期中”? 谢谢39楼的朋友。 既然第一个错误出现,那么27页的也错了,翻开一看果然!!!!!!!!
===========================================================
谢谢! 为了方便购买本书的读者学习和参考,本人在拿到书后的第一时间里,花了5天时间将书仔细的核对了一遍。对书中的错误进行了更正,发布在楼主位,请大家注意,并致歉意。
书中可能还有错误的地方,欢迎大家批评指正,并发到此栏下。
再次向购买本书的读者、阿莫站长、以及关心本书的网友表示感谢! 在ICC中定义变量,请使用 unsigned char 声明试一下。在CVAVR中确省的char 表示为unsigned char 马老师,P35,倒数第6行,(512~64K)X16位,是否是(512~128K)X16位? P35页,倒数第2行,$000,应改为$0000。 P45页,第11行,决大部分 改为 绝大部分。 谢谢ecat! 呵呵!马老师的:《AVR单片机嵌入式系统原理与应用实践》一书确实不错!虽然价格是52元,但书籍的质量和信息的容量确实对的起这个价格!所以,在书店的时候我只考虑了1分钟!!买回来仔细看,更坚定了我的选择!呵呵,我是用ICC AVR和GCC AVR的,没用过CVAVR,但我发现此书对CVAVR的介绍并不太浪费篇幅,主要还是在讲AVR的特殊寄存器和内部资源的用法 及原理!!呵呵,:《AVR单片机嵌入式系统原理与应用实践》一书的确很好啊!!刚买来半天,实在兴奋,若有说错欢迎拍砖! P82,倒数4行,X,Rr改为X+,Rr P92,第7行:转到$000。 改为 转到$0000。 谢谢ecat,你比偶还仔细。 哎呀!!
读这本书的快成品书了!
好书就是好书。。。 今天跑到南京的长三角图书批发市场买了马老师的书,计算机类图书一律75折,价格还不错
遗憾是我还以为像M128上一样的是大开本,结果是小开本的
看前先来纠错哈 P192的HD44780引脚功能定义表下面的第二行字REM应该是RAM吧! P152,8行 Programmer 建议改成 Chip Programmer to 55 楼:我打错了,马上纠正。
to 56 楼:我看过了,CVAVR的菜单选项名称是Programmer,不用改的。(1.25.7a)
谢谢2位。 我的CVAVR版本是1.24.8b,看来是版本差异了。 我书附带的CD中,提供的是CVAVR最新DEMO版的软件,限制代码2K。对于第18章的程序可能不够了。其它的例子应该可以用。 今天在当当网买了马老师的书了,8折,而且免了邮费,刚刚到手,真的不错。其实手头的AVR资料是很多的,本可以不需要这本书的,不过那么多的资料都是打印下来的,有时候查找时还真的不方便,放的又乱,所以还是买一本马老师的书,参考也方便了,而且还给几个同事也带了几本。 谢谢楼上的支持了。
希望书对你及你的同事有帮助,并欢迎拍砖^_^ 买书的人好多啊,5000册看样子很快就要消费掉了!恭喜马老师!
终于把第一篇看完了,把我以前零星自学的内容又总结归纳了一遍,还是很有收获的。
该书虽然是一本面向高校的单片机教才,但我认为它更具有工程参考价值,特别是书中花大篇幅讲解的内容确实是在工作中用的比较多的。
很希望这本书可以在国内高校普及,取代传统的51教材。 谢谢ecat!
更希望你能仔细的看后面的章节,到不是内容精彩,是帮我找书中的问题。
你已经帮助找到了很多的错误,非常感谢! 马老师,P226,4行 指令out sreg,temp 的操作数部分sreg,temp 被移到了注释段了。 第85页有两个elpm rd,z+的 是不是印刷错了啊 楼上好细心!倒数第3行 LPM 应该写成 ELPM。
ELPM Rd,Z 这条指令的说明中 RAMPZ:Z 我不清楚是什么含义,马老师能给解释一下吗? 同时发现,P85,倒数16行 RAMPZ 写成了PAMPZ。 RAMPZ 寄存器我在M128中找到了,M16没有,也就是说这条指令因M16中FLASH不够大,是用不到的?请马老师解惑。 ELPM指令是扩展的AVR指令,主要针对FLASH大于64K字节(32K字)使用的,如M128。对于M16等FLASH小与64K字节的AVR是不支持的。
拿M128为例,它的FLASH是128K字节,64K字,因此它的内部有一个寄存器RAMPZ,实际该寄存器在M128中只用到最底的1位。
这样RAMPZ的最低位,加上Z寄存器的16位,构成17位的地址指针,可以寻址整个FLASH的128K字节空间。
还可以这样理解,RAMPZ的最低位,加上Z寄存器的高15位,构成16位的地址指针,可以寻址整个FLASH的64K字空间,而Z寄存器的最低位的0和1,表示字的高位字节和低位字节。
采用后一种的理解方式相对好些,当涉及到BOOTLOAD时,就比较容易理解如何定位和操作的。 谢谢马老师! 请问马老师:第222页倒数第2行if(count)--counter;不知道是什么意思,是不是有错? 楼上,你自己倒是写错了哈哈。
如果counter不为零,counter自减。 71楼:没有错,相当下面的形式:
if (counter)
--counter;
else
counter = 15; 哦,回得真快,打扰了,谢谢! 马老师:书中178页图6-12,8段字型“点”为P。179页表6-3,PA7控制“点”标的是h.是否需要统一标注,好理解啊。 采纳75楼的建议.谢谢! 马老师,P262,第6行,看上去很多余啊? 78楼:在这个例子中是多余的,只是留个伏笔.在P263的思考和实践中,用到该语句做为一个分析和实践问题. P264,第14行,OCF1A,OCF1B 漏掉了F。 OC1A\OC1B是指中断请求信号,与263页图8-19中的信号描述一致,它们在标志寄存器中的名字叫OCF1A\OCF1B.不用改的. 哦,原来这样,谢谢! P27页倒数第2行的“ATmage16”应改为“ATmega16”。41楼提醒过。
P318页倒数第4行的“以保证换算的正确型”是否改为“以保证换算的正确性”。
===================================
谢谢提醒.并做了修改. P300,程序中的倒数第二条指令有部分印刷重叠。
=============================
谢谢. 多谢马老师!
书已经拿到了!
马老师如此严谨,佩服!
我从来没有遇到如此严谨的老师,我相信成为你的学生真是人生一大幸事! P307,12行,非线形误差 应当该为 非线性误差。 谢谢86楼。
这2个字已经有两处错了,该用“形”用了“型”,而用“型”的地方却用了“形”。需要补语文了。^_^ 马老师,非线型误差是什么概念呢?我以前只知道有非线性误差的。 http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_182391.jpg 误差可以分为线性和非线性2种.
线性误差主要是由于0点(偏置电压)的不准或放大倍数的偏差造成的,误差随电压的升高,成比例的增加.这种误差是可以矫正的.
非线性误差是由于器件材料或随机干扰造成的,通常没有规律,也很难矫正.
本章参考文献中,有ATMEL公司对AVR的ADC误差分析和如何矫正的参考资料,可以进一步参考学习. http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_182518.JPG 昏倒!看来我要和马老师斗争了。
我是在问马老师什么是"非线型"?你在楼主位的勘误公告中特别把 非线形 改为 非线型 ,我非常不理解,因为我只知道 非线性。
==================
谢谢了.现在应该对了吧.
==================
终于改对了^_^ P354,第6行,建议加入一个“沿”字:
移位寄存器中的数据是通过Latch控制线上的上升(沿)打入到锁存器中的。
======================
谢谢,改在上面了。你已经完成2/3了。 马老师,P63,第7行的"LDD R16,Y+31"应该为"LDD R16,Y+$31"吧,否则后面得注释不正确
========================
是的,谢谢. 马老师,P47,第4行的“一组溶丝位SUT、CKSEL...”,“溶丝”应该为“熔丝”
========================
谢谢. 到目前为止,已经有52处改动了。出汗了...... 真正出汗的应该是本书的两位责任编辑和北航出版社。 不要搞大了.作者是我本人,当然是我要负责的. P389,第7行,分离器件 应改为 分立器件。
=========
谢谢。 P388,第9行,硬件低层 应改为 硬件底层 否则于P401,第12行矛盾。
类似的问题还有P351,第9行。
P391,第9行。
这样的问题可能还不只这几处,马老师要好好检查一下了。 P407,第1行,I2C印刷错误。 P409,13行,正确受到 应改为 正确收到。
==========================
已经做了更正,并且我也找到了几处.谢谢.