打印
[AVR单片机]

请高手帮忙看看,好奇怪的问题

[复制链接]
530|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tom9895|  楼主 | 2015-12-18 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义usigned char zxb;如果这个变量定义为全局变量,程序没有问题,但如果定义在cs1180_ini()中ICCAVR编译时也没有什么错误提示,在studio调试时就没法操作这个变量(赋值赋不上,鼠标点中变量提醒定义位置是R20,定义为全局变量时定义位置为SRAM),哪位大神帮忙指点一下,程序代码如下:

还有调试时在cs1180_ini()中第一个delay(1);处加断点,然后再运行下去这是读出来的zxb值正确,但如果把断点加在zxb变量赋值语句后,zxb值就不对了。试过很多次了每次都一样,郁闷死了!实在找不出问题在哪里

unsigned char zxb;

void delay(unsigned char d)
{
  unsigned char i;
  while(d--)
  {
    i     =10;
    while(--i);
  }
}
void spi_send(unsigned char spi_data)
{
  unsigned char bd;
  unsigned char spid =0;
  spid                  =spi_data;
  //PORTB               |=BIT(PB1);              //SCLK=1
  for(bd=0;bd<8;bd++)
  {
    if((spid&0x80)==0x80)
      PORTB             |=BIT(PB3);              //SDI置位
    else
      PORTB             &=~BIT(PB3);             //SDI清除
    spid                <<=1;                    //数据左移(从最高位发起)   
   
    PORTB               &=~BIT(PB1);             //SCLK=0
    delay(10);
    PORTB               |=BIT(PB1);              //SCLK=1
    delay(10);
  }
}
unsigned char spi_read(void)
{
  unsigned char temp=0;
  unsigned char i;
  
  PORTB              |=BIT(PB1);     //SCLK=1;
  for(i=8;i>0;i--)
  {
    temp         <<=1;           //数据移位(高位在前)
    PORTB            &=~BIT(PB1);
    delay(10);
    if((PINB&0X04)==0X04)            //判断SDO
      temp++;
    PORTB            |=BIT(PB1);
    delay(10);
  }
  return(temp);
}
void cs1180_ini(void)
{
  //unsigned char zxb;

  PORTB    |=BIT(PB1);               //SCLK管脚置位
  delay(1);
  spi_send(0XFE);                    //发送芯片复位指令(复位指令为0XFE)
  delay(200);
  spi_send(0X50);                    //写寄存器指令(从0X00寄存器开始)
  spi_send(0x02);                    //写3个寄存器(从0X00寄存器开始)
  spi_send(0x00);                    //SETUP寄存器(设置可编程增益)           可编程增益:1
  spi_send(0x01);                    //MUX寄存器(正常使用时必须设置为0X01)
  spi_send(0x60);                    //ACR寄存器  数据格式:单极性  采样频率:Fosc/256   不使能输入换冲   输出高位在前  2.5V参考  15HZ输出速率
  
  delay(20);
  spi_send(0x12);
  spi_send(0x00);
  zxb    =spi_read();

  while(PINB&(1<<PB0));             //DRDY脚状态(0:转换数据可用   1:转换和数据更新进行中)
  while(!(PINB&(1<<PB0)));
  delay(20);
  while(PINB&(1<<PB0));
}
void main(void)
{  
  WDR();
  sys_ini();                          //系统初始化
         WDR();
         cs1180_ini();                       //初始化CS1180
         SEI();                             //开总中断
         while(1)
         {                  
           ;
         }
}

相关帖子

沙发
huangxz| | 2015-12-18 22:20 | 只看该作者
第一个问题很简单,优化的问题,有些变量直接用了寄存器。
第二个一般是操作时序的问题。

使用特权

评论回复
板凳
tom9895|  楼主 | 2015-12-21 09:34 | 只看该作者
huangxz 发表于 2015-12-18 22:20
第一个问题很简单,优化的问题,有些变量直接用了寄存器。
第二个一般是操作时序的问题。 ...

优化问题怎么解决,只能定义成全局变量了吗?

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝