s3c2440裸机-电阻触摸屏编程(3.触摸屏TSC的初始化和中断服务程序框架)

发布时间:2023-08-02  

1. ADC中断产生流程

 

中断源:

这里是ADC和TSC共用一个中断源。

 

SRCPND表示哪个中断源产生了中断请求。

 

 INTMODE:配置中断模式

 

配置中断屏蔽寄存器

 

中断挂起寄存器(用来显示当前优先级最高的、正在发生的中断, 需要清除对应位)

从SRCPND寄存器可以读到ADC和TSC复用的同一个中断源,那么如何区分呢?

可以从SUBSRCPND寄存器配置,如下:

 

 当bit 9被置1时,表示TSC中断。那么我们需要打开subsrcmask寄存器

 所以TSC中断的产生流程如下:

 2. TSC编程实现

  ①初始化TSC,ADCTSC寄存器

  ②设定TSC处于“等待中断模式”

  ③使能TSC中断

      INTSUBMSK

      MSK/MODE

  ④按下,进入TSC中断

      进入自动采集转换模式

      启动ADC

  ⑤ADC中断

      读数据

      再次进入”等待中断模式“

      启动定时器(为了处理长按或者滑动操作)

  ⑥定时器中断

      若松开,结束

      如任然按下,进入④步骤的启动ADC流程

void touchscreen_init(void)

{

    /* 设置触摸屏接口:寄存器 */

    adc_ts_reg_init();

    /* 设置中断 */

    adc_ts_int_init();

    /* 让触摸屏控制器进入"等待中断模式" */

    enter_wait_pen_down_mode();

}


2.1.1 tsc寄存器init


主要是设置预分频,产生ADC clk = 1MHz.


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


    ADCDLY = 0xff;    

}

2.1.2 TSC interrupt init并且使能int

为了将中断源开启,这里设置SUBSRCPND 和INTSUBMSK让中断源开启。通过register_irq()注册中断号和中断服务程AdcTsIntHandle,查表得出中断号为31,这样当硬件产生中断后可以从INTOFFSET区分是哪个中断号。如下图:

void adc_ts_int_init(void)

{

    SUBSRCPND = (1<

    /* 注册中断处理函数 */

    register_irq(31, AdcTsIntHandle);    /*31号中断*/


    /* 使能中断 */

    INTSUBMSK &= ~((1<    //INTMSK    &= ~(1<}

2.1.3 进入"等待中断模式" 

进入等待中断模式,YM闭合, YP, XP, XM断开,需要pull up,WAIT_PEN_DOWN表示要等待的是按下中断,当触摸屏按下时就会产生一个TSC irq,反之WAIT_PEN_UP表示要等待的是松开中断。

#define ADC_INT_BIT (10)

#define TC_INT_BIT  (9)

#define INT_ADC_TC   (31)

/* ADCTSC's bits */

#define WAIT_PEN_DOWN    (0<<8) /*触摸笔按下*/

#define WAIT_PEN_UP      (1<<8) /*触摸笔松开*/

#define YM_ENABLE        (1<<7)

#define YM_DISABLE       (0<<7)

#define YP_ENABLE        (0<<6)

#define YP_DISABLE       (1<<6)

#define XM_ENABLE        (1<<5)

#define XM_DISABLE       (0<<5)

#define XP_ENABLE        (0<<4)

#define XP_DISABLE       (1<<4)

#define PULLUP_ENABLE    (0<<3)

#define PULLUP_DISABLE   (1<<3)

#define AUTO_PST         (1<<2) /*自动转换*/

#define WAIT_INT_MODE    (3)    /*等待中断模式*/

#define NO_OPR_MODE      (0)    /*禁止模式*/

void enter_wait_pen_down_mode(void)/*等待按下模式*/

{

    ADCTSC = WAIT_PEN_DOWN | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | WAIT_INT_MODE;}

void enter_wait_pen_up_mode(void)/*等待松开模式*/

{

  ADCTSC = WAIT_PEN_UP | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | WAIT_INT_MODE;

}

2.2 TSC中断服务程序

SUBSRCPND的bit9, bit10可以区分是TC中断还是ADC中断。

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))//dat寄存器的第15位判断按下还是松开

  {

    printf("pen upnr");

    enter_wait_pen_down_mode();

  }

  else

  {

    printf("pen downnr");


    /* 进入"等待触摸笔松开的模式" */

    enter_wait_pen_up_mode();

  }

}

void AdcTsIntHandle(int irq)

{

  if (SUBSRCPND & (1<    Isr_Tc();


  // if (SUBSRCPND & (1<  // Isr_Adc();

  SUBSRCPND = (1<  //SRCPND = 1<<31;/*在interrupt.c已经清中断了*/

}

AdcTsIntHandle函数: 这里先注解掉ADC中断,只检测单独的按下松开触摸屏操作。那当isr处理完后为了能够正常响应下一次中断,需要清中断,否则会一直触发interrupt。

Isr_Tc函数:ADCDAT0 寄存器的第15位判断按下还是松开。那么当按下后,要将控制器进入”等待松开模式“,当松开后,要将控制器配置进入”等待按下模式“。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    电源的,输出信号为 4-20MA ,电流)即+ 24vdc,负输出 4-20mA 电流。 ● 四线制 (有自己的供电电源, 一般是 220vac ,信号线输出 +为 4-20ma 正,-为 4......
    信号为 4-20MA ,电流)即+ 24vdc,负输出 4-20mA 电流。 ● 四线制 (有自己的供电电源, 一般是 220vac ,信号线输出 +为 4-20ma 正,-为 4-20ma负......
    传感器正端接12—24VDC,负端输出4-20mA电流。 7 两线制4-20mA信号与PLC匹配隔离调理典型应用图 2、四线制电流/电压(输入/输出)型传感器(有自己的供电电源24VDC,输入/输出:4......
    隔离型输入支持多种输入方式,分别为电流源、三线制、二线制。在自动化控制系统中,一般需要现场的压力、水位、流量等信号进行测量监测,常常用到压力传感器、水位传感器、流量传感器等,这些非电量传感器分为2线制、3线制4线制......
    三种类型,不同类型的信号其接线方式不同。四线制信号指的是模拟量仪表或设备上信号线和电源线加起来有4根线。仪表或设备有单独的供电电源,除了两个电源线还有两个信号线。四线制信号的接线方式如下图2模拟......
    力表+,压力表-420mA+,420mA-24V-就可以,可能中间有端子,要看一下回路图。   液位传感器接线之电压型三线制接线方式:电源+==供电+;电源-(信号-)==供电-;信号+==反馈......
    控制可靠性及可编程可控性,PLC选用了西门子S7-1200,编码器选用了绝对值多圈编码器420mA信号接口,GAX60.LB(代号9600)2个,分别用机械装置安装与左右两个油缸提升高度相对应,对应设置的油缸高度6米对......
    . MAXREFDES1154输入配置 MAXREFDES1152:4通道、通用模拟电压/电流输入 MAXREFDES1152支持4路模拟电压(0-10V)、模拟电流(0-20mA)输入,以及2线、3线、4线制......
    西门子S7-200 SMART 模拟量模块PLC接线图汇总;一. S7-200 SMART数字量I/O接线图 不同型号CPU输入/输出接线 1. CPU SR20接线图 2. CPU......
      1+, 2-   TMT180只能接热电阻,不能接热电偶。   二线制热电阻: 3和6端子。   三线制热电阻:一端接3,另一端兩根线接5和6。   四线制热电阻: 一端两根线接3和4,另一......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>