TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
20 de Octubre de 2014, 05:04:56

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
350119 Mensajes en 39274 Temas por 41014 Usuarios
Último usuario: tony
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  PCF8591P, Ejemplo de lectura y escritura "simultanea" de analogicas.
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: PCF8591P, Ejemplo de lectura y escritura "simultanea" de analogicas.  (Leído 1219 veces)
Diploko
PIC10
*
Desconectado Desconectado

España España

Mensajes: 9


« : 16 de Noviembre de 2010, 17:08:38 »

Hola a todos!
Estos días estuve peleandome un módulo I2C de analógicas, el PCF8591P, y gracias a los ejemplos ya existentes en el foro he podido arreglarmelas pero como me ha dado bastante lata a pesar de ello y también he leido unos cuantos mensajes de dificultades varias con éste módulo por parte de otras personas que también se iniciaban, ahora me decido a mostrar este ejemplo que combina la lectura de los 4 canales y la escritura del canal de salida analógica con una sola función.
El programa varía la frecuencia de un variador (salida analogica del PCF8591) y lee el consumo de éste (con una de las entradas analogicas del PCF8591)

Código
GeSHi (c):
  1. /*
  2. Prueba entradas y salida analógicas PCF8591P.
  3. Probado con un variador controlando la referencia de frecuencia y leyendo el consumo.
  4. Funciona ok.
  5.  
  6. Conexiones PCF8591P:
  7. pines 1,2,3,4,11: N.C.
  8. pines 5,6,7: Address (6)
  9. pines 8,12,13: GND
  10. pines 9,10: SDA y SCL (Bus I2C)
  11. pines 14,16: VDD
  12. pin   15: + Salida analogica
  13.  
  14. */
  15.  
  16. #include <16F877.h>
  17.  
  18. #FUSES HS,NOPROTECT,PUT,BROWNOUT,NOLVP,NOWDT,DEBUG
  19. #USE DELAY(CLOCK=20000000)
  20. #USE I2C(MASTER,SDA=PIN_C4,SCL=PIN_C3,FORCE_HW)
  21. #USE FAST_IO(B)    
  22. #USE rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)  
  23.  
  24. #include <PCF8591P.c>
  25.  
  26. #byte port_a = 5
  27. #byte port_b = 6
  28. #byte port_c = 7
  29. #byte port_d = 8
  30. #byte port_e = 9
  31.  
  32. int rfVariador,ain0,ain1,ain2,ain3;
  33.  
  34. void main()
  35. {  
  36. printf("Inicio 0\n");
  37. //Definición de E/S
  38. set_tris_a(0b00111111);  
  39. set_tris_d(0b11111111);  
  40. set_tris_e(0b00000111);  
  41. set_tris_b(0b00000000);  
  42. set_tris_c(0b00000000);  
  43.  
  44. while(true)
  45. {
  46. // Prueba completa del módulo PCF8591P
  47. rfVariador=ain1; // Lectura del canal 1 (tengo un potenciómetro de 10k para probar rápidamente)
  48. printf("Ref Frecuencia: \%u\n",rfVariador); // Monitorizo por RS232 la referencia de frecuencia del variador
  49. // Lectura y Escritura 4 canales Analogicas I2C.
  50. ain0=rwPCF8591P(0,rfVariador);
  51. printf("Entrada AIN-0 PCF8591P: \%u\n",ain0);
  52. ain1=rwPCF8591P(1,rfVariador);
  53. printf("Entrada AIN-1 PCF8591P: \%u\n",ain1);
  54. ain2=rwPCF8591P(2,rfVariador);
  55. printf("Entrada AIN-2 PCF8591P: \%u\n",ain2);
  56. ain3=rwPCF8591P(3,rfVariador);
  57. printf("Entrada AIN-3 PCF8591P: \%u\n\n",ain3);
  58. // Retardo bucle.
  59. delay_ms(200);
  60. }
  61. }
  62.  
  63.  
  64.  

En el "PCF8591P.c" están las funciones de solo lectura, solo escritura y lectura/escritura:
Código
GeSHi (c):
  1. // Las funciones están pensadas para funcionar como DIRECCION ó Nodo 6 (110)
  2.  
  3.  
  4. // Seleccionamos el módulo PCF8591P del bus I2C y damos un valor a la salida analógica
  5. void writePCF8591P(int dato)
  6. {
  7. i2c_start();   // Inicio comunicación I2C  
  8. i2c_write(0b10011100); // Envío Dirección I2C del PCF8591   (Nodo6)
  9. i2c_write(0b01000000); // Envío Configuración del PCF8591 para Conv. DA  
  10. i2c_write(dato); // Envío el dato de salida analógica
  11. i2c_stop(); // Detengo comunicacion I2C
  12. }
  13.  
  14.  
  15. // Lectura analogica 4 canales del módulo PCF8591P.
  16. int readPCF8591P(int canal)
  17. {
  18. int lectura,control,addressWrite,addressRead;
  19. if(canal<=3)
  20. {
  21. addressWrite=0b10011100;
  22. addressRead=0b10011101;
  23. switch(canal)
  24. {
  25. case 0: control=0b01000001; // Para leer el canal 0 hay que indicar que leemos queremos leer el 1
  26. break;
  27. case 1: control=0b01000010; // Para leer el canal 0 hay que indicar que leemos queremos leer el 2
  28. break;
  29. case 2: control=0b01000011; // Para leer el canal 0 hay que indicar que leemos queremos leer el 3
  30. break;
  31. case 3: control=0b01000000; // Para leer el canal 0 hay que indicar que leemos queremos leer el 0
  32. break;
  33. }
  34. i2c_start();  
  35. i2c_write(addressWrite); // Byte de dirección. Modo Escritura, nodo 6.
  36. i2c_write(control);   // Byte de control.
  37. i2c_write(0);           // Dato salida analógica.
  38. i2c_stop();
  39. i2c_start();
  40. i2c_write(addressRead); // Modo Lectura Nodo 6
  41. lectura=i2c_read(0); // Lectura de datos.
  42. i2c_stop(); // Detengo comunicacion I2C
  43. }
  44. else
  45. lectura=0;
  46. return lectura;
  47. }
  48.  
  49.  
  50. // Funcion que ejecuta la Lectura y Escritura sobre el módulo PCF8591P
  51. int rwPCF8591P(int canal, int write)
  52. {
  53. int lectura,control,addressWrite,addressRead;
  54. if(canal<=3)
  55. {
  56. addressWrite=0b10011100;
  57. addressRead=0b10011101;
  58. switch(canal)
  59. {
  60. case 0: control=0b01000001; // Para leer el canal 0 hay que indicar que leemos queremos leer el 1
  61. break;
  62. case 1: control=0b01000010; // Para leer el canal 0 hay que indicar que leemos queremos leer el 2
  63. break;
  64. case 2: control=0b01000011; // Para leer el canal 0 hay que indicar que leemos queremos leer el 3
  65. break;
  66. case 3: control=0b01000000; // Para leer el canal 0 hay que indicar que leemos queremos leer el 0
  67. break;
  68. }
  69. i2c_start();  
  70. i2c_write(addressWrite); // Byte de dirección. Modo Escritura, nodo 6.
  71. i2c_write(control);   // Byte de control.
  72. i2c_write(write); // Envío el dato de salida analógica
  73. i2c_stop();
  74. i2c_start();
  75. i2c_write(addressRead); // Modo Lectura Nodo 6
  76. lectura=i2c_read(0); // Lectura de datos.
  77. i2c_stop(); // Detengo comunicacion I2C
  78. }
  79. else
  80. lectura=0;
  81. return lectura;
  82.  
  83. }
  84.  
  85.  


Se podría optimizar la función de lectura-escritura aportando como variable para el canal un array y después usar un for recorriendo así los canales...

Lo único que me parece extraño es que para leer el canal 0 haya que indicarle canal 1 y así sucesivamente...  Confused, alguién sabe porqué?.

Pues nada más, espero que sea interesante para alguien  wink.

Salu2!
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.18 segundos con 23 consultas.