Hola a Todos,
Me presento, mi nombre es Daniel y trabajo con PICs hace 8 años aproximadamente. Me registre en el foro para ver si podrian darme una mano con un problemita que tengo.
Les comento, tengo dos PICs 16f88, uno maestro y otro esclavo. Estoy tratando de escribir (esto anda) y leer (esto no anda) desde un PIC a otro con el protocolo I2C.
Lei mucho sobre el tema, decenas de ejemplos en diferentes lenguajes, idiomas pero sigo sin poder leer un byte desde el PIC maestro.
El codigo maestro es bastante simple:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
' Master
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
@ device pic16f88, intrc_osc_noclkout ' system clock options
@ device pic16f88, wdt_on ' watchdog timer
@ device pic16f88, pwrt_on ' power-on timer
@ device pic16f88, mclr_off ' master clear options (internal)
@ device pic16f88, protect_off ' code protect off
'-------------------------------------------------------------------------------
DEFINE OSC 8
OSCCON = %01110001 '8mhz
'-------------------------------------------------------------------------------
CMCON = 7
ADCON1 = 0 ' Disable A/D converter
ADCON0 = 0
ANSEL = 0 ' all analog pins to digital
'-------------------------------------------------------------------------------
DEFINE I2C_HOLD 1
DEFINE I2C_SLOW 1
scl VAR PORTB.4 ' i2c clock input
sda VAR PORTB.1 ' i2c data input
valor VAR BYTE ' value to read
LED VAR PORTA.6
'-------------------------------------------------------------------------------
main:
valor = 0
' I2CWrite sda, scl, $01, [31]
' High LED
' Pause 100
' I2CWrite sda, scl, $01, [30]
' Low LED
' Pause 100
I2CRead sda, scl, $01, [valor]
IF (valor = 24) Then
High LED
Pause 500
Low LED
EndIF
GoTo main
'-------------------------------------------------------------------------------
End
'-------------------------------------------------------------------------------
Y codigo esclavo es el siguiente:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
' Slave
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
@ device pic16f88, intrc_osc_noclkout ' system clock options
@ device pic16f88, wdt_on ' watchdog timer
@ device pic16f88, pwrt_on ' power-on timer
@ device pic16f88, mclr_off ' master clear options (internal)
@ device pic16f88, protect_off ' code protect off
'-------------------------------------------------------------------------------
DEFINE OSC 8
OSCCON = %01110001 '8mhz
'-------------------------------------------------------------------------------
CMCON = 7
ADCON1 = 0 ' Disable A/D converter
ADCON0 = 0
ANSEL = 0 ' all analog pins to digital
'-------------------------------------------------------------------------------
DEFINE I2C_HOLD 1
DEFINE I2C_SLOW 1
'-------------------------------------------------------------------------------
SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag
BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
R_W VAR SSPSTAT.2 ' SSP (I2C) Read/Write
D_A VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKP VAR SSPCON.4 ' SSP (I2C) SCK Release Control
SSPEN VAR SSPCON.5 ' SSP (I2C) Enable
SSPOV VAR SSPCON.6 ' SSP (I2C) Receive Overflow Indicator
WCOL VAR SSPCON.7 ' SSP (I2C) Write Collision Detect
'-------------------------------------------------------------------------------
I2Caddress CON 1 ' Make our address 1
'-------------------------------------------------------------------------------
SSPADD = I2Caddress ' Set our address
SSPCON = $36 ' Set to I2C slave with 7-bit address
'-------------------------------------------------------------------------------
LEDR VAR PORTA.3 ' LED 1
LEDL VAR PORTB.3 ' LED 2
BZR VAR PORTA.7 ' Buzzer
RL6 VAR PORTB.6 ' Relay 1
RL12 VAR PORTB.5 ' Relay 2
'-------------------------------------------------------------------------------
datain VAR BYTE ' Data in
dataout VAR BYTE ' Data out
'-------------------------------------------------------------------------------
GoTo boot
'-------------------------------------------------------------------------------
i2cslave: ' I2C slave subroutine
SSPIF = 0
IF R_W = 1 Then i2crd ' Read data from us
IF BF = 0 Then i2cexit ' Nothing in buffer so exit
IF D_A = 1 Then i2cwr ' Data for us (not address)
IF SSPBUF != I2Caddress Then i2cexit ' Clear the address from the buffer
GoTo i2cexit
'-------------------------------------------------------------------------------
i2cwr: ' I2C write data to us
datain = SSPBUF ' Put data into array
GoTo i2cexit
'-------------------------------------------------------------------------------
i2crd: ' I2C read data from us
SSPBUF = dataout ' Get data from array
CKP = 1 ' Release SCL line
GoTo i2cexit ' That's it
'-------------------------------------------------------------------------------
i2cexit:
SSPOV = 0
WCOL = 0
Return
'-------------------------------------------------------------------------------
boot:
Pause 500
High RL12
High RL6
'-------------------------------------------------------------------------------
main:
dataout = 24
IF SSPIF = 1 Then
GoSub i2cslave
Toggle LEDL
EndIF
IF datain = 121 Then ' on 12v
High RL12
EndIF
IF datain = 120 Then ' off 12v
Low RL12
EndIF
IF datain = 61 Then ' on 6v
High RL6
EndIF
IF datain = 60 Then ' off 6v
Low RL6
EndIF
IF datain = 31 Then ' on buzer
High BZR
EndIF
IF datain = 30 Then ' off buzzer
Low BZR
EndIF
GoTo main
'-------------------------------------------------------------------------------
End
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
No veo porque no puedo leer un byte desde el PIC maestro, ya pase muchas horas y creo que necesito un nuevo par de ojos que miren lo que yo no encuentro.
Saludos y gracias!
Daniel.
PD: me olvidaba, antes que alguno me diga que use los ejemplos de la pagina de MeLabs, esos no andan!!!