Docstoc

ProjectReport1.doc - Dept of EE_ IIT Bombay

Document Sample
ProjectReport1.doc - Dept of EE_ IIT Bombay Powered By Docstoc
					EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




                                   Touch Screen Display


                           Arun G Kumar (09307018) <arung@ee.iitb.ac.in>
                        Rajath P S Bhat (09307R02) < rajathbhat@ee.iitb.ac.in>
                           Tushar Vaidya (09307403) < tushar@ee.iitb.ac.in >


                                      Instructor: Prof. P. C. Pandey




Abstract: The trend in consumer electronics is increasing sophistication. Design of devices like
mobile phones, iPods and laptops are majorly driven by user interface. The present day technology
uses touchscreens as user interface. A touchscreen is an electronic device that can detect the
presence and location of a touch within the display area. The report details the implementation of
touchscreen display using a graphic LCD and a resistive touchpad. The microcontroller reads the
location from the touchpad, performs the appropriate action and displays it on the graphic LCD.




                                       I INTRODUCTION
A touchscreen is an easy to use input device that allows users to control the system by touching
the display screen. A touch system consists of a touch sensor that receives the touch input, a
controller, and a display unit. The most commonly used touch technologies are the capacitive
and resistive systems. The other technologies used in this field are infrared technology, near field
imaging and SAW (surface acoustic wave technology). These technologies are latest in this field
but are very much expensive. A little note on resistive and capacitive touchpad is as follows.

        Resistive: A resistive touch screen panel is coated with a thin metallic electrically
conductive and resistive layer that causes a change in the electrical current which is registered as
a touch event and sent to the controller for processing. Resistive touch screen panels are
generally more affordable but offer only 75% clarity and the layer can be damaged by sharp
objects. Resistive touch screen panels are not affected by outside elements such as dust or water.

        Capacitive: A capacitive touch screen panel is coated with a material that stores
electrical charges. When the panel is touched, a small amount of charge is drawn to the point of
contact. Circuits located at each corner of the panel measure the charge and send the information
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


to the controller for processing. Capacitive touch screen panels must be touched with a finger
unlike resistive and surface wave panels that can use fingers and stylus. Capacitive touch screens
are not affected by outside elements and have high clarity.

        The graphic LCD that we have used here is OMG12864. It is a 126x64 pixel graphic
LCD module having inbuilt controller. A LCD consists of a liquid-crystal material that behaves
electrically as a capacitor. There is a set of two transparent panels with a liquid crystal solution
between them. Light is shined from behind the panels. Each crystal either allows light to pass
through or blocks the light. The configuration of the crystals forms the image.

        The two transparent panels are polarized, which means they will only pass light waves in
one plane. These two polarized panels are at 90 degrees to each other so that light filtered from
one plane cannot get through the other panel because it only lets light through in a plane at 90
degrees to the first plane. So the panel appears to be black or very dark. However, when
electricity is applied to one of the segments of liquid crystals, the crystals line up in such a way
as to make the light turn through 90 degrees in between the two panels, hence forming the image.




                                2 HARDWARE DISCRIPTION
The circuit diagram of the touchscreen display is shown in Appendix A. The circuit can be
divided in to following parts

    1. Touchpad
       The touchpad used here is a 4 wire resistive type. The touchpad controller used is
       TSC2046 controller.
    2. Graphic LCD
       OMG12864, a 126x64 pixel graphic LCD. It has a inbuilt LCD controller.
    3. Microcontroller
       The microcontroller TMS320F2812 is used. It is a 32bit microcontroller with maximum
       operating speed of 150 MHz.



                                   2 WORKING PRINCIPLE
The touchpad is pasted on graphics LCD and is connected to microcontroller through touchpad
controller. The touchpad controller is programmed through the SPI port of the microcontroller.
Once programmed, the location is read each time
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




                 Figure 1: Typical configuration of a 4 wire touch panel


the user touches the screen. The received location value (x, y) point is compared with required
locations and the appropriate action is performed. The details of how touchpad controller works
is given bellow.

        A 4-wire Touch Panel usually has the set up as shown in figure 1. At the bottom layer,
the bus bars are on the left side and on the right side. The left connection is called X Left (XL)
and the right connection is called X Right (XR). The top layer is rotated 90° horizontally. It has
its bus bars on the upper side and on the down side – the Y Upper (YU) and the Y Down (YD).
With this configuration, the bottom Layer is called X-Layer and the Top Layer is called Y-Layer.

        If there is a press on the touch panel a contact is made between the two conductive layers.
When a voltage is applied to one layer the system behaves like a voltage divider. If for example
the XLayer has voltage applied, this voltage can be measured at a bus bar of the Y-Layer. (the
actual bus bar does not matter). This voltage value represents the actual X-Position. Of course,
the measurement at the Y-Layer Bus Bar must be taken with a high resistance connection to keep
reduce the impact to the voltage. Together with this voltage and some calibration data the X-
Position can be calculated using an A-to-D converter. To get the Y-Position, the voltage must
then be switched from the X-Layer to the Y-Layer and the same measurement procedure must be
done at the X-Layer.



The graphic LCD is connected the parallel port of the microcontroller.
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




OGM12864:
Description:
Oriole Graphic LCD Module consists of a LCD panel with CMOS LSIs for LCD driving.
Since this module has a full dot matrix graphic display, it is possible to display graphics as well
as characters.
LCD Module 12864S has 128 x 64 dots.
Features:
1. CMOS LSI’s specifically designed to drive LCDs.
2. Large Capacity Graphics type capable of displaying numerics, alphabets,
   special characters, graphs, charts and patterns.
3. 8 Bits parallel micro controller interface.
4. Super twisted nemantic LCD.
5. Positive Display.
6. 1/64 duty, 1/9 Bias.
7. High contrast, wide viewing range.




Super Twisted Nematic LCD's used here have a twist angle equal to 180 degrees. In this type of
display, the LC material undergoes a twist of 180 . The polarizers in this case are not mounted
parallel to the LC at the surface but rather at some angle. The cell, therefore, does not work on a
light "guiding" principle, as in Twisted Nematic LCDs, but instead on a birefringence principle.
The position of the polarizers, the cell thickness, and the birefringence of the LC are carefully
chosen to result in a particular color in the "off" state. Usually, this is a yellow-green to
maximize the contrast ratio. The viewsing angle of this LCD panel is 10o with bias or offset to
0o with frame frequency equal to 64Hz.
The 128x64 LCD is divided in to two segments of size 64x64 which have separate drivers. The
segements are driven by the corresponding drivers.. The parallel port of the microcontroller
configured for the LCD controller.The operating voltage of OGM 12864 is 5 volts. The output of
the microcontrollers at logic levels corresponding to 3.3volts. Hence two level translators HC244
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


(unidirectional) buffers are used for two segment drivers. The data to be displayed are written to
the display data RAM of the LCD module.

?????????????????????? FLOW CHART would be better ?????????????


                                                   Start



                                                  RST LCD




                                                Configure LCD




                                            Set Y Page (Y address)

                                    (

                                    (        Set X Page (X address)

                                        (

                                        (        Write data




                                            RST Touchpad controller




                                             Configure touchpad




                                                Is touchpad                     Perform required operation
                                                pressed?




                                             Display LCD data

                                        (

                                        (
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




                                               No

                                    Yes                             Yes




TMS320F2812:

Features
High Performance CMOS Technology.
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


Core at 150MHz ,3.3V I/O design

High performance 32bit CPU.

Serial Peripheral interface(SPI)

Upto 56 General Purpose I/O (GPIO) pins.

Flash Devices: Up to 128K x 16 Flash

(Four 8K x 16 and Six 16K x 16 Sectors)

-ROM Devices: Up to 128K x 16 ROM

The General Purpose I/O (GPIO) pins are configured for LCD display. The outputs pins to
connected to LCD module using HC244 level translators for logic level conversion from 3.3V to
5V. Since no feedback is taken from the LCD all the buffers are unidirection. The Touch
Panel(TSG2046) is interface to the microcontroller through Serial Peripheral Interface. The baud
rate of the clock is set to @@@@@@@@@@@@@@@@. The digital values of co-ordinates
obtained from the touch panel is processed and the corresponding pixels which to be set on is
written to the display data RAM of LCD.
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


                                        APPENDIX A
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




BILL OF MATERIALS

Item number          Part Number           Description            Value               Quantity
1                    C                     Capacitor              22UF                6
2                    C                     capacitor              0.01UF              17
3                    TMS320F2812           Microcontroller        -                   1
4                    74HC244               Level Translator       -                   2
5                    OMG12864              LCD with controller    -                   1
6                    TCS2046               Touchpad controller    -                   1
7                    Touchpad              Touchpad               -                   1




***************** NEED TO ADD PHOTOS HERE**************************
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




SOURCE CODE:


#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File
#include "fonts.c"
// Prototype statements for functions found within this file.
// interrupt void ISRTimer2(void);
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
void touch_pad();//LCD
void init_LCD();//LCD
void delay_loop_1_sec();//LCD
void    LCD_write_command(unsigned char section,unsigned char dat);//LCD
void    LCD_write_data(unsigned char section,unsigned char dat);//LCD
void animation(char * mptr);//LCD
void clear_screen();//LCD
void        refresh();//LCD
void small_delay_loop();//LCD
int gety,getx,y_pos,x_pos;

/*---------------------LCD--------------------*/
//#pragma DATA_SECTION(logo00, "logoFile")
#define RS GpioDataRegs.GPBDAT.bit.GPIOB0
#define RW GpioDataRegs.GPBDAT.bit.GPIOB1
#define EN GpioDataRegs.GPBDAT.bit.GPIOB2
#define CS1 GpioDataRegs.GPBDAT.bit.GPIOB3
#define CS2 GpioDataRegs.GPBDAT.bit.GPIOB4
#define RSTB GpioDataRegs.GPBDAT.bit.GPIOB5

#define LCD_DAT GpioDataRegs.GPADAT.all

#define   DPON                  0x3F                  // SETS DISPLAY ON
#define   DP_STLN               0xC0                  // DISPLAY START LINE
#define   SETPG                 0xB8                  // SET PAGE 0 ( B8 to BF        for 0 to 7
pages)
#define   SET_YADD              0x40                 // SET Y ADDRESS ( 40 - 7F )
#define   CHGDP                 0x20                // RIGHT = 0FFH, LEFT = 00H


/*-------------------------------------------*/

char vram[1024];

void main(void)
{
   Uint16 sdata; // send data
   Uint16 rdata; // received data
   int k;
   long j;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();

//   Step 2. Initalize GPIO:
//   This example function is found in the DSP281x_Gpio.c file and
//   illustrates how to set the GPIO to it's default state.
//   InitGpio(); // Skipped for this example
//   Setup only the GP I/O only for SPI functionality
     EALLOW;
     GpioMuxRegs.GPFMUX.all=0x000F;        // Select GPIOs to be SPI pins



                                                                                      //
Port F MUX - x000 0000 0000 1111

     GpioMuxRegs.GPFDIR.bit.GPIOF7=1;

     GpioMuxRegs.GPAMUX.all=0x0000;//LCD
     GpioMuxRegs.GPADIR.all=0xFFFF;//LCD
     GpioMuxRegs.GPBMUX.all=0x0000;//LCD
     GpioMuxRegs.GPBDIR.all=0xFFFF;//LCD

     EDIS;

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

//   Initialize PIE control registers to their default state.
//   The default state is all PIE interrupts disabled and flags
//   are cleared.
//   This function is found in the DSP281x_PieCtrl.c file.
     InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

//   Initialize the PIE vector table with pointers to the shell Interrupt
//   Service Routines (ISR).
//   This will populate the entire table, even if the interrupt
//   is not used in this example. This is useful for debug purposes.
//   The shell ISR routines are found in DSP281x_DefaultIsr.c.
//   This function is found in DSP281x_PieVect.c.
     InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals();
   spi_fifo_init();          // Initialize the Spi FIFO
   spi_init();                  // init SPI

// Step 5. User specific code:
// Interrupts are not used .
   gety=0x9B00;
   getx=0xDB00;
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


    sdata = 0x9B00;

    init_LCD();
    delay_loop();
    delay_loop();
        clear_screen();
   animation(logo00);
   delay_loop_1_sec();
   delay_loop_1_sec();
   delay_loop_1_sec();
  clear_screen();
// ----------------------------DISPLAY IIT on LCD----------------------------
// Write data to display RAM for IIT
vram[523]=3;
vram[524]=0x0e;
vram[525]=0x38;
vram[526]=0xe0;
vram[527]=0x80;
vram[528]=0xe0;
vram[529]=0x38;
vram[530]=0x0e;
vram[531]=3;

vram[533]=0x3c;
vram[534]=0x66;
vram[535]=0xc3;
vram[536]=0x81;
vram[537]=0xc3;
vram[538]=0x66;
vram[539]=0x3c;

vram[541]=       0xff;
vram[542]=       0x80;
vram[543]=       0x80;
vram[544]=       0x80;
vram[545]=       0x80;




for(k=224;k<=248;++k)
{
  vram[k] = 0XFF;
}

vram[234]    =    0Xe7;
vram[235]    =    0Xe7;
vram[236]    =    0X81;
vram[237]    =    0X81;
vram[238]    =    0Xe7;
vram[239]    =    0Xe7;
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


for(k=864;k<=888;++k)
{
  vram[k] = 0XFF;
}

vram[874]          =   0Xe7;
vram[875]          =   0Xe7;
vram[876]          =   0Xe7;
vram[877]          =   0Xe7;
vram[878]          =   0Xe7;
vram[879]          =   0Xe7;


k=776;
refresh();                     // This function makes the pixels on or off //
//                                corresponding to data present in data ram


//------------------------VOLUME CONTROL----------------------------

         for(;;)
         {

             for (j = 0; j < 60000; j++) {}

         touch_pad();//obtaines the co-ordainates x,y from the touch pad controller

              if((x_pos>220)&&(y_pos>210))// check for volume increase
              { if(k<860)k++;
                vram[k] = 0XFF;            // update the display data ram
                    refresh();             // increase the volume bar
              }
                   if((x_pos<190)&&(y_pos>210)) // check for volume decrease
              {
                vram[k] = 0X00;                 // update the display data ram
                    if(k>=776)k--;
                    refresh();                   //decrase the volume bar
              }

    /*     if((x_pos<232)&&(y_pos<176)&&(x_pos>200)&&(y_pos>144))
         clear_screen();
         if((x_pos<160)&&(y_pos<240)&&(x_pos>136)&&(y_pos>216))
         animation(logo00);

         */


         /*for(k=776;k<=866;++k)
         {
         for (j = 0; j < 600000; j++) {}
         vram[k] = 0XFF;
         refresh();
         }*/


         }
}
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




void init_LCD()
{

          RW = 0;
                    delay_loop();
          RSTB = 0;
                  //GpioDataRegs.GPBDAT.bit.GPIOB5 =0;
           delay_loop();
          //GpioDataRegs.GPBDAT.bit.GPIOB5 =1;
           RSTB = 1;
           delay_loop_1_sec();

                     EN =   0;
                     CS1    = 0;
                     CS2    = 0;
                     RS     = 0;

                LCD_write_command(0,DPON);
                            small_delay_loop();
                LCD_write_command(0,DP_STLN);
                                    small_delay_loop();
                LCD_write_command(1,DPON);
                            small_delay_loop();
                LCD_write_command(1,DP_STLN);
                                    small_delay_loop();


}

void      LCD_write_command(unsigned char section,unsigned char dat)
          {
          int i;
            RS     = 0;
            if(section)
               {
                    CS2 = 1;
                    CS1 = 0;
                 }
             else
               {
                    CS2 = 0;
                    CS1 = 1;
                 }

              for(i=1;i<=1000;i++);
              LCD_DAT = dat;
              for(i=1;i<=1000;i++);

             EN = 1;
             for(i=1;i<=1000;i++);
             EN = 0;

            delay_loop();
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


               return;

          }




void animation(char *mptr)
        {
                int i,j;
                char ch1;
                char * mpt;

        mpt = &vram[0];


              /* for(i=0;i<128;i++)
                             {
                 for(j = 0; j < 8;j++)
                    {
                       ch1 = mptr[i+j*128];
                                                   vram[i+j*128]= ch1;

                                    }

                   }           */

                         for(i=136;i<=168;i++)
                         vram[i]=0xff;


                         for(i=176;i<=208;i++)
                         vram[i]=0xff;

                  for(i=216;i<=248;i++)
                  vram[i]=0xff;
////////////////////////////////////////////////

                         for(i=276;i<=284;i++)
                         vram[i]=0xff;


                         for(i=316;i<=324;i++)
                         vram[i]=0xff;


                         for(i=356;i<=364;i++)
                         vram[i]=0xff;

///////////////////////////////////////////////////////////

                         for(i=276+128;i<=284+128;i++)
                         vram[i]=0xff;


                         for(i=316+128;i<=324+128;i++)
                         vram[i]=0xff;
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




                        for(i=356+128;i<=364+128;i++)
                        vram[i]=0xff;


//////////////////////////////////////////////////////


                      for(i=276+128+128;i<=284+128+128;i++)
                       vram[i]=0xff;


                        for(i=316+128+128;i<=324+128+128;i++)
                        vram[i]=0xff;


                        for(i=356+128+128;i<=364+128+128;i++)
                        vram[i]=0xff;


//////////////////////////////////////////////////////
                 for(i=276+128+128+128;i<=284+128+128+128;i++)
                  vram[i]=0xff;


                        for(i=316+128+128+128;i<=324+128+128+128;i++)
                        vram[i]=0xff;


                        for(i=356+128+128+128;i<=364+128+128+128;i++)
                        vram[i]=0xff;


//////////////////////////////////////////////////////



//////////////////////////////////////////////////////


            for(i=136+512;i<=168+512;i++)
                     vram[i]=0xff;


                        for(i=176+512;i<=208+512;i++)
                        vram[i]=0xff;

                        for(i=356+128+128+128;i<=364+128+128+128;i++)
                        vram[i]=0xff;


////////////////////////////////////////////////


            refresh();
}
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010




void             refresh()
          {


          char i,pagenum;
          char *vramptr,*tempptr;

          vramptr = &vram[0];

          for(pagenum=0;pagenum<8;pagenum++)
                           {
               LCD_write_command(0,pagenum | SETPG);
                                   small_delay_loop();
               LCD_write_command(0,SET_YADD); //setting 0 position
                                   small_delay_loop();
               for(i=0;i<64;i++)
                {
                  LCD_write_data(0,*vramptr++);
                                   small_delay_loop();
                }
               LCD_write_command(1,pagenum | SETPG);
                                   small_delay_loop();
               LCD_write_command(1,SET_YADD); //setting 0 position
                        small_delay_loop();
               for(i=0;i<64;i++)
                   {LCD_write_data(1,*vramptr++);
                         small_delay_loop();
                                   }
             }

}


void      LCD_write_data(unsigned char section,unsigned char dat)
          {
int i;
              RS     = 1;
              if(section)
                 {
                      CS2 =   1;
                      CS1 =   0;
                   }
               else
                 {
                      CS2 =   0;
                      CS1 =   1;
                   }

                for(i=1;i<=100;i++);
                LCD_DAT = dat;

                 for(i=1;i<=100;i++);
                EN = 1;
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


                    for(i=1;i<=1000;i++);
                   EN = 0;
                    for(i=1;i<=100;i++);
                   return;
               }


void clear_screen()
        {
        int i;
        char *mpt;
        mpt = &vram[0];

          for(i=0;i<1024;i++)
              *(mpt + i) = 0;

              refresh();
          }




void touch_pad()
{int i;
GpioDataRegs.GPFDAT.bit.GPIOF7=0;
     // Transmit data
     spi_xmit(gety);


          for(i=1;i<=2000;++i);
      y_pos = SpiaRegs.SPIRXBUF;

              spi_xmit(getx);


          for(i=1;i<=2000;++i);
      x_pos = SpiaRegs.SPIRXBUF;


}




// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions
here:

void small_delay_loop()
{
    long       i;
    for (i = 0; i < 100; i++) {}
         //GpioDataRegs.GPBTOGGLE.all=0xffff;
}

void delay_loop()
EE712 Embedded System Design Course Project Report, EE Dept, IIT Bombay, April 2010


{
     long       i;
     for (i = 0; i < 12000; i++) {}
          //GpioDataRegs.GPBTOGGLE.all=0xffff;
}

void delay_loop_1_sec()
{
    long      i;
    for (i = 0; i < 11000000; i++) {}
//        GpioDataRegs.GPBTOGGLE.all=0xffff;
}

void error(void)
{
    asm("     ESTOP0");                                                                    //
Test failed!! Stop!
    for (;;);
}

void spi_init()
{
        SpiaRegs.SPICCR.all =0x0007;                                         // Reset on, rising
edge, 16-bit char
bits
        SpiaRegs.SPICTL.all =0x000E;               //0006                              // Enable
master mode, normal phase,
                                                                  // enable talk, and SPI int
disabled.
         SpiaRegs.SPIBRR =0x007F;
    SpiaRegs.SPICCR.all =0x0087;                                             // Relinquish SPI
from Reset
    SpiaRegs.SPIPRI.bit.FREE = 1;                                 // Set so breakpoints don't
disturb
xmission
}

void spi_xmit(Uint16 a)
{
    SpiaRegs.SPITXBUF=a;
}

void spi_fifo_init()
{
// Initialize SPI FIFO registers
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;
}

//===========================================================================
// No more.
//===========================================================================

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:89
posted:9/27/2011
language:English
pages:19