搜索
bottom↓
回复: 53

写给AVR初学者(一些小技巧) (原创)

[复制链接]

出0入0汤圆

发表于 2007-8-25 22:23:04 | 显示全部楼层 |阅读模式
C语言现在因为其可读性,移植性,效率较高等特点越来越受到欢迎,但是还有一些人因为不了解C里面的一些操作,而坚持用汇编,所以有必要介绍一下在嵌入式C编程的一些技巧.






在汇编里面位造作用  SEI  PORTA  3,把PORTA的第三位置1 ,

在C里面,可以用&与|表达:

PORTA=PORTA|0x08,  简写为PORTA|=(0x08);  

PORTA=PORTB&(0xF7) 简写为PORTA&=0xF7



以上是对寄存器的某一位操作,当然也可以同时操作几个位, |0x0F ,则低四位置1;








在很多地方,如ATMEL的文档里我们会看到像TCCR1A|=(1<<COM1A0);//A比较匹配,



这样的操作,这是怎么回事呢?   



首先要知道<<  ,>>的意思,这是左移,右移操作,(A<<3)是把A的二进制数向左移3位,即乘以2的三次方.



COM1A0是TCCR1A的第6位,这是ATMEL给TCCR1A寄存器第6位取的名字,  在ICCAVR编译器的头文件iom16v.h里可以找到这样的定义"#define OCR1A0   6"  ,所以TCCR1A|=(1<<OCR1A0)的意思是把TCCR1A寄存器的第6位置1, 如果TCCR1A|=(1<<OCR1A0)|(1<<WGM10),那么WGM10同时也被置1;



而TCCR1A&=~(1<<OCR1A0)把第6位清零.  之所以我们要这样写而不写作TCCR1A|=0x40我想一是便于记忆,只记每一位的名字,不记在哪位,这样不容易错,便于对照DATAsheet检查程序.此外还更好移植,从一个系列的一个单片机到另一个单片机,只要控制某功能的位的名字不变,例如OCR1A0不管在哪个位置,此语句都实现OCR1A0置一的功能.



以上是某一个或几个位置一或清零操作,当然可以直接赋值,例如PORTA=0X0F,则是把低四位置1,高四位清零,这样看起来最简单但是对于我们想要改变某些位而不影响其它位的场合是不行的,例如1602液晶操作E和RS,还有数据等等,有严格的时间顺序,彼此要独立,按4data线统统接到PORTA,则无法用=直接赋值.








ICCAVR 的macros.h里定义了一些有用的宏,如SEI(),其实是"asm("SEI") ",   此外还有CLI(),NOP()  等等,大家可以去看看,顺便说说,ICCAVR嵌入汇编的格式是asm("汇编指令");



C 里面我们把一些宏定义,函数的声明等写到.h头文件,而.c则是函数具体实现,当程序比较大时可以把一般函数和main函数分开,一起ADD到Project里面,便于管理.








ICCAVR里面的中断用#pragma interrupt_handler INTTERRUPT_NAME:INTERRUPT_NUM,        INTERRUPT_NAME是自己取的中断函数名,



INTERRPT_NUM是所选中断的中断号,在DATAsheet里有..在这之后就可以写自己的中断函数体了.








在嵌入式的C程序编写里边,尽量少用float,double等等数据类型,可以用整数运算,到最后一步再除以10的多少次方得到所要的数.此外像sin,  log这样的高级函数,虽然C编译器自动给你生成,不想汇编那样自己用加减移位来编写,但是对于这样的函数,C编译器会比较大的代码,所以尽量少用.除法运算若被除数是2的次方,可以用移位操作代替.








以上是我个人感觉写C时要注意的问题,希望对初写C的人有一些帮助

出0入0汤圆

发表于 2007-8-25 22:37:12 | 显示全部楼层
沙发

支持一下。

出0入0汤圆

发表于 2007-8-25 22:38:51 | 显示全部楼层
感谢楼主!
头像被屏蔽

出0入0汤圆

发表于 2007-8-25 22:39:55 | 显示全部楼层
是原创或转载?转载的请注明出处。谢谢。

出0入0汤圆

发表于 2007-8-25 22:55:26 | 显示全部楼层
阿莫老大也是夜猫子啊,呵呵,一般都几点睡啊?
头像被屏蔽

出0入0汤圆

发表于 2007-8-26 00:00:18 | 显示全部楼层
等你们睡了,我要对新服务器做一些攻击性测试。。

出0入0汤圆

发表于 2007-8-26 04:10:57 | 显示全部楼层
我就不睡看你怎么测试!!呵呵呵呵!
头像被屏蔽

出0入0汤圆

发表于 2007-8-26 07:06:48 | 显示全部楼层
由于楼上不睡觉,昨晚我只好先睡了,测试没有进行

出0入0汤圆

发表于 2007-8-26 07:41:12 | 显示全部楼层
支持

出0入0汤圆

发表于 2007-8-26 12:46:06 | 显示全部楼层
谢谢 很长见识

出0入0汤圆

发表于 2007-8-26 13:10:47 | 显示全部楼层
呵呵,我发现一般6am左右没有什么人,阿莫可以考虑在这个时间测试。

出0入0汤圆

发表于 2007-8-26 13:16:13 | 显示全部楼层
学习。。。。

出0入0汤圆

 楼主| 发表于 2007-8-27 11:38:39 | 显示全部楼层
啊莫站长,这是我自己写的,不好意思,没有注明。

打字不快,敲了半个小时。

<<  >>等等东西,DATASHEET里面很多,我开始没弄明白,很不爽,最后查谭号强的C书和ICCAVR的头文件才搞清楚,

我一个朋友初学AVR,从51汇编转来的,我给他讲这些,事后总结发到这里,估计对初学C和看ATMEL公司例程的人

有所帮助。
头像被屏蔽

出0入0汤圆

发表于 2007-8-27 13:01:45 | 显示全部楼层
自己写的就要COOL!了!



我帮你重新排版一下吧。现在的太乱了。

出0入0汤圆

发表于 2007-8-27 16:44:23 | 显示全部楼层
学习

出0入0汤圆

发表于 2007-9-6 22:59:31 | 显示全部楼层
老大是夜猫子里的老大啊,这帮兄弟睡得就够晚的了
你还等别人睡了再攻击,我晕了
我前天半夜有半个小时上不去论坛,我都在给你写电邮了
写了一半上去了,就没发,是不是你自己在攻击OURAVR啊? 呵呵

出0入0汤圆

发表于 2007-9-7 09:49:49 | 显示全部楼层
参考参考.

出0入0汤圆

发表于 2007-9-7 10:06:05 | 显示全部楼层
支持一下楼主

出0入0汤圆

发表于 2007-9-9 15:58:55 | 显示全部楼层
参考参考

出0入0汤圆

发表于 2007-9-9 16:30:00 | 显示全部楼层
这与51、AVR本身无关。

问题是基础打的不牢固,C语言本身就不扎实,到用的时候就叫苦了,然后归结到AVR难学,天晓得。

出0入0汤圆

发表于 2007-9-9 19:46:52 | 显示全部楼层
谢谢,这个对初学者确实大有帮助,这几个点跟51大有区别

出0入0汤圆

发表于 2007-9-10 08:49:59 | 显示全部楼层
PORTA=PORTA|0x08,  简写为PORTA|=(0x08);   
PORTA=PORTB&(0xF7) 简写为PORTA&=0xF7

TCCR1A|=(1<<COM1A0);

在嵌入式的C程序编写里边,尽量少用float,double等等数据类型,可以用整数运算,到最后一步再除以10的多少次方得到所要的数.此外像sin,  log这样的高级函数,虽然C编译器自动给你生成,不想汇编那样自己用加减移位来编写,但是对于这样的函数,C编译器会比较大的代码,所以尽量少用.除法运算若被除数是2的次方,可以用移位操作代替.

======================================================================================

以上LZ提到的事项与用51还是AVR无关,只要用C语言作为开发平台的话,在程序中都会出现这样的语句和尽量使用短类型的变量等。

以上的问题关键不在于使用AVR还是使用51,实际就是C语言编程能力本身的问题,在学校学的那点C,到了实用是远不够的,不管你是使用51,还是使用AVR。

出0入0汤圆

发表于 2007-9-10 09:08:27 | 显示全部楼层
呵呵,还发现一个小问题。那就是A&=0xf7和A&=~(0x01)生成的汇编代码是不一样的。我是在ICC上面试的,其它编译软件不知道会不会不一样。有兴趣可以自己发现一下。

出0入0汤圆

发表于 2007-9-10 09:24:58 | 显示全部楼层
22楼:

首先是结果应该是一样的。不同的C平台产生的汇编代码是非常有可能不同的,这也说明了不同的C,效率上是有差别的。

作为初学者,首先应该把C本身的使用搞清楚,会使用。等到了有一定的经验和积累后,才能更深入的了解从C到汇编的更深入的问题,优化自己的程序。饭要一口一口的吃,基础要扎实全面,才能有真正的上升空间。

出0入0汤圆

发表于 2007-9-10 09:59:33 | 显示全部楼层
to 马老师
    有句话不知道该说,那就是作为老师来说,总感觉自己的学生应该注重基础,当然我也不是说不应该注重基础。只是有时候感觉老师一碰到什么与“基础无关”的东西都把它屏蔽掉了,总感觉这些内容与“学生”无关。结果就直接导致很多学生毕业之后才发现自己学的东西与现实之间的差距有多大,也就使得很多公司不敢要这些学生。这也算是教育界的定势吧。
    我感觉这些方面的内容应该多和学生交流,这样就会使学生更加信任老师。而不是只是感觉老师在念书。
    惭愧的说。我就是这种教育定势的受害者。开始是学生的时候没见过什么深入一点的东西,总感觉这些东西太简单了。以致于对毕业后的工作充满豪情壮志。过了几年才明白,原来学校里面学的东西真的是太…………。
    呵呵,说多了点。我也是有感而发。现在工作有两年了。22楼说的问题是我在工作的时候发现的,老师没和我说过。在用之前根本不会往这个方面去想。
    总之,个人感觉,初学者不一定是要把基础学牢了以后再上升,那样会失去很多的乐趣,而是应该交叉提升,当然,只要是对于有心的人。无心的人也只能学完基础就拜拜了。

出0入0汤圆

发表于 2007-9-10 21:12:17 | 显示全部楼层
to lwfengbao:

我们现在的教育是一种应试教育的模式,造成这种状况是社会的问题。从学校角度讲,有教师的原因,也有学生的原因。

我不想和你讨论如何改变这种情况,我也无力、也不可能改变这种情况。我只是想在这里告诉大家,如果你真的喜欢和想成为真正的电子工程师的话,应该如何学习。能够到这里访问的网友,其学习的积极性可能比电子专业的大学生要高,所以我才强调要注意基础的学习。

出0入0汤圆

发表于 2008-3-7 09:40:43 | 显示全部楼层
学习了,谢谢!!!

出0入0汤圆

发表于 2008-3-7 10:43:25 | 显示全部楼层
谢谢了.

出0入0汤圆

发表于 2008-3-7 11:29:40 | 显示全部楼层
学习中。。。。

出0入0汤圆

发表于 2008-3-7 15:37:39 | 显示全部楼层
说到大学教育,其实早有不少专家学者总结过,我个人感觉是:读大学就是为了个文凭(除个别人个人专业如英语、音乐、艺术、体育等为了提高能力),如果你的老师的确在专业知识上有一定的水平,他的学生才算可以,否则学生不如逃课去找工作做,考试什么的作弊得了,反正毕业以后全部丢掉或者忘记了……

出0入0汤圆

发表于 2008-3-7 22:58:26 | 显示全部楼层
好,我是刚刚接触AVR,自己摸索了半个学期,一直很迷茫,现在看了这个觉得茅塞顿开了,谢谢!也感谢阿莫提供这么好的交流平台,我会宣传这个网站的。

出0入0汤圆

发表于 2008-3-8 20:16:48 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2008-3-9 12:37:27 | 显示全部楼层
支持啊!!!简单明了!

出0入0汤圆

发表于 2009-7-12 15:25:05 | 显示全部楼层
学习了 谢谢

出0入0汤圆

发表于 2009-7-12 19:36:49 | 显示全部楼层
既然我们认识大学的毛病 为什么不去改变 至少自己去改变 我也是一名准大二的学生 不过我的专业是电磁场方面的 学校给我们很多平台 给我们发展给了很多支持 与其花时间天天埋怨 还不如踏踏实实走好每一步~~

出0入0汤圆

发表于 2009-7-12 22:29:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-12 23:33:48 | 显示全部楼层
好帖~
不过C语言基础可以的话大部分应该都能理解的。
多用用就知道了。

出0入0汤圆

发表于 2009-7-13 08:53:02 | 显示全部楼层
记下。

出0入0汤圆

发表于 2009-7-13 11:05:47 | 显示全部楼层
呵呵,都是有性格的人啊!顶起

出0入0汤圆

发表于 2009-7-14 01:40:50 | 显示全部楼层
好,支持

出0入0汤圆

发表于 2009-7-14 14:09:03 | 显示全部楼层
好贴

出0入0汤圆

发表于 2009-7-15 15:05:48 | 显示全部楼层
很好

出0入0汤圆

发表于 2009-7-18 14:58:50 | 显示全部楼层
好的,应该支持!

出0入0汤圆

发表于 2009-7-18 17:41:50 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2009-7-18 18:41:22 | 显示全部楼层
支持下

出0入0汤圆

发表于 2009-7-20 11:32:22 | 显示全部楼层
xiexie

出0入0汤圆

发表于 2009-7-20 12:25:23 | 显示全部楼层
不错啊,

出0入0汤圆

发表于 2009-7-25 20:48:49 | 显示全部楼层
雪中送炭,刚为这个语句发愁呢,太好了,谢谢分享!!!!

出0入0汤圆

发表于 2009-7-26 07:52:50 | 显示全部楼层

出0入0汤圆

发表于 2009-7-26 17:56:24 | 显示全部楼层
刚开始学的时候不懂,看了此贴有那么回事了!

出0入0汤圆

发表于 2009-8-19 20:56:11 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-8-19 21:20:14 | 显示全部楼层
支持!!!

出0入0汤圆

发表于 2009-8-19 23:56:26 | 显示全部楼层
之前看过,这次又看了一遍,很受用,谢谢楼主!

出70入0汤圆

发表于 2009-8-20 09:13:29 | 显示全部楼层
“尽量少用float,double等等数据类型”? 有些地方用浮点类型会省事很多,个人认为,该用的浮点的时候就尽量用,用多了就会避免错误了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 03:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表