Estoy haciendo un rpograma en lenguaje C para gobernar una parte de un robot con un PIC 18F252 que funcionara como esclavo, y me esta dando problemas la comunicación con el I2C. Basicamente no se si los comandos son correctos. El programa es bien sencillo y solo tiene que leer un caracter del I2C cuando salta una interrupción y que el master pueda leer cuando quiera el valor de mi variable "varm2".
Otra cosa, tendría que usar instrucciones del compilador mcc18, pero me conformo con que me digais que orden he de poner las instrucciones y ya buscare las que son equivalentes en mi compilador.
El programa es el siguiente:
#include <p18f252.h>
#include <i2c.h>
#include <delays.h>
//cristal 10MHz con pll activado
unsigned char contador;
int direc; /*0-HORARIO 1-ANTIHORARIO*/
char tirook;
int disp;
char varm;
unsigned char varm2;
#pragma code
#pragma interrupt int_sspi2c //Rutina Interrupción I2C
void int_sspi2c(void)
{
//disable_interrupts(int_ssp); // *** Necesario ***
if(SSPSTATbits.BF==1)
{
varm=SSPBUF;
SSPBUF=varm2;
}
}
#pragma code
void main (void)
{
INTCONbits.GIE=1;
INTCONbits.GIEL=1;
SSPCON1bits.SSPEN=1;
TRISBbits.TRISB1=0; /*MOTOR GIRO HORARIO*/
TRISBbits.TRISB2=0; /*MOTOR GIRO ANTIHOARIO*/
TRISBbits.TRISB4=0; /*SOLENOIDE 1, 1-EXTENDIDO*/
TRISBbits.TRISB5=0; /*SOLENOIDE 2*/
TRISBbits.TRISB3=1; /*SENSOR*/
direc=0;
contador=0;
disp=0;
varm2=0;
PORTBbits.RB4=1;
PORTBbits.RB5=0;
while(1)
{
if(varm=="r")
{
//y el adri va y coge el bolo
}
if(varm=="d")
{
varm2&=0xF7;
if(contador<6)
{
if(direc==0)
{
PORTBbits.RB5=1;
Delay10KTCYx(1000);
PORTBbits.RB4=0;
PORTBbits.RB1=1;
Delay10KTCYx(1000); //delay_ms(1000);
while(PORTBbits.RB3==0)
{PORTBbits.RB1=1;}
PORTBbits.RB1=0;
PORTBbits.RB4=1;
PORTBbits.RB5=0;
contador++;
direc=1;
varm2++;
varm2|=0x08;
StartI2C(); // Condicion Inicio
IdleI2C();
WriteI2C(varm2);
StopI2C(); // Stop
}
else
{
PORTBbits.RB5=1;
Delay10KTCYx(1000);
PORTBbits.RB4=0;
PORTBbits.RB2=1;
Delay10KTCYx(1000); //delay_ms(1000);
while(PORTBbits.RB3==0)
{PORTBbits.RB2=1;}
PORTBbits.RB2=0;
PORTBbits.RB4=1;
PORTBbits.RB5=0;
contador++;
direc=0;
varm2++;
varm2|=0x08;
StartI2C(); // Condicion Inicio
IdleI2C();
WriteI2C(varm2);
StopI2C(); // Stop
}
}
else
{
varm2|=0x80; //ya llevamos 6 tiros
StartI2C(); // Condicion Inicio
IdleI2C();
WriteI2C(varm2);
StopI2C(); // Stop
}
}
}
}
Gracias, y si puede alguien que me eche una manita.