Comunicacion I2C

men y que opinas del pic18f97j60 que tiene un modulo ethernet , lo malo es que estuve leyendo y el ccs no tiene librerias para trabajar con el modulo ethernet
 
Que tal el_chelo, oye men probe la transmision del esclavo al maestro como dijistes y nada , no me da..puedes colgar el programa completo a ver y disculpa la molestia
 
Personalmente no conozco el pic18f97j60, pero si ya trae el puerto Ethernet integrado mucho mejor, será cuestion de buscar un buen rato en la red alguna librería ó leer detalladamente el datasheet y desarrollar las funciones necesarias.

Respecto al programa de comunicación SPI no lo pondré todo porque ya lo llevo un poco extenso, pero voy a poner las funciones que nos interesan.


Función de leer en el maestro

Código:
void Leer_SPI(char *Valor, int n, int f)
{
   int i;   
   for(i = 0;i < n;i++)
   {
      spi_write(f);//Envío un numero que el esclavo interpreta como una instrucción donde le digo que arreglo quiero leer
      delay_ms(5);//Sin estos retardos no me funciona el programa
      spi_write(i);//Envío un numero que el esclavo interpreta como la posición del arreglo que quiero leer
      delay_ms(5);
      Valor[i] = spi_read(0);//Leo
      delay_ms(5);
   }     
}


Fucion en el esclavo

Código:
void Leer()
{
   short int Condicion;
   Condicion = true;
   do
   {
      while(spi_data_is_in())
      {        
         Rx = spi_read();//Leo lo enviado por el maestro
         if(Rx == 25)//el maestro envia 25 cuando quiero terminar la comunicacion
         {
            Cont = 20;
            Condicion = false;
         }
         Switch(Cont)//En el contador llevo la secuencia de lectura, primero leo Instruccion, segundo leo posicion en el vector
         {                  //Si el maestro manda un dato para meter al arreglo entonces abria un tercer paso que es recibir el dato.
            case 0:{//Si Cont es 0 es porque se leyó la instruccion
                     Instr = Rx;
                     Cont++;
                   }break;
            case 1:{//Si Cont es 1 es porque se leyó la posición del arreglo
                     Address = Rx;
                     if(Instr == 10)//Si la instruccion es 10 es porque el maestro quiere leer el arreglo ValT
                     {
                        Rx = spi_read(ValT[Address]);
                        Cont = 0;
                     }
                     else
                     {
                        if(Instr == 11)//Si la instruccion es 11 es porque el maestro quiere leer el arreglo ValL
                        {
                           Rx = spi_read(ValL[Address]);
                           Cont = 0;
                        }
                        if(Instr == 12)//Si la instrucción es 12 es porque el maestro quiere enviar un dato
                        {
                           Cont++;
                        }
                     }
                   }break;
             case 2:{    //Si el maestro envía dato, se recibe y se guarda
                        Dato = Rx;                          
                        Val2[Address] = Dato;         
                        Cont = 0;
                    }break;
         } 
        }         
   }while(Condicion);
}


Trate de comentar un poco el código para darme a entender que quería hacer ya que la función en el esclavo puede ser un poco confusa.
 
Men , con respecto al puerto ethernet, estuve leyendo un buen rato y parece que ccs no tiene librerias para el manejo de este puerto , de todas maneras si consigues alguna por alli de antemano te agradezco,..., por los momentos voy a seguir estudiando l que me dejastes de spi
..nos vemos suerte y gracias
 
men, mejor para no molestarte mas con esto de las comunicaciones seriales, te pido el favor que me envie tus apuntes o la base que te permitio programar estas comunicaciones en ccs,.., lo que tengas de spi e i2c.,.,no te pido codigos solo apuntes donde expliquen el funcionamientos de las instrucciones por ejemplo....este es mi correo eldegreg@hotmail ..te lo agradezco estas comunicaciones me tienen loco.., las entiendo pero no las he podido programar en c
 
que tal. he corrido el jemplo de chelo para pic masestro y pic esclavo, pero no veo que aparezca el pin cs, y al simular en proteus aparece un error logico, quiza debido a las resistencias pull up de los pines sdo sdi clk. he usado un key phone de proteus en el puerto b. y el lcd en el puerto b.

muchas gracias
 
Supongo que cuando dice el pin cs se refiere al de selección de esclavo, no hay selección de esclavo porque solo se está haciendo entre dos pics y como puede ver en el codigo del esclavo está este párametro "spi_ss_disabled" que quiere decir que no se va a usar la selección de esclavo, efectivamente el teclado se usa en el puerto b del maestro y el LCD en el puerto b del esclavo, resistencias de pull up no entiendo a que se refiere, las resistencias de pull up se usan en I2C, de todas maneras con seguridad funciona porque yo lo monté.
 
gracias por responder chelo

te adjunto una imagen de la conexion en proteus, en el codigo solo se utilizan 4 pines, los ultimos del puerto b, com esta en tu codigo para el manejo del teclado, pero no creo que ese sea el problema, en el codgio veo que has configurado los pines de entrada y de salida para sdo, sdi, etc. me gustaria si pudieras postear una imagen en proteus.

ritos
 

Adjuntos

  • doc1_593.doc
    91 KB · Visitas: 134
que tal el chelo gracias a dios y a tu ayuda , hice algo parecido a lo tuyo pero conecte el teclado en el esclavo y la lcd esta en el maestro,..,pero resulta que debo presionar la tecla varias veces para que esta pueda mostrarse en la lcd ....tienes alguna idea de que pueda ser..¿tal vez te ocurrio lo mismo?
 
Bueno, andaba un poco perdido, primero para Ritos, no tengo diagrama en proteus pero tratare de describir la conexion del teclado en el maestro (yo use teclado 4x4) en los 4 primeros pines RB0 RB1 RB2 RB3 poner resistencias 10k a tierra igualmente conectar las filas del teclado, en los 4 pines restantes conectar resistencias de 1k en serie con las columnas del teclado.


Para Gregory, si, si me ha pasado, eso es cuestion de jugar con los retardos aumentelos un poco.
 
el_chelo sera que me puedes abrir la mente con los retardos, que me sugeristes con respecto al problema que te comente de que la tecla debe ser pulsada varias veces he intentado de varias maneras pero nada que ver...gracias
 
hola yo tambien necesito utilizar la comunicacion i2c para pretendo conectar un pic con otro pic y me ayudaria si me das algun ejemplo en mikro c

yo lo he echo en asm no es muy dificil y la ventaja que presenta con respecto a acerlo en basic es que consumem menos memoria y tiempo de ejecucion. en los microcontroladores PIC16F87x es muy simple, solo seteas uno como master y otro como slave (creo que son los ultimos bits del registro sspcon) y despues manejandolo por las interrupciones podes hacer otras cosas con el micro mientras recive o transmite informacion. Otra ventaja que implementan estos micros es que soportan direcciones de 10 bit's pudiendo conectar en teoria hasta 1024 micros en el mismo bus.
Si necesitas ayuda avisame que yo en este protocolo tengo algo de experiencia, es mas, estoy armando un microbot de sumo e internamente controla todo por el bus I2C con los maravillosos integrados de PHILIPS PCF8574 y PCF8591.
 
una dudilla compañeros
estaba empezando a hacer comunicacion spi con ccs y me ha parecido interezante lo que aqui se postea ya que no he logrado una comunicacion aceptable entre master y slave, mi problema es este, el master no puede leer si no envia antes algo???

y que diferencia de lo que aqui se postea tiene utilizar las funciones de la siguiente manera:
MASTER:
recive=spi_read(send);
SLAVE:
from_send = spi_read(to_recive);

segun la teoria al utilizar esta funcion en el master envia el valor send y lee 1 dato que guarda en recive. el problema es que si envia send al slave pero lee 2 valores send y recive...

el esclavo no tiene problemas si recive y si envia la info y es correcta.

cualquier alluda sirve, saludos y gracias desde ya.
 
bueno pues... hasta que alguien me contradiga:)

"If this device is the master then either do a SPI_WRITE(data) followed by a SPI_READ() or do a SPI_READ(data). These both do the same thing and will generate a clock. If there is no data to send just do a SPI_READ(0) to get the clock"
al parecer ahun que ccs diga que se puede usar ambiguamente las instrucciones resultase que no!!!

si se utiliza un read y un write en el master en el slave se tiene que usilizar un read y un write, no se pueden pasar datos correctos si se envia en el read un argumento de regreso al master o al slave.

y si se utiliza un read con argumento de retorno en el master se debe tener un read con argumento de retorno en el slave.

todo esto es referente a la comunicacion BIDIRECCIONAL y no aplica si se maneja comunicacion solo en un sentido en donde si se pueden convinar instrucciones.

a si y no ocupa delay!!! ni para leer ni para escribir.

opcion 1:
master & slave:
data_to_recive = spi_read(data_to_send);

opcion 2:
master:
spi_write(data_to_slave);
data_from_slave=spi_read(0);

slave:
data_from_master=spi_read(0);
spi_write(data_to_master);


estoy en lo cierto? :unsure:
 
Hola a todos!. Quería ver si alguien me podía ayudar, estoy tratando de establecer una comunicación por I2C entre un PIC 18F4520 y un oscilador LTC6904. Estoy programando en CCS, el problema que tengo es que se me clava el oscilador en 1KHz, o sea no estan llegando bien los datos, o no esta bien establecida la comunicación. Si alguien puede ayudarme se lo agradezco, luego voy a subir el código de lo que hice hasta ahora. Gracias y saludos a todos!
 
La verdad es que cuando programo en C me olvido de esas cosas que por ahi contemplaba en asm, puede ser que haya algún FUSE que no tuve en cuenta o alguna definición que no puse q haga q no se establezca bien la comunicación?. Gracias!.
 
Atrás
Arriba