Autor Tema: I2C por software (i2cwrite, i2cread)  (Leído 4120 veces)

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

Desconectado manu2097

  • PIC10
  • *
  • Mensajes: 17
I2C por software (i2cwrite, i2cread)
« en: 21 de Diciembre de 2004, 10:18:00 »
No consigo comunicarme con una memoria i2c 24c04 con los comandos i2cwrite, i2cread. ¿Alguien ha podido hacerlo?

"include "bs2defs.bas"
Include "modedefs.bas"

DEFINE OSC 4  

"Define I2C_INTERNAL 1
"DEFINE I2C_SCL PORTC.4
"DEFINE I2C_SDA PORTC.5

TRISC.6=0                      " TX (PortC.6) como salida
TRISC.7=1                      " RX (portc.7) como entrada

SPBRG = 51                     " Ponemos el baud rate a 1200

RCSTA = %11010000              " configuracion de la recepcion paridad par
TXSTA = %01100000              " configuracion de la transmision paridad par

i2c_send var byte

portb=0
portc=0

TRISC.5=1
TRISC.4=1
TRISC.3=1

INICIO:

i2c_send=10

pause 1000
pause 1000
pause 1000

I2CWRITE PORTC.5,PORTC.4,$A0,10,i2c_send

pause 100
i2c_send=0

I2CREAD PORTC.5,PORTC.4,$A0,10,i2c_send
   
    if i2c_send=10 then
         charout0: if PIR1.4=0 then charout0
                TXSTA.0=0
                TXREG=83
    else
         charout1: if PIR1.4=0 then charout1
                TXSTA.0=0
                TXREG=78
    endif

goto INICIO

end

Desconectado hexmotion

  • PIC10
  • *
  • Mensajes: 22
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #1 en: 21 de Diciembre de 2004, 11:21:00 »
tal vez solo escribiendo algo como
I2CREAD PORTC.5,PORTC.4,$A0,10,[i2c_send ]

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #2 en: 21 de Diciembre de 2004, 12:06:00 »
Como dice el pana Hexmotion, para empezar serian los corchetes, de todas formas
aqui dejo un ejemplo funcional para pbp:

" Write to the first 16 locations of an external serial EEPROM
" Read first 16 locations back and send to serial out repeatedly
" Note: for EEPROMS with byte-sized address

        Include "modedefs.bas"          " Include serial modes

SO      con     0                       " Define serial output pin
DPIN    var     PORTA.0                 " I2C data pin
CPIN    var     PORTA.1                 " I2C clock pin
B0      var     byte
B1      var     byte
B2      var     byte

        For B0 = 0 To 15                " Loop 16 times
                I2CWRITE DPIN,CPIN,$A0,B0,[B0]  " Write each location"s address to itself
                Pause 10                " Delay 10ms after each write
        Next B0

Loop:   For B0 = 0 To 15 Step 2         " Loop 8 times
                I2CREAD DPIN,CPIN,$A0,B0,[B1,B2]        " Read 2 locations in a row
                Serout SO, N2400, [#B1," ",#B2," "]     " Print 2 locations
        Next B0

        Serout SO, N2400, [10]          " Print linefeed

        Goto loop

Salu2

Desconectado manu2097

  • PIC10
  • *
  • Mensajes: 17
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #3 en: 11 de Enero de 2005, 05:12:00 »
Saludos de nuevo, este es el código que ahora estoy usando, pero no funciona, es practicamente igual al de Lager, así que no se por que no va, la memoria sigue siendo una 24C04, utilizo los pines portc.5, portc.4 porque no puedo usar el modulo para i2c, esos pines los tengo ocupados, así que he recurrido a la utilizacion de las funciones i2cread y i2cwrite.

Include "modedefs.bas" " Include serial modes

DEFINE OSC 4  

TRISC.6=0                      " TX (PortC.6) como salida
TRISC.7=1                      " RX (portc.7) como entrada

DPIN var PORTC.5 " I2C data pin
CPIN var PORTC.4 " I2C clock pin

B0 var byte
B1 var byte
B2 var byte

portb=0
portc=0

inicio:

For B0 = 20 To 35                     " Loop 16 times
    I2CWRITE DPIN,CPIN,$A0,B0,[B0]   ",Nova " Write each location"s address to itself
    Pause 20                              " Delay 10ms after each write
Next B0

loop: For B0 = 20 To 35                    
          I2CREAD DPIN,CPIN,$A0,B0,[B1]           ",B2]",Nova " Read 2 locations in a row
          Serout2 portc.6, 188, [" leido: ",dec B1] ",dec B2," "] " Print 2 locations 2400 baudrate
      Next B0

pause 200
Serout2 portc.6, 188, [10] " Print linefeed

goto loop

end

"Nova:
"    Serout2 portc.6, 188, ["NO VA"]
"    pause 200
"goto inicio

ESTO ES LO QUE VISUALIZA EL HYPERTERMINAL:

leido: 32 leido: 32 leido: 32 leido: 32 leido: 3
2 leido: 32 leido: 32 leido: 32 leido: 32 leido: 32 leido: 32 leido: 32 leido: 3
2 leido: 32 leido: 32 leido: 32

Creo que no estoy comunicandome con la eeprom porque si utilizo el parametro de etiqueta de la funcion i2cread siempre se va a la etiqueta dadome a entender que no va la comunicación.

Desconectado manu2097

  • PIC10
  • *
  • Mensajes: 17
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #4 en: 14 de Enero de 2005, 02:38:00 »
he encontrado un error, resulta que si no le pongo el DEFINE I2C_HOLD no me va, que fuerte, el tema es que hay gente que no lo necesita, en realidad no se que es lo que hace este define. En la ayuda de microcode studio pone esto:
"Pause I2C transmission while clock held low

¿Puede que la configuracion que tenga la memoria con las resistencias de pull-ups infuya en tener que poner el define o no?

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #5 en: 14 de Enero de 2005, 14:12:00 »
Que onda manu2097,
Pusiste las resistencias ,en este caso pullups, en los pines de datos y de reloj(SDAy cLK),??? por que son necesarias.

salu2

Desconectado manu2097

  • PIC10
  • *
  • Mensajes: 17
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #6 en: 18 de Enero de 2005, 02:13:00 »
Las resistencias de pull-up han estado siempre puestas. En mi caso, es cuestion del define I2C_HOLD 1, si no lo pongo no va, la verdad es que no me mola decir que me va con el define sin saber bien porque lo tengo que poner, bueno creo que mi caso sera algo especifico.
Pongo el codigo por si le hace falta a alguien, gracias por todo, asunto zanjado XD

include "modedefs.bas" " Include serial modes
"include "bs2defs.bas"

DEFINE OSC 4  

DEFINE I2C_HOLD 1  
"DEFINE I2C_SCLOUT 1

"TRISC.6=0                      " TX (PortC.6) como salida
"TRISC.7=1                      " RX (portc.7) como entrada

DPIN var PORTC.5 " I2C data pin
CPIN var PORTC.4 " I2C clock pin

posicion var byte
dato1 var byte
dato2 var byte[10]
i var byte

"portb=0
"portc=0

pause 100

dato1=0
for posicion=5 to 15                
    I2CWRITE DPIN,CPIN,$A0,posicion,[dato1],nova
    pause 20
    dato1=dato1+1
next posicion          
             
i=0
for posicion=5 to 15            
    I2CREAD DPIN,CPIN,$A0,posicion,[dato2],nova
    pause 20
    i=i+1  
next posicion        

serout2 portc.6, 188, [" datos leidos:"]

for i=0 to 10
    serout2 portc.6, 188, [dec dato2,","]    
    pause 20
next i

end

nova:
    serout2 portc.6,188,[" no va "]
end

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: I2C por software (i2cwrite, i2cread)
« Respuesta #7 en: 23 de Enero de 2005, 18:11:00 »
Acojonante pero confirmo el problema de manu. Uso Micro Code Studio Pic Basic Pro y me estaba volviendo loco para controlar un MAX6959 por I2C.
El caso es que viendo la ayuda figura entre los defines
DEFINE I2C_HOLD 1 "Pause I2C transmission while clock held low
y aunque parezca que ya está definido por defecto resulta que nada de nada.

Gracias Manu por colocar la solución, y ya puestos indicar a todos los que piden ayuda  directamente que antes busquen un poco, realmente merece la pena leer.

Un saludo.
Saludos desde Logroño (España)


 

anything