打印

请教几位斑竹,psoc中用户自定义API会存在什么风险?

[复制链接]
2151|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
碧水长天|  楼主 | 2009-3-24 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PSOC的API比较方便;但不是太全,比如del-sig模块的输入,只能在器件编辑器中选择好,程序运行中没有API函数可以改变其输入。

通过PSOC寄存器定义发现,可以通过更改相应的模块来改变del-sig模块的输入信号的,于是自己编写API,通过改变ASC10CRx寄存器的值来切换输入通道,经测试在多个方案中均可行。

但是某一个应用比较苛刻的方案,却发现同样的方法,若有del-sig切换,相邻的模块在特定时刻会受到“干扰”。我描述如下,请斑竹和高人指点:

使用del-sig采集两路输入信号VA和VB,其中,VA通过PGA可连到del-sig模块,而VB则可直接连到del-sig模块,另外一个比较器模块连接到PGA。del-sig的输入通道的切换(从VB和PGA输出的互相切换是在中断中使用ASC10CR寄存器操作来完成)。

发现如下情况:
次数 VA范围(v)  VB范围(v)   PGA值         CMP(阀值v)     结果
1:  0~3.5     0~3.6       1.0           3.75           比较器正常,不动作
2:  0~3.5     0~3.6       1.0           3.2            比较器异常
3:  0~3.5     0~3.1       1.0           3.2            比较器正常动作
4:  0~3.5     0~3.6       1.23          3.75           比较器异常

比较器异常时,情况如下:
VA输入电压已经超过CMP阀值,CMP一直在动作,CMP输出1时,VA便迅速减小,CMP便又输出0.在这个过程中,一旦发生del-sig的切换(在定时中断中切换),便会出现,CMP会长时间输出1,即使VA已经远低于阀值,此时间持续1~2秒后,CMP才能正常工作-根据VA的值正常输出0或者1.

1)根据第1次和第3次的结果,所以第4次测试我故意将PGA提高到1.23,是想通过提高CMP阀值来避开异常,但不幸的是,故障仍然存在;

2)直接将CMP连到VA引脚,不通过PGA,测试第2种,还是有故障。

3)不进行del-sig切换,比较器工作正常,没有问题。

此问题困扰我多日仍无法完善解决,特来麻烦各位前辈,指点一二:
1)使用用户定义的API(操作寄存器),存在什么风险?为什么cypress不提供诸如改变del-sig输入的API?(del-sig不适合多路采样等不是充分的理由)

2)为什么切换会对比较器产生“干扰”?


沙发
碧水长天|  楼主 | 2009-3-24 11:17 | 只看该作者

我下次测试一下,在切换

我下次测试一下,在切换del-sig输入时,先停止del-sig看看结果如何。

使用特权

评论回复
板凳
ni_labview| | 2009-3-25 16:37 | 只看该作者

楼主玩得太深,兄弟佩服

问题之一:如果你的比较器与del-sig放在一列内,二者都用到模拟比较输出线,会影响到比较器结果。
其二:如果第一条不符合,那么你的寄存器设置应该有没有被重新赋值影响到比较器结果的。
其三:不知兄弟是否精心研读PSOCConfigTBL.asm看每次重新配置模块后寄存器数值的变化,这个对改变寄存器设置更新模块设置具有很大意义,个人认为。
综上,不建议兄弟用此方法,我用过此类方法,有的可以有的不可以,不敢冒言,仅供参考。

使用特权

评论回复
地板
碧水长天|  楼主 | 2009-3-27 09:04 | 只看该作者

多谢ni_labview回帖帮助

说实话,对psoc我勉强算入门而已,只是我想把它做成有竞争力的产品,所以关注稍微深入了一些而已。


1 在器件编辑中,由于比较输出总线冲突,比较器是不能和del-sig放在一列的,我这里是不在同一列;
2 我选择不同的del-sig输入时,观察过tbl.asm,其寄存器的设置和我根据手册得出的设置相同,故才敢使用此方法设置自己的API;
3 实在是万不得已才用这个方法的,不知道ni_labview兄能否提供一些资深的赛普拉斯应用工程师的联系方法?(我已加你QQ,我的Q:549337536)。这个问题我目前的确难以解决。

再次感谢各位关注。

使用特权

评论回复
5
碧水长天|  楼主 | 2009-3-27 09:19 | 只看该作者

同时就“虚拟工作寄存器组”请教一下ni_labview兄和其他各位

我研读我的中断服务模块(C写的)的汇编代码发现,在ISR的入口和出口,编译器为我压栈和出栈了__rx,__ry, __rz, __r0, __r1......等十余个“临时工作寄存器”,我推测是由于PSOC芯片的工作寄存器太少,在涉及到ISR中使用局部变量或者较复杂一点的运算和判断必须使用中间变量时,C编译器会自动使用从RAM中模拟来的工作寄存器组,对此,我倒也没有异议,但是,我观察ISR模块,事实上汇编代码只使用了2个临时工作寄存器,但是C编译器却对整个虚拟的工作寄存器组全部做了现场保存和恢复处理,由于我的中断周期比较短,所以耗费了大量的时间,难以忍受。

由于我不打算用汇编重写整段ISR,所以对于C编译器如此“自作主张”,没有别的办法,我试过将ISR中所有临时变量改为静态局部变量,仍然存在,原因是一些运算和判断时,isr还是使用了临时变量。


我打算重写ISR,使用简单的语句来完成需要用到临时变量的判断或处理,但可能不一定能行。请问这样的问题,大家有何良策?

多谢!

使用特权

评论回复
6
ni_labview| | 2009-3-27 11:00 | 只看该作者

已经将楼主需求转达AE,稍等

使用特权

评论回复
7
PSoC_Rock| | 2009-3-30 17:49 | 只看该作者

del-sig的AD转换是通过抽样滤波器后输出

所以它在通道切换后第三次输出以后的值才有效.希望这个信息对LZ有帮助.

使用特权

评论回复
8
碧水长天|  楼主 | 2009-3-31 17:12 | 只看该作者

多谢PSoC_Rock和ni_labview的帮助

del-sig类型的AD的确在很多方面与我们常用的SAR型ADC不一样,其特性值得大家注意,我也建议初次使用del-sigADC的同志,必须理解其原理,最好能自己画出信号转换的流程图,这样才能扬长避短,灵活应用该ADC。

使用特权

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

本版积分规则

20

主题

120

帖子

1

粉丝