Autor Tema: Problema raro I2C entre PIC18F452  (Leído 2264 veces)

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

Desconectado Protheus5

  • PIC10
  • *
  • Mensajes: 37
Problema raro I2C entre PIC18F452
« 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);

}
}


Desconectado trunksx64

  • PIC10
  • *
  • Mensajes: 16
    • Trunksx64-Blog
Re: Problema raro I2C entre PIC18F452
« Respuesta #1 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...
Uno es Amo y Señor de lo que calla, pero un esclavo de lo que dice....


 

anything