Autor Tema: Comunicacion I2C  (Leído 2622 veces)

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

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Comunicacion I2C
« en: 08 de Febrero de 2011, 08:41:20 »
Hola a todos, estoy intentando configurar 2 pics en modo maestro y esclavo para comunicar por I2C utilizanco CCS C, he visto un monton de post en inet, pero no consigo hacer que me funcione, de momento solo consigo que el maestro mande un dato por I2C (EL 19)y lo veo con el I2C debuger del Proteus,no se porque narices no me muestra nada el esclavo por pantalla.

La idea es que el maestro mande un byte o un dato,¿podria mandar un string?
, y que la reciba el esclavo y la guarde en una variable, parece sencillo pero mas vueltas que le doy y no lo saco.
Mi problema creo que esta en el esclavo ya que si desconecto de los pines en el proteus del esclavo, el maestro manda sin problemas,yo creia que en el esclavo habilitando las interrupciones SSP y la global, usando #use I2c .....
y solamente con 3 lineas de codigo me serviria,del tipo  i2c_start();i2c_write(0xa1); dato = i2c_read(); i2c_stop();
¿¿por cierto en el esclavo tengo que poner la linea i2c_write(0xa1),??Pensaba que esta linea era la direccion del dispositivo a donde se quiere enviar la trama, pero en el esclavo no le veo sentido usarla, ya que solo tengo el maestro y el esclavo.

El Codigo seria el siguiente:
Maestro:

#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#include <string.h>
#include <stdlib.h>
#use delay(clock=2000000) //Osc Interno a 2 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3) //Configuracion I2c
#use fast_io(b)

char adac_msb;
char adac_lsb;

void main()
{

enable_interrupts(INT_SSP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(NO_ANALOGS);


do
               {
                adac_msb=0x19;
                adac_lsb=0x99;
             
                i2c_start();
                i2c_write(0xa1);
                i2c_write(adac_msb);
                i2c_stop();   
                delay_ms(3000);
               
    }
while(1);
}
Escalavo:
#include <16F886.h>
#use delay (clock=2000000)
#use standard_io(c)
#use I2C(SLAVE, Fast,sda=PIN_C4,scl=PIN_C3, ADDRESS=0xa1, FORCE_HW)
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232


int dato;

#int_SSP
SSP_isr()
{
while (1) {
 i2c_start();
 i2c_write(0xa1);
 dato = i2c_read();
 i2c_stop();
     
         }
   puts(dato);
   printf("El dato es:%u",dato);
   putc(dato);
       
}

void main()
{
enable_interrupts(INT_SSP);             
enable_interrupts(GLOBAL);
}

Agradezco cuaquier pista que me podais dar para solucionar este sencillo problema.
Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Comunicacion I2C
« Respuesta #1 en: 08 de Febrero de 2011, 23:00:37 »
Hola compañero

mira este enlace seguro que te puede ayudar.

http://robotypic.blogspot.com/2010/10/comunicacion-via-i2c-entre-dos-pic.html ir

Un saludo.

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Comunicacion I2C
« Respuesta #2 en: 09 de Febrero de 2011, 05:25:37 »
Hola compañero

mira este enlace seguro que te puede ayudar.

http://robotypic.blogspot.com/2010/10/comunicacion-via-i2c-entre-dos-pic.html ir

Un saludo.

Gracias por el enlace, la verdad que es un ejemplo muy sencillo que es facil de enteneder,es lo que buscaba.Gracias .