OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5685|回复: 5

mega169 ADS1100转换问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-6-2
在线时间
0 小时
发表于 2012-7-10 00:36:58 | 显示全部楼层 |阅读模式

                                                                                               ADS1100原理图


以下是我编的程序   
//ICC-AVR application builder : 2012-7-7 19:30:59
// Target : M169
// Crystal: 8.0000Mhz

#include <iom169v.h>
#include <macros.h>

#define  uchar unsigned char
#define  uint unsigned  int


#define SCL_OUT    DDRF |= (1<<F6)
#define SCL_OUT_H  ORTF |= (1<<F6)
#define SCL_OUT_L  ORTF &=~ (1<<F6)

#define SDA_OUT    DDRF |= (1<<F7)
#define SDA_OUT_H  ORTF |= (1<<F7)
#define SDA_OUT_L  ORTF &=~ (1<<F7)

#define SDA_IN     DDRF &=~ (1<<PF7)
#define SDA_IN_D   (PINF&0x80)

#define DELAY_NOP asm("NOP\n")

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; 
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
 PORTE = 0x00;
 DDRE  = 0x00;
 PORTF = 0xc0;//
 DDRF  = 0x00;
 PORTG = 0x00;
 DDRG  = 0x00;
}

void delay_10us(void)
{
  uchar delay_num;
for(delay_num=0;delay_num<=10;delay_num++){DELAY_NOP;}
}

void delay250ms(void)
{
uchar delay_num1,delay_num2;
for(delay_num1=0;delay_num1<=250;delay_num1++)
for(delay_num2=0;delay_num2<=250;delay_num2++) {}  //1ms
}

void delayms(uint d)      //ms
{
uint c,e;
for(e=0;e<d;e++)
{
    for(c=1;c<143*1-2;c++);
}
}

///////////////////////////////////////////////////////AD程序
void     ads1100_start(void)
//inital:scl=1,data=1,data =>out
    
SDA_OUT;     
SCL_OUT;

SDA_OUT_L; //=0
delay_10us();
SCL_OUT_L;//insure scl=0
delay_10us();
//finally :scl=0,data=0,data =>out
}

void     ads1100_stop(void)
{            
SDA_OUT;
SCL_OUT;

SDA_OUT_L;
delay_10us();
delay_10us();
// scl=1 data=0=>data=1
SCL_OUT_H;
delay_10us();
delay_10us();     
SDA_OUT_H;
delay_10us(); 
delay_10us();

}

uchar    ackby_ads1100(void)
{                        
unsigned char times=0;
//start:scl=0 data=>out 
//give up bus     setup data in    

SDA_IN;
SCL_OUT;   
delay_10us(); //wait for ads1100 ready data          

//wait ads1100 ack
SCL_OUT_H;

while((SDA_IN_D==1)&&(times<100))           //wait for ads ack   data=0 
{
    times++;
}
SCL_OUT_L; //ready for next 
delay_10us();                            
//fianlly:scl=0;data <in     
if(times>90)
{
    return 0;
}           
else
{
    return 1;
}
}


void     ackby_master(void)
//start:scl=0 
//get bus
SDA_OUT;
SCL_OUT;

//ready ack data
SDA_OUT_L;
delay_10us();  //ready data

SCL_OUT_H;        //wait for ads1100 receive 
delay_10us();   
delay_10us();         

SCL_OUT_L;      //ready for next
delay_10us();      
//fianlly:scl=0,data >out
}

void     send_frame(uchar framedata)
{
unsigned char i;  

//initial:scl=0 
SDA_OUT;
SCL_OUT;
delay_10us(); 
delay_10us(); 

for(i=0;i<8;i++)
     SCL_OUT_L;             //read for next scl=0      
     if( ( (framedata << i) & 0x80) ==0 )
     {
         SDA_OUT_L;
     }             
     else
     {
         SDA_OUT_H;
     }      
    delay_10us();     //稳定数据
     
    SCL_OUT_H;           //suo shuju
     delay_10us();   //wait for ads1100 receive data          
}                                                   
SCL_OUT_L;              //read for next scl=0
//finally:scl=0,data getbus   


uchar    read_frame(void)
uchar data=0,i;

//start:scl=0; data no confire
//give up bus     setup data in
SDA_IN;
SCL_OUT;

delay_10us();          //wait for ads ready data

for(i=0;i<8;i++)
{
     SCL_OUT_H;
     data=data<<1;           //bit0=0
     delay_10us();      //等待数据稳定
 
     if(SDA_IN_D!=0)    
{
         data=data+1;
     }
     SCL_OUT_L;               
     delay_10us();       //wait for ads ready data
}                 
//fially:scl=0 data <in 
return data;
}

/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:写一个命令码到ADS1100
参数说明:addr器件地址,command命令码
          此为ads1100用函数
////////////////////////////////////////////////////////////////////////////////////////////
*/
void     ads1100_write(unsigned char addr,unsigned char command)
{
//addr=0x90;                          //1001(固定) 000(器件编号) 0(写)

//a start
ads1100_start();

//sent for a frame    addr      
send_frame(addr); 
ackby_ads1100();

//sent for a frame    command
send_frame(command);
ackby_ads1100();

//a stop 
ads1100_stop(); 
}

/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:读写一次转换数据从ADS1100
参数说明:addr器件地址
          此为ads1100用函数
////////////////////////////////////////////////////////////////////////////////////////////
*/
unsigned int     ads1100_read(unsigned char addr)
{
uint data;
uchar datah,datal,datac;
//addr=0x91;                          //1001(固定) 000(器件编号) 1(读)          

//a start
ads1100_start();

//sent for a frame    addr      
send_frame(addr);
ackby_ads1100();

//read a 8bit data for ads1100 datah
datah=read_frame();
ackby_master();

//read a 8bit data for ads1100 datal
datal=read_frame(); 
ackby_master();

datac=read_frame(); 
ackby_master(); 
//a stop 
ads1100_stop(); 
// UART_TXD0(datac);
data=(((uint)datah)<<8) + datal;
return data;
}
//////////////////////////////////////////////
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 CLKPR=0x80;
 //CLKPR=0x05;//软件分频1/32
 //CLKPR=0x01;//软件分频1/2
// CLKPR=0x08;//软件分频1/256
 //CLKPR=0x07;//软件分频1/128
 //CLKPR=0x06;//软件分频1/64
 //SMCR=0x05;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
 

void main()
 { 

   uint data;
   init_devices();
  
   ads1100_write(0x90,0x8c);//写地址:1001 000 0  固定码1001,地址为000,写命令为0 写配置字:连续转换,转换速率为8SPS,增益为1
   while(1)
   {
    data = 0;
data=ads1100_read(0x91); //写地址:1001 000 1  固定码1001,地址为000,读命令为1
delayms(500); 
data=ads1100_read(0x91); 
delayms(500); 
        //最后将结果data显示出来,程序此处未写
    }
 
 }

问题:上面程序下载烧写后,ads1100转换结果总是显示0x0000,即不转换,不知道程序问题出在哪?大家帮我看看是什么原因。谢谢了!














正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-7-10 09:02:32 | 显示全部楼层
看代码最郁闷了.尤其是有问题的代码.
你先看看你的iic通讯是否正常吧,检查写入的值和读出的值是否一致!如果iic都不正常,读数当然就不正确了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

68

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2011-12-17
在线时间
4 小时
发表于 2012-7-10 11:48:05 | 显示全部楼层
楼主先分析自己程序的操作步骤以及时序是不是正确,应该自己找个示波器一点点的测量信号查看!就能找出原因,不然以后操作这样的器件还是没法解决!
与其相濡以沫,不如相望江湖!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-6-2
在线时间
0 小时
 楼主| 发表于 2012-7-11 17:02:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
找到问题了,熔丝位设置的问题。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-6-2
在线时间
0 小时
 楼主| 发表于 2012-7-11 17:04:58 | 显示全部楼层
回复【3楼】相识在天涯:
---------------------------------
恩,程序没问题,熔丝位设置有误,刚开始没在意。
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-10-30
在线时间
6 小时
发表于 2018-3-7 16:01:04 | 显示全部楼层
能提供一下代码参考一下吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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