CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

I2C communication between two 16F877A

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
freshdesing



Joined: 14 Jul 2010
Posts: 2

View user's profile Send private message

I2C communication between two 16F877A
PostPosted: Wed Jul 14, 2010 6:01 am     Reply with quote

Hi, I connected two pics 16F877A using I2C. The master has four LEDs, when lit the first, sent as data "1" when lit the second led, sent as data "2" and so since four leds. The slave has an LCD screen that initially displays "waiting for data, and when it arrives (should) represents the data that has come on the LCD screen. The problem is that it works, it lights the first LED of the master and the slave not receive any data.. Both pic's has led to "status" that flashes every half second, and both work well, so do not stay in any loop or freeze. ... I would appreciate some extra help. The codes are:

MASTER´s code:
Code:

//    RB7     --> ENTRADA ON/OFF
//    RB6     --> ENTRADA ON/OFF
//    RB5     --> ENTRADA ON/OFF
//    RB4     --> ENTRADA ON/OFF
//    RB0/INT -->
//    RA0     --> LED STATUS
//    RC7     -->
//    RC6     -->
//    RC5     -->
//    RC4     --> SDA
//    RC3     --> SCL
//    RC2     -->
//    RC1     -->
//    RD0     --> OUT E
//    RD1     --> OUT RS
//    RD2     --> OUT RW
//    RD3     -->   
//    RD4     --> OUT D4
//    RD5     --> OUT D5               
//    RD6     --> OUT D6
//    RD7     --> OUT D7
//
//
//
////////////////////////////////////////////////////////////////////////////////

#include <16f877A.h>                    //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT   //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz


#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_HW)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
#byte port_d = 0x08
#byte port_e = 0x09


int dato=0;

void i2c(int data)
{
   i2c_start();      //condicion de inicio
   i2c_write(0xa0);  //direccion del esclavo con el que haremos la comunicacion
                     //A6 A5 A4 A2 A1 A0 R/W  -> R/W = 0 escritura; 1 lectura
                     

   i2c_write(data);  //enviamos dato
   i2c_stop();       //finalizacion de la comunicacion
   delay_ms(1000);   //introducimos retardo para que no este constantemte escribiendo
   
}


#INT_TIMER1
void control_timer1(void)
   {
   output_bit(pin_a0,!input(pin_a0));
   set_timer1(3036);
   }


void main(void)
{
   disable_interrupts(GLOBAL);
   set_tris_a(0x00);       //    RA0   --> LED STATUS 
                           //    RA1   -->   
                           //    RA2   -->   
                           //    RA3   -->   
                           //    RA4   -->   
                           //    RA5   -->   

   port_b_pullups(false);   // Resistencias de polarización del puerto B

   set_tris_b(0xF0);       //    RB7   -->
                           //    RB6   -->
                           //    RB5   -->
                           //    RB4   -->
                           //    RB3   -->   
                           //    RB2   -->   
                           //    RB1   -->   
                           //    RB0   -->   
                           
   set_tris_c(0x00);       //    RC0   -->   
                           //    RC1   -->   
                           //    RC2   -->   
                           //    RC3   -->   SCL
                           //    RC4   -->   SDA 
                           //    RC5   -->                 
                           //    RC6   -->   
                           //    RC7   -->   
                           
   set_tris_d(0x00);     //    RD0   -->   OUT E
   output_d (0x00);        //    RD1   -->   OUT RS
                           //    RD2   -->   OUT RW
                           //    RD3   -->   
                           //    RD4   -->   OUT D4
                           //    RD5   -->   OUT D5               
                           //    RD6   -->   OUT D6
                           //    RD7   -->   OUT D7

   setup_adc_ports(NO_ANALOGS);
   setup_comparator(NC_NC_NC_NC);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   while(1)
   {
      delay_ms(2000);
      output_bit(pin_d0,1);
      dato=0;
      i2c(dato);
      delay_ms(500);
      output_bit(pin_d0,0);
     
      delay_ms(2000);
      output_bit(pin_d1,1);
      dato=1;
      i2c (dato);
      delay_ms(500);
      output_bit(pin_d1,0);
     
      delay_ms(2000);
      output_bit(pin_d2,1);
      dato=2;
      i2c(dato);
      delay_ms(500);
      output_bit(pin_d2,0);
     
      delay_ms(2000);
      output_bit(pin_d3,1);
      dato=3;
      i2c(dato);
      delay_ms(500);
      output_bit(pin_d3,0);
   }
   
}



SLAVE´s code
Code:

//    RD0     --> OUT LED
//    RD1     --> OUT LED
//    RD2     --> OUT LED
//    RD3     --> OUT LED
//    RA0     --> LED STATUS
//    RC4     --> SDA
//    RC3     --> SCL
//
//
//
////////////////////////////////////////////////////////////////////////////////

#include <16f877A.h>                    //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT   //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz

#define use_portd_lcd TRUE
#include <lcd.c>

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
#byte port_d = 0x08
#byte port_e = 0x09

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3,ADDRESS=0xA0,FAST,FORCE_HW)


int dato=0;

BYTE incoming, state; // I2C vars
BYTE address, buffer[0x10]; // Address and Array of Bytes


#INT_SSP

void i2c_isr()
 {

      state = i2c_isr_state();

      if(state < 0x80) //Master is sending data
        {
          if(state == 0)
             {
             incoming = i2c_read();
             printf(LCD_PUTC, "\fEl dato recibido es:\n %u",incoming);
             }
     
          if(state == 1)  //First received byte is address
            {
            incoming = i2c_read();
            address = incoming;
            }
         if(state == 2)  //Second received byte is data
           {
           incoming = i2c_read();
           printf(LCD_PUTC, "\fEl dato recibido es:\n %u",incoming);
           buffer[address] = incoming;
           }
        }
     
        if(state == 0x80)  //Master is requesting data
           {
           i2c_write (buffer[address]);
           }
 }

#INT_TIMER1
void control_timer1(void)
   {
   output_bit(pin_a0,!input(pin_a0));
   set_timer1(3036);
   }

void main(void)
{
   delay_ms(200); // power up delay
   disable_interrupts(GLOBAL);
   set_tris_a(0x00);       //    RA0   -->   
                           //    RA1   -->   
                           //    RA2   -->   
                           //    RA3   -->   
                           //    RA4   -->   
                           //    RA5   -->   

   port_b_pullups(false);   // Resistencias de polarización del puerto B

   set_tris_b(0xF1);     
                           
   set_tris_c(0xFF);       //    RC0   -->   
                           //    RC1   -->   
                           //    RC2   -->   
                           //    RC3   -->   SCL
                           //    RC4   -->   SDA   
                           //    RC5   -->                 
                           //    RC6   -->   
                           //    RC7   --> 
                           
   //set_tris_d(0x00);       //    RD0   -->   OUT LED   
                           //    RD1   -->   OUT LED   
                           //    RD2   -->   OUT LED   
                           //    RD3   -->   OUT LED   
                           //    RD4   -->     
                           //    RD5   -->                 
                           //    RD6   -->   
                           //    RD7   -->   

   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   setup_psp(PSP_DISABLED);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   lcd_init();         //inicializa lcd
   printf(LCD_PUTC, "\fEsperando dato..");
   
  while(1)
   {
   
   }

}


Thanks in advance.


Last edited by freshdesing on Wed Jul 14, 2010 7:25 am; edited 1 time in total
Wayne_



Joined: 10 Oct 2007
Posts: 681

View user's profile Send private message

PostPosted: Wed Jul 14, 2010 7:12 am     Reply with quote

First issue:-

Code:

int dato=0;

void i2c(int dato)


Do not do this in CCS or any compiler for that matter. CCS does not issue a warning to say you are using the same name for a local as you are for a global BUT there could and may (in my case, was) be problems.

Use different names for local vars.

Secondly, in your master code you are using standard_io so all those set_tris statements are irrelivant.
freshdesing



Joined: 14 Jul 2010
Posts: 2

View user's profile Send private message

PostPosted: Wed Jul 14, 2010 7:29 am     Reply with quote

Thanks, I am trying to use the standard_io, and I didn't remember to change to fast_io. I changed the local variable to "data", but the comunication don't works.

Anybody know if the code of comunication is correctly?



Thnaks.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group