课十八、ADC和触摸屏
节二、ADC编程
1、vol = (double)val/1023*3.3; /* 0xff=1023--3.3v */
需要强制类型转换,不然会打印为0.000!
例如:
视频打印:
vol: 1.125v
我的打印:
NOr:vol: 0.000000V00V
Nand:vol: 0.000000Vv0000V
修改后打印:
vol: 1.270V25V
vol: 1.154V25V
补:多出来的部分为printf()函数的问题。
2、编译时,gcc编译警告:
lcd/font.c: In function `fb_print_char':
lcd/font.c:24: warning: initialization discards qualifiers from pointer target type
错误代码:
font.c>>24行:unsigned char * dots = &fontdata_8x16[c*16];
引用位置:const unsigned char fontdata_8x16[FONTDATAMAX] = {...};
原因查找:
const unsigned char 被赋值给unsigned char 类型,丢掉了const qualifier。如果非要这样用,你需要把const void * 给cast为void *类型:
unsigned char * c = (unsigned char *)str;
节4:s3c2440触摸屏接口
ADCDAT0[15][14][13:12] = ADCDAT1[15][14][13:12] = ADCTSC[8][2][1:0]【成立!】
判断触摸笔落下与抬起状态:ADCDAT0[15] = ADCDAT1[15] = ADCTSC[8]【?=】ADCUPDN[1][0];【未知】
节5:编程_按下/松开检测
1、刚进入enter_wait_pen_up/down_mode()函数时,ADCTSC寄存器的设置和开关的关系,以及联想触摸屏的内部结构!
2、当程序持续出现bug而找不到原因时,可以把每个进程使用到的寄存器都打印出来,如此更方便观察每个进程的运行状况(通用异步收发器
UART的作用即在此),更方便查找问题的原因!
使用技巧: a.在每个不同的进程做标号;
b.打印全部关键使用到的寄存器(尤其在进程开始和结束的位置);
3、ADC/TC中断,使用触摸屏期间不需要清中断吗?触摸屏中断的函数调用(即中断处理)流程是什么?
答:
while(1);→点击触屏→异常向量表→跳转指令→handle_irq()→AdcTsIntHandle()→SubInt_Ts_irq()→printf("pen up/pen down")+enter_wait_pen_down/up_mode()→
返回SubInt_Ts_irq()→返回AdcTsIntHandle()清中断→handle_irq()→返回执行跳转指令的下条指令,退出中断→while(1);→→→
4、对于ADC的A/D转换之后的数据用【查询法】读取,需要指令序列:
ADCCON |= (1<<0); # 手动启动ADC的A/D转换;
while(!(ADCCON & (1<<15))); # 判断A/D转换的进程状态,等待A/D转换结束;
return ADCDAT0 & 0x3ff; # 读A/D转换数据后X方向的转换数值;
但对于TC的数据的读取呢?其需要的指令序列呢?
对于本节课程只是判断触摸笔按下/松开的状态,并未涉及到读取坐标数据,猜测:对于数据的读取的指令和寄存器读取并未使用;
5、指令序列:
ADCCON = (1<<14) | (49<<6) | (0<<3);
ADCDLY = 0xff;
1)于目前检测触摸屏的笔按下/松开状态检测的意义?
答:设置AD的工作模式,开启A/D转换;目前可以去掉?为何不并入ADCCON寄存器初始化;
2)对于后期触摸屏工作的意义?
6、在main()函数内,同时存在指令序列:
touchscreen_test();
while(1){adc_test();}
触摸屏的笔按下/松开状态检测,将不成功!
答:实验是成功的!之前没有成功是因为串口工具MobaXterm的问题!旧版10.4工具刚打开可以正常打印,使用十几分钟之后就不能打印了!
重新安装新串口工具就好了!
节六:
1、疑问代码如下:
void enter_auto_measure_mode(void)
{
ADCTSC = AUTO_PST | NO_OPR_MODE;
}
问题:ADCTSC[1:0]为什么不是【0b11 = 等待中断模式】而是【0b00 = 等待中断模式】?
还有对于测量坐标反转的问题是不是该条指令初始化的问题?是否应该修改为:
ADCTSC |= (AUTO_PST | NO_OPR_MODE);
或者 ADCTSC = WAIT_PEN_DOWN | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | AUTO_PST | NO_OPR_MODE;
答:实验验证,不是该条指令导致的反转问题,当 void enter_wait_auto_measure_mode(void){ADCTSC |= AUTO_PST;}时,亦可以正常读取触点
坐标 X,Y 的值; 视频程序应该是为了再读取A/D转换之后的数据时,不再进行触摸屏中断?
2、打印x,y坐标不线性的问题的解决,添加代码如下:
if (!(x & (1<<15))) /* 如果仍然按下才打印 */
{
x &= 0x3ff;
y &= 0x3ff;
printf("x = %08d, y = %08d\n\r", x, y);
}
3、/* 功能: adc/tc总中断处理函数; adc/tc同时发生,同时处理
*/
void AdcTcIntHandle(int irq){...}
tc中断,是基于检测触摸笔按下或者松开是否发生, 并紧接着处理ADC中断;
ADC中断处理是基于测量触电电压的X/Y双向(测量两次)的A/D转换值;
问题1:是不是触摸笔“按下”“松开”两种状态都可以触发 INT_TC 中断?若是,为何只有在“按下”中断时才可且有读取且打印A/D转化的数据,
“松开”却不会读数据并且也没有打印数据?
答1:通过在点击屏幕的同时main()内while(1){}内的LCD程序的几何图案的正常显示可知,在触摸笔保持“按下”尚未“松开”时,程序未在 I