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条回答
小灰
1楼-- · 2019-03-26 04:58
没有看到你程序里有AD转换功能啊 只是开启了AD转换模块 没有启动AD转换 是不是我看错了
512213634
2楼-- · 2019-03-26 10:20
手动转换时———_samp 置1采样开始,_samp清零了就开启了转换了,_DONE位被硬件置1
小灰
3楼-- · 2019-03-26 13:55
你打了双斜杆 注释了啊 没有开启转换啊
小灰
4楼-- · 2019-03-26 14:15
我是新手哈 仔细看了你的程序 查了一下 才知道_samp的用法 不过你那个动态四位扫描那个遍历数组方法这样也可以么 还是你漏了
for( i=0; i<4; i++)  //实现4位动态扫描循环
  {  
   PORTE= LedOut;  //将字模送到数码管显示  
  
   PORTC=dispbit;
你这样不是一直显示最高位么。
还有你这个芯片这些端口设置跟我刚在学的 差好多哦 都看不懂
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;
还有这个AD1CON2=0X0000;  //Vadd  Vss  1个采样产生一个中断
这个怎么实现采样一次一次中断的? 你说不能进入中断又是怎么判断的
小灰
5楼-- · 2019-03-26 15:34
还有 你在动态扫描后面那个PORTE=LedNumVal;是干嘛?
我还没学中断 所以有个疑问 需要先开总中断么?
512213634
6楼-- · 2019-03-26 19:40
 精彩回答 2  元偷偷看……

一周热门 更多>