Autor Tema: Liberia para PCA9538 (I2C I/O Expander With Interrupt Output)  (Leído 1358 veces)

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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Liberia para PCA9538 (I2C I/O Expander With Interrupt Output)
« en: 01 de Febrero de 2011, 13:12:33 »
Bueno, cacharreando con el mbed necesite trabajar con un expansor de puertos y el que tenia a mano era el PCA9538. Tras crear una class y ver que funciona de maravilla y que es muy cómodo, migre el código para CCS que es el compilador más utilizado  en PICs ;-)

Algunas características del dispositivo:

  • Comunicación I2C de hasta 400k
  • Pin para generar interrupción en microcontrolador al ocurrir un cambio en sus pines configurados como entrada
  • Posibilidad de configurar los pines como entrada o salida
  • Pin de reset
  • Trabaja desde 2.5V a 5V
  • Pines tolerables a 5V
  • ect.


Por aquí datasheet

Librería:
Código: C
  1. /*
  2.    \file PCA9538.h
  3.    \version: 1.0
  4.    
  5.    \brief Este fichero contiene funciones para control de PCA9538 creando pin
  6.           digitales de salida o entrada, o control por registro (8-bits).
  7.    
  8.    \web www.micros-designs.com.ar
  9.    \date 01/02/11
  10.    
  11.  *- Version Log --------------------------------------------------------------*
  12.  *   Fecha       Autor                Comentarios                             *
  13.  *----------------------------------------------------------------------------*
  14.  * 01/02/11      Suky        Original                                         *
  15.  *----------------------------------------------------------------------------*/
  16. ///////////////////////////////////////////////////////////////////////////
  17. ////                                                                   ////
  18. ////                                                                   ////
  19. ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
  20. //// Este código puede ser usado, modificado y distribuido libremente  ////
  21. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  22. ////                                                                   ////
  23. ////                                                                   ////
  24. ///////////////////////////////////////////////////////////////////////////
  25. enum PinName{
  26.     exp_p0=0,
  27.     exp_p1,
  28.     exp_p2,
  29.     exp_p3,
  30.     exp_p4,
  31.     exp_p5,
  32.     exp_p6,
  33.     exp_p7,    
  34. };
  35. #define DIGITAL_IN   1
  36. #define DIGITAL_OUT  0
  37. char _Address;
  38.  
  39. void vInitPCA9538(char Address){
  40.    _Address=Address<<1;  
  41. }
  42.  
  43. void vSetTrisPCA9538(char Dir){
  44.  
  45.     i2c_start();
  46.     i2c_write(_Address & 0xFE);
  47.     i2c_write(0x03);
  48.     i2c_write(Dir);
  49.     i2c_stop();
  50. }
  51.  
  52. void vWritePortPCA9538(char Value){
  53.  
  54.     i2c_start();
  55.     i2c_write(_Address & 0xFE);
  56.     i2c_write(0x01);
  57.     i2c_write(Value);
  58.     i2c_stop();
  59. }
  60.  
  61. char cReadPorPCA9538(void){
  62.     char Temp;
  63.  
  64.     i2c_start();
  65.     i2c_write(_Address & 0xFE);
  66.     i2c_write(0x00);
  67.     i2c_start();
  68.     i2c_write(_Address | 0x01);
  69.     Temp=i2c_read(0);
  70.     i2c_stop();
  71.    
  72.     return(Temp);
  73. }
  74.  
  75.  
  76. void vSetTrisPinPCA9538(PinName Pin,short Dir){
  77.     char Temp;
  78.    
  79.     i2c_start();
  80.     i2c_write(_Address & 0xFE);
  81.     i2c_write(0x03);
  82.     i2c_start();
  83.     i2c_write(_Address | 0x01);
  84.     Temp=i2c_read(0);
  85.     i2c_stop();
  86.    
  87.     i2c_start();
  88.     i2c_write(_Address & 0xFE);
  89.     i2c_write(0x03);
  90.     if(Dir==1){
  91.       i2c_write((0x01<<Pin)|Temp);
  92.     }else{
  93.       i2c_write((~(0x01<<Pin))&Temp);
  94.     }
  95.     i2c_stop();
  96.  
  97. }
  98.  
  99. void vSetPinOutPCA9538(PinName Pin,short Value){
  100.     char Temp;
  101.    
  102.     i2c_start();
  103.     i2c_write(_Address & 0xFE);
  104.     i2c_write(0x01);
  105.     i2c_start();
  106.     i2c_write(_Address | 0x01);
  107.     Temp=i2c_read(0);
  108.     i2c_stop();
  109.    
  110.     i2c_start();
  111.     i2c_write(_Address & 0xFE);
  112.     i2c_write(0x01);
  113.     if(Value==0){
  114.         i2c_write((~(0x01<<Pin))&Temp);
  115.     }else{
  116.         i2c_write((0x01<<Pin)|Temp);
  117.     }    
  118.     i2c_stop();
  119. }
  120.  
  121. short bTestPinInPCA9538(PinName Pin){
  122.     char Temp;
  123.    
  124.     i2c_start();
  125.     i2c_write(_Address & 0xFE);
  126.     i2c_write(0x00);
  127.     i2c_start();
  128.     i2c_write(_Address | 0x01);
  129.     Temp=i2c_read(0);
  130.     i2c_stop();
  131.    
  132.     return((Temp>>Pin)&0x01);
  133. }


Ejemplos:
Código: C
  1. #include <18F4620.h>
  2. #device adc=8
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
  4. #use delay(clock=20000000)
  5. #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
  6.  
  7. #include "PCA9538.c"
  8.  
  9. void main(){
  10.    
  11.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  12.    setup_adc(ADC_OFF);
  13.    setup_psp(PSP_DISABLED);
  14.    setup_wdt(WDT_OFF);
  15.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  16.    setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
  17.    setup_timer_2(T2_DISABLED,0,1);
  18.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  19.    setup_comparator(NC_NC_NC_NC);
  20.    setup_vref(FALSE);
  21.    
  22.    vInitPCA9538(0x70);
  23.    vSetTrisPinPCA9538(exp_p4,DIGITAL_OUT);
  24.    vSetTrisPinPCA9538(exp_p7,DIGITAL_OUT);
  25.    vSetTrisPinPCA9538(exp_p0,DIGITAL_IN);
  26.    
  27.    
  28.    for(;;){
  29.       if(bTestPinInPCA9538(exp_p0)==0){
  30.          vSetPinOutPCA9538(exp_p7,0);
  31.          delay_ms(300);
  32.          vSetPinOutPCA9538(exp_p7,1);
  33.          delay_ms(300);
  34.       }else{
  35.          vSetPinOutPCA9538(exp_p4,0);
  36.          delay_ms(300);
  37.          vSetPinOutPCA9538(exp_p4,1);
  38.          delay_ms(300);
  39.       }
  40.    }  
  41. }


Código: C
  1. #include <18F4620.h>
  2. #device adc=8
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
  4. #use delay(clock=20000000)
  5. #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
  6.  
  7. #include "PCA9538.c"
  8.  
  9. void main(){
  10.    
  11.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  12.    setup_adc(ADC_OFF);
  13.    setup_psp(PSP_DISABLED);
  14.    setup_wdt(WDT_OFF);
  15.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  16.    setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
  17.    setup_timer_2(T2_DISABLED,0,1);
  18.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  19.    setup_comparator(NC_NC_NC_NC);
  20.    setup_vref(FALSE);
  21.    
  22.    vInitPCA9538(0x70);
  23.    vSetTrisPCA9538(0x0F);  
  24.    for(;;){
  25.       vWritePortPCA9538(cReadPorPCA9538()<<4);
  26.       delay_ms(300);
  27.    }  
  28. }



Saludos!
« Última modificación: 02 de Febrero de 2011, 18:35:48 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Liberia para PCA9538 (I2C I/O Expander With Interrupt Output)
« Respuesta #1 en: 01 de Febrero de 2011, 22:23:31 »
Hola Suky,

mire tu codigo, cual es la razon de  hacer una and con la dirección y 0xFE, y la or  de la funcion textpin?

Un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Liberia para PCA9538 (I2C I/O Expander With Interrupt Output)
« Respuesta #2 en: 01 de Febrero de 2011, 23:43:26 »
Hola Suky,

mire tu codigo, cual es la razon de  hacer una and con la dirección y 0xFE, y la or  de la funcion textpin?

Un saludo.

Sin importar la dirección i2c del esclavo que se fije se setea el bit R/W.
No contesto mensajes privados, las consultas en el foro


 

anything