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