Autor Tema: :: Control :: PIC :: BUS I2C ::  (Leído 13863 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: Control :: PIC :: BUS I2C ::
« en: 07 de Junio de 2012, 11:30:31 »
Hola a Todos

Debido a que no logro dar con una solucion, aplicando mi ingenio
he determinado poner a prueba el ingenio de los otros foreros,
asi pues les reto a probar ...

Expongo el tema:
----------------------


Desde hace un mes llevo investigando el protocolo i2c orientado a la comunicación,
en este protocolo pueden funcionar los dispositivos colgados del bus de 3 modos:

- maestro
- esclavo
- multimaestro


Este protocolo lleva unas resistencias pull-up que dependiendo de su valor
 se varia la capacidad y la longitud del bus, tambien se disminuye la velocidad.

Pues bien, en el entorno de programación PIC C o ccs c hay alguna libreria implemetada
para el uso del protocolo i2c:

- i2c_poll()
- i2c_write(byte)
- i2c_read()
- i2c_start()
- i2c_stop()

principalmnete para el control de dispositivos del bus se una o dos o tres funciones:

- escribir el esclavo desde el maestro con la funcion escribe
- leer el esclavo desde el maestro con la funcion leer
- una funcion que detecta si tal dispositivo con xxx direcion esta en el bus.

Pero ahora llega la duda:

Es posible mediante el bus i2c controlar dos dispositivos por ejemplo dos pic18f250?

- hacer que unas vez funcione uno como esclavo y otro maestro y despues cambiar?
- hasta que nivel es posible controlar al otros dispositivo.


¿Es posible este caso: CASO  1 ?
pic 1 y pic 2

si pic1 es master encience los led que yo te diga del pic 2, tomamos un cafe con hielo...,

despues se puede hacer que el pic 2 le encieda led al pic 1.


maestro esclavo : es uno escribe(maestro) y otro ejecuta(esclavo)


otro caso se podra hacer esto a la vez

===========================

mietras el pic 2 enciende los led del pic 1 en puerto A
 el pic 1 enciende los led del puerto b del pic 2

¿esto seria "full duples"?

seria necesario implementar otro canal por software para esto?


Son un monto de preguntas,
pero prefiero compartir mis inquitudes y asi aprendemos todos.


Un Saludo para todos, en especial los del Polo Norte.


PAGINAS CONSULTADAS:
======================


http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/general-introduction/extended-addressing-10-bit.html

http://www.ccsinfo.com/downloads/ccs_c_manual.pdf

http://ww1.microchip.com/downloads/en/appnotes/00736a.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/80131e.pdf

http://www.classic.nxp.com/acrobat_download2/literature/9398/39340011.pdf


HILOS LEIDOS:
=======================



Master and slave I2C implemented on one PIC
http://www.ccsinfo.com/forum/viewtopic.php?t=33950

I2C slave in EX_SLAVE.C
http://www.ccsinfo.com/forum/viewtopic.php?t=28744

General CCS C Discussion
http://www.ccsinfo.com/forum/viewtopic.php?t=26477&start=3


18f4550 maestro vs 24c256 y 18f2550 esclavo
http://www.micropic.es/mpforo/index.php?topic=224.0

librería de ccs para i2c ¿donde hay un tutorial o alguna info?
http://www.todopic.com.ar/foros/index.php?topic=17818.0

Duda I2C en dos pic
http://www.todopic.com.ar/foros/index.php?topic=38265.0

Comunicacion I2C multi-slave
http://www.todopic.com.ar/foros/index.php?topic=12822.0

Dudas I2C Multiesclavo con 18F458 en CCS
http://www.todopic.com.ar/foros/index.php?topic=35853.0

Problemas con i2c 16f877a (master) a 16f88 (slave)
http://www.todopic.com.ar/foros/index.php?topic=36114.0

Problema con I2C [ 18f452 (Ma) <---> 18f2550 (Sl) ]
http://www.todopic.com.ar/foros/index.php?topic=16246.0

duda con funciones de i2c en CCS
http://www.todopic.com.ar/foros/index.php?topic=27517.20

De Nuevo I2C para leer al maestro
http://www.todopic.com.ar/foros/index.php?topic=28458.0

Dos velocidades distintas en un mismo bus i2c por hardware.
http://www.todopic.com.ar/foros/index.php?topic=22021.20

Ejemplo comunicación serie I2C entre un PIC y la memoria EEPROM 24LC256A
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/comunicacion-serie-i2c-entre-pic-y-eeprom-24lc256a.html

Librería de control del LCD03 en modo I2C para CCS
http://wiki.webdearde.com/index.php/Librer%C3%ADa_de_control_del_LCD03_en_modo_I2C_para_CCS

I2C - Primeros pasos
http://www.foroselectronica.es/f66/i2c-primeros-pasos-2239.html

Programacion CCS y I2C
http://www.forosdeelectronica.com/f26/programacion-ccs-i2c-39967





« Última modificación: 13 de Junio de 2012, 18:02:45 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #1 en: 07 de Junio de 2012, 12:57:05 »
Pero ahora llega la duda:

Es posible mediante el bus i2c controlar dos dispositivos por ejemplo dos pic18f250?

- hacer que unas vez funcione uno como esclavo y otro maestro y despues cambiar?
- hasta que nivel es posible controlar al otros dispositivo.

  Para ello habría que mandarle información al pic (Via I2C) y según esa información reconfigurar el dispositivo como maestro o esclavo... Tal vez evaluando lo que llega mediante un IF


¿Es posible este caso: CASO  1 ?
pic 1 y pic 2

si pic1 es master encience los led que yo te diga del pic 2, tomamos un cafe con hielo...,

despues se puede hacer que el pic 2 le encieda led al pic 1.


maestro esclavo : es uno escribe(maestro) y otro ejecuta(esclavo)

  Cualquiera de los pic puede enviar y recibir datos. Lo que se debe tener en cuenta es que toda transmisión comienza desde el maestro. Es el maestro quien manda una dirección al bus para saber si responde algún dispositivo, luego se puede enviar datos al dispositivo o pedir que el dispositivo le envíe datos al maestro.
  Por lo tanto sí se puede ese punto.


otro caso se podra hacer esto a la vez
===========================

mietras el pic 2 enciende los led del pic 1 en puerto A
 el pic 1 enciende los led del puerto b del pic 2

¿esto seria "full duples"?
seria necesario implementar otro canal por software para esto?


Son un monto de preguntas,
pero prefiero compartir mis inquitudes y asi aprendemos todos.


Un Saludo para todos, en especial los del Polo Norte.

  Con una sola vía de I2C no hay full dulex ya que hay sólo un pin de datos. Siempre viajan primero en un sentido y luego en otro
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #2 en: 07 de Junio de 2012, 14:36:13 »
Hol@

 de las respuestas obtenidas me surgen otras custiones...

Citar

Citar

otro caso se podra hacer esto a la vez
===========================


mietras el pic 2 enciende los led del pic 1 en puerto A
 el pic 1 enciende los led del puerto b del pic 2

¿esto seria "full duples"?
seria necesario implementar otro canal por software para esto?




  Con una sola vía de I2C no hay full dulex ya que hay sólo un pin de datos. Siempre viajan primero en un sentido y luego en otro



Entonces seria posible, trabajar full duplex si el pic tuviera dos canales de i2c?

en caso de un pic "normal solo tiene uno", por lo tanto se podrían implementar por software
de forma que por uno funcionase como master y por el otro como esclavo.

¿seria posible Teoricamente?

¿En la practica conun clock de 20Mhz, seria cuasi tiempo real..?

¿seria como tener 2 CLK y 2 SDA?

de todas formas ...si puede haber mas de un master en el bus y mas de un esclavo

puede a la vez tomar el canal más de un master dirigiendose a distintos esclavos?



un saludo


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #3 en: 07 de Junio de 2012, 16:59:16 »
Hol@

 de las respuestas obtenidas me surgen otras custiones...




Entonces seria posible, trabajar full duplex si el pic tuviera dos canales de i2c?

en caso de un pic "normal solo tiene uno", por lo tanto se podrían implementar por software
de forma que por uno funcionase como master y por el otro como esclavo.

¿seria posible Teoricamente?

¿En la practica conun clock de 20Mhz, seria cuasi tiempo real..?

¿seria como tener 2 CLK y 2 SDA?

de todas formas ...si puede haber mas de un master en el bus y mas de un esclavo

puede a la vez tomar el canal más de un master dirigiendose a distintos esclavos?



un saludo



  En un mismo pic podés tranquilamente utilizar el I2C por Hard e implementar otro por software.

  No entiendo a que te refieres con un pic funcionando a 20MHz sería casi en tiempo real.

  Ten en cuenta que la velocidad del bus no es la del PIC. Tendrías que leer bien las especificaciones para saber cuales son las velocidades permitidas. Creo que eran hasta 100KHz como standard, hasta 400KHz como Fast y hasta 3.4MHz como HighSpeed.

  Puede haber múltiples master y múltiples eslaves.

  No, el canal siempre lo tiene un maestro determinado. Ten en cuenta que si dos lo toman a la vez, se generarán conflictos de datos. El bus tiene sus propias especificaciones al respecto y detecta un "bus collision" cuando dos master quieren escribir a la vez.

  Una vez que un dispositivo tiene el control, otro no lo puede tomar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #4 en: 07 de Junio de 2012, 17:19:10 »
Hola ... :-/


Vale solo un master tiene el testigo, como el token ring,
quien tiene el testigo puede hablar y el resto o escuchar hasta que el master entregue el testigo.



empezare con algo sencillo...

Tenemos 2  PIC: PIC18F2550
===========================

M1: mastro
S1: esclavo

Ambos pic en sus pines pin_b3 tienen un led.

----------------------------------------


RETO numero 1:
========================


desde M1 encender el led de S1 meadiante i2c.




Hardware:
=====================


2 pic18f2550
2 Cristales de 20MHZ
4 Condensadores de 15pF
1 condesador 104
1 resistencia 2k2
1 resisetncia de 220
1 diodo PH4148
2 LM7805



-----------------

una vez montado en fisico pasamos por el simulador protesus, isis y montamos.

Pasamos por CCS para codificar:


Creamos 2 proyectos:
=======================


1.- pic_master: para configurar como master

2.- pic_esclavo: para configurar como esclavo



necesitaremos una libreria para i2c,
 con las funciones de escribir esclavo y leer esclavo.


#define S1 0xA2 //define la direcion del esclavo

void rw_bus_i2c(int8 S1, int dato){

   i2c_start();            //condiccion de inicio
   i2c_write(S1+1);   // direccion del esclavo a escribir o comandar como escritura
   i2c_write(0);
    ...
    ..
   i2c_stop();           //condicion de stop


}




int8  r_bus_i2c(int8 S1){
   int8 dato;
   i2c_start();         //condicion de inicio
   i2c_write(s1);     //direcion del esclavo moco lectura
   i2c_write(0);
   i2c_start();
   i2c_write(S1+1);
   dato= i2c_read();
   ....

   i2c_stop();
   return dato;
}





ALguien conoce un libreria para hacer esto?

¿como le envio el dato para que enciencda el led?

encender led es OUTPUT_HIGH(PIN_B3);

 :-/

+ ¿como le envio eso al otro pic?.

+ ¿se le puede implementar una función para pasarle comandos?


¿..Alguien conoce un librería para hacer esto?




Un Saludo

« Última modificación: 08 de Junio de 2012, 09:07:16 por pajaro »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #5 en: 07 de Junio de 2012, 17:46:27 »
Hola Angel y Pájaro:

               Encontré este appnote AN736 An I2CTM Network Protocol for Environmental Monitoring que puede aportar algo de luz.
                   Saludos.
                       Jukinch

"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #6 en: 07 de Junio de 2012, 20:58:45 »
Hola  :-/

Jukinch gracias por el aporte del enlace

En el caso de enviar un datos desde el master y sacarlo por la consola virtual del esclavo
parecio facil, asi que le incremento un esclavo.
Y la cosa queda asi : 1 master y 2 esclavo.

y repetimos la jugada : ...

sobre proteus implemente un circuito de 3 pic18f2550;

con el PIC C de ccs codifico en  C los *.HEX.

En proteus tenemos 1 master y 2 esclavos,

el problema es que los esclavos leen el dato del i2c y lo muestran aunque no sea para ellos.
¿como hago para que el esclavo detecte si es para el ...?
se que cada esclavo tiene una direcion unica, hay alguna forma de que detecte la dirección.

Ejemplo:


M1: master 1
S1: esclavo 1 direcion 0xA1
S2: esclavo 2 direccion 0XA2


el programa es simple le envio un 1 y lo muesta por la terminal virual

¿como se haria para que el esclavo distinguiera si es para el o no?

libreria de funciones
Citar


//direcciones de dispositivos

#Define M1 0xA1 //Master
#Define S1 0x01 //Esclavo 1
#Define S2 0x02 //Esclavo 2
#Define S3 0x03 //Esclavo 3
#Define S4 0x04 //Esclavo 4
#Define S5 0x05 //Esclavo 5

// --- escribir en dispositivo ---

void escribir_i2c(BYTE direccion, int dato)
{
   i2c_start();
   i2c_write(direccion);
   i2c_write(dato);
   i2c_stop();
   delay_us(50);
}


// --- leer del dispositivo ---
int leer_i2c(BYTE direccion, int opcion)
{
   int dato = 0;
   i2c_start();
   i2c_write(direccion); //direccion device
   i2c_write(opcion);
  
   i2c_start();
   i2c_write(direccion+1);
   dato = i2c_read();
   i2c_stop();
  
   return(dato);
}



por otra parte lo del esclavo


Citar

#include "pic_master_net.h"



void main()
{  


   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
  
   printf("\r\n PIC MASTER:  ");
   printf("\r\n     enviando....  ");
  
    OUTPUT_HIGH(PIN_B3);  
   escribir_i2c(S1,1);
  
  

}




para los esclavo el fichero es el mismo pero cambi la direccion del esclavo


Citar

#include "pic_esclavo_net.h"


void main()
{
int8 dato;
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   printf("\n\r PIC ESCLAVO 1: ");
   printf("\n\r      recibiendo.... ");
  
   OUTPUT_HIGH(PIN_B3);
  

         dato=i2c_read();
         printf("\r\n Dato: %d",dato);                  //Muestra dato recibido por pantalla



}




Algun compañero darme alguna pista o consejo
o decirme como el pudo solucionar el problema....

Un saludo..
« Última modificación: 08 de Junio de 2012, 07:01:55 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #7 en: 08 de Junio de 2012, 07:00:08 »

Hola

Leyendo un el manual de CCS de julio del 2011 disponible en este enlace.

http://www.ccsinfo.com/downloads/ccs_c_manual.pdf

Manual de referencia del CCS (Julio 2011)

Parece que la recepcion en el esclavo la hace mediante una interrupcion
esta se produce cuando ocurre un evento en el bus.

En la pagina 115(129)

en la pagina 183(197)

muestra esto:




#INT_SSP
   void i2c_isr() {
        state = i2c_isr_state();                     
        if((state== 0 ) || (state== 0x80))
        i2c_read();
        if(state >= 0x80)
        i2c_write(send_buffer[state - 0x80]);
        else if(state > 0)
        rcv_buffer[state - 1] = i2c_read();
}




i2c_isr_state();   

Syntax:
state = i2c_isr_state();
state = i2c_isr_state(stream);

Parameters: None

Returns:
state is an 8 bit int
0 - Address match received with R/W bit clear, perform i2c_read( ) to read the I2C address.
1-0x7F - Master has written data; i2c_read() will immediately return the data
0x80 - Address match received with R/W bit set; perform i2c_read( ) to read the I2C address, and use i2c_write( ) to pre-load the transmit buffer for the next transaction (next I2C read performed by master will read this byte).
0x81-0xFF - Transmission completed and acknowledged; respond with i2c_write() to pre-load the transmit buffer for the next transation (the next I2C read performed by master will read this byte).

Function:
Returns the state of I2C communications in I2C slave mode after an SSP interrupt. The return value increments with each byte received or sent. If 0x00 or 0x80 is returned, an i2C_read( ) needs to be performed to read the I2C address that was sent (it will match the address configured by #USE I2C so this value can be ignored)

Availability:
Devices with i2c hardware Requires: #USE I2C


Voy a modificar la funcion
del esclavo para que lea al master por interrupción.

.....



Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #8 en: 08 de Junio de 2012, 10:30:58 »
Hola

Situacion actual:

M1 maestro envia a S1 un dato
S1 configurado para que mediante la interuppcion del i2c evalue si el dato es para el
S2 lee el bus y muestra lo que lee i2c_lead;


Problemas :

S2 solo me lee, la direcion del ultimo dato colocado en el bus, la direcion del S1, no los datos.

S1 no entra en la interrupcion nunca

El simulador de proteus me tira como una docena de lineas de errores del chip S1 del S2 ni quejarse


Codigo del master:



#include "pic_master_net.h"



void main()



   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   
   printf("\r\n PIC MASTER:  ");
   printf("\r\n     enviando....  ");
   //limpia_v(nums,4,9);
    OUTPUT_HIGH(PIN_B3); 
   escribir_i2c(S1,10);
   //escribir_i2c(S1,20);
   
  // escribir_i2c(S2,10);
  // escribir_i2c(S2,20);
   
   

}





libreia :bus_i2c.h master





/*****************************************************
*
*  Libreria del bus i2c
*
*****************************************************/





//direcciones de dispositivos

#Define M1 0xA1 //Master
#Define S1 0xA2 //Esclavo 1
#Define S2 0xA3 //Esclavo 2
#Define S3 0xA4 //Esclavo 3

// --- escribir en dispositivo ---

void escribir_i2c(BYTE direccion, int dato)
{
   i2c_start();
   i2c_write(direccion);
   i2c_write(dato);
   i2c_stop();
   delay_us(50);
}


// --- leer del dispositivo ---
int leer_i2c(BYTE direccion, int opcion)
{
   int dato = 0;
   i2c_start();
   i2c_write(direccion); //direccion device
   i2c_write(opcion);
   
   i2c_start();
   i2c_write(direccion+1);
   dato = i2c_read();
   i2c_stop();
   
   return(dato);
}




libreria :pricipal del master



#include <18F2550.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,SLOW,sda=PIN_B0,scl=PIN_B1)
//#USE FAST_IO(B)

#include <stdlib.h>                 //Archivo necesario para función rand()
#include <math.h>
#include "bus_i2c.h"                //libreia bus
#include "mi_lib.c"                 //mis librerias





Para el primer esclavo tengo lo siguiente:




/***************************************
*
* Progrma principal del esclavo:
* pic_esclavo_net.c
*
***************************************/



#include "pic_esclavo_net.h"

#INT_SSP

void ssp_interupt();


void main()
{
int8 dato;
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   
   
   printf("\n\r PIC ESCLAVO 1: ");
   
   OUTPUT_HIGH(PIN_B3);
   


}




en lal ibreria de cabeceras del esclavo tengo




/***************************************
*
* lib de cabeceras esclavo
* pic_esclavo_net.h
*
***************************************/





#include <18F2550.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA2,NOFORCE_SW)
#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xA2)

#include <stdlib.h>                 //Archivo necesario para función rand()
#include <math.h>
#include "bus_i2c.h"                //libreia bus
#include "mi_lib.c"                 //mis librerias





lib mi_lib.c






/*****************************************************
*
*  Libreria del mis funciones
*  mi_lib.c
*
*****************************************************/



//DEFINICIONES
#define led1 PIN_B3


BYTE address, buffer[0x10];


void ssp_interupt (){
   BYTE incoming, state;

   state = i2c_isr_state();
  printf("\n\r state: %d ",state);
 
   if(state < 0x80)                     //Master is sending data
   {
      incoming = i2c_read();
      printf("\n\r incoming: %d ",incoming);
     
      if(state == 1)                     //First received byte is address
         address = incoming;
      if(state == 2)                     //Second received byte is data
         buffer[address] = incoming;
   }
   if(state == 0x80)                     //Master is requesting data
   {
      i2c_write(buffer[address]);
   }
}





¿Alguna persona sabe que ocurre?



Un Saludo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #9 en: 08 de Junio de 2012, 10:49:23 »
  Esto que digo lo estoy presuponiendo ya que nunca trabajé con dos esclavos, y tampoco uso CCS... Tal vez el esclavo que reciba una dirección que no le corresponde deba hacer algún tratamiento como para borrar algún buffer para que quede libre para una nueva adquisición de la dirección. Habría que leer el datasheet del PIC para saber que dice al respecto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: Comunicar: Controlar : i2c :PIC ::
« Respuesta #10 en: 08 de Junio de 2012, 12:04:05 »
Hola AngelGris

Me temo que algo se me esta pasando por alto

el simulador de proteus me dice como que:
algo pasa por ahi..




pic18 exec: (PC=0x0012) Attempt to execute illegal opcode (loaded from Pc=0012 ), instruction executes as a NOP
pic18 exec: (PC=0x0020) Attempt to execute illegal opcode (loaded from Pc=0020 ), instruction executes as a NOP

pic18 MEMORY: (PC=0x0030) Read of unimpremented memory address 0x0F64 returns Zero.

pic18 exec: (PC=0x0012) Attempt to execute illegal opcode (loaded from Pc=0012 ), instruction executes as a NOP
pic18 exec: (PC=0x0020) Attempt to execute illegal opcode (loaded from Pc=0020 ), instruction executes as a NOP

pic18 MEMORY: (PC=0x0030) Read of unimpremented memory address 0x0F64 returns Zero.




Puede ocurrir a lo mejor que tengo mal implementdas las funciones de escriruta y lectura

no lo se, pero eso no explica que la interrupcion del bus no se active, porque el otro esclavo al leer el bus
encuentra dato cuando hace i2c_read:

Aunque realmnete es la direccion del dispositivo no es el dato
es como sino le llegase el ack u algo raro.

a ver si alguien con más vista que yo sabe que le pasa a esto..


encontre un documento :
http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf
http://ww1.microchip.com/downloads/en/DeviceDoc/80131e.pdf

UN SALUDO.




« Última modificación: 08 de Junio de 2012, 13:38:47 por pajaro »