Autor Tema: I2C con PIC 18F252  (Leído 1797 veces)

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

Desconectado JOAKISS

  • PIC10
  • *
  • Mensajes: 2
I2C con PIC 18F252
« en: 01 de Abril de 2005, 14:20:00 »
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.

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: I2C con PIC 18F252
« Respuesta #1 en: 01 de Abril de 2005, 23:17:00 »
Creo q en el subforo de Lenguaje C te ayudaran mejor...