I2C pic en modo esclavo (en CCS y por software)

hola, me gustaria saber como puedo hacer que pics que no disponen de modulos ssp y etc como es en el caso de los pic16f84a, funcionen sin fallos con un bus i2c en modo esclavo, y el lenguaje lo busco para CCS.

Veréis, estoy intentando hacer que dos Pics 16f84a intercambien informacion con un bus i2c por software (uno maestro y otro esclavo). hice los dos programas acorde con las indicaciones que he visto en diferentes paginas.

El programa del maestro se compiló bien, pero el del esclavo me surgió un mensaje que dice que la directiva I2C_POLL no esta definida, y no se ni como corregirlo ni como adaptarlo.

Porfavor, solo he creado este tema como ultimo recurso, estoy completamente en blanco :confused::confused::confused:
 
La directiva POLL es una directiva exclusiva de los microcontroladores que tienen el modulo de comunicación I2C, en el caso del PIC 16f84, no puedes hacer la comunicacion asi de facil como si fuera un 877 u otro q contenga el modulo... =)
 
Prueba a hacerlo SPI, el protocolo és mas sencillo. De todos modos hacer un esclavo por soft es mas complicado que el maestro.
 
¿Y en el 16f84a no se puede forzar la comunicación I2C por software?
Yo he comunicado un 18f2455 como maestro con un 16f873A como esclavo, leyendo con el maestro variables del esclavo.
 
Para la empezar el tema es muy viejo, ya me dio tiempo para resolver el problema :LOL:, al final lo arregle cambiando la libreria I2C, y lo puse de tal forma que el pin RB0 del pic16f84a que es el de las interrupciones, y he hecho una rutina de I2C aprovechando esa interrupción, ademas ya me pase a otra cosa, aunque gracias por vuestro interes :)
 
Hola Crayfe

Soy nuevo en el foro, y lei que pudos conectar 2 pics16f84 por I2c.

Estoy tratando de hacer eso pero no se como...

Si pudieras subir algo de info de eso seria genial

gracias

Att
Un estudiante de electronica
 
Hola. Te puedo poner un ejemplo del código que utilicé yo en su día.
En el pic que quieras tener como esclavo, lo configuras logicamente como esclavo. Yo tengo esto en el esclavo, donde le digo que es esclavo, los pines sda y scl, velocidad lenta (aun no he probado la rapida), forzar el i2c por hardware y la direccion que he queridopara este pic, 0x0A o 10 en decimal:
Código:
#use i2c(SLAVE,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW,ADDRESS=0x0A)
Este programa para el esclavo lo que hace es leer una entrada analogica y tenerla disponible para cuando el maestro se la solicite:
Código:
#include <16F873A.h>
#device ADC=8
#fuses HS,NOWDT,PUT
#use delay(clock=20000000)
#use i2c(SLAVE,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW,ADDRESS=0x0A)
 
int pichB,state,buffer[0x01],adress;
#INT_SSP
void ssp_interrupt()
{ output_high(PIN_A2);
 state=i2c_isr_state();
 if(state==0x80){
  i2c_write(buffer[0x00]);
  output_high(PIN_A1);
 }
}
void main(){
 set_tris_A(0b00000001);
 setup_adc_ports(AN0);
 setup_adc(ADC_CLOCK_INTERNAL);
 set_adc_channel(0);
 delay_us(20);
 pichB=read_adc();
 enable_interrupts(GLOBAL);
    enable_interrupts(INT_SSP);
 
 adress=0x00;
 
 while(TRUE){
 
 set_adc_channel(0);
 delay_us(20);
 pichB=read_adc();
 buffer[0x00]=pichB;
 delay_ms(1);
 output_high(PIN_A3);
 }
}

Hasta aqui el esclavo. El maestro se configura como maestro:

Código:
#use i2c(MASTER,SCL=PIN_B1,SDA=PIN_B0,SLOW,FORCE_HW)

y cuando quiero leer el dato que está en el esclavo utilizo esto en el programa:

Código:
i2c_start();
  i2c_write(0x0A+1);
  pichB=i2c_read(0);
  i2c_stop();

Y ya está. Si hace falta alguna aclaración más no dudeis en preguntar.
Busca por el foro que esto ya lo traté en otro tema.
Saludos
 
Atrás
Arriba