Leefree 发表于 2013-10-3 22:13:20

MMU对DS18b20温度采集程序的影响

如题,FL2440开发板自带的,ADS程序,在实现18b20温度显示的时候发现温度根本全部都是乱码,但是程序跟Test.bin 里面是一样的,只是因为MMU吗?有人知道MMU对这个有什么影响吗,谢谢了

Leefree 发表于 2013-10-6 16:07:25

顶                  

飞凌-peacelove 发表于 2013-10-8 10:07:35

楼主是怎么使用这段程序的呢,在串口里显示还是什么地方显示温度呢

Leefree 发表于 2013-10-9 11:14:48

飞凌-peacelove 发表于 2013-10-8 10:07 static/image/common/back.gif
楼主是怎么使用这段程序的呢,在串口里显示还是什么地方显示温度呢

就是把文件编译成bin格式后,下载到Myapp分区,然后运行,温度从串口显示出来

Leefree 发表于 2013-10-9 11:18:02

贴上源码 :/*******************************************************/
// 公司名称 :保定飞凌嵌入式技术有限公司
// 描    述 :温度传感器试验,由串口打印采集数据
// 版    权 :保定飞凌嵌入式技术有限公司
// 网    址 :www.witech.com.cn
/***************************************************************/

/*-------------------------地址声明----------------------------*/
#define GPGCON (*(volatile unsigned *)0x56000060)   //18b20寄存器设置
#define GPGDAT (*(volatile unsigned *)0x56000064)
#define GPGUP (*(volatile unsigned *)0x56000068)

#define UFCON0   (*(volatile unsigned *)0x50000008)   //串口寄存器设置
#define UMCON0   (*(volatile unsigned *)0x5000000c)
#define ULCON0   (*(volatile unsigned *)0x50000000)       
#define UCON0      (*(volatile unsigned *)0x50000004)
#define UBRDIV0    (*(volatile unsigned *)0x50000028)
#define UTRSTAT0   (*(volatile unsigned *)0x50000010)
#define UTXH0                 (*(volatile unsigned*)0x50000020)
#define URXH0                 (*(volatile unsigned*)0x50000024)
   
/*-------------------------变量定义----------------------------*/
unsigned char wd;
unsigned int sdata;                //测量到的温度的整数部分
unsigned char xiaoshu1;        //小数第一位
unsigned char xiaoshu2;        //小数第二位
unsigned char xiaoshu;        //两位小数

/*-------------------------函数声明----------------------------*/
void zh(void);
void Delay(unsigned int x) ;
void uart(void);
void DS18B20PRO(void);
void dmsec (unsigned int t);
void tmreset (void);
unsigned char tmrbit (void);
unsigned char tmrbyte (void) ;
void tmwbyte (unsigned char dat);
void tmstart (void) ;
void tmrtemp (void) ;

/*-------------------------------------------------------------/
函数名称:        Main
功能描述:        入口函数
                        不停循环检测温度值,并转换为asc||码,通过串口传出来
传    参:        无
返 回 值:        int
--------------------------------------------------------------*/
int Main(void)                     
{
    while(1)
    {
                   DS18B20PRO();      
                zh();
                uart();
                Delay(30);                     
        }
   
        return(0);
}

/*-------------------------------------------------------------/
函数名称:        dmsec
功能描述:        精确延时函数
传    参:        unsigned int t
返 回 值:        无
--------------------------------------------------------------*/
void dmsec(unsigned int t)       //精确延时函数
{   
        unsigned int i;
    unsigned int j;
    j = 1 * t;
    for(i=0; i<j; i++);
}

/*-------------------------------------------------------------/
函数名称:        tmreset
功能描述:        18b20初始化
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/         
void tmreset(void)
{   
        unsigned int i;                           
   
        GPGCON &= 0xfffffffc;    //设置寄存器对18b20进行写操作
        GPGCON |= 0x01;
       
        GPGDAT |= 0x01;
    dmsec(100);

        GPGDAT &= 0xfffe;   
        dmsec(600);

              
        GPGDAT |= 0x01;
       
        dmsec(100);
        GPGCON &= 0xfffffffc;   //设置寄存器对18b20进行读操作
        i = GPGDAT;
       
}            

/*-------------------------------------------------------------/
函数名称:        Delay
功能描述:        延时函数
传    参:        int x
返 回 值:        无
--------------------------------------------------------------*/
unsigned char tmrbyte (void)      //读一个字节函数
{   
       unsigned int j;            
       unsigned char i, u=0;      
             
       for (i=1; i<=8; i++)      
       {
                  GPGCON &= 0xfffffffc;
               GPGCON |= 0x01;            //GPG0设为输出
                
                  GPGDAT &= 0xfffe;
               u >>= 1;
          
                  GPGCON &= 0xfffffffc;   //设为输入口
                  j = GPGDAT;
                if (j & 0x01)
                          u |= 0x80;
          
                dmsec(46);
                GPGDAT |= 0x01;
       }      
       return (u);      

}

/*-------------------------------------------------------------/
函数名称:        tmwbyte
功能描述:        写一个字节函数
传    参:        unsigned char dat
返 回 值:        无
--------------------------------------------------------------*/         
void tmwbyte (unsigned char dat)   //写一个字节函数
{                     
       unsigned char j;      
       
       GPGCON &= 0xfffffffc;
       GPGCON |= 0x01;      
       for (j=1; j<=8; j++)      
       {
               GPGDAT &= 0xfffe;
          dmsec(1);      
          GPGDAT |= (dat & 0x01);
          dmsec(47);
          GPGDAT |= 0x01;   
          dat = dat >> 1;      
        }      
}

/*-------------------------------------------------------------/
函数名称:        tmstart
功能描述:        发送ds1820 开始转换
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void tmstart (void)   
{                        
        tmreset();             //复位   
        dmsec(120);            //延时   
        tmwbyte(0xcc);         //跳过序列号命令   
        tmwbyte(0x44);         //发转换命令 44H,
}         

/*-------------------------------------------------------------/
函数名称:        tmrtemp
功能描述:        读取温度
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void tmrtemp (void)
{                        
        unsigned char a,b;
        tmreset();                      //复位   
        dmsec(2000);                   //延时   
        tmwbyte(0xcc);                //跳过序列号命令   
        tmwbyte(0xbe);                //发送读取命令   
        a = tmrbyte();                //读取低位温度   
        b = tmrbyte();                //读取高位温度         
       
        sdata = a / 16 + b * 16;      //整数部分
       
        xiaoshu1 = (a&0x0f) * 10 / 16;    //小数第一位
        xiaoshu2 = (a&0x0f) * 100 / 16 %10;//小数第二位
        xiaoshu = xiaoshu1*10 + xiaoshu2; //小数两位
}

/*-------------------------------------------------------------/
函数名称:        zh
功能描述:       
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void zh(void)
{
        unsigned int wdata;
        wdata = sdata;
        wd = wdata / 10 + 0x30;
        wd = wdata % 10 + 0x30;
        wd = xiaoshu / 10 + 0x30;
        wd = xiaoshu % 10 + 0x30;
}

/*-------------------------------------------------------------/
函数名称:        DS18B20PRO
功能描述:       
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/
void DS18B20PRO(void)         
{   
tmstart();        //uart(10);   
dmsec(5);         //如果是不断地读取的话可以不延时
tmrtemp();         //读取温度,执行完毕温度将存于TMP
}                                                                          

/*-------------------------------------------------------------/
函数名称:        uart
功能描述:        串口函数用于发送温度值
传    参:        无
返 回 值:        无
--------------------------------------------------------------*/      
void uart(void)
{       
       
    UFCON0 = 0x0;
    UMCON0 = 0x0;
    ULCON0 = 0x3;
    UCON0= 0x245;
    UBRDIV0=( (int)(50000000/16/115200+0.5) -1 );
       
            while(!(UTRSTAT0 & 0x2));
                UTXH0='\n';
                while(!(UTRSTAT0 & 0x2));
                UTXH0='\r';
                while(!(UTRSTAT0 & 0x2));            
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=46;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=wd;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=39;
                while(!(UTRSTAT0 & 0x2));
                UTXH0=67;
}

/*-------------------------------------------------------------/
函数名称:        Delay
功能描述:        延时函数
传    参:        int x
返 回 值:        无
--------------------------------------------------------------*/
void Delay(unsigned int x)      
{
unsigned int i, j, k;
for(i=0; i<=x; i++)
    for(j=0; j<0xff; j++)
      for(k=0; k<0xff; k++);
}
这个18b20的程序跟启动代码编译成bin文件下载到分区运行,显示的温度完全是乱码,但是你们Test.bin 那个文件里也是有18b20的程序,而且两个程序都一样,那个可以,这个单独就不可以

Leefree 发表于 2013-10-9 11:19:34

飞凌-peacelove 发表于 2013-10-8 10:07 static/image/common/back.gif
楼主是怎么使用这段程序的呢,在串口里显示还是什么地方显示温度呢

程序的话就是你们test文件夹中的温度采集程序,但是单独编译成bin文件下载到分区运行就不行了,是什么原因呢?

飞凌-peacelove 发表于 2013-10-9 14:46:33

看看输出串行温度数据的那块有没有问题

Leefree 发表于 2013-10-9 16:02:33

飞凌-peacelove 发表于 2013-10-9 14:46 static/image/common/back.gif
看看输出串行温度数据的那块有没有问题

那块是没有问题的,源程序都是你们附带的,我也试过,是可以的,就是温度不对,好像跟18B20通讯不上

飞凌-peacelove 发表于 2013-10-10 08:50:07

要不单步调试看看读取18b20数据那儿是怎么操作的吧

Leefree 发表于 2013-10-10 10:38:15

飞凌-peacelove 发表于 2013-10-10 08:50 static/image/common/back.gif
要不单步调试看看读取18b20数据那儿是怎么操作的吧

单步调试过,也不行的,网上查了资料,类似的情况很多,你们有没有什么解决的办法啊,

飞凌-peacelove 发表于 2013-10-10 11:30:29

那我们先看看程序调一下

Leefree 发表于 2013-10-10 12:04:52

飞凌-peacelove 发表于 2013-10-10 11:30 static/image/common/back.gif
那我们先看看程序调一下

好吧,等着你的好消息

飞凌-路飞 发表于 2013-10-16 10:09:43

楼主试试给他顶一个分频的频率试试呢!!!

Leefree 发表于 2013-10-16 15:24:51

飞凌-路飞 发表于 2013-10-16 10:09 static/image/common/back.gif
楼主试试给他顶一个分频的频率试试呢!!!

什么意思?不太明白,在启动代码里Fclk、Pclk这些频率都已经设置好了啊
页: [1]
查看完整版本: MMU对DS18b20温度采集程序的影响