PIC24hj128gp510 ad采样之后转换不了 DONE 不能被硬件置1

2019-03-25 19:25发布

写了一个AD采样程序,显示用数码管;但是无论自动手动都不能转换,DONE位不能被硬件置1,采样1次1次中断,不能进入中断,

晶振是6M,
#include<p24HJ128GP510.h>
unsigned char const   Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //段码控制
unsigned char const   dispbit[]={0X1D,0X1A,0X16,0X0E };
//{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
static unsigned int LedNumVal=1234 ;
void lcddelay(unsigned char ms)   //ms
{
unsigned char i,j;
for(i=ms;i>0;i--)
     for(j=166;j>0;j--)
   {;}
  
}
void initacd(void)
{
AD1PCFGL=0Xfffb; //AN2
AD1CON1=0X0000;  //SHOU采样  采样结束后SHOU转换
AD1CON2=0X0000;  //Vadd  Vss  1个采样产生一个中断
AD1CON3=0X1fff;     //32Tad ;256*Tcy=256*1/3us ;Fosc=6M
AD1CHS0=0X0002;  //AN2
AD1CON4=0;
AD1CSSL=0;
ADC1BUF0=0;
_ADON=1;      //开启AD模块
}

void intadcin(void)      //中断初始化
{

_AD1IP=111;   //中断优先级7
_AD1IF=0;  
_AD1IE=1;   //开启中断
}
main(void)
{

unsigned int i ;
   unsigned int LedOut[4];
   TRISC=0X0000;
   TRISE=0X0000;
   TRISBbits.TRISB2=1;
   PORTE=0X0000;
   
   intadcin();
   initacd();
   lcddelay(10);
  
   
  while(1)  //进入循环状态
  {   
    _SAMP = 1;
   lcddelay(10);
    _SAMP = 0;
    lcddelay(1);
  // AD1CON1bits.DONE=1;
   //lcddelay(10);
  
     if(LedNumVal<=2000)
  {
  LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
     LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
     LedOut[2]=Disp_Tab[LedNumVal%100/10];
     LedOut[3]=Disp_Tab[LedNumVal%10];
  }
  else
  {
    LedOut[0]=Disp_Tab[2];
     LedOut[1]=Disp_Tab[0];
     LedOut[2]=Disp_Tab[0];
     LedOut[3]=Disp_Tab[0];
  }

  for( i=0; i<4; i++)  //实现4位动态扫描循环
  {  
   PORTE= LedOut;  //将字模送到数码管显示
  
   PORTC=dispbit;
   
  lcddelay(10);
   }
  PORTE=LedNumVal;
  }   
}
void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
LedNumVal=ADC1BUF0;
_AD1IF=0;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
512213634
1楼-- · 2019-03-26 21:47
#include<p24HJ256GP610.h>


unsigned char const   Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //段码控制
unsigned char const   dispbit[]={0X1D,0X1A,0X16,0X0E };
volatile static unsigned int LedNumVal=0,sum=0;
        int a=1;
void lcddelay(unsigned char ms)   //(4j+11)*i个指令周期
{
        unsigned char i,j;                        //
        for(i=ms;i>0;i--)
     for(j=4000;j>0;j--)       
          {;}         
}


void ADCinit(void)
{
        AD1PCFGL=0XfffF;
        AD1PCFGH=0XFFFF;
       
        AD1PCFGLbits.PCFG3=0;        //AN3
        TRISBbits.TRISB3=1;
        AD1CON1=0X00e4;                //自动采样  采样以后自动开始转换
        AD1CON2=0X0004;                //Vadd=3.2V Vss  2个采样产生一个中断
        AD1CON3=0X1f09;            //9*Tcy=9*1/12us ;Fosc=24M;32*Tad
        AD1CHS0=0X0003;                //AN3
        AD1CSSL=0;
        _AD1IF=0;
        _AD1IP=7;
        _AD1IE=1;
        AD1CON1bits.ADON=1;                    //开启AD模块       
}
void __attribute__((__interrupt__)) _ADC1Interrupt(void)
{

        if(a<=11)
        {
                sum=sum+ADC1BUF0;
                a++;
        }
        else
        {
                LedNumVal=sum/11;
                sum=0;
                PORTD=LedNumVal;
                a=1        ;
        }
//        while(!_DONE);
// LedNumVal=ADC1BUF0;
     
          _AD1IF=0;
}

void main()
{       
                unsigned char LedOut[4];
            int k;
              TRISC=0;
              TRISE=0;
              TRISD=0;    //提供给FPGA的控制信号
              ADCinit();
              //_SAMP=1;
          while(1)  //进入循环状态
          {          

                   if(LedNumVal<=1000)
                 {
                         LedOut[0]=Disp_Tab[LedNumVal%10000/1000+1];
                     LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
                     LedOut[2]=Disp_Tab[LedNumVal%100/10];
                     LedOut[3]=Disp_Tab[LedNumVal%10];
                 }
                    else
                 {
                          LedOut[0]=Disp_Tab[2];
                     LedOut[1]=Disp_Tab[0];
                     LedOut[2]=Disp_Tab[0];
                     LedOut[3]=Disp_Tab[0];
                 }
       
                 for( k=0; k<4; k++)  //实现4位动态扫描循环
                 {         
          
                           PORTC=dispbit[k]&0xff;
                          PORTE= LedOut[k]&0xff;  //将字模送到数码管显示
                        lcddelay(20);
                  }  
    }
}

一周热门 更多>