天嵌 ARM开发社区

 找回密码
 注册
查看: 5328|回复: 20

在UCOSII中整合TEST2440中触摸屏模块的问题

[复制链接]
jamesjoo 发表于 2009-12-14 17:53:08 | 显示全部楼层 |阅读模式
是基于开发板提供的UCOSII加上开发板裸奔TEST2440里的TOUCHPANEL.C里的一些函数自己弄的。但是好像不能用。。。请版主帮忙。
这是我的设置中断的函数
void SetTSInterrupt(void) //设置中断向量,开中断:


{

rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
        rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value

        //Uart_Printf("\nTouch Screen test\n");

        rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

        pISR_ADC = (int)AdcTsAuto;
        rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear,&是我加的
        rINTSUBMSK=~(BIT_SUB_TC);
}

这个是原来TEST2440里触摸板的测试程序里的函数
void __irq AdcTsAuto(void)
{
        U32 saveAdcdly;

        if(rADCDAT0&0x8000)
        {
                //Uart_Printf("\nStylus Up!!\n");
                rADCTSC&=0xff;        // Set stylus down interrupt bit
        }
        //else
                //Uart_Printf("\nStylus Down!!\n");

        rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
        saveAdcdly=rADCDLY;
        rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

        rADCCON|=0x1;                   //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);

        //check Stylus Up Interrupt.
        rSUBSRCPND|=BIT_SUB_TC;
        ClearPending(BIT_ADC);
        rINTSUBMSK=~(BIT_SUB_TC);
        rINTMSK=~(BIT_ADC);
                         
        rADCTSC =0xd3;    //Waiting for interrupt
        rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

        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            
        //Lcd_printf(30,180,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),0,"屏幕中断测试:x:%d : y:%d : 第%d次\n",xdata,ydata,++count);
        //xPhys=xdata;
        //yPhys=ydata;
        Uart_Printf("INTERUPPT!!!\n");
        Uart_Printf("\nrADCDAT0 is:%x; rADCDAT1 is:%x; rADCTSC is:%x; rADCCON is:%x;\n rADCDLY is:%x; BIT_ADC is:%x  \n",rADCDAT0,rADCDAT1,rADCTSC,rADCCON,rADCDLY,BIT_ADC);
        rADCDLY=saveAdcdly;
        rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
        rSUBSRCPND|=BIT_SUB_TC;
        rINTSUBMSK=~(BIT_SUB_TC);        // Unmask sub interrupt (TC)     
        ClearPending(BIT_ADC);
        Uart_Printf("INTERUPPT DONE!!!\n");
}
我把SetTSInterrupt()直接挂到主程序的初始模块里,好像中断不正常,是不是寄存器和中断处理没有设置好。
亚瑟王 发表于 2009-12-17 19:39:58 | 显示全部楼层
uCOS我也不会。帮不了你。
 楼主| jamesjoo 发表于 2009-12-27 21:25:19 | 显示全部楼层
斑竹,不考虑UCOS,我们说说一般的设置屏幕冲断,是否是我以上的方法做的。
跟系统自带的TQ2440_TEST里的触摸控制部分是一样的方式。
但是,实际应用中我按一下,中断可以触发一次,可以得到一次坐标,之后就死机了。请斑竹帮忙。
亚瑟王 发表于 2009-12-31 15:08:23 | 显示全部楼层
直接在TQ2440_Test中测试不会这样吧,应该是ucos的核有问题导致的。
 楼主| jamesjoo 发表于 2010-1-2 00:44:35 | 显示全部楼层
可能是UCOS的中断设置的问题。。。我再深入研究一下,实在弄不出来,就上操作系统了,不写裸奔程序了。
tyblly 发表于 2010-1-2 10:06:37 | 显示全部楼层
我之前有研究过ucos,是在NXP的LPC2148上的
ucos中的IRQ(汇编那部分)与平常的裸奔的IRQ有小部分不同
建议参考一下
 楼主| jamesjoo 发表于 2010-1-2 22:48:30 | 显示全部楼层
回复斑竹和tyblly,我已经逐行比较了UCOS里的汇编INIT部分,全部照着裸奔的TQ2440TEST里的改的,也还不行。。。。。很郁闷。不知道谁做出了可以实际运行UCOS并支持触摸屏的实作,放出来给我参考一下吧。
plxpenglixin 发表于 2010-1-4 11:40:15 | 显示全部楼层
void __irq AdcTsAuto(void)  中__irq 去掉,并且建立该函数与中断向量地址的关系
如 pISR_ADC= (unsigned)AdcTsAuto;
 楼主| jamesjoo 发表于 2010-1-5 08:10:35 | 显示全部楼层
回复plxpenglixin,
谢谢啦,我试过了,还是不行,还是以碰触摸屏只能取到一次坐标,然后就死机了。
亚瑟王 发表于 2010-1-5 11:10:19 | 显示全部楼层
我不会弄uCOS,呵呵,不过TQ2440_Test中的代码是可以正常使用触摸的。
tyblly 发表于 2010-1-5 21:26:55 | 显示全部楼层
这位大哥还在埋头ucos啊,看来很有劲头啊
不能简单地把裸奔的程序挂上ucos的线程就了事了呀,还要考虑各个方面,例如调度、中断等等
ucos我也不熟悉,只是看过它的内核,理解一下操作系统的原理

PS 偶在实习得时候认识一位从周立功出来的工程师,他说的:ucos用来学习研究做课题还是很好的,但是要实际应用的话,没有1年以上的使用经验,是很难用得好的。
这个可是原话,只是作为给你一个参考,希望不会打断你的劲头
还要看看邵贝贝的书
plxpenglixin 发表于 2010-1-6 22:36:30 | 显示全部楼层
你是在光盘UCOS例子下改的吗? 如果是的就不要用BEEP函数,它的延时与系统时钟是冲突的。我做过RTC实验,我的能进中断!不会死机啊!
plxpenglixin 发表于 2010-1-6 22:41:42 | 显示全部楼层
过两天做下实验 嘿嘿
非洲老人 发表于 2010-1-10 20:22:41 | 显示全部楼层
8# plxpenglixin

我也遇到这问题  

只中断一次 然后停在  
while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit

跳不出这循环.......      弄了一天   毫无头绪 .......
plxpenglixin 发表于 2010-1-21 19:42:04 | 显示全部楼层
我搞不定啊  头痛啊 程序运行就进入中断了
好像没有跳出中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-10-6 22:22 , Processed in 1.020547 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表