I've decided to abandon 5 months of learning C++ so I could use Arduinos and going back to the superior PBP and PIC MCUs. Having said that, Arduino had the most fantastic libraries which made I2C and MCP23017 (port expander), tremendously easy to use. I have code running that accesses 5 PE (port expander) equipped boards with 16 RGB LEDs each and able to access each individually with only a few commands.
I'm now using my Lab X1, PBP, a single MCP23017 trying to light ONE LED. Yes, this is my Hello World experiment. I have the anode of a common anode RGB LED attached to portA.0, portC2 and portC3 connected to the port expander I2C connections. My R,G, B cathodes are connected to portA.0, porta.1 and porta.2 of the port expander.
My program is attached. I'm using a logic probe to test pins, and get pulsing on the SDA and SCL lines. I get pulsing on the anode of the LED. On the 3 PE output lines I get a high pulse, that never goes low. Therein lies the problem...it has to go low since it's attached to the cathodes.
I'm convinced it's more a configuration problem than hardware. I had the same setup for Arduino which worked fine.
I stole some of the code from another writer and modified for my own use since I was just starting and didn't want to have to go through all the fuse parameters and other setup.
Anyone out there have some insight into what's happening and how to fix? Once I get this hello world action going, I'll be homefree and be able to do all the other re-coding (from C++ to PBP).
Code:
#config
__CONFIG _CONFIG1, _HS_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
#endconfig
DEFINE OSC 20 '20MHz crystal
DEFINE I2C_SLOW 1
DEFINE I2C_SCLOUT 1
ANSEL = 000000 'no analog, all digital!
ANSELH = 000000
TRISA = 000000 'all ports output
TRISC = 000000
SDA VAR PORTC.4 'i2c data line bob changed needed pullup
SCL VAR PORTC.3 'i2c clock line bob change
led var porta.0 'led for testing
addr var word '
INIT:
I2CWRITE SDA,SCL,$20,[$05,%10111000]
I2CWRITE SDA,SCL,$20,[$00,$00]
addr = $00
MAIN:
I2CWRITE SDA,SCL,$20,addr[$00]
gosub blink
goto main
blink:
led = 1 'blink led for feedback
PAUSE 50
led = 0
pause 50
return
Bookmarks