这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【已OK】R8C/2C关于A/D转换

共6条 1/1 1 跳转至

【已OK】R8C/2C关于A/D转换

菜鸟
2008-07-28 11:11:04     打赏
使用AN9,对KEY进行A/D检测。AN9管脚设置为输入,VREF 5V.
遇到的问题是:单步执行的时候3次当中有1次能检测到AD0的值。
如果步单步执行的话,根据就检测不到按键。
程序如下:
if(adst == 0) //如果为停止位时,才开始A/D转换设置
{
   adcon0 = 0x80 | (adc_channel &  0x07);//设置单次模式,软件触发,并取相应Channel低3位,fOCO-F频率设置
  adcon2 = 0x00 | (adc_channel &  0x18);//无采样,取bit3-bit4,和adcon0取的低3位共同设置Channel
  adcon1 = 0x30; //8位分辨率,VREF连接
  waitus(1); //等待1us

  fra2 = 0;  //fOCO-F频率设置为2分频
  fra1 = 0;
  fra0 = 0;

  adst = 1;  //计数开始

  waitus(20);//等待20us ,等待49个AD转换周期

  aucRtnData = ad0l; //将AD0低8位传给返回值
}
 



关键词: 关于     转换    

菜鸟
2008-07-28 13:44:14     打赏
2楼

请问你的adc_channel = 0x0D么?注意AN9并不是0x09。
还有就是你的fOCO并没有打开呀?
应该是:
fra2 = 0x02; //最少4分频,fAD必须小于等于10MHz
fra0 = 1;       //启动告诉时钟
fra1最好不要设定,设定后你的内部时钟就不准了。


菜鸟
2008-07-28 14:05:49     打赏
3楼
AN9 设定的是 0x0D
其他的还没有试过
先谢谢,试试之后再说问题~

菜鸟
2008-07-28 14:53:40     打赏
4楼

刚回复的东西没有贴上来。
再次谢谢Fishs_new_life。确实好使了。
程序设置如下:
prcr = 0x01;//允许改写fra2,fra0寄存器

fra2 = 0x06;//8分频设置
fra0 = 0x03;//使用高速内部振荡器并启动

prcr = 0x00;;//禁止改写fra2,fra0寄存器

另外,我在设置这些寄存器时使用了禁止中断,不知道是否为多余的操作?
即:
asm("FCLR I");
.
.
. //AD转换程序
.
.

asm("FSET I");


呵呵,顶楼的帖子当时应该是写fra20,fra21,fra22这几个bit位的(很粗心把2全漏掉了,^_^)。
希望这个帖子也能对其他人有用。


菜鸟
2008-07-28 15:37:05     打赏
5楼
修改时钟的时候其实可以不用关闭中断。当然以情况而定。

比如下面的例子还是关闭中断的好:
从低速(比如低功耗模式)返回的时候,因为这个时候的时钟频率很低(比如传说中的低速时钟的16分频=125K/16 = 7.8KHz),如果这个时候有中断,中断很容易强过你的CPU,所以CPU还要先到中断程序里面去转一圈,如果你的中断程序比较长,那么这个时间可是等的死人的。

还有就是,你的程序中有个漏洞:
fra01和fra00不能同时设定,就是说fra0 = 0x03是很危险的。
以为fra01 = 1的时候要是那个高速时钟还没有启动怎么办?
这个手册上写的有的。

菜鸟
2008-07-28 16:13:44     打赏
6楼

1、有想过没启动的问题。
我用的是XIN/XOUT
R8C/2C提供4个时钟产生电路,如果在系统启动的时候就启动高速时钟的话,似乎是不合理的设计。若不设置使用高速时钟fra01的话,直接设置fra00,不会有问题?

2、但是如果不使用XIN/XOUT(0~20M)
直接使用高速时钟(0~40M)
这样会影响到其他延时的准确性。程序段所有使用延时(nop)语句的就都会有问题。也不是个很好的办法。定时器可以直接修改数据,倒还OK。

3、如果不使用内部时钟的话,直接通过CKS1和CKS0设置为f4也就OK了。

以上几点想法,不知道有没有其他问题。


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]