It won't let me add info to my previous post above:
16F18877
MCP23017
Using 1K/130pF on SCL/SDA as mentioned on p.5 of datasheet (they use 135pF).
It won't let me add info to my previous post above:
16F18877
MCP23017
Using 1K/130pF on SCL/SDA as mentioned on p.5 of datasheet (they use 135pF).
Last edited by Demon; - 4th October 2024 at 05:16.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
I didn't quite understand what they meant with the Bank A/B at first.
I've now tried with both versions, and still no blinky.
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 define CCP1_REG 0 ' Must clear unused CCP pins or else unpredictable results DEFINE CCP1_BIT 0 define CCP2_REG 0 DEFINE CCP2_BIT 0 DEFINE CCP3_REG PORTB DEFINE CCP3_BIT 5 define CCP4_REG 0 DEFINE CCP4_BIT 0 define CCP5_REG 0 DEFINE CCP5_BIT 0 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 TRISA = %00000000 TRISB = %00000000 TRISC = %00000000 TRISD = %00000000 TRISE = %00001000 PinSCL2 VAR PortB.1 PinSDA2 VAR PortB.2 HPWM 3, 8, 1953 addr var byte : addr = %01000000 ' $40 IOCONreg var byte : IOCONreg = $05 IOCONdat var byte : IOCONdat = %00110000 ' Bank=0 'IOCONdat var byte : IOCONdat = %10110000 ' Bank=1 ' bit 7 1 = The registers associated with each port are separated into different banks. ' bit 6 0 = The INT pins are not connected. INTA is associated with PORTA and INTB is associated with PORTB ' bit 5 1 = Sequential operation disabled, address pointer does not increment. ' bit 4 1 = Slew rate disabled ' bit 3 0 = Disables the MCP23S17 address pins. ' bit 2 0 = Active driver output (INTPOL bit sets the polarity.) ' bit 1 0 = Active-low ' bit 0 Unimplemented: Read as ‘0’ I2CWRITE PinSDA2,PinSCL2,addr,IOCONreg,[IOCONdat] : pauseus 1 IODIRAreg var byte : IODIRAreg = $00 ' Bank=0 'IODIRAreg var byte : IODIRAreg = $00 ' Bank=1 IODIRAdat var byte : IODIRAdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,IODIRAreg,[IODIRAdat] : pauseus 1 'set GPIOA all output IODIRBreg var byte : IODIRBreg = $01 ' Bank=0 'IODIRBreg var byte : IODIRBreg = $10 ' Bank=1 IODIRBdat var byte : IODIRBdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,IODIRBreg,[IODIRBdat] : pauseus 1 'set GPIOB all output OLATAreg var byte : OLATAdat var byte OLATBreg var byte : OLATBdat var byte LOOOP: OLATAreg = $14 : OLATAdat = %00000000 ' Bank=0 ' OLATAreg = $0A : OLATAdat = %00000000 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATAdat] : pauseus 1 OLATBreg = $15 : OLATBdat = %00000000 ' Bank=0 ' OLATBreg = $1A : OLATBdat = %00000000 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATBdat] : pauseus 1 pause 250 OLATAreg = $14 : OLATAdat = %11111111 ' Bank=0 ' OLATAreg = $0A : OLATAdat = %11111111 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATAdat] : pauseus 1 OLATBreg = $15 : OLATBdat = %11111111 ' Bank=0 ' OLATBreg = $1A : OLATBdat = %11111111 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATBdat] : pauseus 1 pause 250 GOTO LOOOP end
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Argh, won't let me add a comment.
Apparently I still hadn't understood how I'm supposed to set the register for IOCON.
Latest attempt, still no workie.
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 define CCP1_REG 0 ' Must clear unused CCP pins or else unpredictable results DEFINE CCP1_BIT 0 define CCP2_REG 0 DEFINE CCP2_BIT 0 DEFINE CCP3_REG PORTB DEFINE CCP3_BIT 5 define CCP4_REG 0 DEFINE CCP4_BIT 0 define CCP5_REG 0 DEFINE CCP5_BIT 0 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 TRISA = %00000000 TRISB = %00000000 TRISC = %00000000 TRISD = %00000000 TRISE = %00001000 PinSCL2 VAR PortB.1 PinSDA2 VAR PortB.2 HPWM 3, 8, 1953 addr var byte : addr = %01000000 ' $40 IOCONAreg var byte : IOCONAreg = $0A ' Bank=0 IOCONBreg var byte : IOCONBreg = $0B ' Bank=0 IOCONdat var byte : IOCONdat = %00110000 ' Bank=0 'IOCONAreg var byte : IOCONAreg = $05 ' Bank=1 'IOCONBreg var byte : IOCONBreg = $15 ' Bank=1 'IOCONdat var byte : IOCONdat = %10110000 ' Bank=1 ' bit 7 0 = The registers associated with each port are separated into different banks. ' bit 6 0 = The INT pins are not connected. INTA is associated with PORTA and INTB is associated with PORTB ' bit 5 1 = Sequential operation disabled, address pointer does not increment. ' bit 4 1 = Slew rate disabled ' bit 3 0 = Disables the MCP23S17 address pins. ' bit 2 0 = Active driver output (INTPOL bit sets the polarity.) ' bit 1 0 = Active-low ' bit 0 Unimplemented: Read as ‘0’ I2CWRITE PinSDA2,PinSCL2,addr,IOCONAreg,[IOCONdat] I2CWRITE PinSDA2,PinSCL2,addr,IOCONBreg,[IOCONdat] IODIRAreg var byte : IODIRAreg = $00 ' Bank=0 'IODIRAreg var byte : IODIRAreg = $00 ' Bank=1 IODIRAdat var byte : IODIRAdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,IODIRAreg,[IODIRAdat] 'set GPIOA all output IODIRBreg var byte : IODIRBreg = $01 ' Bank=0 'IODIRBreg var byte : IODIRBreg = $10 ' Bank=1 IODIRBdat var byte : IODIRBdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,IODIRBreg,[IODIRBdat] 'set GPIOB all output OLATAreg var byte : OLATAdat var byte OLATBreg var byte : OLATBdat var byte LOOOP: OLATAreg = $14 : OLATAdat = %00000000 ' Bank=0 ' OLATAreg = $0A : OLATAdat = %00000000 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATAdat] OLATBreg = $15 : OLATBdat = %00000000 ' Bank=0 ' OLATBreg = $1A : OLATBdat = %00000000 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATBdat] pause 250 OLATAreg = $14 : OLATAdat = %11111111 ' Bank=0 ' OLATAreg = $0A : OLATAdat = %11111111 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATAdat] OLATBreg = $15 : OLATBdat = %11111111 ' Bank=0 ' OLATBreg = $1A : OLATBdat = %11111111 ' Bank=1 I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATBdat] pause 250 GOTO LOOOP end
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
For the MCP23017 28-pin DIP package make sure you have connections to:
RESETn (pin 18)
A2, A1, A0 (pins 17, 16, 15) - these should be pulled low (GND) for address $40... they should not be left floating
There should also be pullups to VDD on SCL (pin 12) and SDA (pin 13)
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Streamlined code even more:
No longer need to mess with comments to change BANK setting. I just flip bit in IOCONdat and IF takes care of the rest.Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 define CCP1_REG 0 ' Must clear unused CCP pins or else unpredictable results DEFINE CCP1_BIT 0 define CCP2_REG 0 DEFINE CCP2_BIT 0 DEFINE CCP3_REG PORTB DEFINE CCP3_BIT 5 define CCP4_REG 0 DEFINE CCP4_BIT 0 define CCP5_REG 0 DEFINE CCP5_BIT 0 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 TRISA = %00000000 TRISB = %00000000 TRISC = %00000000 TRISD = %00000000 TRISE = %00001000 PinSCL2 VAR PortB.1 PinSDA2 VAR PortB.2 HPWM 3, 8, 1953 addr var byte : addr = %01000000 ' $40 IOCONAreg var byte IOCONBreg var byte IODIRAreg var byte IODIRBreg var byte OLATAreg var byte OLATBreg var byte IOCONdat var byte IODIRdat var byte OLATdat var byte IOCONdat = %00110000 ' bit 7 0 = The registers associated with each port are separated into different banks. ' bit 6 0 = The INT pins are not connected. INTA is associated with PORTA and INTB is associated with PORTB ' bit 5 1 = Sequential operation disabled, address pointer does not increment. ' bit 4 1 = Slew rate disabled ' bit 3 0 = Disables the MCP23S17 address pins. ' bit 2 0 = Active driver output (INTPOL bit sets the polarity.) ' bit 1 0 = Active-low ' bit 0 Unimplemented: Read as ‘0’ if IOCONdat.7 = 0 then ' Bank=0 IOCONAreg = $0A IOCONBreg = $0B IODIRAreg = $00 IODIRBreg = $01 OLATAreg = $14 OLATBreg = $15 else ' Bank=1 IOCONAreg = $05 IOCONBreg = $15 IODIRAreg = $00 IODIRBreg = $10 OLATAreg = $0A OLATBreg = $1A endif IODIRdat = %00000000 'set GPIO all output I2CWRITE PinSDA2,PinSCL2,addr,IOCONAreg,[IOCONdat] I2CWRITE PinSDA2,PinSCL2,addr,IODIRAreg,[IODIRdat] I2CWRITE PinSDA2,PinSCL2,addr,IOCONBreg,[IOCONdat] I2CWRITE PinSDA2,PinSCL2,addr,IODIRBreg,[IODIRdat] LOOOP: OLATdat = %00000000 ' LEDs ON I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATdat] I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATdat] pause 200 OLATdat = %11111111 ' LEDs OFF I2CWRITE PinSDA2,PinSCL2,addr,OLATAreg,[OLATdat] I2CWRITE PinSDA2,PinSCL2,addr,OLATBreg,[OLATdat] pause 200 GOTO LOOOP end
Quadruple checked everything, still no blinky blink.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Changed to GPIO instead of LAT as per Dave's suggestion here:
https://www.picbasic.co.uk/forum/sho...6693#post96693
Also played with the syntax (register now part of the list of data).
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 define CCP1_REG 0 ' Must clear unused CCP pins or else unpredictable results DEFINE CCP1_BIT 0 define CCP2_REG 0 DEFINE CCP2_BIT 0 DEFINE CCP3_REG PORTB DEFINE CCP3_BIT 5 define CCP4_REG 0 DEFINE CCP4_BIT 0 define CCP5_REG 0 DEFINE CCP5_BIT 0 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 TRISA = %00000000 TRISB = %00000000 TRISC = %00000000 TRISD = %00000000 TRISE = %00001000 PinSCL2 VAR PortB.1 PinSDA2 VAR PortB.2 HPWM 3, 8, 1953 addr var byte : addr = %01000000 ' $40 IOCONAreg var byte IOCONBreg var byte IODIRAreg var byte IODIRBreg var byte GPIOAreg var byte GPIOBreg var byte IOCONdat var byte IODIRdat var byte GPIOdat var byte IOCONdat = %10110000 ' bit 7 0 = The registers associated with each port are separated into different banks. ' bit 6 0 = The INT pins are not connected. INTA is associated with PORTA and INTB is associated with PORTB ' bit 5 1 = Sequential operation disabled, address pointer does not increment. ' bit 4 1 = Slew rate disabled ' bit 3 0 = Disables the MCP23S17 address pins. ' bit 2 0 = Active driver output (INTPOL bit sets the polarity.) ' bit 1 0 = Active-low ' bit 0 Unimplemented: Read as ‘0’ if IOCONdat.7 = 0 then ' Bank=0 IOCONAreg = $0A IOCONBreg = $0B IODIRAreg = $00 IODIRBreg = $01 GPIOAreg = $12 GPIOBreg = $13 else ' Bank=1 IOCONAreg = $05 IOCONBreg = $15 IODIRAreg = $00 IODIRBreg = $10 GPIOAreg = $09 GPIOBreg = $19 endif IODIRdat = %00000000 'set GPIO all output I2CWRITE PinSDA2,PinSCL2,addr,[IOCONAreg,IOCONdat] I2CWRITE PinSDA2,PinSCL2,addr,[IODIRAreg,IODIRdat] I2CWRITE PinSDA2,PinSCL2,addr,[IOCONBreg,IOCONdat] I2CWRITE PinSDA2,PinSCL2,addr,[IODIRBreg,IODIRdat] LOOOP: GPIOdat = %00000000 ' LEDs ON I2CWRITE PinSDA2,PinSCL2,addr,[GPIOAreg,GPIOdat] I2CWRITE PinSDA2,PinSCL2,addr,[GPIOBreg,GPIOdat] pause 200 GPIOdat = %11111111 ' LEDs OFF I2CWRITE PinSDA2,PinSCL2,addr,[GPIOAreg,GPIOdat] I2CWRITE PinSDA2,PinSCL2,addr,[GPIOBreg,GPIOdat] pause 200 GOTO LOOOP end
Tried with both Bank settings, still no good.
I'm quickly running out of crazy ideas.![]()
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
The example you refer to used and expected iocon.bank to = 1 , why i chose that and how it got that way are lost into the mystery of time. [probably some weird dev board]
this simulates ok for bank=0
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_ON & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_ON __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 ANSELB = 0 PinSCL2 VAR PortB.1 PinSDA2 VAR PortB.2 GPIOAdat var byte GPIOBdat var byte addr var byte reg var byte dat var byte addr = %01000000 ' $40 ; UNCOMMENT EITHER SECTION BANK=0 OR BANK=1 NOT BOTH ;START IOCON.BANK=0 reg = 0 dat = 0 I2CWRITE PinSDA2,PinSCL2,addr,reg,[dat] 'set GPIOA all output reg = 1 dat = 0 I2CWRITE PinSDA2,PinSCL2,addr,reg,[dat] 'set GPIOB all output LOOOP: reg = $12 : GPIOAdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOAdat] reg = $13 : GPIOBdat = %00000000 I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOBdat] pause 250 reg = $12 : GPIOAdat = %11111111 I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOAdat] reg = $13 : GPIOBdat = %11111111 I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOBdat] pause 250 GOTO LOOOP end ;IOCON.BANK=0 ;START IOCON.BANK=1 ; NOT TESTED BANK=1 NOT SUPPORTED IN SIMULATOR 'reg = $A 'dat = %10100000 'I2CWRITE PinSDA2,PinSCL2,addr,reg,[dat] 'reg = 0 'dat = 0 'I2CWRITE PinSDA2,PinSCL2,addr,reg,[dat] 'set GPIOA all output 'reg = $10 'dat = 0 'I2CWRITE PinSDA2,PinSCL2,addr,reg,[dat] 'set GPIOB all output 'LOOOP: ' reg = $9 : GPIOAdat = %00000000 ' I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOAdat] ' reg = $19 : GPIOBdat = %00000000 ' I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOBdat] ' pause 250 ' reg = $9 : GPIOAdat = %11111111 ' I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOAdat] ' reg = $19 : GPIOBdat = %11111111 ' I2CWRITE PinSDA2,PinSCL2,addr,reg,[GPIOBdat] ' pause 250 ' GOTO LOOOP 'end ;IOCON.BANK=1
Warning I'm not a teacher
Bookmarks