μC/OS-II实时内核下的A/D驱动程序设计 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
μC/OS-II实时内核下的A/D驱动程序设计 02
保存全部CPU寄存器; /*将CPU的PSW、ACC、B、DPL、DPH及Rn入栈*/
通知内核进入ISR(调用OSIntEnter()或OSIntNesting直接加1);
发送ADC转换完成信号; /*利用μC/OS-II内核的OSSemPost()*/
通知内核退出ISR(调用OSIntExit());
恢复所有CPU寄存器;/*将CPU的PSW、ACC、B、DPL、DPH及Rn出栈*/
执行中断返回指令(即RETI);
}
在这种方法里,要求ISR执行时间与调用等待信号的时间之和为A/D转换时间。
如果A/D转换时间小于处理中断时间与等待信号所需的时间之和,则可以用第三种方法。如图3所示,前两步(①②同以上两种方法)结束后,驱动程序接着在一个软件循环中等待(③)ADC直到完成转换。在循环等待时,驱动程序检测ADC的状态(BUSY)信号。如果等待时间超过设定的定时值(软件定时),则结束等待循环(循环等超时)。如果在循环等待中,检测到ADC发出转换结束的信号(BUSY)时,驱动程序读取ADC转换结果(④)并将结果返回到应用程序(⑤)。驱动程序伪代码如下:
ADRd(ChannelNumber){
选择要读取的模拟输入通道;
等待AMUX输出稳定;
启动ADC转换;
启动超时定时器;
while(ADC Busy & Counter 0);/*循环检测*/
if(Counter==0){
*err=信号错误;
return;
}else{
读取ADC转换结果并将其返回到应用程序;
}
}
A、D转换速度快,这种驱动程序的实现是最好的。 |
|
|
|
|
|