PengPeng0419 发表于 2008-4-12 02:15:53

发现了一个关于M128 A/D令人百思不得其解的问题

我利用AVRSTUDIO在M128上进行JATG调试时,单步运行,观察A/D几个I/O端口寄存器,为什么ADSCRA中的值与我设定的不同呢?
当我令ADSCRA=0xE5时,寄存器里显示的是0xF5,当我令ADSCRA=0xC5时,它显示的是0x95,这是为什么呢 ?
那如果我想要启动单次转换,不用中断的话,应该如何设置ADSCRA的值??
另外,在上述情况下应该检测ADSC位还是ADIF位等待其转换完毕~!~!
希望马老师能为我解答一下~!~!

ztxfhl 发表于 2008-4-12 12:16:33

认真看一下数据手册这种情况是正常的.当然是ADIF位

PengPeng0419 发表于 2008-4-12 20:08:58

如果我是判断ADIF的话,它跟我设定的初值不同我如何知道它正常工作了,如果按照手册上,ADIF=1证明转换完毕,那么如果ADSC位始终无法置1 那么怎么证明开始采集了???又如何证明转换完毕了,我已经读了好多次手册了,我觉得是在理解这个A/D转换上有差异,按照手册上说,ADSC位是ADC启动转换位,置1代表转换开始,转换完成时会变为0,那么为什么不用检测此位来判断ADC是否结束??ADIF=0代表转换尚未完成或无ADC转换,那么判断此位是否为1来判断ADC与上面有什么区别~!~!现在的问题是这两种判断方法都无法完成阿,我设定的值在寄存器里面看都不同,我不明白为什么楼上的高手说是正常现象~!~!
是否有人愿意帮我解答一下呢??

ztxfhl 发表于 2008-4-13 00:16:16

ADIF=1证明转换完毕,需要触发中断服务程序,在中断服务程序由硬件自动清零,或用软件清零.
你有中断服务程序吗,正常触发了吗?若没有中断服务程序,用软件清零了吗?

PengPeng0419 发表于 2008-4-13 19:32:49

我没有用到中断,所以希望用检测位的方式来完成ADC,那这样是说就不能用检测ADIF位了是吗?我还是想问为什么我的设定值与在AVRSTUDIO中ADSCRA寄存器看到的值不同,当我设定为0xC5时,显示的却是0x95,也就是说ADSC位没被置1,那么这样是不是ADC就没有转换阿~!~!而且我不用中断的话,是不是就该用检测此位是否为0来判断ADC是否结束了~!~!

ztxfhl 发表于 2008-4-13 20:37:22

ADSCRA设定为0xC5时表示单次转换开始,此时ADSC位没被置1,开始转换,ADIF位为0,未转换结束;
当读ADSCRA时转换已结束,此时ADSC位为0,ADIF位为1,即0X95.
无论单次或连续转换都应该以ADIF位为1作为转换结束数据有效的标志,然后触发中断由硬件自动清ADIF位,或用软件清ADIF位(如果没有启用中断的话).
当然如果是单次转换的话,以ADSC位是否为0来判断ADC是否结束了从时序上看可能可以,但不推荐.

ztxfhl 发表于 2008-4-13 20:40:37

楼上错发一个字,应为:
ADSCRA设定为0xC5时表示单次转换开始,此时ADSC位被置1,开始转换,ADIF位为0,未转换结束;
当读ADSCRA时转换已结束,此时ADSC位为0,ADIF位为1,即0X95.
无论单次或连续转换都应该以ADIF位为1作为转换结束数据有效的标志,然后触发中断由硬件自动清ADIF位,或用软件清ADIF位(如果没有启用中断的话).
当然如果是单次转换的话,以ADSC位是否为0来判断ADC是否结束了从时序上看可能可以,但不推荐.

PengPeng0419 发表于 2008-4-14 09:47:14

那这样是不是就是说我实际已经设置了,0xC5,但由于是靠分频来提供ADC时钟周期,所以在瞬间就完成了转换,所以观察它时与我设置的不同~!~!这与单步执行程序的时间由我自己控制的是不同的??是不是应该这样解释呢??

machao 发表于 2008-4-14 19:04:21

?Bit 6 ?ADSC: ADC Start Conversion
In Single Conversion mode, write this bit to one to start each conversion. In Free Running mode, write this bit to one to start the first conversion. The first conversion after ADSC has been written after the ADC has been enabled, or if ADSC is written at the same time as the ADC is enabled, will take 25 ADC clock cycles instead of the normal 13. This first conversion performs initialization of the ADC.
ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. Writing zero to this bit has no effect.

?Bit 5 ?ADFR: ADC Free Running Select
When this bit is written to one, the ADC operates in Free Running mode. In this mode, the ADC samples and updates the data registers continuously. Writing zero to this bit will terminate Free Running mode.

?Bit 4 ?ADIF: ADC Interrupt Flag
This bit is set when an ADC conversion completes and the data registers are updated. The ADC Conversion Complete Interrupt is executed if the ADIE bit and the I-bit in SREG are set. ADIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag.

Beware that if doing a read-modify-write on ADCSRA, a pending interrupt can be disabled. This also applies if the SBI and CBI instructions are used.

Kidult 发表于 2012-5-2 09:12:44

machao 发表于 2008-4-14 19:04 static/image/common/back.gif
?Bit 6 ?ADSC: ADC Start Conversion
In Single Conversion mode, write this bit to one to start each...

看过了很多遍中文说明手册,再看英文手册,感觉一下英文的原汁原味~

Kidult 发表于 2012-5-2 09:24:02

ztxfhl 发表于 2008-4-13 20:40 static/image/common/back.gif
楼上错发一个字,应为:
ADSCRA设定为0xC5时表示单次转换开始,此时ADSC位被置1,开始转换,ADIF位为0,未转换结 ...

"无论单次或连续转换都应该以ADIF位为1作为转换结束数据有效的标志,然后触发中断由硬件自动清ADIF位,或用软件清ADIF位(如果没有启用中断的话). "我一直在纠结的问题终于解决了,以前以为ADIF只有在中断的时候才能用呢~
         另外,
“或用软件清ADIF位(如果没有启用中断的话). ”是不是应该这样的:
                  while(!(ADCSRA&(1<<ADIF)));//等待转换结束
                                             ADCSRA|=(1<<ADIF);//清楚ADIF位,
            我有点不明白,为什么软件清除ADIF位,是写“1”呢?不是ADIF已经是1了吗???

millwood0 发表于 2012-5-3 09:23:30

我有点不明白,为什么软件清除ADIF位,是写“1”呢?不是ADIF已经是1了吗???

let me give you a piece of advice that you will benefit infinitely in the future:

read the f@#$king datasheet.
页: [1]
查看完整版本: 发现了一个关于M128 A/D令人百思不得其解的问题