4991|7

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

PIC24hj128gp510 ad采样之后转换不了 DONE 不能被硬件置1 [复制链接]

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

晶振是6M,
#include
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;
}

最新回复

还有 你在动态扫描后面那个PORTE=LedNumVal;是干嘛? 我还没学中断 所以有个疑问 需要先开总中断么?  详情 回复 发表于 2012-7-31 00:33
点赞 关注
 

回复
举报

8

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没有看到你程序里有AD转换功能啊 只是开启了AD转换模块 没有启动AD转换 是不是我看错了

点评

手动转换时———_samp 置1采样开始,_samp清零了就开启了转换了,_DONE位被硬件置1  详情 回复 发表于 2012-7-19 13:04
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 小灰 的帖子

手动转换时———_samp 置1采样开始,_samp清零了就开启了转换了,_DONE位被硬件置1

点评

我是新手哈 仔细看了你的程序 查了一下 才知道_samp的用法 不过你那个动态四位扫描那个遍历数组方法这样也可以么 还是你漏了 for( i=0; i  详情 回复 发表于 2012-7-31 00:15
你打了双斜杆 注释了啊 没有开启转换啊  详情 回复 发表于 2012-7-30 21:43
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 512213634 的帖子

你打了双斜杆 注释了啊 没有开启转换啊

点评

PORTE那条写错了没用可以注释。本来应该是PORTF的,将采样转换的数据给别的器件的 for( i=0; i  详情 回复 发表于 2012-7-31 12:57
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳 512213634 的帖子

我是新手哈 仔细看了你的程序 查了一下 才知道_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个采样产生一个中断
这个怎么实现采样一次一次中断的? 你说不能进入中断又是怎么判断的
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

6
 
还有 你在动态扫描后面那个PORTE=LedNumVal;是干嘛?
我还没学中断 所以有个疑问 需要先开总中断么?
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 4楼 小灰 的帖子

PORTE那条写错了没用可以注释。本来应该是PORTF的,将采样转换的数据给别的器件的
for( i=0; i<4; i++)  //实现4位动态扫描循环
  {  
   PORTE= LedOut;  //将字模送到数码管显示  
  
   PORTC=dispbit;//我用的是4个数码管,PORTE将数据送给数码管,PORTC选择开启拿给数码管
}
  中断可以设置采样一次中断一次,但是下一次采样中断时,你的上一次数据转换肯定好了
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

8
 

可以运行的AD程序

#include


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);
                  }  
    }
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表