ADC触摸屏编程_ADC中断


ADC触摸屏编程_ADC中断

文章插图
 
来源:百问网_嵌入式linux wiki_jz2440 新1期视频维基教程 (视频文字版)
作者:韦东山
本文字数:2725 , 阅读时长:3.5分钟
第018课 ADC和触摸屏 第006节_触摸屏编程_ADC中断
这节课我们加上ADC中断把触点的xy坐标读出来
查看touchscreen.c
写出这个自动测量的函数void enter_auto_measure_mode(void){//现在是自动测量 , 我们没有机会分别设置这些开关设置AUTO_PST =1XY_PST = 00ADCTSC = AUTO_PST | NO_OPR_MODE;}现在是自动测量 , 我们没有机会分别设置这些开关
ADC触摸屏编程_ADC中断

文章插图
 
进入中断处理函数
void AdcTsIntHandle(int irq){if (SUBSRCPND & (1<<TC_INT_BIT))/* 如果是触摸屏中断 */Isr_Tc();if (SUBSRCPND & (1<<ADC_INT_BIT))/* ADC中断 , 则会进入Adc中断处理函数 */Isr_Adc();SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT);}进入触摸屏中断处理函数
void Isr_Tc(void){//printf("ADCUPDN = 0x%x, ADCDAT0 = 0x%x, ADCDAT1 = 0x%x, ADCTSC = 0x%xnr", ADCUPDN, ADCDAT0, ADCDAT1, ADCTSC);if (ADCDAT0 & (1<<15)){//printf("pen upnr");enter_wait_pen_down_mode();}else{/* 进入"自动测量"模式 */enter_auto_measure_mode();/* 启动ADC */ENABLE_START = 1就可以了ADCCON |= (1<<0);}}启动ADC
ADC触摸屏编程_ADC中断

文章插图
【ADC触摸屏编程_ADC中断】 
Adc中断处理函数
void Isr_Adc(void){进入adc中断后 , 等待触摸笔松开int x = ADCDAT0 & 0x3ff;int y = ADCDAT1 & 0x3ff;printf("x = %08d, y = %08dnr", x, y);//等待触摸笔松开模式enter_wait_pen_up_mode();}烧写
实验发现打印一堆乱码
ADC触摸屏编程_ADC中断

文章插图
 
应该是printf函数出了问题打开my_printf.c文件 , 找到printf函数应该是处理第二个数据的时候 , 没有设置初始值
/*reference :int vprintf(const char *format, va_list ap); */static int my_vprintf(const char *fmt, va_list ap) {char lead=' ';intmaxwidth=0;for(; *fmt != ''; fmt++){if (*fmt != '%') {outc(*fmt);continue;}//碰到 % 就重新处理 ,  初始值应该重新设置初始值上去lead=' ';maxwidth=0;//format : %08d, %8d,%d,%u,%x,%f,%c,%sfmt++;if(*fmt == '0'){lead = '0';fmt++;}while(*fmt >= '0' && *fmt <= '9'){maxwidth *=10;maxwidth += (*fmt - '0');fmt++;}switch (*fmt) {case 'd': out_num(va_arg(ap, int),10,lead,maxwidth); break;case 'o': out_num(va_arg(ap, unsigned int),8,lead,maxwidth); break;case 'u': out_num(va_arg(ap, unsigned int), 10,lead,maxwidth); break;case 'x': out_num(va_arg(ap, unsigned int), 16,lead,maxwidth); break;case 'c': outc(va_arg(ap, int)); break;case 's': outs(va_arg(ap, char *)); break;default:outc(*fmt);break;}}return 0;}重新烧写执行 , 发现数据变化幅度很大 , 但至少Adc已经有输出
ADC触摸屏编程_ADC中断

文章插图
 
我们需要解决输出值不线性的问题
到底是触摸屏质量问题 , 还是Adc转化精度问题 , 觉得应该是触摸屏电压不稳定之前不知道DELAY寄存器是用来干嘛的
ADC触摸屏编程_ADC中断

文章插图
 
等待中断模式时 , 当触摸笔按下时我们会产生中断 , 但是可以通过 DELAY来延时产生中断
在前面有一张图
ADC触摸屏编程_ADC中断

文章插图
 
按下触摸笔 , 延迟A才可以产生中断 , 你才可以测量X Y坐标A = D(晶振的周期)D就是 DELAY就是那个寄存器的值晶振周期时12M我们需要设置一下
void adc_ts_reg_init(void){/* [15] : ECFLG,1 = End of A/D conversion* [14] : PRSCEN, 1 = A/D converter prescaler enable* [13:6]: PRSCVL, adc clk = PCLK / (PRSCVL + 1)* [5:3] : SEL_MUX, 000 = AIN 0* [2]: STDBM* [0]: 1 = A/D conversion starts and this bit is cleared after the startup.*/ADCCON = (1<<14) | (49<<6) | (0<<3);/*按下触摸屏, 延时一会再发出TC中断* 10ms为120000*延时时间 = ADCDLY * 晶振周期 = ADCDLY * 1 / 12000000 = 5ms*/ADCDLY = 60000; }再次烧写 , 发现数据并不规律我们需要再次改进程序


推荐阅读