这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 紧急求助啊,闹不懂为啥这读取温度的函数在中断里调不了啊

共14条 1/2 1 2 跳转至

紧急求助啊,闹不懂为啥这读取温度的函数在中断里调不了啊

助工
2014-09-01 11:46:27     打赏

为什么读取DS1820的值写进中断,堆栈就溢出,但是在中断外这个正常执行啊

 

这是读取温度的代码

uint Do1Convert(void)
{
    uchar i;
   
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Convert();
    //for(i = 4;i > 0;i--) //
        delay_ms(200); //    
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Read_SP();
    return ReadTemp();
}

 


专家
2014-09-01 13:27:39     打赏
2楼
堆栈层数不够,看下你的mcu支持几级堆栈

高工
2014-09-01 13:41:10     打赏
3楼
中断里不支持有返回值吧

专家
2014-09-01 14:03:10     打赏
4楼

堆栈的空间大小不够?

方便把将问题贴出来吗


助工
2014-09-01 14:03:24     打赏
5楼

这个怎么看呐,新手不好意思啊,我用的是msp430f149


助工
2014-09-01 14:25:48     打赏
6楼

__interrupt void timerA0_ISR()
{
    ////tempe=Do1Convert();//读取温度
 
    if(!setF)//如果没选择设置功能,时间会自动走
    {
      ShowTime();
      disp_hz(0x80,tishi_W,5);
      disp_temp(tempe);//执行到这里的时候堆栈溢出
    }
    jiance_Key();//
程序写的不好,只贴一部分吧,

溢出函数

void disp_temp(uint tempe)
{
 
  write_cmd(0x85);
  if(tempe<0)
  {
    write_data(temp[0]+0x30);
    tempe=0-tempe;
  }
  else
    write_data(0x30);
  if(tempe>=100&tempe<=125)
  {
    write_data(temp[1]+0x30);
    write_data(temp[2]+0x30);
    write_data(temp[3]+0x30);
  }
  if(tempe<100&tempe>=10)
  {
    write_data(0x30);
    write_data(temp[2]+0x30);
    write_data(temp[3]+0x30);
  }
  if(tempe<10&tempe>0)
  {
    write_data(0x30);
    write_data(0x30);
    write_data(temp[3]+0x30);
  }
}

 


助工
2014-09-01 14:26:39     打赏
7楼

#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in   P1DIR &= ~BIT6
#define DQ_out  P1DIR |= BIT6
#define DQ_val  (P1IN & BIT6)

#define CPU           (8000000)
#define DelayNus(x)   (__delay_cycles((double)x*CPU/1000000.0))
#define delay_ms(x)   (__delay_cycles((double)x*CPU/1000.0))/**/

/*******************************************
函数名称:Init_18B20
功    能:对DS18B20进行复位操作
参    数:无
返回值  :初始化状态标志:1--失败,0--成功
********************************************/
uchar Init_18B20(void)
{
    uchar Error;
   
    DQ_out;
    _DINT();
    DQ0;
    DelayNus(500);
    DQ1;
    DelayNus(55);
    DQ_in;
    _NOP();
    if(DQ_val)     
    {
        Error = 1;          //初始化失败
    }
    else
    {
        Error = 0;          //初始化成功
    }
    DQ_out;
    DQ1;
    _EINT();
   
    DelayNus(400);
   
    return Error;
}
/*******************************************
函数名称:Write_18B20
功    能:向DS18B20写入一个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write_18B20(uchar wdata)
{
    uchar i;
   
    _DINT();
    for(i = 0; i < 8;i++)
    {
        DQ0;
        DelayNus(6);            //延时6us
        if(wdata & 0X01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        DelayNus(50);           //延时50us
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
}
/*******************************************
函数名称:Read_18B20
功    能:从DS18B20读取一个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
   
    _DINT();
    for(i = 0;i < 8;i++)
    {
        temp >>= 1;
        DQ0;
        DelayNus(6);            //延时6us
        DQ1;
        DelayNus(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(45);           //延时45us
        DQ_out;
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
   
    return  temp;
}

/*******************************************
函数名称:Skip
功    能:发送跳过读取产品ID号命令
参    数:无
返回值  :无
********************************************/
void Skip(void)
{
    Write_18B20(0xcc);
}
/*******************************************
函数名称:Convert
功    能:发送温度转换命令
参    数:无
返回值  :无
********************************************/
void Convert(void)
{
    Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功    能:发送读ScratchPad命令
参    数:无
返回值  :无
********************************************/
void Read_SP(void)
{
    Write_18B20(0xbe);
}
/*******************************************
函数名称:ReadTemp
功    能:从DS18B20的ScratchPad读取温度转换结果
参    数:无
返回值  :读取的温度数值
********************************************/
uint ReadTemp(void)
{
    uchar temp_low;
    uint  temp;
    float tt;
   
    temp_low = Read_18B20();      //读低位
    temp = Read_18B20();     //读高位
    temp = (temp<<8) | temp_low;
    //temp >>= 4;
    tt = temp * 0.0625;
    temp = (uint) ((tt * 10) + 0.5) / 10;//小数点后的数四舍五入取整数
    return  temp;
}
/*******************************************
函数名称:ReadTemp
功    能:控制DS18B20完成一次温度转换
参    数:无
返回值  :测量的温度数值
********************************************/
uint Do1Convert()
{
    uchar i;
   
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Convert();
    for(i = 200;i > 0;i--) ////
        DelayNus(1000); //延时800ms以上
   
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Read_SP();
    return ReadTemp();
}


助工
2014-09-01 14:31:05     打赏
8楼
测温这块,用的例程直接改的

专家
2014-09-01 16:25:15     打赏
9楼
看技术手册上面 搜一下stack

助工
2014-09-02 09:33:31     打赏
10楼

程序放在while语句里可以,在中断里不行,


共14条 1/2 1 2 跳转至

回复

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