TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Protheus5 en 06 de Junio de 2005, 03:59:00

Título: Problema raro I2C entre PIC18F452
Publicado por: Protheus5 en 06 de Junio de 2005, 03:59:00
Hola amigos,

estoy intentando hacer una sencilla comunicacion mediante i2c entre 2 pic 18f452 usando las funciones del i2c que viene en el ccs, y no consigo que haga lo que yo quiero.

La idea es la siguiente: el maestro le manda al esclavo una secuencia de numeros del 0 al 8, y el esclavo los presenta en el puerto B (al cual hay conectados unos led) y los envia por el puerto serie.

Problemas: encender los led del puerto b y mandar por el puerto serie no es posible: solo puede hacer una cosa, las dos a la vez noEnfurruñado

si por ejemplo solo presento el dato por el puerto serie, me aparece una cosa rara, como esta:

8
8
0
8
8
1
8
8
2
8
8
3
8
8
4
...

la verdad no se que es lo que puede estar pasando. Os pongo a continuacion el codigo por si podeis mirarlo y proponer alguna idea o lo que sea. Un saludo y gracias.


//////////////////////////////////////////////////////////////////
//MAESTRO
///////////////////////////////////////////////////////////////////


#include <18f452.h>
#device adc=10
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, NOPUT,  NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)

#use standard_io(c)

#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,fast,force_hw)


void main(void)
{
unsigned int dato,i;

delay_ms(2000);  

while(1)
{

for(i=0;i<9;i++)
{

dato=i;
i2c_start();
i2c_write(0x08); //direccion del esclavo con el que haremos la comunicacion
delay_ms(3);

i2c_write(dato);
delay_ms(3);
i2c_stop();


delay_ms(1000);
}
}
}




//////////////////////////////////////////////////////////////////
//ESCLAVO
///////////////////////////////////////////////////////////////////


#include <18f452.h>
#device adc=10
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, NOPUT,  NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)


#USE standard_io(B)
#USE standard_io(C)

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08,fast,force_hw)
#byte puerto_b=0xf81


void main(void)
{
unsigned int dato;
puerto_b = 0x00;
set_tris_b( 0x00 );// todo salidas


while(1)
{


dato=i2c_read();
puerto_b=dato;

printf("%u
",dato);

}
}

Título: Re: Problema raro I2C entre PIC18F452
Publicado por: trunksx64 en 06 de Septiembre de 2008, 00:41:16
Hi, por lo que he visto en el porgrama el problema esta como el esclavo recibe la llamada por parte del maestro, es recomendable que esta se hago por medio de interruciones. asi:

#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)

BYTE address, buffer[0x10];

#INT_SSP
void ssp_interupt ()
{
   BYTE incoming, state;

   state = i2c_isr_state();

   if(state < 0x80)                     //Master is sending data
   {
      incoming = i2c_read();
      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]);
   }
}

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

   while (TRUE) {}
}

esta estructura esta en la ayuda del mismo ccs. la he usado y funciona perfecto ademas de que se evita "estar pendiente" del control por medio del esclavo...