;======================================================================
; Demo Program to test MCP23017 inputs with interrupt
;======================================================================
;
#PICAXE 28X1 ; or 40X1 or an X2 device with HI2C.... commands for 18X change to i2cslave, i2c write and i2cread commands
;
; MCP23017 Device Address constant
SYMBOL Expand0 = %01000000 ; $0100 A2, A1, A0, R/W
;
; MCP23017 register address constants
SYMBOL IODIRA = $00 ; Port A IO Direction register
SYMBOL IODIRB = $01 ; Port B IO Direction register
SYMBOL IPOLA = $02 ; Port A Input Polarity Register
SYMBOL IPOLB = $03 ; Port B Input Polarity Register - not used in this code example
SYMBOL GPINTENA = $04 ; Port A GPIO Interrupt on-change pins
SYMBOL GPINTENB = $05 ; Port B GPIO Interrupt on-change pins - not used in this code example
SYMBOL DEFVALA = $06 ; Port A Interrupt register default value
SYMBOL DEFVALB = $07 ; Port A Interrupt register default value - not used in this code example
SYMBOL INTCONA = $08 ; Port A Interrupt Control Register
SYMBOL INTCONB = $09 ; Port B Interrupt Control Register - not used in this code example
SYMBOL IOCON = $0A ; IO Expander config register - address $0B accesses the same register
SYMBOL GPPUA = $0C ; Port A GPIO Pull-up resistor register
SYMBOL GPPUB = $0D ; Port B GPIO Pull-up resistor register - not used in this code example
SYMBOL INTFA = $0E ; Port A Interrupt Flag Register
SYMBOL INTFB = $0F ; Port B Interrupt Flag Register - not used in this code example
SYMBOL INTCAPA = $10 ; Port A Interrupt Capture Register
SYMBOL INTACPB = $11 ; Port B Interrupt Capture Register - not used in this code example
SYMBOL GPIOA = $12 ; Port A General purpose register
SYMBOL GPIOB = $13 ; Port B General Purpose register
SYMBOL OLATA = $14 ; Port A Output Latch register
SYMBOL OLATB = $15 ; Port B Output Latch register
;
;
; Intialise
HI2CSETUP i2cmaster, Expand0, i2cfast, i2cbyte
;
; Control register setup:
; seq reg addressing, INT pins separate, Seq Op for addr auto inc, --, --, Active Int drive, Int Active low
HI2COUT IOCON, ($00)
;
HI2COUT IODIRA, ($FF, $00) ; set all port A pins as inputs (1) and all port B pins as outputs (0)
HI2COUT IPOLA, ($00) ; port A register bits have same logic state as the signal on physical pin
HI2COUT GPPUA, ($FF) ; enable all port A 100 kOhm pull-up resistors
HI2COUT GPINTENA, ($FF) ; enable all Port A pins for interrupt on change
HI2COUT DEFVALA, ($FF) ; normal state is all port A pins is high - a low causes an interrupt
;
; set up for Interrupts from MCP23017 on PICACE input 1
SETINT %00000010, %00000010 ; to interrupt on input1 high only
; SETINT %00000000, %00000010 ; to interrupt on input1 low only
;
; Main program loop - displays a continual "Knight Rider" style shifting LED across the 8 outputs on port B
Main:
DO
b3 = 1
DO ; LED dot pattern to move left
HI2COUT GPIOB, (b3)
b3 = b3 << 1 ; shift left 1 bit
PAUSE 500
LOOP UNTIL b3 = 0
b3 = 64
DO ; LED dot pattern to move right
HI2COUT GPIOB, (b3)
b3 = b3 >> 1 ; shift right 1 bit
PAUSE 500
LOOP UNTIL b3 = 1
LOOP ; loop forever waiting for an interrupt
;
; Interrupt Subroutine – called when MCP23017 input on Port A is pulled low
; Stops the "Knight Rider" effect and flashes the LED corresponding to the input pin on Port A that has been switched low.
Interrrupt:
HI2CIN INTFA, (b0) ; fetch the IO Expander Flag register – set bit indicates pin causing interrupt
HI2CIN INTCAPA, (b1) ; fetch the status for all port A pins at time of the interrupt
FOR b2 = 1 to 5 ; flash LED corresponding to the input causing interrupt 5 times
HI2COUT GPIOB, (b0) ; set LED ON
PAUSE 300
HI2COUT GPIOB, ($00) ; all LEDs OFF
PAUSE 300
NEXT b2
HI2COUT GPIOB, (b3) ; Show the original LED again
SETINT %00000010, %00000010 ; turn the interrupt function back on
RETURN