Autor Tema: Primer mensaje, primera duda!! eeprom en pbp, no me cuadra lo que hace proteus  (Leído 2347 veces)

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

Desconectado r0j4z0

  • PIC10
  • *
  • Mensajes: 2
Hola Buenas noches!

Antes de nada, presentarme, ya que este es el primer mensaje que escribo en el foro (aunque lleve ya tiempo leyéndolo), me llamo Fernando y aunque llevo bastantes años pensando en hacer inmersión en esto de los microcontroladores, no me había atrevido, simplemente me dedicaba a clonar placas y a cargar programas que muchas veces funcionaban y casi el mismo número de veces no.

Harto de no comprender lo que estaba haciendo, me he lanzado a aprender un poco (aunque sea) de este mundo que me parece tan impresionante a la par que didáctico...

Bien os voy a exponer algo que me tiene loquísimo y que no llego a comprender, seguramente debido a mi inexperiencia en esto de los microcontroladores.

Estoy haciendo un circuito que me permita tocar muchas "tecnologías distintas" al mismo tiempo para así acelerar un poco el aprendizaje obligándome a estudiar cada una de las cosas que quiero implementar, con esta idea en la cabeza me he puesto a hacerme un controlador de acuarios, que como la mayoría manejará X reles, tendrá X entradas analógicas para convertir, RTC, LCD, menu... la luna... todo lo que de de sí mi PIC16F876.

El compilador que uso es PBP 2.60 y como entorno de simulación uso el Proteus 7.7sp2

Para empezar a salsear, he hecho que me funcione el DS1307 por I2c, he implementado el LCD, los botones y estoy con el menú. Como quiero que el menú sea algo complejo, y al ver las limitaciones de la eeprom interna del chip, me decidí a enchufar una eeprom por i2c para almacenar todos los strings que usaré en el menú así como los datos de configuración de alarmas, umbrales de temperaturas etc.

La eeprom que he seleccionado es la 24C04A que yo creo que con 4kbit de almacenamiento me es mas que suficiente.

El problema que tengo, es que cuando simulo en proteus y uso el i2c analyzer para ver las tramas que viajan por el bus no me cuadra lo que veo, os pego el código que uso para la comunicación:

Código: [Seleccionar]
ds1307w con %11010000 ' Control para escribir el DS1307
ds1307r con %11010001 ' Control para leer del DS1307
eepromw con %10100000 ' Control para escribir EEPROM, se puede usar $A0 hex
eepromr con %10100001 ' Control para leer EEPROM (innecesario, i2cXXX cambia el último bit según sea R o W)

SDA VAR PORTC.4 ' Definicion pin data bus i2c
SCL VAR PORTC.3 ' Definicion pin data bus i2c

dread var byte ' Variable donde recogemos el byte que queremos de la eeprom
datatiempo var byte [8] ' Array 8 posiciones para almacenar datos de tiempo
'datatiempo[0] - Segundos
'datatiempo[1] - Minutos
'datatiempo[2] - Horas
'datatiempo[3] - Dia de la semana
'datatiempo[4] - Dia
'datatiempo[5] - Mes
'datatiempo[6] - Año
'datatiempo[7] - Control

gosub graba
lee:
I2CREAD SDA,SCL,ds1307r,$00,[STR datatiempo\8] ' Lee 8 bits empezando en la direccion $00 y lo almacena en el array datatiempo.
pause 20
I2CREAD SDA,SCL,eepromw,$00,[dread] ' Guardamos contenido de la posición $00 de la eeprom en byte dread
pause 20
lcdout $fe,1,hex2 datatiempo[2],":",hex2 datatiempo[1],":",hex2 datatiempo[0],"R:", hex2 dread ' Pintamos HORA y valor eeprom
lcdout $fe,$c0,hex2 datatiempo[4],"/",hex2 datatiempo[5],"/",hex2 datatiempo[6] ' Pintamos FECHA

goto lee ' volvemos a empezar

graba:
I2CWRITE SDA,SCL,ds1307w,$00,$10, $35, $17, $01, $31, $07, $11, $10 ' SEGUNDOS-MINUTOS-HORAS-DIADELASEMANA-DIA-MES-AÑO-CONF
pause 30

I2CWRITE SDA,SCL,eepromw,$00,$10 ' Grabamos en la posicion de memoria $00 de la eeprom el valor $10
pause 15 ' Esperamos a que termine la escritura
RETURN




Este código, simulado en proteus, funciona a medias, el DS1307 funciona correctamente, es decir me setea la hora y luego me la lee, pero la eeprom, me hace el write correctamente (basandome en lo que veo en el i2c analycer) pero luego el read no funciona.

Investigando el datasheet he estado mirando el tamaño de los mensajes que acepta y que tiene que devolver la eeprom cuando se escribe y se lee sobre ella y es aquí donde viene mi confusión o mi problema con proteus, os cuento:

Cuando yo hago:
Código: [Seleccionar]
I2CWRITE SDA,SCL,eepromw,$00,$10
en el debugger veo lo siguente: S A0 A 00 A 10 A (escritura) pero justo despues de hacer la escritura, la eeprom me devuelve lo siguiente (sin bit P ni Sr aún) A1 A 00 A (comienzo lectura addr 00? no entiendo porque lo hace, pero bueno el ds1307 también hace algo parecido), despues de esto es cuando hace algo que no entiendo porque lo hace: Sr A1 A FF N P (según el datasheet es correcto, pero cuando lanzo yo el read, no cuando hago un write) y es ahí cuando ya devuelve FF sobre la dirección $00 de la eeprom siempre.

He probado mil cosas, al principio pensaba que no entendía el concepto de bit de control (10100000) y lo puse de todas las maneras posibles $A0, $A1, %10100000..., luego empecé a pensar que el problema venía por la dirección $00 pero viendo ejemplos por internet he visto que se puede escribir sin problemas, ya por último solo me queda echarle la culpa al proteus o a mi inexperiencia (seguramente sea esta última) pero no comprendo porque sucede esto.

Comentaros que he probado a hacer las operaciones con los componentes aislados, el DS1307 siempre me funciona pero la eeprom nunca.

Espero que podáis echar un poco de luz sobre este asunto ya que antes de continuar con el resto de cosas que quiero hacer, me gustaría dejar el tema de la memoria zanjado para así ir planificando un "mapa" de memoria coherente.

Os dejo un enlace con un rar con todo el código fuente, y el fichero de simulación de proteus.

Muchísimas gracias y seguir así, este es un foro estupendo donde aprender es muy sencillo!!

Enlace al circuito.
Poquito a poco entendiendo...

Desconectado r0j4z0

  • PIC10
  • *
  • Mensajes: 2
Re: Primer mensaje, primera duda!! eeprom en pbp, no me cuadra lo que hace proteus
« Respuesta #1 en: 06 de Agosto de 2011, 11:36:21 »
Buenas, pues después de volverme loco ya he encontrado una manera de hacerlo funcionar, simplemente haciendo la escritura de eeprom antes de hacer la escritura sobre el DS1307, no sé porque así funciona... supongo que será porque proteus no es infalible (o eso he leido bastante por ahí).

El lunes me iré a comprar los componentes que me faltan y montaré todo en una protoboard para asegurarme de que todo funciona en la realidad para no tener que basarme en proteus.

Ahora estoy con el mapa de memoria, vosotros normalmente como lo hacéis? yo había pensado la siguiente estructura:

Teniendo en cuenta que voy a tener 8 "alarmas", había pensando en empezar la memoria con estos datos seguidos de los valores de temperatura y después los strings para el LCD todos los datos de tamaño fijo

3 bytes para las alarmas (hora:minuto:dia de la semana)
3 bytes para la información de la temperatura (min:max:actual)
14 bytes para los mensajes del LCD (dejo 2 caracteres libres para indicador de posición del menú)

Así al saber exactamente en que dirección están las cosas y cuantos bytes ocupan, podré acceder a todo de una manera sencilla (por lo menos la mas sencilla que se me ha ocurrido).

Una cosa que me preocupa de esto es: es conveniente dejar tantas cosas en la eeprom? es decir, no ralentizará mucho el estar haciendo todo el rato ic2read para casi todo? es mejor cargarlo todo en memoria y luego simplemente tirar de variables? sin poder simularlo en la realidad no puedo saber si influye mucho, si alguno me dais alguna orientación con esto sería perfecto.

Muchas gracias de antemano!

Un saludo!
Poquito a poco entendiendo...


 

anything