打印
[M051]

m0516上很奇怪的问题

[复制链接]
2601|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
lvyunhua| | 2015-2-13 17:15 | 只看该作者
x是什么类型的,int  char呢???如果为char ,x=0x100已经超出范围了。

使用特权

评论回复
板凳
lvyunhua| | 2015-2-13 17:15 | 只看该作者
x是什么类型的,int  char呢???如果为char ,x=0x100已经超出范围了。

使用特权

评论回复
地板
联众菜鸟|  楼主 | 2015-2-13 17:27 | 只看该作者
lvyunhua 发表于 2015-2-13 17:15
x是什么类型的,int  char呢???如果为char ,x=0x100已经超出范围了。

uint32_t  x=0; 改成0x100编译下载就马上运行正常,改成100后就出问题了,很纳闷。

使用特权

评论回复
5
-|continue;|-| | 2015-2-13 17:32 | 只看该作者
如果0x100正常,256出问题,那才是问题

使用特权

评论回复
6
lvyunhua| | 2015-2-13 17:35 | 只看该作者
我个人认为KEIL不会有问题,你试着更改下编译优化等级试试。

使用特权

评论回复
7
联众菜鸟|  楼主 | 2015-2-13 17:42 | 只看该作者
-|continue;|- 发表于 2015-2-13 17:32
如果0x100正常,256出问题,那才是问题

和值的大小没有关系,程序直接运行异常了。

使用特权

评论回复
8
-|continue;|-| | 2015-2-13 17:54 | 只看该作者
程序运行异常,看你的变量有没跟指针扯上关系

使用特权

评论回复
9
联众菜鸟|  楼主 | 2015-2-13 17:59 | 只看该作者
-|continue;|- 发表于 2015-2-13 17:54
程序运行异常,看你的变量有没跟指针扯上关系

x仅仅只是次数,后面是while(x),工作一次就x--,就这简单而已。

使用特权

评论回复
10
lvyunhua| | 2015-2-13 18:03 | 只看该作者
建议把整个代码贴出看看

使用特权

评论回复
11
联众菜鸟|  楼主 | 2015-2-13 18:14 | 只看该作者
lvyunhua 发表于 2015-2-13 18:03
建议把整个代码贴出看看

好,随便改成0x222,0x22居然也运行异常.....

使用特权

评论回复
12
联众菜鸟|  楼主 | 2015-2-13 18:18 | 只看该作者
本帖最后由 联众菜鸟 于 2015-2-14 15:31 编辑

#include <stdio.h>
#include <stdint.h>
#include "M051.h"
#include "Register_Bit.h"
#include "Common.h"
#include "retarget.h"
#include "Macro_SystemClock.h"
#include "Macro_Timer.h"
#include "Macro_ADC.h"

#define CLOCK_SETUP           1
#define CLOCK_EN              0xF
#define PLL_Engine_Enable     1
#define PLL_SEL               0x00000000
#define CLOCK_SEL             0x0   
#define ADC_CLOCK_DIVIDER     0x00040000
#define ADC_CLK_Source        0x00000000
#define P0                                                                                0
#define P1                                                                                1
#define P2                                                                                2
#define P3                                                                                3
#define P4                                                                                4
#define C                                                                                  P00_DOUT
#define F                                                                                  P01_DOUT
#define MAX                                                                              P02_DOUT
#define FD                                                                                P20_DOUT
#define CD                                                                                P21_DOUT
#define KG                                                                                P22_DOUT


int32_t aj=0xff;

void TMR0_Delay1ms(uint32_t ulCNT);
void TMR0_Delay100us(uint32_t ulCNT);
void Timer0_Init(void);

main(void)
{
        uint32_t  k=3690,uc=0,back=0xff,ks=0xff,x=0;                                          
                                                                while(1)
                                                                {
/***************************************************/        
                                                                                        uc=1000;
                                                                                        C=1;
                                                                                        back=C;
                                                                                        if(back==0)这里是个按键检测,按下后开始工作 次数为x次,开始工作后ad升高
                                                                                        {        
                                                                                                        TMR0_Delay1ms(10);
                                                                                                        C=1;
                                                                                                        back=C;
                                                                                                        if (back==0)
                                                                                                        {
                                                                                                                        TMR0_Delay1ms(10);
                                                                                                                        C=1;
                                                                                                                        back=C;
                                                                                                                        if (back==0)
                                                                                                                                        {
                                                                                                                                                        x=0X222;
                                                                                                                                                        ks=0;
                                                                                                                                                        KG=0;
                                                                                                                                                        TMR0_Delay1ms(20);
                                                                                                                                                        CD=0;
                                                                                                                                        }                                                                                                                                                                                                               
                                                                                                        }
                                                                                        }                                                                                       
                                                                                                                                                                                
                                                                                        if(sy(10)>uc) 是采集ad 超过uc,会给指令控制ad降低(这里是意外开始工作的情况)
                                                                                        {
                                                                                                        if(sy(10)>uc)
                                                                                                        {
                                                                                                                        if(sy(10)>uc)
                                                                                                                                        {
                                                                                                                                                        CD=1;
                                                                                                                                                        TMR0_Delay1ms(50);
                                                                                                                                                        KG=1;
                                                                                                                                                        TMR0_Delay1ms(50);
                                                                                                                                                        FD=0;
                                                                                                                                                        TMR0_Delay100us(10);
                                                                                                                                                        FD=1;

                                                                                                                                        }
                                                                                                        }                                                                                                                                                                                                                                       
                                                                                        }
/****************************************/                                                                                       

                                                                                                        
                                                                                        while(x)  这里是按键按下,x被置数后运行到这
                                                                                        {                                                                                                
                                                                                                        while(ks==0)
                                                                                                        {                                                                                                
                                                                                                                        if(sy(10)>uc)  检测ad超过后,给指令降低ad
                                                                                                                        {
                                                                                                                                        CD=1;
                                                                                                                                        TMR0_Delay1ms(50);
                                                                                                                                        KG=1;
                                                                                                                                        TMR0_Delay1ms(50);

                                                                                                                                        FD=0;
                                                                                                                                        TMR0_Delay100us(10);

                                                                                                                                        FD=1;
                                                                                                                                        TMR0_Delay1ms(50);                                                                                                                        

                                                                                                                                        if(uc<20)
                                                                                                                                        {
                                                                                                                                                ks=1;
                                                                                                                                                FD=0;
                                                                                                                                                TMR0_Delay1ms(10);
                                                                                                                                                FD=1;                                                                                                                        
                                                                                                                                                        

                                                                                                                                        }
                                                                                                                                        else
                                                                                                                                        {
                                                                                                                                                        KG=0;
                                                                                                                                                        TMR0_Delay1ms(50);

                                                                                                                                                        CD=0;
                                                                                                                                        }
                                                                                                                                        uc=(uc*k)/4096;
                                                                                                                        }                                                                                                               
                                                                                                        }
                                                                                                        x--;
                                                                                                        if(x==0)
                                                                                                        {
                                                                                                                        ks=1;
                                                                                                        }
                                                                                                        else
                                                                                                        {
                                                                                                                        ks=0;
                                                                                                                        uc=1000;
                                                                                                                        KG=0;
                                                                                                                        TMR0_Delay1ms(100);
                                                                                                                        CD=0;
                                                                                                        }
                                                                                        }                                                                                       
                                                                                
                                                                        }
}

使用特权

评论回复
13
联众菜鸟|  楼主 | 2015-2-13 18:50 | 只看该作者
目前发现x只有从256到512的数字可正常运行,其他都不正常运行,与表示方式没有关系,继续测试中,

使用特权

评论回复
14
联众菜鸟|  楼主 | 2015-2-13 18:54 | 只看该作者
lvyunhua 发表于 2015-2-13 17:35
我个人认为KEIL不会有问题,你试着更改下编译优化等级试试。

这个好像是没有优化吧。

9999.jpg (72.47 KB )

9999.jpg

使用特权

评论回复
15
联众菜鸟|  楼主 | 2015-2-13 19:08 | 只看该作者
这个问题其实前几天也出现过,改了不同数字重复几次后可以运行正常,到今天调的时候突然有不行了,真的是奇了怪了。

使用特权

评论回复
16
玄德| | 2015-2-14 01:53 | 只看该作者
什么样的“异常”?

有没有单步运行过?

使用特权

评论回复
17
xmar| | 2015-2-14 11:30 | 只看该作者
   uint32_t  x=0;
   

   /************/
    C=1;
    back=C;
    if(back==0)
    {
     /*********/
    x=0x222;
    }      
   
    while(x)
    {
    /*********/
     }

    x永远为0,while(x)不会执行。楼主编的什么乱七八糟的程序。

使用特权

评论回复
18
lvyunhua| | 2015-2-14 12:50 | 只看该作者
楼上说的有道理啊,楼主程序有点乱,整理下吧,头文件怎么放在宏定义下面了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
联众菜鸟 + 2 很给力!
19
联众菜鸟|  楼主 | 2015-2-14 15:19 | 只看该作者
玄德 发表于 2015-2-14 01:53
什么样的“异常”?

有没有单步运行过?

sy()函数是ad采集,当ad电压到一定值时会给一个降低ad电压的指令,异常就是ad电压超过设定值后没有动作,ad继续升高,是单片机跑飞吗?

使用特权

评论回复
20
联众菜鸟|  楼主 | 2015-2-14 15:24 | 只看该作者
xmar 发表于 2015-2-14 11:30
uint32_t  x=0;
   

新手,不是很会写,,x只有在在256到512可以运行怎么解释啊?程序的while(1)和while(x)里都有检测ad,超过后会有指令让ad降低,异常情况就是ad电压直接超出设定值了。

使用特权

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

本版积分规则

5

主题

42

帖子

0

粉丝