Page 1 of 2
Need help with PCF8574
Posted: 16 May 2011, 10:30
by brandts
Hi everyone,
I'm trying to control 8 leds using a PCF8574 according to the scheme as seen in the attachment (from the book NXT Extreme).
The problem is that I can't control the leds. If I connect the PCF to the NXT only 4 leds are turned on continously (the leds connected to P0, P1, P2 and P3) and the other 4 leds are all off. I tried multiple software programs like NXT-G or NXC but I can't switch any leds on or off. It also doesn't matter which port I use (sensor port 1 to 4 or motor port A, B, or C) while I only programmed to control the PCF by sensor port 1.
Can anyone tell me what I'm doing wrong?
Greetings,
Brandts
Re: Need help with PCF8574
Posted: 16 May 2011, 11:37
by h-g-t
Are you wiring it up using discrete parts or using a ready-made board?
If using a commercial board, have you set the jumpers to enable the pull-up resistors?
Have you used the nbc program in the book?
Re: Need help with PCF8574
Posted: 16 May 2011, 12:01
by brandts
I use discrete parts. I bought a PCF8574AP fabricated by NXP:
http://www.nxp.com/documents/data_sheet/PCF8574.pdf and got some leds, wires and resistors from my work. I soldered it all together on a standard solder board (similar like:
http://itp.nyu.edu/physcomp/Tutorials/S ... APerfBoard).
I have no idea what you mean setting the jumpers to enable. Could you explain that a bit further?
I tried the program from the book (which I believe is NXC instead of NBC) and also tried the NXT-G software which I downloaded from
www.mindsensors.com
Re: Need help with PCF8574
Posted: 16 May 2011, 12:17
by h-g-t
Mini boards like this
http://www.futurlec.com/Mini_PCF8574.shtml have jumpers which enable you to add in various resistors but that is not relevant in your case.
The program in the (excellent) book is definitely nbc (see below) - if you used that did you compile it with the Bricx Command Center?
Code: Select all
#include "NXTDefs.h"
#define I2CPort IN_1
#define I2CAddress 0x40
// 0x40 for PCF8574 or 0x70 for PCF8574A
dseg segment
lswArgs TCommLSWrite // Write structure
lscsArgs TCommLSCheckStatus // Status structure
Value byte
dseg ends
thread main
// Initialize variables
mov lswArgs.Port, I2CPort
mov lscsArgs.Port, I2CPort
// Initialize input port to I2C
SetSensorType(I2CPort,IN_TYPE_LOWSPEED)
SetSensorMode(I2CPort,IN_MODE_RAW)
ResetSensor(I2CPort)
Loop: // Top of loop
// Build buffer and write port
arrbuild lswArgs.Buffer, I2CAddress, Value
set lswArgs.ReturnLen, 0 // Read back 0 bytes
syscall CommLSWrite, lswArgs
Wait: // Wait till done
syscall CommLSCheckStatus, lscsArgs
brtst GT, Wait, lscsArgs.Result
// Increment
add Value, Value, 1
// Start over
jmp Loop
endt
Re: Need help with PCF8574
Posted: 16 May 2011, 12:35
by brandts
The book I used is "Extreme NXT: Extending the LEGO MINDSTORMS NXT to the Next Level".
The program I used looks like this:
Code: Select all
#define I2Cport S1 // Port number
#define I2CAddr8574 0x70 // I2C address x040 8574 or 0x70 for 8574A
byte WriteBuf[]={I2CAddr8574,0x00}; // write buffer is addr and data
task main() {
int nbytes;
SetSensorLowspeed (I2Cport); // Configure I2C port
while (true) {
WriteBuf[1]++; // update data byte
I2CWrite(I2Cport, 0, WriteBuf); // send buffer
while(I2CStatus(I2Cport, nbytes)==STAT_COMM_PENDING); // wait
}
}
The compiler I use is indeed Bricx Command Center. I believe I've read somewhere on a forum that I had to be sure to use firmware 1.05 so I tried the program on 1.05 and also on the latest firmware but nothing changes. I also tried both adresses (0x40 and 0x70) but also that won't help.
Re: Need help with PCF8574
Posted: 16 May 2011, 12:43
by philoo
I'm dry... what bothers me most is the 4 LEDs continuously on. Are you sure your IC is not fried?
As for the NBC/NXC discussion, first edition of Extreme NXTused NBC as NXC was not yet available. But sample code were rewritten into (more palatable) NXC for the second edition.
Re: Need help with PCF8574
Posted: 16 May 2011, 12:53
by brandts
In not sure that the IC is fried. Is it possible that I damaged something inside the chip with soldering the contacts? Is there a way to measure this with a multimeter?
I have the second edition of Extreme NXT so that indeed explains why the sample code is different.
Re: Need help with PCF8574
Posted: 16 May 2011, 13:14
by philoo
brandts wrote:In not sure that the IC is fried. Is it possible that I damaged something inside the chip with soldering the contacts?
That can happen, but it's quite rare. Stupid question: are you sure the IC is not upside down?
Is there a way to measure this with a multimeter?
Not really...
Re: Need help with PCF8574
Posted: 16 May 2011, 13:25
by h-g-t
Have you tried changing the port address in case you have bought an 'A' model chip?
"#define I2CAddr8574 0x70 // I2C address x040 8574 or 0x70 for 8574A"
If you tried it in a motor port it is possible that the extra voltage available (9v cf ~ 4.5v) has damaged your chip since it operates between 2.5 & 6v.
Re: Need help with PCF8574
Posted: 16 May 2011, 19:44
by mattallen37
I used to use the PCF8574 for all sorts of things. Here is an old program of mine (modified to not require my library). I know it works, as I just tested it.
Code: Select all
#define Port S1
#define Address 0x40
void WritePins(byte port, byte addr, byte input){
byte I2CMsg[];
//byte Command = ~input; //with enhanced FW
byte Command = input*(-1)+255; //with standard FW
byte nByteReady = 0;
int loop;
ArrayBuild(I2CMsg,addr,Command);
while (loop == STAT_COMM_PENDING) {
loop = I2CStatus(port, nByteReady);
}
I2CWrite(port, 1, I2CMsg);
while (loop == STAT_COMM_PENDING) {
loop = I2CStatus(port, nByteReady);
}
}
int LEDtoDrive;
bool LR;
task main()
{
SetSensorLowspeed(Port);
LR=1;
LEDtoDrive=1;
while (true)
{
WritePins(Port, Address, LEDtoDrive);
if (LR==1)
{
LEDtoDrive=LEDtoDrive*2;
if (LEDtoDrive>128)
{
LEDtoDrive=128;
LR=0;
}
}
if (LR==0)
{
LEDtoDrive=LEDtoDrive/2;
if (LEDtoDrive==1)
{
LR=1;
}
}
ClearScreen();
NumOut(0,LCD_LINE1,LEDtoDrive);
Wait (30); //Slow down a little, but must be at least 7ms
}
}
At the top, set the port and address.