TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: manu2097 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
-
tal vez solo escribiendo algo como
I2CREAD PORTC.5,PORTC.4,$A0,10,[i2c_send ]
-
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
-
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.
-
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?
-
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
-
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
-
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.