天嵌 ARM开发社区

 找回密码
 注册
查看: 2160|回复: 1

恳求指教!!adc实验中遇到的问题

[复制链接]
mobilefzb 发表于 2011-3-28 23:09:22 | 显示全部楼层 |阅读模式
板子应该是没有问题的,这里想请教下我在做这个实验的时候遇到的一个非常奇怪的问题。
在现在做过的实验中,rtc实验和adc实验需要从寄存器读取数据。但是adc比rtc来说还多了个计算功能。
问题就出在这个计算中。
如果我使用一个变量然后保存寄存器的值,然后进行运算(除法,乘法)那么程序保证运行到这个位置飞掉。但是读取寄存器的值到变量这部分代码是可以通过的,运算的代码也是可以通过的(都是互相屏蔽掉单独测试)。最可怕的是,我改一个赋值语句,最终生成的bin文件就会相差达到100多字节。
请大家帮助分析一下,小弟感激不尽!!
我贴出adc测试部分的代码
else if(!(no_system_strcmp("adc test",cmd_buf)))
                {
                        char temp[6];
                        int adc_data0;
                        float adc_data;
                        no_system_memset(cmd_buf,0,50);
                        adc_init();
/*成功的部分,表明读取寄存器的值无错*/
                        adc_data0 = adc_read_once();
                        uart0_printf("convert adc\n\r");
                        temp[0] = '0';
                        temp[1] = 'x';
                        temp[2] = ((adc_data0 >> 8) & 0x3) + 48;
                        temp[3] = ((adc_data0 >> 4) & 0xf) + ((((adc_data0 >> 4) & 0xf) > 9) ? 55 : 48);
                        temp[4] = (adc_data0 & 0xf) + (((adc_data0 & 0xf) > 9) ? 55 : 48);
                        temp[5] = '\0';
                        uart0_printf("adc capture data: ");
                        uart0_printf(temp);
                        uart0_printf(" v");
/*上面证明了读取寄存器无错,最后打印出来的是0~0x3ff的值*/


                        adc_data1 = 800;/*如果这句的赋值语句改为adc_data1 = ADCDAT0就是直接读取寄存器的值,程序编译后会增大100多字节,且程序运行到这里飞掉,*/
                        adc_data = (adc_data1 / 1024 * 3.3);/*这个和上面的一句配合有问题,单独测试都是好的*/
/*现在完全搞不懂为何这样,我的几个想法是:1.编译器本身bug问题(但是单独测试都能通过,和他们的汇编没有太大关系)2.和自己的程序配合问题(不知道是哪方面的配合有问题?我很在意代码暴涨的情况,还在看反汇编代码,但是分析的头都大了,发布上来希望遇到过这样情况的朋友指点一下)*/
                        temp[1] = '.';
                        temp[5] = '\0';
                        temp[0] = ((int)adc_data) + 48;
                        temp[2] = ((int)(adc_data * 10) - (int)adc_data * 10) + 48;
                        temp[3] = ((int)(adc_data * 100) - ((int)(adc_data * 10) * 10)) + 48;
                        temp[4] = ((int)(adc_data * 1000) - ((int)(adc_data * 100) * 10)) + 48;

                        uart0_printf("adc capture data: ");
                        uart0_printf(temp);
                        uart0_printf(" v");
                }
embedsky_lhh 发表于 2012-5-9 21:28:57 | 显示全部楼层
建议代码贴完整点,方便大家跟帖,比如adc_data1 是怎么定义的.....................
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 16:23 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表