TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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 no
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);
}
}
-
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...