首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

μC/OS-II实时内核下的A/D驱动程序设计 02

μ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转换速度快,这种驱动程序的实现是最好的。
返回列表