Hi Bruce, thanks for the reply,
I use the following code and INCLUDE it in my main PBP file:
Code:
' ==============================================================================
' Constants
' ==============================================================================
CONTROL_BYTE con $40 ' write operation to device address $00
' Port Expander Registers
IOCON con $0A
IODIRA CON $00
IODIRB CON $01
GPIOA CON $14
GPIOB con $15
' ==============================================================================
' Pin Definitions
' ==============================================================================
SCLK var PORTC.3
SDI var PORTC.4
SDO var PORTC.5
nCS var PORTA.2
nRST var PORTA.3
REGISTER_BYTE var byte
DATA_BYTE var byte
goto EndOfPortExpander
' ==============================================================================
' Macros
' ==============================================================================
asm
PE_Init_As_Outputs macro ; Send appropriate initialisation bytes for Outputs
L?CALL _PE_INITIALISE_OUTPUTS
endm
PE_Write macro Data, Register ; Write Data to the Port Expander Register
MOVLW Data
MOVWF _DATA_BYTE
MOVLW Data
MOVWF PORTB
MOVLW Register
MOVWF _REGISTER_BYTE
L?CALL _SEND_PE_BYTE
endm
endasm
' ==============================================================================
' Subs
' ==============================================================================
PE_INITIALISE_OUTPUTS:
nRST = 0 ' reset the port expander
pause 10
nRST = 1
REGISTER_BYTE = IOCON
DATA_BYTE = %00100000
gosub SEND_PE_BYTE ' setup IOCON for Bank 0 non-sequetial operation
REGISTER_BYTE = IODIRA
DATA_BYTE = $00
gosub SEND_PE_BYTE ' set PORTA as output
REGISTER_BYTE = IODIRB
DATA_BYTE = $00
gosub SEND_PE_BYTE ' set PORTB as output
return
SEND_PE_BYTE:
nCS = 0 ' enable PE
Shiftout SDO, SCLK, 1, [CONTROL_BYTE,REGISTER_BYTE,DATA_BYTE]
nCS = 1 '
pause 10
return
EndOfPortExpander:
The problem I am having is when invoking the PE_WRITE macro. To check what is being passed to the macro I am writing Data to PORTB. When I invoke the following:
Code:
@ PE_Write 55h, _GPIOA
I get 55h on PORTB - it works correctly. However when I call the following:
Code:
Temp VAR BYTE
Temp = $55
@ PE_Write _Temp, _GPIOA
I get 22h on PORTB. I have tried other numbers for Temp but they all show 22h on PORTB.
I can only think that this is some kind of type mismatch but I don't see how. Any ideas?
Bookmarks