TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: rlcobos en 21 de Marzo de 2006, 07:57:00
-

Hola foreros,
Estoy intentando conectar dos pic via i2c.
Mejor dicho lo único que necesito es enviar una cadena de un pic a otro. ( He descartado la conexión serie para tenerla libre para otras tareas. ).
La idea es un pic dedicado a correr el programa, las entradas, las conversiones a/d, la conexión serie, etc ...
Y el segundo pic simplemente recibiría un valor via i2c del primero.
En función de este valor activará o desactivará alguno de los 20 relés integrados en la misma placa.
Es la primera vez que trabajo con I2C, lo tengo practicamente funcionando pero los valores que leo en pic esclavo no concuerdan con los que le envío desde el maestro. ( Es más no cambia el valor recibido aunque cambie el que le envío ).
El codigo que utilizo es el siguiente
Maestro
Include "modedefs.bas" " Include serial modes
DPIN var PORTc.4 " I2C data pin
CPIN var PORTc.3 " I2C clock pin
b0 var byte
b0="Q"
pause 10
:loop
I2CWRITE DPIN,CPIN,2,2,[b0]
pause 250
goto loop
end
Esclavo
"valores lcd
DEFINE LCD_DREG PORTD
" Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 0
" Set LCD Register Select port
DEFINE LCD_RSREG PORTb
" Set LCD Register Select bit
DEFINE LCD_RSBIT 5
" Set LCD Enable port
DEFINE LCD_EREG PORTb
" Set LCD Enable bit
DEFINE LCD_EBIT 6
" Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 4
" Set number of lines on LCD
DEFINE LCD_LINES 2
" Set command delay time in us
DEFINE LCD_COMMANDUS 2000
" Set data delay time in us
DEFINE LCD_DATAUS 50
Include "modedefs.bas" " Include serial modes
DPIN var PORTc.4 " I2C data pin
CPIN var PORTc.3 " I2C clock pin
B0 var byte
:loop
I2CREAD DPIN,CPIN,$A0,,127,[B0]
LCDOUT $FE,1,"SEÑAL " , b0 , " ", DEC b0
pause 250
Goto loop
end
Cuando intento correrlo siempre me muestra el valor 16 en el lcd.
Adjunto envio tambien el archivo simulador de proteus por si fuera error en las conexiones. ( lo he hecho deprisa y corriendo no me regañen.
)
un saludo y gracias anticipadas
raul l. cobos
-
Hola soy yo Raúl de nuevo,
leyendo de nuevo mi consulta veo que me he equivocado al pegar el codigo,
donde digo:
I2CREAD DPIN,CPIN,$A0,,127,[B0]
quiero decir:
I2CREAD DPIN,CPIN,2,2,[B0]
perdón y gracias.
-
Pues te comento que estas usando los 2 pics como maestros pues el i2cread y el i2cwrite se usan desde un pic maestro para leer y escribir sobre una memoria i2c. Ademas estos comandos hacen el i2c por software y no por hardware, por lo que estas desperdiciando el modulo i2c de tu micro.
Yo hice una maestro y un esclavo en PBP combinandolo con ASM. Dale una ojeada a este link:
http://miarroba.com/foros/ver.php?foroid=8826&temaid=4940774
Nos vemos
-
En primer lugar gracias por las molestias artifox,
Como he comentado al principio es la primera vez que uso el 12c y ando bastante perdido.
He probado tu codigo y al compilarlo me genera varias lineas con el siguiente error:
opcode expected instead of "wsave".
"sspstat".
....
...
Respecto a asm es un lenguaje que no conozco, así que poco he podido hacer.
¿ Sabeis a que se puede deber este error ?.
No obstante mientras he bajado otro codigo de ejemplo de algun lugar del web.
slave
( omito las declaraciones del LCD )
scl VAR PORTC.3 " I2C clock input
sda VAR PORTC.4 " I2C data input
" Define used register flags
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
" Define constants
I2Caddress CON %00011110
" Allocate RAM
datain VAR BYTE " Data in
counter1 VAR BYTE
dato var byte[7]
" Initialize I2C slave mode
TRISC = %11111111 " set PORTC to output ffor LEDs
TRISD = %00000000
PORTD=%00000000
SSPADD = I2caddress " Set our address
SSPCON = $36 "%00110110" Set to I2C slave with 7-bit address
PIE1.3 = 1 " SSP (I2C) interrupt enable
INTCON.6 = 1 " PEIE = Peripheral Interrupt Enable bit
INTCON.7 = 1 " GIE enable
SSPIF = 0
SSPSTAT = $00
pause 250
lcdout $fe,1,"Está funcionando"
mainloop:
IF SSPIF THEN
SSPIF = 0 " clear the flag
lcdout $fe,1,sspbuf
pause 50
dato = SSPBUF
SSPBUF = dato
CKP = 1
GOSUB Blink5 " let me know that i2c interrupt occurred
ENDIf
lcdout $fe,1,"Ejecutando..."
pause 250
GoTo mainloop " Do it forever
Blink5:
for counter1=0 to 8
lcdout $fe,1,dec dato[counter1]
pause 50
next
RETURN
end
master
SDA VAR PORTC.4 " Data
SCL VAR PORTC.3 " Clock
Angulo var byte[7]
Dir_S1 con %00011110" $02
Dir_S2 con $04
angulo[0]=%00011111
angulo[1]=22
angulo[2]=22
angulo[3]=22
angulo[4]=22
angulo[5]=22
"
TxI2C:
I2CWrite SDA,SCL,dir_s1,111,[angulo[0],angulo[1]],error
pause 50
high portb.1 " para saber si pasa por este punto.
goto txi2c:
: error
high portb.2
goto txi2c:
Con este codigo consigo mostrar en el display del esclavo la siguiente secuencia de bytes.
30,0,0,0,0,0,0,7
se que el primero es la direccion que le tengo asignada en i2cadress y el ultimo un recuento de bytes enviados.
pero no logro entender porque los demas datos me los muestra como ceros.
Creo que el salto a la etiqueta error que hace el comando 12cwrite del master es porque el esclavo no le ha devuelto el bit de reconociemto ACK. ¿ Pero como se lo envío ?
un saludo y gracias de antemano.
Raúl L. Cobos
a ver si me pueden dar una idea de por donde solucionarlo.
-
Bueno... hace mas de un año que no uso el i2c en basic, pues estoy mudando al C. El programa que viste era parte de un programa mas grandedonde el esclavo atendia el I2C como interrupcion.
Si ahora te esta dando errores es probablemente porque no se coordinan bien los tiempos entre envios. Por esa razon yo lo asia en ASM para no perder ni un dato (incluso hacia direccionamiento indirecto para guardar 12 valores seguidos).
Creo que para empezar ya que no sabes ASM es que revises los archivos que vienen con el PBP que estan en la misma carpeta del PBP o en estos links:
http://www.melabs.com/resources/samples/pbp/i2cslave.bas
http://www.melabs.com/resources/samples/pbp/i2cmast.bas
Ambos corresponden al Master y al Slave.. revisalos y me avisas...
Suerte

