Pcf8574 + bs sx
o_wan
Posts: 15
hi,
I followed the tutorial here, http://www.phanderson.com/stamp/i2c/8574.html, flash a LED using below circuit and code. It didn't work and I'm not sure what happen.
Does anyone get a working SX example with 8574? Could you please share?
code.:
device var byte ' device 0-7
o_byte var byte ' byte to send to device
i_byte var byte ' byte from device
o_patt var byte ' byte to appear on output of 8574
i_patt var byte ' byte read from input of 8574
directions var byte ' defines which bits on 8574 are outputs
n var byte ' index
b var bit ' bit
SDA_PIN con 4
SCL_PIN con 5
SDA_OUT var out4
SCL_OUT var out5
SDA_IN var in4
SDA_DIR var dir4
OUT con 1
IN con 0
dirs=$f0ff
directions=$80 ' p7 of 8574 defined to be an input
device = 0 ' setting of A2 A1 A0
main
o_patt = $ff ' initialize all outputs to logic one
gosub out_patt
top
low SDA_PIN
gosub in_patt
debug hex i_patt
if ((i_patt & $80) >> 7 ) = 0 THEN flash
' if most sign bit is a zero then flash
o_patt = $01 ' otherwise, turn the LED off
gosub out_patt
goto top
flash ' wink the LED on and off one time
o_patt = $00
gosub out_patt
pause 300
o_patt = $01
gosub out_patt
pause 300
goto top
'*****
in_patt ' fetch input on addressed device
gosub start
o_byte = $40 | (device <<1) | $1
gosub out_byte
gosub nack
gosub in_byte
gosub nack
gosub sstop
i_patt = i_byte
return
out_patt ' output specified patt to addresses device
gosub start
o_byte = $40 | (device <<1)
gosub out_byte
gosub nack
o_byte = o_patt | directions ' bits defined as inputs set
' to logic one
gosub out_byte
gosub nack
gosub sstop
return
in_byte ' fetches 8 bits, most sign bit first
SDA_DIR=IN 'input
i_byte=0
for n=0 to 7
pause 200
high SCL_PIN ' clock high
pause 200
i_byte=(i_byte << 1) | SDA_IN 'read bit and or with prev
debug dec SDA_IN
low SCL_PIN
next
SDA_DIR=OUT 'output
return
out_byte ' output o_byte 'beginning with most sig bit
low SDA_PIN
for n=0 to 7
b= (o_byte >> 7) & 1
if (b=1) then out_one
SDA_DIR=OUT
debug "0"
_clk
high SCL_PIN
pause 100
low SCL_PIN
pause 100
o_byte=o_byte << 1
next
return
out_one
SDA_DIR=IN
debug "1"
goto _clk
nack
SDA_DIR=OUT ' bring SDA high and clock
high SCL_PIN
low SCL_PIN
return
start
low SCL_PIN
SDA_DIR=IN ' SDA at logic one
high SCL_PIN
low SDA_PIN
SDA_DIR =OUT 'bring SDA low while clock is high
low SCL_PIN
debug "START"
debug $0d
return
sstop
low SCL_PIN
SDA_DIR=OUT
high SCL_PIN
SDA_DIR=IN 'bring SDA high while clock is high
debug "STOP"
debug $0d
return
I followed the tutorial here, http://www.phanderson.com/stamp/i2c/8574.html, flash a LED using below circuit and code. It didn't work and I'm not sure what happen.
Does anyone get a working SX example with 8574? Could you please share?
code.:
device var byte ' device 0-7
o_byte var byte ' byte to send to device
i_byte var byte ' byte from device
o_patt var byte ' byte to appear on output of 8574
i_patt var byte ' byte read from input of 8574
directions var byte ' defines which bits on 8574 are outputs
n var byte ' index
b var bit ' bit
SDA_PIN con 4
SCL_PIN con 5
SDA_OUT var out4
SCL_OUT var out5
SDA_IN var in4
SDA_DIR var dir4
OUT con 1
IN con 0
dirs=$f0ff
directions=$80 ' p7 of 8574 defined to be an input
device = 0 ' setting of A2 A1 A0
main
o_patt = $ff ' initialize all outputs to logic one
gosub out_patt
top
low SDA_PIN
gosub in_patt
debug hex i_patt
if ((i_patt & $80) >> 7 ) = 0 THEN flash
' if most sign bit is a zero then flash
o_patt = $01 ' otherwise, turn the LED off
gosub out_patt
goto top
flash ' wink the LED on and off one time
o_patt = $00
gosub out_patt
pause 300
o_patt = $01
gosub out_patt
pause 300
goto top
'*****
in_patt ' fetch input on addressed device
gosub start
o_byte = $40 | (device <<1) | $1
gosub out_byte
gosub nack
gosub in_byte
gosub nack
gosub sstop
i_patt = i_byte
return
out_patt ' output specified patt to addresses device
gosub start
o_byte = $40 | (device <<1)
gosub out_byte
gosub nack
o_byte = o_patt | directions ' bits defined as inputs set
' to logic one
gosub out_byte
gosub nack
gosub sstop
return
in_byte ' fetches 8 bits, most sign bit first
SDA_DIR=IN 'input
i_byte=0
for n=0 to 7
pause 200
high SCL_PIN ' clock high
pause 200
i_byte=(i_byte << 1) | SDA_IN 'read bit and or with prev
debug dec SDA_IN
low SCL_PIN
next
SDA_DIR=OUT 'output
return
out_byte ' output o_byte 'beginning with most sig bit
low SDA_PIN
for n=0 to 7
b= (o_byte >> 7) & 1
if (b=1) then out_one
SDA_DIR=OUT
debug "0"
_clk
high SCL_PIN
pause 100
low SCL_PIN
pause 100
o_byte=o_byte << 1
next
return
out_one
SDA_DIR=IN
debug "1"
goto _clk
nack
SDA_DIR=OUT ' bring SDA high and clock
high SCL_PIN
low SCL_PIN
return
start
low SCL_PIN
SDA_DIR=IN ' SDA at logic one
high SCL_PIN
low SDA_PIN
SDA_DIR =OUT 'bring SDA low while clock is high
low SCL_PIN
debug "START"
debug $0d
return
sstop
low SCL_PIN
SDA_DIR=OUT
high SCL_PIN
SDA_DIR=IN 'bring SDA high while clock is high
debug "STOP"
debug $0d
return
Comments
The schematic shows different BASIC Stamp connections than your code. This might be the problem.
Ken Gracey
Parallax, Inc.
Cheers,
Short of interrogating your code, I suggest you run a few of our examples:
http://www.parallax.com/dl/docs/cols/nv/vol3/col/nv79.pdf
Code for the above is found here:
http://www.parallax.com/html_pages/downloads/nvcolumns/Nuts_Volts_Downloads_V3.asp
Check for the correct I/O pin assignments, too. This code requires a BS2p24/40 or above. You mentioned that you have an "SX Stamp". If it's a BS2SX-IC it doesn't have the I2C commands.
Ken Gracey
Parallax, Inc.
It still doesn't work and I'm not sure what's the problem.
Cheers,
Double check the orientation of the LEDs. If they're installed backwards they won't light as expected.
Regards,
Bruce Bates
I've checked both polarities but still it didn't flash, it did gives debug output, is there any sourcecode & tutorial somewhere online?
Cheers,
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Jon Williams
Applications Engineer, Parallax