Real Time FIR Filter - Distinctive Excellence award winner :)

Dependencies:   mbed

Committer:
Gonzakpo
Date:
Sat Aug 13 17:35:52 2011 +0000
Revision:
0:b3e50e98acac

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gonzakpo 0:b3e50e98acac 1
Gonzakpo 0:b3e50e98acac 2 /* Esta rutina de touchpad esta pensada especificamente para la aplicacion del KaossPad */
Gonzakpo 0:b3e50e98acac 3 /* Si se quisiera portar a otro proyecto se deber� agregar una configuracion inicial del ADC */
Gonzakpo 0:b3e50e98acac 4 /* As� como esta presupone que el ADC ya est� corriendo (modo BURST) */
Gonzakpo 0:b3e50e98acac 5
Gonzakpo 0:b3e50e98acac 6 #include "touchpad.h"
Gonzakpo 0:b3e50e98acac 7
Gonzakpo 0:b3e50e98acac 8 /* Configuracion del touchpad */
Gonzakpo 0:b3e50e98acac 9 /*
Gonzakpo 0:b3e50e98acac 10 * AD0.4 OPEN-DRAIN OPEN-DRAIN AD0.5
Gonzakpo 0:b3e50e98acac 11 * P1[30] P2[0] P2[1] P1[31]
Gonzakpo 0:b3e50e98acac 12 * | | | |
Gonzakpo 0:b3e50e98acac 13 * | _____________|______________ | |
Gonzakpo 0:b3e50e98acac 14 * | | | | |
Gonzakpo 0:b3e50e98acac 15 * | | | | |
Gonzakpo 0:b3e50e98acac 16 * |__________| Touchpad |________| |
Gonzakpo 0:b3e50e98acac 17 * | | |
Gonzakpo 0:b3e50e98acac 18 * | | |
Gonzakpo 0:b3e50e98acac 19 * |____________________________| |
Gonzakpo 0:b3e50e98acac 20 * | |
Gonzakpo 0:b3e50e98acac 21 * |______________________________________|
Gonzakpo 0:b3e50e98acac 22 */
Gonzakpo 0:b3e50e98acac 23
Gonzakpo 0:b3e50e98acac 24 void init_touchpad() {
Gonzakpo 0:b3e50e98acac 25 /* P2[0] y P2[1] se configuran como GPIO */
Gonzakpo 0:b3e50e98acac 26 LPC_PINCON->PINSEL4 &= ~(((unsigned int)0x3 << 0) | ((unsigned int)0x3 << 2));
Gonzakpo 0:b3e50e98acac 27
Gonzakpo 0:b3e50e98acac 28 /*Deshabilito todas las R de pullup y pulldown (de P2[0], P2[1], P1[30] y P1[31])*/
Gonzakpo 0:b3e50e98acac 29 LPC_PINCON->PINMODE4 |= ((unsigned int)0x2 << 0) | ((unsigned int)0x2 << 2);
Gonzakpo 0:b3e50e98acac 30 LPC_PINCON->PINMODE3 |= ((unsigned int)0x2 << 28) | ((unsigned int)0x2 << 30);
Gonzakpo 0:b3e50e98acac 31
Gonzakpo 0:b3e50e98acac 32 /* P2[0] y P2[1] se configuran como salidas */
Gonzakpo 0:b3e50e98acac 33 LPC_GPIO2->FIODIR |= ((unsigned int)0x1 << 0) | ((unsigned int)0x1 << 1);
Gonzakpo 0:b3e50e98acac 34
Gonzakpo 0:b3e50e98acac 35 /* P2[0] y P2[1] se configuran como Open-Drain */
Gonzakpo 0:b3e50e98acac 36 LPC_PINCON->PINMODE_OD2 |= ((unsigned int)0x1 << 0) | ((unsigned int)0x1 << 1);
Gonzakpo 0:b3e50e98acac 37
Gonzakpo 0:b3e50e98acac 38 /* Los pines P1[31] y P1[30] funcionaran tanto como ADC como GPIO
Gonzakpo 0:b3e50e98acac 39 * y por eso no se configuran inicialmente */
Gonzakpo 0:b3e50e98acac 40 }
Gonzakpo 0:b3e50e98acac 41
Gonzakpo 0:b3e50e98acac 42 touchpad_position get_position(void) {
Gonzakpo 0:b3e50e98acac 43 touchpad_position positions;
Gonzakpo 0:b3e50e98acac 44 int i;
Gonzakpo 0:b3e50e98acac 45
Gonzakpo 0:b3e50e98acac 46 /* Paro Modo Burst y desactivo canal AD0.0 (del audio) */
Gonzakpo 0:b3e50e98acac 47 LPC_ADC->ADCR &= ~(((unsigned int)0x1 << 16) | ((unsigned int)0x1 << 0));
Gonzakpo 0:b3e50e98acac 48
Gonzakpo 0:b3e50e98acac 49 /* Configuro el touchpad para que me indique la posicion de X */
Gonzakpo 0:b3e50e98acac 50
Gonzakpo 0:b3e50e98acac 51 LPC_PINCON->PINSEL3 |= ((unsigned int)0x3 << 30); /* P1[31] -> AD0.5 */
Gonzakpo 0:b3e50e98acac 52 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28); /* P1[30] -> GPIO */
Gonzakpo 0:b3e50e98acac 53 LPC_GPIO1->FIODIR |= ((unsigned int)0x1 << 30); /* P1[30] es una salida */
Gonzakpo 0:b3e50e98acac 54
Gonzakpo 0:b3e50e98acac 55 LPC_GPIO2->FIOCLR |= ((unsigned int)0x1 << 1); /* Pongo en 0 el pin P2[1] */
Gonzakpo 0:b3e50e98acac 56 LPC_GPIO2->FIOSET |= ((unsigned int)0x1 << 0); /* Pongo en 1 el pin P2[0] */
Gonzakpo 0:b3e50e98acac 57 LPC_GPIO1->FIOSET |= ((unsigned int)0x1 << 20); /* Pongo en 1 el pin P1[30] */
Gonzakpo 0:b3e50e98acac 58
Gonzakpo 0:b3e50e98acac 59 /* Delay de 1uS aprox. para que se estabilizen las lineas */
Gonzakpo 0:b3e50e98acac 60 for (i = 0; i < 100; i++);
Gonzakpo 0:b3e50e98acac 61
Gonzakpo 0:b3e50e98acac 62 /* Activo canal AD0.5 (coordenada X) */
Gonzakpo 0:b3e50e98acac 63 LPC_ADC->ADCR |= ((unsigned int)0x1 << 5);
Gonzakpo 0:b3e50e98acac 64
Gonzakpo 0:b3e50e98acac 65 /* Comienzo la conversion */
Gonzakpo 0:b3e50e98acac 66 LPC_ADC->ADCR |= ((unsigned int)0x1 << 24);
Gonzakpo 0:b3e50e98acac 67
Gonzakpo 0:b3e50e98acac 68 /* Espero a que se complete la conversion */
Gonzakpo 0:b3e50e98acac 69 while ( (LPC_ADC->ADDR5 & 0x80000000) == 0x0 ) {
Gonzakpo 0:b3e50e98acac 70 }
Gonzakpo 0:b3e50e98acac 71
Gonzakpo 0:b3e50e98acac 72 /* Almaceno la posicion X */
Gonzakpo 0:b3e50e98acac 73 positions.pos_x = ((LPC_ADC->ADDR5 & ((unsigned int)0x7 << 12)) >> 12 );
Gonzakpo 0:b3e50e98acac 74
Gonzakpo 0:b3e50e98acac 75 /* Desactivo canal AD0.5 (coordenada X) */
Gonzakpo 0:b3e50e98acac 76 LPC_ADC->ADCR &= ~((unsigned int)0x1 << 5);
Gonzakpo 0:b3e50e98acac 77
Gonzakpo 0:b3e50e98acac 78 /* Configuro el touchpad para que me indique la posicion de Y */
Gonzakpo 0:b3e50e98acac 79
Gonzakpo 0:b3e50e98acac 80 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30); /* P1[31] -> GPIO */
Gonzakpo 0:b3e50e98acac 81 LPC_PINCON->PINSEL3 |= ((unsigned int)0x3 << 28); /* P1[30] -> AD0.4 */
Gonzakpo 0:b3e50e98acac 82 LPC_GPIO1->FIODIR |= ((unsigned int)0x1 << 31); /* P1[31] es una salida */
Gonzakpo 0:b3e50e98acac 83
Gonzakpo 0:b3e50e98acac 84 LPC_GPIO2->FIOSET |= ((unsigned int)0x1 << 1); /* Pongo en 1 el pin P2[1] */
Gonzakpo 0:b3e50e98acac 85 LPC_GPIO2->FIOCLR |= ((unsigned int)0x1 << 0); /* Pongo en 0 el pin P2[0] */
Gonzakpo 0:b3e50e98acac 86 LPC_GPIO1->FIOSET |= ((unsigned int)0x1 << 31); /* Pongo en 1 el pin P1[31] */
Gonzakpo 0:b3e50e98acac 87
Gonzakpo 0:b3e50e98acac 88 /* Delay de 1uS aprox. para que se estabilizen las lineas */
Gonzakpo 0:b3e50e98acac 89 for (i = 0; i < 100; i++);
Gonzakpo 0:b3e50e98acac 90
Gonzakpo 0:b3e50e98acac 91 /* Activo canal AD0.4 (coordenada Y) */
Gonzakpo 0:b3e50e98acac 92 LPC_ADC->ADCR |= ((unsigned int)0x1 << 4);
Gonzakpo 0:b3e50e98acac 93
Gonzakpo 0:b3e50e98acac 94 /* Comienzo la conversion */
Gonzakpo 0:b3e50e98acac 95 LPC_ADC->ADCR |= ((unsigned int)0x1 << 24);
Gonzakpo 0:b3e50e98acac 96
Gonzakpo 0:b3e50e98acac 97 /* Espero a que se complete la conversion */
Gonzakpo 0:b3e50e98acac 98 while ( (LPC_ADC->ADDR4 & (unsigned int)0x80000000) == (unsigned int)0x0 ) {
Gonzakpo 0:b3e50e98acac 99 }
Gonzakpo 0:b3e50e98acac 100
Gonzakpo 0:b3e50e98acac 101 /* Almaceno la posicion Y */
Gonzakpo 0:b3e50e98acac 102 positions.pos_y = (((LPC_ADC->ADDR4) & ((unsigned int)0xF << 12)) >> 12 );
Gonzakpo 0:b3e50e98acac 103
Gonzakpo 0:b3e50e98acac 104 /* Desactivo canal AD0.4 (coordenada Y) */
Gonzakpo 0:b3e50e98acac 105 LPC_ADC->ADCR &= ~((unsigned int)0x1 << 4);
Gonzakpo 0:b3e50e98acac 106
Gonzakpo 0:b3e50e98acac 107 /* Restauro configuracion del ADC */
Gonzakpo 0:b3e50e98acac 108
Gonzakpo 0:b3e50e98acac 109 /* Activo canal AD0.0 (del audio) */
Gonzakpo 0:b3e50e98acac 110 LPC_ADC->ADCR |= ((unsigned int)0x1 << 0);
Gonzakpo 0:b3e50e98acac 111
Gonzakpo 0:b3e50e98acac 112 /* Activo modo Burst */
Gonzakpo 0:b3e50e98acac 113 LPC_ADC->ADCR |= ((unsigned int)0x1 << 16);
Gonzakpo 0:b3e50e98acac 114
Gonzakpo 0:b3e50e98acac 115
Gonzakpo 0:b3e50e98acac 116 return positions;
Gonzakpo 0:b3e50e98acac 117 }