Adcts.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:4k
源码类别:

uCOS

开发平台:

C/C++

  1. /*****************************************
  2.   NAME: Adcts.c
  3.   DESC: ADC & Touch screen test
  4.   HISTORY:
  5.   2003.09.23:Leon YH KIM: draft ver 1.0
  6.  *****************************************/
  7. #include <string.h>
  8. #include "def.h"
  9. #include "2440addr.h"
  10. #include "2440lib.h"
  11. #define REQCNT 30
  12. #define ADCPRS 9 //YH 0627
  13. #define LOOP 1
  14. int ReadAdc(int ch);    //Return type is int, Declare Prototype function
  15. void __irq AdcTsAuto(void);
  16. int count=0;
  17. volatile int xdata, ydata;
  18. void Test_Adc(void)
  19. {
  20.     int a0=0,a1=0,a2=0,a3=0; //Initialize variables
  21.     int a4=0,a5=0,a6=0,a7=0; //Initialize variables
  22.     Uart_Printf("The ADC_IN are adjusted to the following values.n");        
  23.     Uart_Printf("Push any key to exit!!!n");    
  24.     Uart_Printf("ADC conv. freq.=%d(Hz)n",(int)(PCLK/(ADCPRS+1.))); // ADC Freq. = PCLK/(ADCPSR+1), ADC conversion time = 5CYCLES*(1/(ADC Freq.))
  25.     
  26.     while(Uart_GetKey()==0)
  27.     {
  28.     a0=ReadAdc(0);
  29.     a1=ReadAdc(1);
  30.     a2=ReadAdc(2);
  31.     a3=ReadAdc(3);
  32.     a4=ReadAdc(4);    
  33.     a5=ReadAdc(5);
  34.     a6=ReadAdc(6);
  35.     a7=ReadAdc(7);    
  36.     Uart_Printf("AIN0: %04d AIN1: %04d AIN2: %04d AIN3: %04d", a0,a1,a2,a3);
  37.     Uart_Printf("AIN4: %04d AIN5: %04d AIN6: %04d AIN7: %04d n", a4,a5,a6,a7);
  38.    }
  39.     
  40.     rADCCON=(0<<14)+(19<<6)+(7<<3)+(1<<2);     //stand by mode to reduce power consumption 
  41.     Uart_Printf("rADCCON = 0x%xn", rADCCON);
  42. }
  43.         
  44. int ReadAdc(int ch)
  45. {
  46.     int i;
  47.     static int prevCh=-1;
  48.     if(prevCh!=ch)
  49.         {
  50.         rADCCON=(1<<14)+(ADCPRS<<6)+(ch<<3);   //setup channel, ADCPRS
  51.         for(i=0;i<LOOP;i++);    //delay to set up the next channel
  52.         prevCh=ch;
  53.         }
  54.     rADCCON=(1<<14)+(ADCPRS<<6)+(ch<<3);   //setup channel, ADCPRS
  55.     rADCTSC = rADCTSC & 0xfb;     //Normal ADC conversion & No TS operation
  56.     rADCCON|=0x1;   //start ADC
  57.     while(rADCCON & 0x1);          //check if Enable_start is low
  58.     while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high
  59.     return (rADCDAT0&0x3ff);
  60. }
  61.     
  62. void Test_AdcTs(void)
  63. {
  64.    
  65.     rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
  66.     rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value
  67.     Uart_Printf("[ADC touch screen test.]n");
  68.     rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
  69.     pISR_ADC = (int)AdcTsAuto;
  70. rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear
  71. rINTSUBMSK=~(BIT_SUB_TC);
  72. Uart_Printf("nType any key to exit!!!n");
  73. Uart_Printf("nStylus Down, please...... n");
  74. Uart_Getch();
  75. rINTSUBMSK|=BIT_SUB_TC;
  76. rINTMSK|=BIT_ADC;
  77. Uart_Printf("[Touch Screen Test.]n");
  78. }
  79. void __irq AdcTsAuto(void)
  80. {
  81. int i;
  82. U32 saveAdcdly;
  83.     if(rADCDAT0&0x8000)
  84.     {
  85. Uart_Printf("nStylus Up!!n");
  86. rADCTSC&=0xff; // Set stylus down interrupt bit
  87.     }
  88.     else 
  89. Uart_Printf("nStylus Down!!n");
  90. rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
  91. saveAdcdly=rADCDLY;
  92. rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms
  93. rADCCON|=0x1;                   //start ADC
  94. while(rADCCON & 0x1); //check if Enable_start is low
  95. while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!
  96.             while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit
  97.             xdata=(rADCDAT0&0x3ff);
  98.             ydata=(rADCDAT1&0x3ff);
  99.  //YH 0627, To check Stylus Up Interrupt.
  100.  rSUBSRCPND|=BIT_SUB_TC;
  101.  ClearPending(BIT_ADC);
  102.  rINTSUBMSK=~(BIT_SUB_TC);
  103.  rINTMSK=~(BIT_ADC);
  104.  
  105.  rADCTSC =0xd3;    //Waiting for interrupt
  106.  rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
  107. while(1) //to check Pen-up state
  108. {
  109.  if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
  110.  {
  111. Uart_Printf("Stylus Up Interrupt~!n");
  112. break; //if Stylus is up(1) state
  113. }
  114. }
  115.     Uart_Printf("count=%d XP=%04d, YP=%04dn", count++, xdata, ydata);    //X-position Conversion data            
  116. rADCDLY=saveAdcdly; 
  117. rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
  118.     rSUBSRCPND|=BIT_SUB_TC;
  119.     rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC)     
  120.     ClearPending(BIT_ADC);
  121. }