打印
[AVR单片机]

不喜欢9位模式~~~飞船受"**"影响太重---"程式"~~~村里叫"程

[复制链接]
楼主: lwking412
手机看帖
扫描二维码
随时随地手机跟帖
21
lwking412|  楼主 | 2008-5-11 00:26 | 只看该作者 回帖奖励 |倒序浏览

dai_weis朋友,我看了手册

但是手册上很多东西变成程序我会觉得有些无法理解,可否请你稍微给我讲仔细点呢?如果因此浪费您的时间,实在不好意思,可是对于一个初学者,想不通是很难受的,所以我现在很想知道为什么

使用特权

评论回复
22
dai_weis| | 2008-5-11 00:27 | 只看该作者

呵呵,基本不用傻等这种方式

因为我还需要MCU做好多工作,它完成了用中断通知就好了

使用特权

评论回复
23
宇宙飞船| | 2008-5-11 00:28 | 只看该作者

马老师对硬件理解不透的结果,应该是实战不够!

使用特权

评论回复
24
lwking412|  楼主 | 2008-5-11 00:28 | 只看该作者

别见怪,不是很理解

0 位是 TXB 位啊,那样的话代表TXB为零或1,对不起了,有时候可能解答的人心里明白,可是问问题的人还是很不明白,希望你别见怪

使用特权

评论回复
25
dai_weis| | 2008-5-11 00:32 | 只看该作者

睡觉之前做做好事,也许明天就没有心情了

对于RB9的位置在寄存器的第一位即是bit1
所以RB9的值应该存放在XXXXXX?X,就是? 的位置
那么其他的X对你来说没有用途
C的基础中要是取得某一位,那么需要怎么做?
你不会去把X & 0b00000010;的方式吧?
也不是不可以,呵呵
一般把需要的位移到第0位,然后去掉第7-1位的值,就是我们要的结果了 

使用特权

评论回复
26
t.jm| | 2008-5-11 00:32 | 只看该作者

没错,扣个帽子还可以:

可读性差,因返回是unsigned int,gcc 对resh做了类型转换。

使用特权

评论回复
27
宇宙飞船| | 2008-5-11 00:32 | 只看该作者

对硬件理解不透,整个逻辑设计有问题,垃圾的设计!

所长。。。在哪里。。。出来分析一下!好让俺见识一下所长对MCU的精通呀!

使用特权

评论回复
28
lwking412|  楼主 | 2008-5-11 00:45 | 只看该作者

有些明白了,真的非常感谢,dai_weis

因为resh=(resh>>1)&0x01,并不是UCSRB=(resh>>1)&0x01,如果是后者就是TXB位了,不符合要求,而前者只是让resh获取第9位的值,是这样的吧,谢谢你,朋友,如果想要电磁场入门,找我就好了,一定耐心解答:)
另外我感觉X & 0b00000010更好理解一点哦,是把
最后祝您步步高升

使用特权

评论回复
29
lwking412|  楼主 | 2008-5-11 00:47 | 只看该作者

t.jm 麻烦告诉我

 t.jm 发表于 2008-5-11 00:32 AVR 单片机 ←返回版面    

28楼: 没错,扣个帽子还可以: 

可读性差,因返回是unsigned int,gcc 对resh做了类型转换 
 
如何看出来做了转换,程序里面似乎没有啊???

使用特权

评论回复
30
t.jm| | 2008-5-11 08:51 | 只看该作者

这个类型转换是隐式的,

对此我做了测试,resh左移8位不会丢失,就好像resh是16位一样。如果老马做强制类型转换就安全了,他漏了而GCC帮他做了。

使用特权

评论回复
31
音乐乐乐| | 2008-5-11 09:59 | 只看该作者

ls,这个工作有的编译器会做,有的编译器不会做的

使用特权

评论回复
32
zhousd| | 2008-5-11 10:53 | 只看该作者

某些人净会蒙小菜鸟,碰到真正的高手,P都不敢放!

不好玩。

使用特权

评论回复
33
t.jm| | 2008-5-11 11:34 | 只看该作者

所以说要多看代码规范,才能写出安全的代码。

使用特权

评论回复
34
粉丝| | 2008-5-11 13:24 | 只看该作者

原来21IC的某些所谓的高手是平常用嘴吹出来的!

终于见识到了。。。

使用特权

评论回复
35
lwking412|  楼主 | 2008-5-12 11:38 | 只看该作者

THANK YOU

呵呵。我很多不会,劳大家费心了

使用特权

评论回复
36
ATmega32L| | 2008-5-13 12:48 | 只看该作者

resh<<8是16位,而不是8位,这是C标准

程序没有问题。

resh<<8是16位数据,而不是8位。C语言<<自动将不满int型扩展成int型(这是C语言标准)。 
返回的是一个16位数,高8位是resh,低8位是resl 

使用特权

评论回复
37
lwking412|  楼主 | 2008-5-13 14:26 | 只看该作者

谢谢

虽然我是电磁场专业但有你们的帮助我相信我会**学下去

使用特权

评论回复
38
kanprin| | 2008-5-13 17:49 | 只看该作者

我的理解

这个例子不懂的地方有两个 
1.关于return -1代表什么意思啊,是不返回的意思么 
2.resh=(resh>>1)&0x01; 
Return ((resh<<8)|resl);是什么意思啊 
既然resh=UCSRB,那么resh>>1就是把UCSRB的位1 RXB位右移1位,这样RXB位的数值就移动到了第0位上,在于0x01相&代表什么呢?这样一来,resh的值只有两种情况00000001或者00000000.不明白这样有什么用 



1.程序注释已说明白,如果接收错误的话,返回-1;
2.
resh=(resh>>1)&0x01; 
/*
//获取有效数据的第9位,注意前面接收的时候是resh=UCSRB;
//而实际有效位RXB8在UCSRB寄存器的第2位(从1算起)
//所以取有效数据需要把第一位移走(右移1位),然后把其他无用数据清除
//即移完后再&0x01;
*/
Return ((resh<<8)|resl);//将接收到的9位数据合并成一个整形数据返回


3.题外话:飞船没必要揪住什么稻草不放,结果这只是数据手册上提供的例程而已,并非出自马潮之手(取来用之)。至于程序的致命之处,鄙人确实没发现有什么不对劲的地方,说不定也有可能只是你自以为是呢
(正如

 宇宙飞船 发表于 2008-5-10 21:58 AVR 单片机 ←返回版面    

3楼: 的确有错,resh应定义成16位unsigned int resh 

unsigned int USART_Receive(void)
{unsigned char status,resh,resl;//才8位定义。
。。。。
Return ((resh<<8)|resl);//resh 原定义是8位,resh左移后变成0了,真垃圾!
}  



呵呵。技术讨论,最好对事不对人,以和为贵,互通有无。

使用特权

评论回复
39
kanprin| | 2008-5-13 18:03 | 只看该作者

难道所谓致命错误是

本身想发送-1这个值,而恰巧发生接收错误的情况?

使用特权

评论回复
40
t.jm| | 2008-5-13 19:30 | 只看该作者

-1代表0XFFFF,正常时候9BIT是不会有

这个值,所以可以用来表示错误。

使用特权

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

本版积分规则