1.SRCPND,INTPND 寄存器的意义:
一直不明白为什么中断服务程序最后要把SRCPND,INTPND相应位置1,还把这个过程称为CleaningPend,既然叫清除为什么不是清零呢?查了手册:当有中断源请求中断服务时,SRCPND相应位置1,裁决(判断是否响应中断)时INTPND自动置1。如果中断屏蔽,SRCPND置1,但INTPND不变。当INTPND置1时,响应中断服务程序。中断服务程序通过向相应位写1来清除未决断条件(pending)。
我理解是SRCPND只要有中断源请求中断就置1,可以响应中断时(未屏蔽),INTPND相应位置1,否则为0。为了使其他的中断服务程序可以执行,在中断服务程序中SRCPND、INTPND相应位应清零,否则会认为一直有中断源请求中断。而*PND寄存器的清零就是向相应位写入1(通过调试发现)。我一直理解错误,以为写入1就是把相应位置1,其实刚好相反。
2.编译问题:
头文件里定义了define BIT_ADC (0x1<<31)
结果编译报错:
Warning :signed constant overflow “<<”
上网查了才明白原来ADS1.2把1当成有符号数,加上强制转换就好了。
define BIT_ADC ((U32)0x1<<31)
分析中断程序:
/*中断服务程序*/
void __irq Touch_ScrISR(void)
{
rINTMSK|=BIT_ADC; //屏蔽ADC 中断
}
rADCTSC=(1<<3|1<<2);
//XP pull up disable,seq X Y position 产生中断后waiting for interrupt mode应被清除
//这里1<<2设为自动测量模式。
rADCDLY=40000;
rADCCON|=0x01; //start ADC
while(rADCCON & 0x1); //check if Enable_start is low
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
xdata=(rADCDAT0&0x3ff);
ydata=(rADCDAT1&0X3ff);
rSUBSRCPND|=(BIT_SUB_TC); //clear pending
rSRCPND =(BIT_ADC);
rINTPND =(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);
rADCTSC=(0<<8|1<<7|1<<6|0<<5|1<<4|0<<3|0<<2|3);//waiting for interrupt
rADCTSC=rADCTSC|(1<<8); //detect stylus up 触摸屏抬起
while(1) //to check Pen-up state
{
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
{
//Uart_Printf("Stylus Up Interrupt~!/n");
break; //if Stylus is up(1) state
}
}
Uart_Printf(" count=%03d, XP=%04d, YP=%04d/n",count++, xdata, ydata); //X-position Conversion data
rADCDLY=40000;
//rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
rSUBSRCPND|=BIT_SUB_TC;
//rINTMSK=~(BIT_SUB_TC);
rINTSUBMSK=~(BIT_SUB_TC);
rSRCPND =(BIT_ADC); //clear pending
rINTPND =(BIT_ADC);
}
其中要是不加如下:
while(1) //to check Pen-up state
{
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
{
//Uart_Printf ("Stylus Up Interrupt~!/n");
break; //if Stylus is up(1) state
}
}
触摸屏会出现抖动,按下后会出现十几个值,加上上面语句程序会停在while中,只有产生INT_TC (触摸屏源中断)中断才执行break 跳出执行其后的Uart_Printf(" count=%03d, XP=%04d, YP=%04d/n",count++, xdata, ydata);
最后还有一个现象我不明白,注意红色语句,如果屏蔽掉,则触摸屏左半边点两下才有反应,右半边正常。加上则触摸屏正常。