Autor Tema: Sensor MPR121  (Leído 2081 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mrl1993

  • PIC10
  • *
  • Mensajes: 4
Sensor MPR121
« en: 28 de Enero de 2013, 09:33:44 »
Necesito ayuda con este sensor. Quiero conectarlo con un PIC 16F87xA, pero no logró a entender el protocolo I2C, sobre todo el apartado de registros.
¿Alguien tendría una configuración básica, o alguna idea para poder arrancar?

Gracias

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Sensor MPR121
« Respuesta #1 en: 28 de Enero de 2013, 10:04:51 »
¿en qué idioma quieres hacerlo? ¿tienes por ahí a mano el datasheet del sensor? Para ir entrando en calor  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Sensor MPR121
« Respuesta #2 en: 28 de Enero de 2013, 10:05:17 »
Hola, yo estuve lidiando mucho con este módulo y obtuve pocos resultados, me parecía muy inestable, sobre los registros de configuración fue poca la información clara que encontré, hice esta aplicación que consistía en enviar el PC la tecla que presionaban.

No sé si de algo te sirva.

Saludos.

Código: CSS
  1. #include <12F1822.h>
  2. #use delay(clock=4000000)
  3. #fuses wdt, put, brownout, nomclr, intrc_io
  4. #use rs232(baud=9600, xmit=pin_a4,rcv=pin_a5)   //configuración del puerto
  5. #use i2c(master,sda=pin_a2,scl=pin_a1)
  6.  
  7. #byte   porta = 0x0c
  8. #byte   wpua = 0x20c
  9. #byte   option_reg = 0x95
  10.  
  11. int const dir_escribir = 0b10110100;
  12. int const dir_leer = 0b10110101;       
  13.  
  14. short ban_500ms;
  15.  
  16. int dato_rec;
  17. int teclas;
  18.  
  19. char cadena[4];
  20.  
  21. void confi_mpr121();
  22. void leer_mpr121();
  23.  
  24. ///////////////////////////////////////////////////////////////////////////////
  25. #int_rda                                //vector de interrupcion de la recepcion de datos
  26. void interrupcion_rx()  //por el usart, el dato es pasado al dac
  27. {
  28.         dato_rec = getc();     
  29. }
  30. ///////////////////////////////////////////////////////////////////////////////
  31. #int_timer1
  32. void interrupcion_tmr1()
  33. {
  34.         set_timer1(3039);
  35.         ban_500ms = 1;
  36. }
  37. ///////////////////////////////////////////////////////////////////////////////
  38. #zero_ram   //Borrado de la memoria ram
  39.  
  40. void main()      //Rutina principal
  41. {
  42.         set_tris_a(0b101111);
  43.         enable_interrupts(global);
  44.         enable_interrupts(int_rda);             //habilitación de todas las interrupciones
  45.         enable_interrupts(int_timer1);  //Habilitación de la interrupción tmr1
  46.         setup_timer_1(t1_internal | t1_div_by_8);
  47.         set_timer1(0);
  48.        
  49.         setup_oscillator(osc_4mhz | osc_normal | osc_pll_off);
  50.         setup_wdt(wdt_1s);
  51.        
  52.         setup_comparator(nc_nc);        //se deshabilita comparador
  53.        
  54.         setup_adc(adc_off);
  55.         setup_dac(dac_off);
  56.        
  57.         porta = 0;
  58.        
  59.         delay_ms(500);
  60.         ban_500ms = 0; 
  61.         confi_mpr121();
  62.        
  63.  //////////////////////////////////////
  64.         while(true)
  65.         {
  66.                 restart_wdt();
  67.                
  68.                 if(ban_500ms)   //tiempo de 0.5seg
  69.                 {
  70.                         ban_500ms = 0;
  71.                        
  72.                         leer_mpr121();
  73.                         sprintf(cadena,"%03u",teclas);
  74.                         printf("Teclas = %\s\r",cadena);                       
  75.                 }
  76.         }
  77. }
  78. ///////////////////////////////////////////////////////////////////////////////
  79. ///////////////////////////////////////////////////////////////////////////////
  80. void leer_mpr121()
  81. {
  82.         i2c_start();                    //Start
  83.         i2c_write(dir_escribir);        //direccion
  84.         i2c_write(0x00);                        //registro de control
  85.         i2c_start();                    //Start
  86.         i2c_write(dir_leer);            //Control para lectura
  87.        
  88.         teclas = i2c_read();            //Se lee la 8 primeras teclas
  89.        
  90.         i2c_stop();                     //Stop 
  91. }///////////////////////////////////////////////////////////////////////////////
  92. void confi_mpr121()
  93. {
  94.         i2c_start();                    //Start
  95.         i2c_write(dir_escribir);        //direccion
  96.         i2c_write(0x5e);                        //habilitar electrodos
  97.         i2c_write(0b00111111);          //dato a escribir
  98.         i2c_stop();                     //Stop
  99. }

Desconectado mrl1993

  • PIC10
  • *
  • Mensajes: 4
Re: Sensor MPR121
« Respuesta #3 en: 28 de Enero de 2013, 10:21:35 »
Lo estoy haciendo en C con el Hi-tech y Proteus. Mi idea es tener ocho variables táctiles, enviarlas al PIC, y luego trabajar con ellas, para obtener unas determinadas salidas.

Tengo el data sheet: http://cache.freescale.com/files/sensors/doc/data_sheet/MPR121.pdf?fpsp=1&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation

Pero no me aclara nada como configurar el PIC como master, ni el proceso de comunicación.

Muchas gracias Diego, a ver si puedo sacar algo.