PCF8574

Başlatan eeburakdemir, 07 Mart 2016, 15:33:24

eeburakdemir

Arkadaşlar merhaba. Pic16f877 ' e aynı sda ve scl hattına 2 tane pcf8574 bağladım. Kodu paylasıyorum arkadaşlar. Sorunum okuma yaptığım birinci pcf ' den interrupt alıyorum ve bunu görebiliyorum. Fakat ikinci pcf'ye yazdıramıyorum. Sizce sorun ne olabilir. Datasheet de ne istiyorsa aynısını yaptım. Açıklama satırlarına takılmayın , okadar çok denedim ki , insanların yazdıklarını dahi mix yaptım yine de bana mısın demiyor 
Saygılar.


#include <16F877.h>  

#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 

#use delay(clock=20000000)

#use i2c(master,sda=pin_C4,scl=pin_C3,slow=100000) 



#define PCF8574_WRITE_ADDRESS 0x40
#define PCF8574_READ_ADDRESS 0x4F

#define TEST_LED PIN_A0

int8 data;                 // Byte received from PCF8574
int1 PCF8574_int_flag = 0;

#INT_EXT
void ext_int_isr(void)
{
   PCF8574_int_flag = 1;
   clear_interrupt(INT_EXT);
}

void main(void)
{

   set_tris_a(0b00000000);
   output_a(0);

   ext_int_edge(H_TO_L);
   clear_interrupt(INT_EXT);      // Added. Clear flag.
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   // Configure PCF8574 pins as inputs. Defaults to inputs on power-up,
   // but do anyway.
   
   
   
   // Get and display current switch state
   // The read also resets the interrupt logic of the PCF8574
   
   i2c_start();
   i2c_write(PCF8574_READ_ADDRESS);
   data = i2c_read(0);  // First byte is also last so NACK
   i2c_stop();
   
   // Display state of switch on PCF8574 pin P0
   
   if(bit_test(data,0))
      output_bit(TEST_LED,1);
     
   else output_bit(TEST_LED,0);
   
   
   while(1)
   {
      // If switch state has changed read PCF8574 port
     
      if (PCF8574_int_flag)
      {
         PCF8574_int_flag = 0;   // Clear for next time
         
         i2c_start();
         i2c_write(PCF8574_READ_ADDRESS);
         data = i2c_read(0);     // First byte is also last so NACK
         i2c_stop();
         
         // Display state of switch on PCF8574 pin P0
         
         if(bit_test(data,0))
            output_bit(TEST_LED,1);
           
         else output_bit(TEST_LED,0);
         
         
         i2c_start();
         i2c_write(PCF8574_WRITE_ADDRESS);
         i2c_write(0x00);     // Set all pins as inputs
         i2c_stop();
         
         
      }
   }
}

eeburakdemir

Alıntı yapılan: eeburakdemir - 07 Mart 2016, 15:33:24
Arkadaşlar merhaba. Pic16f877 ' e aynı sda ve scl hattına 2 tane pcf8574 bağladım. Kodu paylasıyorum arkadaşlar. Sorunum okuma yaptığım birinci pcf ' den interrupt alıyorum ve bunu görebiliyorum. Fakat ikinci pcf'ye yazdıramıyorum. Sizce sorun ne olabilir. Datasheet de ne istiyorsa aynısını yaptım. Açıklama satırlarına takılmayın , okadar çok denedim ki , insanların yazdıklarını dahi mix yaptım yine de bana mısın demiyor 
Saygılar.


#include <16F877.h>  

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 

#use delay(clock=20000000)

#use i2c(master,sda=pin_C4,scl=pin_C3,slow=100000) 



#define PCF8574_WRITE_ADDRESS 0x40
#define PCF8574_READ_ADDRESS 0x4F

#define TEST_LED PIN_A0

int8 data;                 // Byte received from PCF8574
int1 PCF8574_int_flag = 0;

#INT_EXT
void ext_int_isr(void)
{
   PCF8574_int_flag = 1;
   clear_interrupt(INT_EXT);
}

void main(void)
{

   set_tris_a(0b00000000);
   output_a(0);

   ext_int_edge(H_TO_L);
   clear_interrupt(INT_EXT);      // Added. Clear flag.
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   // Configure PCF8574 pins as inputs. Defaults to inputs on power-up,
   // but do anyway.
   
   
   
   // Get and display current switch state
   // The read also resets the interrupt logic of the PCF8574
   
   i2c_start();
   i2c_write(PCF8574_READ_ADDRESS);
   data = i2c_read(0);  // First byte is also last so NACK
   i2c_stop();
   
   // Display state of switch on PCF8574 pin P0
   
   if(bit_test(data,0))
      output_bit(TEST_LED,1);
     
   else output_bit(TEST_LED,0);
   
   
   while(1)
   {
      // If switch state has changed read PCF8574 port
     
      if (PCF8574_int_flag)
      {
         PCF8574_int_flag = 0;   // Clear for next time
         
         i2c_start();
         i2c_write(PCF8574_READ_ADDRESS);
         data = i2c_read(0);     // First byte is also last so NACK
         i2c_stop();
         
         // Display state of switch on PCF8574 pin P0
         
         if(bit_test(data,0))
            output_bit(TEST_LED,1);
           
         else output_bit(TEST_LED,0);
         
         
         i2c_start();
         i2c_write(PCF8574_WRITE_ADDRESS);
         i2c_write(0x00);     // Set all pins as inputs
         i2c_stop();
         
         
      }
   }
}


Powered by EzPortal