msp430和EEPROM,调试了好几天都没调出来,有人能指导一下吗?十分感谢。

2019-03-24 11:46发布

#include  <msp430x14x.h>
#include "EEPROM.h"
#include "IIC.h"
#define uchar unsigned char
#define uint unsigned int
#define key (P1IN&0x80)                  //设置 P1.7 管脚   


uint m;                                 //写入IIC时循环参数
uint i;                                 //
uint n;                                 //
uint j;                                 //延时
uint dd;
uchar qq;   
uint num2;
int address=0x12;                        //前面地址有擦坏的
int zhi;                                  //显示数组
uchar  p=0;                                //把AD采集来的信号存入 0-20
uchar  count=0;                         //按键的次数
static uchar  results[4];                       //AD采集的数据
uchar dataaddress[1];                    //IIC的地址位置
uchar rd[21];
uchar rd2[7][3];
uchar rd1[7][3];                            //  测试存入数据
uchar flag = 0;                          //标志是否能存取数据


uchar table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x11,0xfe};
             //分别显示 0 1 2 3 4 5  R .    为小数点
                          // 共阳极数码管
/************************延时函数************************************/   
void delay1(uint n)                           
{
   
    for(j=n;j>0;j--)
    {
    for(i=1140;i>0;i--);
    }  
}


void main()
  {
    WDTCTL=WDTPW+WDTHOLD;                     //关闭看门狗
/************************AD转换************************************/     
    P6SEL = 0x0F;                             // Enable A/D channel inputs
    P3DIR |= BIT3 + BIT1;                     //设置相应端口为输出状态  iic
    ADC12CTL0 = ADC12ON+MSC+SHT0_2;           // Turn on ADC12, set sampling time
    ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, single sequence
    ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0
    ADC12MCTL1 = INCH_1;                      // ref+=AVcc, channel = A1
    ADC12MCTL2 = INCH_2;                      // ref+=AVcc, channel = A2
    ADC12MCTL3 = INCH_3+EOS;                  // ref+=AVcc, channel = A3, end seq.
    ADC12IE = 0x08;                           // Enable ADC12IFG.3
    ADC12CTL0 |= ENC;                         // Enable conversions
    _EINT();   //开启总中断
   
   
/**********************显示部分**************************************/
    P1DIR&=~0x80;                             //P1.7口设置为输入
    P4DIR |= 0xff;                               //P4口设置为输出
    P4OUT=0xff;                               //对P4口进行初始化
    P6DIR |= 0xf0;
    P2DIR |= 0xff;
/*******************************************************************/  
   
while(1)  
{
   if(key!=(0x80))
      {
       delay1(10);                            //上电前长按进入标定状态 显示小数点
          if(key!=(0x80))
             {
                   while(1)
                          {
                               if(key!=(0x80))
                                    {
                                       delay1(5);
                                       if(key!=(0x80))
                                           {
                                             while(1)
                                             {
                                               while(key!=(0x80));
                                             
                                                 dd=0x8fff;
                                                 while(dd--);
                                             
                                                P4OUT=table[count];
                                                P4OUT=table[7];
                                               
                                                  if(key!=(0x80))
                                               {   delay1(5);
                                                   if(key!=(0x80))
                                                   {   
                                                    ADC12CTL0 |= ADC12SC;      //开启转换
                                                    //delay1(100);
                                                    count++;
                                                
                                                     if(count==7)
                                                
                                                       count=0;
                                                     
                                                     
                                                address=address+3;
                                                if (address>36)
                                                   address=18;
                                                Write_NByte(results,3,address);       //在address后连续写入了3个数据
                                                
                                                Read_NByte_Randomaddress(rd1[p],3,address);
                                             
                                                                                                                                                                                    
                                                p++;
                                                if(p==7)
                                                p=0;
                                             
                                                
                                               
                                                 }                                                                                                                              
                                             }
                                               
                                             
                                               
                                             
                                                                                                                                    
                                            
                                             }
                                             
                                             
                                           }
         
                                    }
                                       
      
                                                
                                   
                                      
                           }
            }
       }
   
  
  else   
        {   
            for(m=0;m<7;m++)
               {
                  if (address>36)
                  address=18;
                  Read_NByte_Randomaddress(rd1[count],3,address);
                             
                  count++;
                  address=address+3;
                  if(count==7)
                  count=0;
                           }
               while(1)
                  {
                    dd=0x8fff;
                    while(dd--);
                 
                    
  /****************************比较数据部分*******************************************/
                      {
  
                           if(results[1]<2800)
                           { qq=8;}

                           if(results[1]<2500)
                           { qq=0;P2OUT=0x00;}
                           
                           if(results[1]<500)
                           { qq=7;}


                          if(results[0]<2800)
                          { qq=9;P2OUT=0x02;}

                          if(results[0]<2500)
                          { qq=4;P2OUT=0x04;}
                          
                          if(results[0]<500)
                          { qq=2;P2OUT=0x06;}


                          if(results[2]<2800)
                         { qq=5;P2OUT=0x01;}

                          if(results[2]<2500)
                         { qq=3;P2OUT=0x03;}
                          
                         if(results[2]<500)
                         { qq=1;P2OUT=0x05;}
                       
                          }
/****************************显示部分******************************************/                        
                       {



                          switch(num2)
                          {
                            case 0x00:num2=table[0];break;
                            case 0x01:num2=table[1];break;
                            case 0x02:num2=table[2];break;
                            case 0x03:num2=table[3];break;
                            case 0x04:num2=table[4];break;
                            case 0x05:num2=table[5];break;
                            case 0x06:num2=table[6];break;
                            case 0x07:num2=table[7];break;
                           
                           
                           }
                             P4OUT=num2;

  
}
                        
      
      
                       
                         ADC12CTL0 |= ADC12SC;          //开启转换AD
                       
                      }
        }
    }
}   
   
/**********************AD转换中断*****************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  results[0] = (ADC12MEM0/12);                   // Move results, IFG is cleared
  results[1] = (ADC12MEM1/12);                   // Move results, IFG is cleared
  results[2] = (ADC12MEM2/12);                   // Move results, IFG is cleared
  results[3] = (ADC12MEM3/12);                  // 未使用

  //_BIC_SR_IRQ(LPM0_bits);                   // Clear LPM0, SET BREAKPOINT HERE
  while((ADC12IFG & 0x0f)!=0);
}

  


/****************************************************************************************

这个是个档位传感器的程序,ad三个通道分别采集数据。

上电前,长按按键。进去标定状态,显示零,再按键,进行数据采集保存到二维数组,每次采集记录三组数据,一个采集六次,并将采集的数据存到EEPROM。再按键后显示为1,直到6.

此时手动断电,再上电后,首先将EEPROM里存的数据读出来。



我的问题是,每次都会有一两个值偏差很大,而且每次采集的数据都不变,我感觉是EEPROM没写进去,是不是IIC写的有问题? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
shmily53
1楼-- · 2019-03-24 14:54
这个问题解决了么

一周热门 更多>

相关问题

    相关文章