I am using an external oscillator and not the internals. I will post the test code - no problem but what I can't get is WHY the pins don't toggle when I use the I2C command - they should shouldn't they?
I know that. And if you read the datasheet you'll see references to the 4xPLL. You must be using an external 40Mhz clock if you're not using the internal PLL.
Then post the code...I will post the test code - no problem but what I can't get is WHY the pins don't toggle when I use the I2C command - they should shouldn't they?
Code I am using is shown below- The remarked lines are for FULL use.........
When I manually toggle both I2C pins by the same method I use for the 'heartbeat' LED, they work as they should. (Had to cut code to 10,000 chars <grin>).
'---------------------------------------------------------------------------------------
'Define configuration bits - 'Set for using PIC18F4680 - 'Program using the USB MELABS programmer
'*** NOTICE ***
'The INC file in PBP has been modified to allow TOTAL CONFIGURATION of the fuses!
@ __CONFIG _CONFIG1H, _OSC_ECIO_1H & _FCMEN_ON_1H
'External oscillator, RA6 GIO
'Fail-safe clk monitor ENABLED
@ __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOREN_BOHW_2L
'Power up Timer ENABLED
'Brown-out reset ENABLED in h-ware only
@ __CONFIG _CONFIG2H, _WDT_OFF_2H
'Watchdog DISABLED
@ __CONFIG _CONFIG3H, _MCLRE_OFF_3H & _PBADEN_OFF_3H
'MCLR is DISABLED, RE3 is INPUT
'PORTB is DIGITAL on reset
@ __CONFIG _CONFIG4L, _LVP_ON_4L & _STVREN_ON_4L & _XINST_ON_4L & _DEBUG_OFF_4L
'Single supply ICSP ENABLED
'Stack Overflow reset is ENABLED
'Enhanced CPU is ENABLED
'Background debugger DISABLED
@ __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
'Code Protect Block 0, 1, 2, 3
'---------------------------------------------------------------------------------------
'Define the oscillator or crystal used
DEFINE OSC 40 '40 MHz oscillator, one clk input
INCLUDE "MODEDEFS.BAS" 'Include Shiftin/out modes if we need them
'---------------------------------------------------------------------------------------
define LCD_DREG PORTA
define LCD_DBIT 0
define LCD_RSREG PORTA
define LCD_RSBIT 6
define LCD_EREG PORTA
define LCD_EBIT 5
define LCD_BITS 4 define LCD_LINES 4 define LCD_COMMANDUS 4000
define LCD_DATAUS 100
'---------------------------------------------------------------------------------------
'Lets setup the MCP23016s
' define I2C_HOLD 1
define I2C_SLOW
'---------------------------------------------------------------------------------------
'OKAY, Lets set up the registers.....
CMCON=%00000111 'Disables comparators, Port A
ADCON0=%00000000 'Turns off ADC, Port A
ADCON1=%00001111
CMCON =%00000111 'Turns OFF comparators
CVRCON=%00000000 'DISABLES comparator voltage module
ECCP1CON=%00000000 'DISABLES PWMs and such
'---------------------------------------------------------------------------------------
'Direction registers
TRISA = %10000000 'Set PORTA to all output
TRISB = %11111111 'set all the pins of PORTB to INPUT
TRISC = %10000111 'Set RC6 (TX), RC3 (SCL), RC4 (SDA)
'Set RC7 (RX), RC0-RC2 are 3 address lines
TRISD = %00000000 'Set PORTD to outputs
TRISE = %00000000 'Set PORTE to outputs except RE3 which can ONLY be input
'---------------------------------------------------------------------------------------
'Additional I/O Definitions
fault var PORTE.1 'FAULT output, low active (LED and Sonalert)
heart var PORTE.0 'Heartbeat to know we are online
CTS Var PORTE.2 'Goes high to xmit on RS485
idata var PORTC.4 'I2C data pin - put 4.7k pullup!
iclock var PORTC.3 'I2C clock pin - put 4.7k pullup!
'Setup MCP23016; GP1.0-GP1.7 as inputs, GP0.0-GP0.7 as outputs
'---------------------------------------------------------------------------------------
'Variable List
p_addr var byte 'Address of this processor
K var byte 'Hex convertor variable
i var byte 'Loop variable
s var byte 'Seconds placeholder
m var byte 'Minutes placeholder
timers var byte[8] 'An array of 8 bytes to function as timers
door var byte 'Loop counter
DPI var byte
locks var byte
loop var byte
i2c_addr var byte 'Address variable for the MCP23016
i2cdoor var byte[8] 'An array of 8 bytes for I2C doors
i2cdpi var byte[8] 'An array of 8 bytes for I2C Door Position
i2cswitch var byte
i2cled var byte
'################################################# ############
'# We are going to start this Pig!
'################################################# ############
init:
pause 1000 'Hold here for a bit while things IPL......
heart=1 'Turns off HEARTBEAT led
fault=1 'Turns off FAULT led
for i2c_addr=0 to 7
' i2c_addr=$20 'address 0 for the test
i2cwrite idata,iclock,$06,i2c_addr,[$00,$FF] 'Sets GP0.0-GP0.7 as OUTPUTS
pause 20
i2cwrite idata,iclock,$07,i2c_addr,[$FF,$00] 'Sets GP1.0-GP1.7 as INPUTS
pause 20
next i2c_addr
'################################################# ############
'# We go around the rest of the subroutines
'################################################# ############
Initialize:
goto startmain 'Jumps around subroutines
'################################################# ############
'# Subroutines
'################################################# ############
dly300: pause 300
return
initlcd:lcdout $fe,1 'Inits the lcd
return
get_addr:
p_addr = PORTC & %00000111
return
chirp: for i=1 to 3
low fault
pause 50
high fault
pause 50
next i
return
errori2c:
lcdout $FE,2," "
lcdout $FE,$C0," "
lcdout $FE,$94,"No ACK from I2C dev "
lcdout $FE,$D4," "
pause 2000
return
'################################################# ############
' Hokay boyz, here we go......
'################################################# ############
startmain:
'This is where it breaks down. I do not get any signals that change at the DATA and CLOCK pins on the proc.
'DATA pin stays low and the CLOCK pin stays high.
'I changed this short test area to pulse both pins in a tight loop
'and that was just fine.
'It is as if the I2C portion died! But, I am sure something I have done.......
'I have checked and double-checked the I2C statements and they look fine.....
check: gosub get_addr 'Just as a check of what addr the board is....for diagnostic
loop=loop+1 'loop counter for heartbeat led 'pulse'
' i2c_addr=$20
' i2cread idata,iclock,$01,i2c_addr,[i2cswitch],errori2c
pause 20 'Pause cause apparently we need to
'' next i2c_addr 'Go get the next set of switches
i2c_addr=0
i2cwrite idata,iclock,0,0,[loop],errori2c
pause 10 'Display for a while
if loop=<10 then low heart 'A way to turn off the heartbeat pulse
if loop=>11 then high heart 'A way to turn on heartbeat pulse
if loop=20 then loop=0 'Resets us so we know we are alive
goto check
end
Unless your programmer use this pin to program your PIC, high unlikely, you want to use LVP_OFF, unless it may not work as expected.@ __CONFIG _CONFIG4L, _LVP_ON_4L & _STVREN_ON_4L & _XINST_ON_4L & _DEBUG_OFF_4L
'Single supply ICSP ENABLED
'Stack Overflow reset is ENABLED
'Enhanced CPU is ENABLED
Second test, use the internal OSC or lower value for the external.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Thanks to both.
Mr. E, I have changed the code to:
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & _STVREN_ON_4L & _XINST_ON_4L & _DEBUG_OFF_4L
AND changed the oscillator to 20 MHz:
DEFINE OSC 20
and now BOTH lines are low all the time.......
This is confounding, I am certain it will be a simple thing but I can not see it..... however, I do smell a lot of pine....... <grin>.
Again, any help no matter how critical would be appreciated. Datasheet reading have proved as helpful as the tea readings.......
UPDATE-
I built another test board (had several made overseas) and it does the same thing. Also tried another 6 pin programming cable - same thing.
Tried different I2C defines such as
define I2C_HOLD 1
define I2C_SLOW
with no luck, lines are either fixed at both high or one is high and the other is low - this should be telling me something - just don't know what it is.......
OK, I have tried more things, but no difference:
i2cwrite idata,iclock,$2E,$06,[$00,$00]
pause 20
The idea is to force the R/W bit (0) to low for a write to the registers and telling the 23016 that both ports are outputs.
BOTH the clock and data lines from the proc are high and do not wiggle at all under I2C commands but still can be made to wiggle under the HIGH and LOW coomands for individual pins.
Still appears that no matter what I try to do with the I2C commands, the pins are silent.....
Bookmarks