天嵌 ARM开发社区

 找回密码
 注册
查看: 2085|回复: 2

关于2440内部AD中断方式 采集数据

[复制链接]
Rain_ning 发表于 2010-10-11 13:19:32 | 显示全部楼层 |阅读模式
想用AIN2采集模拟量 转换后打印到串口  可是老是不出信息 这是为啥啊
大伙帮忙看看  我菜鸟 可能有许多错误的地方 见谅见谅

#define        EnableIrq(bit)                rINTMSK &= ~(bit)
#define        DisableIrq(bit)                rINTMSK |= (bit)
#define BIT_ADC                        (0x1<<31)

static void __irq ADC_ISR(void)
{
        int i;

        if(rINTPND==BIT_ADC)
        {
                ClearPending(BIT_ADC);
                i= (int)rADCDAT0 & 0x3ff;
                Uart_Printf("AIN2=%4d",i);
        }
}


__inline void ClearPending(int bit)
{
        rSRCPND = bit;
        rINTPND = bit;
}


void main(void)
{
            ClearPending(BIT_ADC);
            pISR_ADC=(U32)ADC_ISR;
            EnableIrq(BIT_ADC);

            
            Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;

            preScaler = ADC_FREQ;
            Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
            preScaler = 50000000/ADC_FREQ -1;
          
            Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
            
            rADCCON = (1<<14)|(preScaler<<6)|(2<<3);                //setup channel
            rADCCON|=0x1;                                                                        //start ADC
            
            
            while( Uart_GetKey() != ESC_KEY ) ;
                DisableIrq(BIT_ADC);       
}
 楼主| Rain_ning 发表于 2010-10-11 17:45:07 | 显示全部楼层
一网友告诉我说Uart_printf也是需要中断  我当时没想起来 最好不要再中断函数里面用Uart_pritf
我又改进了程序
#define        EnableIrq(bit)                rINTMSK &= ~(bit)
#define        DisableIrq(bit)                rINTMSK |= (bit)
#define BIT_ADC                        (0x1<<31)

volatile U32 ADresult=0;


static void __irq ADC_ISR(void)
{
        if(rINTPND==BIT_ADC)
        {
                ClearPending(BIT_ADC);
                ADresult= (int)rADCDAT0 & 0x3ff;
        }
}


__inline void ClearPending(int bit)
{
        rSRCPND = bit;
        rINTPND = bit;
}


void main(void)
{
                Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;

                preScaler = ADC_FREQ;
                Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
                preScaler = 50000000/ADC_FREQ -1;
            
                Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
            
                 rADCCON = (1<<14)|(preScaler<<6)|(2<<3);                //setup channel
                rADCCON|=0x1;                                                                        //start ADC
       
                ClearPending(BIT_ADC);
                pISR_ADC=(U32)ADC_ISR;
                EnableIrq(BIT_ADC);
               
                Uart_Printf("AIN2=%4d",ADresult);
       
                 while( Uart_GetKey() != ESC_KEY ) ;
                   DisableIrq(BIT_ADC);       
}

仍然不行  进不去中断服务程序 斑竹大人啊 赶快指导指导啊
1# Rain_ning
 楼主| Rain_ning 发表于 2010-10-11 19:55:52 | 显示全部楼层
经过不懈的努力  发现自己的错误在于不知道ADC的中断有两个子中断  2440的ADC中断包括INT_ADC_S和INT_TC  需要先处理一下子中断INT_ADC_C  再处理INT_ADC
另外要感谢网友hbicecream的帮助  我才想起来Uart_Printf函数也是需要中断的
所以最好不要在中断服务程序中使用Uart_Printf
最终整理的程序如下:
使用的板子为TQ2440
#define        EnableIrq(bit)                rINTMSK &= ~(bit)
#define        DisableIrq(bit)                rINTMSK |= (bit)
#define        EnableSubIrq(bit)        rINTSUBMSK &= ~(bit)
#define        DisableSubIrq(bit)        rINTSUBMSK |= (bit)
#define BIT_ADC                        (0x1<<31)
#define BIT_SUB_ADC                (0x1<<10)

__inline void ClearPending(int bit)
{
        rSRCPND = bit;
        rINTPND = bit;
}

__inline void ClearSubPending(int bit)
{
        rSUBSRCPND |= bit;        
}

volatile U32 ADresult=0;//该变量做测试用 看能不能进入中断服务程序
volatile U32 ADping=0;

static void __irq ADC_ISR(void)
{
        ADping=8;

        if(rINTPND==BIT_ADC)
        {
                ClearSubPending(BIT_SUB_ADC);
                ClearPending(BIT_ADC);
                ADresult= (int)rADCDAT0 & 0x3ff;
        }
}


__inline void ClearPending(int bit)
{
        rSRCPND = bit;
        rINTPND = bit;
}


void main(void)
{
        while(1)
        {        Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;

                ClearSubPending(BIT_SUB_ADC);//清子中断处理寄存器  因为AD有两个子中断 一个INT_ADC_S  一个INT_TC(即触摸屏中断)
                ClearPending(BIT_ADC);//清中断处理寄存器
               
                EnableSubIrq(BIT_SUB_ADC);//开AD子中断
                EnableIrq(BIT_ADC);//开AD中断
               
                preScaler = ADC_FREQ;//设置AD工作时钟
                Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
                preScaler = 50000000/ADC_FREQ -1;
            
                Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
            
                   rADCCON = (1<<14)|(preScaler<<6)|(2<<3);                //setup channel
                  rADCCON|=0x1;        //start ADC                                                                //start ADC
        

        
                pISR_ADC=(U32)ADC_ISR;//设置中断服务程序
               

               
                Uart_Printf("AIN2=%4d/n",ADresult);//打印转换结果
                Uart_Printf("ADping=%4d",ADping);//该变量是我做测试用的 看有没有进入中断服务程序        
        
                 while( Uart_GetKey() != ESC_KEY ) ;//当按下ESC键以后 会停止中断
                        DisableIrq(BIT_ADC);
                        DisableSubIrq(BIT_SUB_ADC);        
        }
}
2# Rain_ning
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-15 20:32 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表