ADC&触摸屏硬件学习--ADC数值输出

1、遇到的问题

a、刚开始不能够进入中断。后来检查这句话导致。

	ADCCON |= 1<<0;   /*ADCCON = 1<<0;原来写的这一句话,把原来的值全部修改了就出问题了*/

b、后来发现ADC转换有问题,标绿色的语句就是从下到上的执行顺序。这个是有问题的程序(因为没有使用ADC中断对转换数据进行读取,而是通过延时,对ADC的数据进行读取,这样明显是有问题的)

void measure_xy(void)
{
	int x,y;	
		//x = ADCDAT0 & 0X3ff;
		//printf("x = %08d  ", x);
		//y = ADCDAT1 & 0X3ff;
		//printf("y = %08d\n\r", y);  //这两段加上哪一段都行,程序能能进行转换
	//x = 3000;          //对这个数值进行了修改500及以下都不能运行到if判断里,1000可以运行到if判断里面
	//while(x--);
	if(!(ADCDAT0 & (1<<15)))
	{
		x = ADCDAT0 & 0X3ff;
		printf("x = %08d  ", x);
	}
	if(!(ADCDAT1 & (1<<15)))
	{
		y = ADCDAT1 & 0X3ff;
		printf("y = %08d\n\r", y);
	}
	ADCCON &= ~(1<<0);
	touchscreen_int_up();
	
}

void touchscreen_auto_measure(void)
{
	ADCTSC = AUTO_PST_AUTO | XY_PST_NO_OPERATION;
	ADCCON |= 1<<0;   /*ADCCON = 1<<0;原来写的这一句话,把原来的值全部修改了就出问题了*/
	measure_xy();

	//printf("auto_measure done \n\r");
}



void AdcTsIntHandle(int irq)
{
	/*读状态位判断处理*/
	if(SUBSRCPND & (1 << 9))
	{
		if(ADCUPDN & (1<<0))
		{
			/*触摸屏按下*/
			//printf("down   ADCUPDN = 0x%x\n\r", ADCUPDN);
			
			ADCUPDN &= ~(1<<0);
			touchscreen_auto_measure();

		}
		if(ADCUPDN & (1<<1))
		{
			/*触摸屏松开*/
			//printf("up  ADCUPDN = 0x%x\n\r", ADCUPDN);
			ADCUPDN &= ~(1<<1);
			touchscreen_int_down();
		}
	}
	if(SUBSRCPND & (1 << 10))
	{
		//printf("ADC irq %x\n\r");
	}

	/*清除中断标志位*/
	SRCPND = 1 << 31;
	INTPND = 1 << 31;
	SUBSRCPND |= (1<<9) | (1<<10);
	
	
}

  

正常的完整程序如下所示

另外x y 坐标好像是反了,但是软件可以处理,后面用到时再说。

#include "../s3c2440_soc.h"

#define UD_SEN_DOWN (0<<8)
#define UD_SEN_UP (1<<8)

#define YM_SEN_DISABLE (0<<7)
#define YM_SEN_ENABLE (1<<7)

#define YP_SEN_ENABLE (0<<6)
#define YP_SEN_DISABLE (1<<6)

#define XM_SEN_DISABLE (0<<5)
#define XM_SEN_ENABLE (1<<5)

#define XP_SEN_ENABLE (0<<4)
#define XP_SEN_DISABLE (1<<4)

#define PULLUP_ENABLE (0<<3)
#define PULLUP_DISABLE (1<<3)

#define AUTO_PST_AUTO (1<<2)

#define XY_PST_NO_OPERATION (0)
#define XY_PST_X_MEASURE (1)
#define XY_PST_Y_MEASURE (2)
#define XY_PST_WAITING (3)


void touchscreen_int_up(void)
{
	ADCTSC = UD_SEN_UP| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | XY_PST_WAITING;
}

void touchscreen_int_down(void)
{
	ADCTSC = UD_SEN_DOWN| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | XY_PST_WAITING;
}

void measure_xy(void)
{
	int x,y;	
		//x = ADCDAT0 & 0X3ff;
		//printf("x = %08d  ", x);
		//y = ADCDAT1 & 0X3ff;
		//printf("y = %08d\n\r", y);
	//x = 3000;
	//while(x--);
	if(!(ADCDAT0 & (1<<15)))
	{
		x = ADCDAT0 & 0X3ff;
		printf("x = %08d  ", x);
	}
	if(!(ADCDAT1 & (1<<15)))
	{
		y = ADCDAT1 & 0X3ff;
		printf("y = %08d\n\r", y);
	}
	ADCCON &= ~(1<<0);
	touchscreen_int_up();
	
}

void touchscreen_auto_measure(void)
{
	ADCTSC = AUTO_PST_AUTO | XY_PST_NO_OPERATION;
	ADCCON |= 1<<0;   /*ADCCON = 1<<0;原来写的这一句话,把原来的值全部修改了就出问题了*/
	//measure_xy();

	//printf("auto_measure done \n\r");
}



void AdcTsIntHandle(int irq)
{
	/*读状态位判断处理*/
	if(SUBSRCPND & (1 << 9))
	{
		if(ADCUPDN & (1<<0))
		{
			/*触摸屏按下*/
			//printf("down   ADCUPDN = 0x%x\n\r", ADCUPDN);
			
			ADCUPDN &= ~(1<<0);
			touchscreen_auto_measure();

		}
		if(ADCUPDN & (1<<1))
		{
			/*触摸屏松开*/
			//printf("up  ADCUPDN = 0x%x\n\r", ADCUPDN);
			ADCUPDN &= ~(1<<1);
			touchscreen_int_down();
		}
	}
	if(SUBSRCPND & (1 << 10))
	{
		//printf("ADC irq %x\n\r");
		measure_xy();
	}

	/*清除中断标志位*/
	SRCPND = 1 << 31;
	INTPND = 1 << 31;
	SUBSRCPND |= (1<<9) | (1<<10);
	
	
}


void touchscreen_initw(void)
{
	/*触摸屏控制设置*/
	ADCCON = (1<<14) | (49<<6) | (0<<3) ;
	//ADCTSC = UD_SEN_DOWN| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | AUTO_PST_AUTO | XY_PST_WAITING;

	ADCDLY = 60000;


	/*中断设置*/
	//INTMOD &= ~(1<<31);/*设置ADC为irq中断模式*/
	//INTMSK &= ~(1<<31);/*使能ADC中断*/
	SUBSRCPND = (1<<9) | (1<<10);
	SRCPND = (1<<31) | (1<<25);
	INTPND = (1<<31) | (1<<25);
	register_irq(31,AdcTsIntHandle);
	INTSUBMSK &= ~((1<<9) | (1<<10));/*使能touchscreen中断*/
	
	touchscreen_int_down();
	printf("touchscreen_init\n");
	printf("INTSUBMSK = 0x%x,INTMSK = 0x%x,SUBSRCPND =0x%x,SRCPND = 0x%x,INTPND = 0x%x\n\r",INTSUBMSK,INTMSK,SUBSRCPND,SRCPND,INTPND);
}

  

猜你喜欢

转载自www.cnblogs.com/youthforever/p/12586433.html
ADC