|
|
View previous topic :: View next topic |
Author |
Message |
bertronicom Guest
|
i/o i2c expander interrupt problem |
Posted: Wed Aug 06, 2003 3:11 pm |
|
|
I try to read inputs from a pcf8674 by mean i2c bus, i have the next problem:
i have connected Interrupt pin from PCF8574 to PIC
INT0 interrup pin, but this is low while push button is pressed
int read_input(){
int data;
start_i2c();
data = read_i2c(0);
stop_i2c();
return (data);
}
#INT0
void Int_PCF8574 (){
dato=read_input();
output_high (pin_B0);
}
Can you help me please??
Thanks in advance
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516731 |
|
|
Kenny
Joined: 07 Sep 2003 Posts: 173 Location: Australia
|
Re: i/o i2c expander interrupt problem |
Posted: Wed Aug 06, 2003 6:00 pm |
|
|
<font face="Courier New" size=-1>:=I try to read inputs from a pcf8674 by mean i2c bus, i have the next problem:
:=
:=i have connected Interrupt pin from PCF8574 to PIC
:=INT0 interrup pin, but this is low while push button is pressed
That's correct, it will go low on input change provided there is a pullup resistor and stay low until input returns to original state or port is read. It's better to connect unused inputs to either Vss or Vdd. So the PIC external interrupt needs to be setup for a falling edge.
This example is for a 16F876, which has RB0 as the external interrupt, so the test led is on RB1 instead. Change to suit the pic you are using.
Connect input to P0 on PCF8574, and all other port pins to Vss or Vdd.
Connect /INT pin of PCF8574 to external interrupt pin of PIC.
A pullup resistor is required, eg. 4k7 ohm.
Edited to tidy up.
Code: |
#include <16F876.h>
#use delay(clock=16000000)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,FORCE_HW)
#fuses HS,NOWDT,NOLVP,PUT,NOPROTECT,BROWNOUT
// PCF8574 addresses with A2,A1,A0 all tied to common
#define PCF8574_WRITE_ADDRESS 0x40
#define PCF8574_READ_ADDRESS 0x41
#define TEST_LED PIN_B1
int8 data; // Byte received from PCF8574
int1 PCF8574_int_flag = 0;
#INT_EXT
void ext_int_isr(void)
{
PCF8574_int_flag = 1;
}
void main(void)
{
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.
i2c_start();
i2c_write(PCF8574_WRITE_ADDRESS);
i2c_write(0xff); // Set all pins as inputs
i2c_stop();
// 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);
}
}
}
|
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516738
Last edited by Kenny on Fri May 16, 2008 9:24 pm; edited 2 times in total |
|
|
alberto campo Guest
|
Re: i/o i2c expander interrupt problem |
Posted: Thu Aug 07, 2003 4:06 am |
|
|
The main problem for me is that while i press the push button Interrupt pin is low and not return to high until button is depressed . It is a problem because the others buttons cannot generate another interrupts.
I try to set high interrupt pin when finish ISR but it's not working.
Datasheet PCF8574 pag12 show when reading data by mean i2c_read() interrupt return to high. But in my project remains low until button is depressed.
Thanks for your help.
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516760 |
|
|
Kenny
Joined: 07 Sep 2003 Posts: 173 Location: Australia
|
Re: i/o i2c expander interrupt problem |
Posted: Thu Aug 07, 2003 5:51 am |
|
|
:=The main problem for me is that while i press the push button Interrupt pin is low and not return to high until button is depressed . It is a problem because the others buttons cannot generate another interrupts.
:=
:=I try to set high interrupt pin when finish ISR but it's not working.
:=
:=Datasheet PCF8574 pag12 show when reading data by mean i2c_read() interrupt return to high. But in my project remains low until button is depressed.
:=
:=Thanks for your help.
Guess it implies that the PCF8574 is not being read.
Things to check:
1. Is there activity on the i2c bus?
2. Are pullup resistors the correct value? 2k2 is good.
3. There is an 'A' version of the PCF8574, the PCF8574A.
It has a different address. Are address pins A0,A1, and A2 configured to match the address being sent?
4. i2c_read() should be i2c_read(0) to give the NACK. Not strictly necessary though because the PCF8574 is one of the few i2c devices tolerant of this error.
HTH
Kenny
Posting again because 1st attempt apparently unsuccessful
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516762 |
|
|
alberto campo Guest
|
Re: i/o i2c expander interrupt problem |
Posted: Thu Aug 07, 2003 7:30 am |
|
|
:=:=The main problem for me is that while i press the push button Interrupt pin is low and not return to high until button is depressed . It is a problem because the others buttons cannot generate another interrupts.
:=:=
:=:=I try to set high interrupt pin when finish ISR but it's not working.
:=:=
:=:=Datasheet PCF8574 pag12 show when reading data by mean i2c_read() interrupt return to high. But in my project remains low until button is depressed.
:=:=
:=:=Thanks for your help.
:=
:=
:=Guess it implies that the PCF8574 is not being read.
:=Things to check:
:=1. Is there activity on the i2c bus?
yes, sometimes i can read data correct from 8574
:=2. Are pullup resistors the correct value? 2k2 is good.
yes , i have set 4k7 pull up resistor
:=3. There is an 'A' version of the PCF8574, the PCF8574A.
:=It has a different address. Are address pins A0,A1, and A2 configured to match the address being sent?
version without "a" i have a0, a1,a2 connected to gnd and i use 0x40 for writing and 0x41 for reading
:=4. i2c_read() should be i2c_read(0) to give the NACK. Not strictly necessary though because the PCF8574 is one of the few i2c devices tolerant of this error.
:=
Again, Sometimes INT pin not return to high after depressing push button this disable another new interrupt ¿?
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516776 |
|
|
Kenny
Joined: 07 Sep 2003 Posts: 173 Location: Australia
|
Re: i/o i2c expander interrupt problem |
Posted: Fri Aug 08, 2003 12:26 am |
|
|
:=:=:=The main problem for me is that while i press the push button Interrupt pin is low and not return to high until button is depressed . It is a problem because the others buttons cannot generate another interrupts.
:=:=:=
:=:=:=I try to set high interrupt pin when finish ISR but it's not working.
:=:=:=
:=:=:=Datasheet PCF8574 pag12 show when reading data by mean i2c_read() interrupt return to high. But in my project remains low until button is depressed.
:=:=:=
:=:=:=Thanks for your help.
:=:=
:=:=
:=:=Guess it implies that the PCF8574 is not being read.
:=:=Things to check:
:=:=1. Is there activity on the i2c bus?
:= yes, sometimes i can read data correct from 8574
:=:=2. Are pullup resistors the correct value? 2k2 is good.
:= yes , i have set 4k7 pull up resistor
:=:=3. There is an 'A' version of the PCF8574, the PCF8574A.
:=:=It has a different address. Are address pins A0,A1, and A2 configured to match the address being sent?
:= version without "a" i have a0, a1,a2 connected to gnd and i use 0x40 for writing and 0x41 for reading
:=:=4. i2c_read() should be i2c_read(0) to give the NACK. Not strictly necessary though because the PCF8574 is one of the few i2c devices tolerant of this error.
:=:=
:=
:=Again, Sometimes INT pin not return to high after depressing push button this disable another new interrupt ¿?
Yes, the pin needs to go high again if the interrupt is setup for falling edge.
Could you post your code so we can look for a problem.
Kenny
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516801 |
|
|
Kenny
Joined: 07 Sep 2003 Posts: 173 Location: Australia
|
Re: i/o i2c expander interrupt problem |
Posted: Fri Aug 08, 2003 2:51 pm |
|
|
:=:=:=The main problem for me is that while i press the push button Interrupt pin is low and not return to high until button is depressed . It is a problem because the others buttons cannot generate another interrupts.
:=:=:=
:=:=:=I try to set high interrupt pin when finish ISR but it's not working.
:=:=:=
:=:=:=Datasheet PCF8574 pag12 show when reading data by mean i2c_read() interrupt return to high. But in my project remains low until button is depressed.
:=:=:=
:=:=:=Thanks for your help.
:=:=
:=:=
:=:=Guess it implies that the PCF8574 is not being read.
:=:=Things to check:
:=:=1. Is there activity on the i2c bus?
:= yes, sometimes i can read data correct from 8574
:=:=2. Are pullup resistors the correct value? 2k2 is good.
:= yes , i have set 4k7 pull up resistor
:=:=3. There is an 'A' version of the PCF8574, the PCF8574A.
:=:=It has a different address. Are address pins A0,A1, and A2 configured to match the address being sent?
:= version without "a" i have a0, a1,a2 connected to gnd and i use 0x40 for writing and 0x41 for reading
:=:=4. i2c_read() should be i2c_read(0) to give the NACK. Not strictly necessary though because the PCF8574 is one of the few i2c devices tolerant of this error.
:=:=
:=
:=Again, Sometimes INT pin not return to high after depressing push button this disable another new interrupt ¿?
Reposting.
Yes, the pin needs to go high again if the interrupt is setup for
falling edge.
Could you post your code so we can look for a problem.
Kenny
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516845 |
|
|
|
|
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
|