- 21
- 11月
- 11
- 11月
这几天,Hanny稍微用了一下MMA7660传感器,详细阅读了一下MMA7660的DataSheet,又借着机会与FreeScale的工程师交流了一下,在这里总结一下MMA7660传感器的使用心得。
MMA7660是一款重力传感器,主要用于检测X、Y、Z三个轴所受到的加速度大小。检测范围是-1.5g ~ 1.5g,其中,g为一个重力加速度。
由于MMA7660比较低端,因此也只有6BIT的精度,而且输出值上还会有3个刻度的误差,因此在值的输出上,必须经过一个软件的均值滤波处理。一般来说,如果传感器只是应用于方位检测的话,8个值的滤波就够了。而用于动作检测的话,一般使用32阶的均值滤波。
MMA7660有两种工作模式,一个为Auto-Sleep,即Running模式。在该模式下,传感器可以配置较高的采样率。另一个模式为Auto-Wakeup,即Sleep模式。值得注意的是,该模式并非真正的休眠模式,而只是低速采样模式。在该模式下,能够有效地降低芯片的运行功耗。
MMA7660内部还支持几种常见的中断。在这里值得一提的就是Tap中断了。由于Tap是一个短时间的脉冲,因此只有在最高采样速率下,即120Samples/S下,才能够有效地触发Tap中断。
在动作检测的过程中,尽量采用的是相对的坐标值,而不是绝对的坐标值。因为在生产过程中,并不能保证传感器的绝对水平。
MMA7660的采用IIC的接口。IIC接口这里就不详细介绍了。Hanny在这里要说的是:在读取XYZ坐标的时候,最好采用的就是Multiple Byte Read的方式,这样才能保证XYZ三个坐标是同一次采样的结果。如果分开读取,则有可能读取到不同组的采样数据。
最后,总体来说MMA7660还是一颗比较低端的芯片,如果有高端应用的话,可以考虑使用MMA8452。
附:MMA7660的datasheet
- 3
- 11月
openrisc,或者说mips吧,跳转指令会有一个延迟槽。
首先,Hanny可能先需要解释一下什么是延迟槽。我们知道,CPU指令在执行跳转指令时,一般是会清空流水线的。这样,就会造成几个指令周期的浪费。具体浪费周期数取决于流水线的级数。
而延迟槽的作用呢,则是在执行完跳转指令,并执行跳转指令的下一条指令后,才会真正地跳转至目标PC。因此,延迟槽在一定程度上,能够提高CPU的效率。
有的时候,可能不想去利用延迟槽,在GCC的编译选项中增加
-fno-delayed-branch
这样,在编译过程中的跳转,都会在延迟槽中填入nop指令。缺点就是有点浪费程序空间了。
- 3
- 11月
最近使用GCC时,老是提示一个错误:
/cygdrive/xx/..\xxx/xxxx.c:118: multiple definition of `xxxx'<br />
xxx/xxxx.o:/cygdrive/xx/..\xxx/xxxx.c:118: first defined here
大概意思就是,有一个函数重定义了!
可是在整个程序中,我并没有去重定义这个函数啊!
最后,经过Hanny的一番查找,原来是斜杆和反斜杆惹的祸!
我们知道,Windows是比较喜欢用反斜杆的,而Linux却钟情于斜杆。
由于在GCC的Makefile中使用了反斜杆的路径,而在linker文件中却使用了斜杆路径,这样,链接器就认为是两个不同路径了。同一个文件也就链接了两次,造成了重定义的发生。
解决方法就是,统一使用斜杆或反斜杆就行了。而Hanny比较推荐斜杆。
- 29
- 9月
IAR对局部部变量,一般是采取虚拟寄存器的方式来进行访问。如果是外部堆栈的话,有时它会将SPH,SP的值赋至DPTR中,然后使用DPTR来对堆栈进行操作。
然而,除了将SPH和SP的值赋至DPTR外,它还会做一些动作。
ANL A,#0x03 ; Maks out relevant ESP bits.<br />
ORL A,#(HIGH(sfb(EXT_STACK)) & 0xFC)<br />
MOV DPH,A
其实就是会将堆栈的高6BIT地址强制不可改。具体作用暂时不明。
不过,如果有做一些多BIN的工程时,可就要小心了,需要保证堆栈的高6BIT地址不变,否则可能出一些不可预料的错误。