Autor Tema: Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )  (Leído 3052 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rlcobos

  • PIC10
  • *
  • Mensajes: 14
Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )
« en: 21 de Marzo de 2006, 07:57:00 »
Ardiendo

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. Sonrisa Gigante)

un saludo y gracias anticipadas

raul l. cobos

Desconectado rlcobos

  • PIC10
  • *
  • Mensajes: 14
RE: Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )
« Respuesta #1 en: 21 de Marzo de 2006, 08:56:00 »
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.

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )
« Respuesta #2 en: 22 de Marzo de 2006, 15:11:00 »
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 Rebotado
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado rlcobos

  • PIC10
  • *
  • Mensajes: 14
RE: Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )
« Respuesta #3 en: 24 de Marzo de 2006, 13:41:00 »
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.

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: Comunicar dos pic mediante i2c. ( ¿ En que estoy fallando ? )
« Respuesta #4 en: 24 de Marzo de 2006, 21:55:00 »
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...

SuerteRebotadoRebotadoRebotadoRebotado
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)


 

anything