针对PIC微控制器的设计窍门
PIC异步串口的状态位包括FERR标记。FERR表示终止位为低而不是所要求的高,这表明发送方的波特率低于接收方的波特率,并且预期的终止位的确是一个数据位。也可用FERR来检测RS-232的“中断”条件。中断通常包括一个低起始位、全0数据以及一个0终止位。如果FERR被设置且数据为0,则将有一次中断,但一般需对输入做较长时间的观察,以确认它保持为低。“中断” 条件是一种向系统发送秘密“蝙蝠信号”并启用特殊配置或测试模式的方法。有些终端能发送各种长度的中断,或者设计工程师可将串口的RX输入缩短为正电压,其确切电平取决于硬件,但它可低到3V。如果是RS-232状态输出(如DTR),则其有效电平为正,且将能提供接收器所需的电压电平。
[next]
TX9及TX9D是两个经常被忽略的特殊函数寄存器位,可对TX9设置进行设置,使TX9D作为第9个数据位被发送。额外数据位的一种传统用法是将其作为错误检查的奇偶校验位。如果错误检查对应用很关键,那么只进行简单的奇偶校验还不够,因为错误检查位可能出错。
曾经有一种采用RS-485的系统通过电线在数百英尺的距离上进行通信。该系统采用具有故障自恢复功能的RS-485芯片,即使电线是开路的,它也能保证有效输出。电线开路在半双工通信时经常出现,因为数据在同一对电线的两个方向上传输,每次只有一边能发送,而在间歇期间两边都在侦听,这使电线上没有驱动信号。该系统可靠工作了数年时间,直到客户想采用其它外来的RS-485设备。
图5:在堆栈上进行5+3运算。
这些外来设备没有使用具有故障自恢复功能的器件,系统在PIC的TRMT状态位表明所有的位都被发送后才释放线路。TRMT不对终止位进行计数,因此PIC在另一端收到终止位之前释放线路。这并没有选择修改硬件,而是将PIC配置成发送9个数据位,并使TX9D为高以发送在另一端看起来为终止位的一个额外数据位。这样,这两种系统从此都工作得很好。
如果正在设计一种新系统,合适的终端将非常有用;并且如果硬件允许使用这种终端,则可在发送时使接收器有效。一旦侦听到自己的发送,设计工程师就知道包括终止位在内的所有数据位都已安全地抵达另一端。
参数堆栈
尽管多年以前人们为8位微处理器编写了一些图形函数,但设计工程师还需要32位定点运算。由于存储器有限,所以在进行复杂计算时,复用临时存储空间来存储中间值是很有吸引力的。知道何时能安全地复用特定的临时存储位置将带来更多复杂性。 [next]
Forth语言采用参数堆栈与RPN。计算时,先从参数堆栈中弹出参数,然后再将计算结果推入参数堆栈。临时存储空间总是位于参数堆栈的顶部,当从堆栈中弹出一个参数后,该临时存储空间被自动释放并可再被使用。
使用参数堆栈是处理复杂表达式及中间结果的一种便利方法,尤其是当编译器不支持最佳数据大小的时候。如果没有参数堆栈,则“add”函数就可能会将两个参数相加,然后再将结果返回至某一个地方;而有了参数堆栈,则算术函数不需要任何参数,也不用返回任何结果。Add() 函数可能会先从堆栈中弹出两个数,将它们相加后再将结果推入堆栈中。数据可以是32位、24位或任何所需的位数,也不必考虑数据大小,除非需要在堆栈与其它位置之间转移数据。以这种方式使用参数堆栈,要求重新考虑数学运算与函数,而RPN则提供一种简单的解决方案。
图6:Over() 与 Add() 函数。
代数表达式“5+3” 可用RPN编码成“5 3 +”,其程序代码如下:
Push(5);
Push(3);
Add();
代数表达式“(2*3)+(4*7)” 可用RPN表示为“2 3 * 4 7 * +”,其程序代码为:
Push(2);
Push(3);
Multiply();
Push(4);
Push(7);
Multiply();
Add();
如同Add() 函数一样,Multiply()函数先从参数堆栈中弹出两个参数,将它们相乘,然后再将结果推入堆栈中。
除了支持通常的算术运算,Forth语言还有几种操作堆栈中的值的方法。Dup()函数复制推入栈顶(TOS)的最后值;Over() 函数复制栈顶以下的第二个值;Swap() 函数交换两个栈顶值;Drop() 函数将值推入栈顶。Pick(n) 函数复制栈顶以下第N个值。图6显示Over() 函数如何将两个值保持在栈上并对它们求和。 [next]
图7:内部IBF与OBF信号。
当将数字堆砌到堆栈上时,只需调用少数几个函数即可进行复杂运算,而无需参数或返回值。
笔者用这些从Forth及RPN借用来的概念开发出一个精度扩展数学库。有了PIC,函数调用常常编译为单个操作码,可以从ftp://ftp.embedded.com/pub/2005/04rowe下载PicMath.c ,该版本适用于CCS PCM编译器,其配置最小为:
1.将StackDataSize栈数
- 分析连结USB闪存盘与PIC微控制器的简单方案(10-08)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)