Hola a todos.
Necesito un poco de ayuda con el tema de los relojes RTC, en la parte de comunicación, y otro poco en el tema de la decodificación.
Estoy usando microcontroladores PIC. Más específicamente el 16f877a, pero más adelante voy a pasar al 16f685, que es más chico, más barato, y no hace que gaste recursos.
Estoy haciendo un proyecto de reloj digital (de más está decir), donde comunico la hora al PIC que maneja la parte gráfica, desde un DS1307. Estos integrados son de 8 patas y se comunican mediante el protocolo I2C (mediante 2 cables).
Tienen una entrada de batería de 3V, por si la alimentación general se corta, y guardar la hora.
Como tiene una RAM de 64x8 bits, de los cuales sólo 8 registros se usan para el reloj, se puede guardar más información en los registros restantes, y obviamente, salvarlos del apagón (cosa muy común donde vivo).
La hoja de datos dice que con una batería de 48mAh, el integrado funciona por 10 años, para que se den una idea de lo poco que consume.
Bueno, ahora, vamos al tema.
El tema de la comunicación ya lo tengo dominado (o al menos eso parece), porque vi bastantes ejemplos, incluyendo cómo usarlo en la hoja de datos, y coinciden con lo que yo hago.
Doy ejemplos, más o menos:
Para escribir:
Inicio de transmisión.
Dirección de esclavo + bit de escritura
Dirección donde se va a escribir
Enviar información
Fin de transmisión.
Para leer (de algún lugar específico)
Inicio de transmisión
Dirección de esclavo + bit de escritura
Dirección donde se va a escribir
Inicio de transmisión (reinicio)
Dirección de esclavo + bit de lectura
Recibir información
Fin de transmisión.
Está bien eso?
Supongamos que ese tema está resuelto.
Hoja de datos: CLICK ACÁ
Ahora, según el fabricante, el integrado muestra los datos (cuando se lo lee, obviamente) de la siguiente forma, y doy el ejemplo de un sólo registro:
8 bits: _._._._._._._._ (cada _ es 1 bit).
El primer bit (de la izquierda de todo) es un 0.
Los siguientes 3 bits son las DECENAS de los minutos.
Los siguientes (y últimos) 4 bits al anterior, son las UNIDADES de los minutos.
Entonces, si estoy en el minuto 37, me manda el 3 con 3 bits, y el 7 con 4 bits (cosa coherente porque el máximo es 59 y el 5 y el 9 se pueden codificar con 3 y 4 bits cada uno respectivamente).
Ahora, no habría sido mejor enviar el número 59b (00111011) en los 8 bits, por más que sobren algunos? Bueno, no va a cambiar la cosa, pero es un comentario nomás.
Necesitaría alguna forma de, justamente, con ese número descompuesto en decenas y unidades, generar el mismo en formato decimal.
Y digo nomás, para no quedar mal, lo que se me ocurrió:
Leer un registro y guardarlo en una variable de 8 bits.
A esa variable hacerle una máscara (con operador &), y sacar los bits importantes, de a partes.
Con las unidades parece funcionar bien (probé con papel y lápiz...), pero con las decenas me quedan ceros a la derecha. No hay un operador de C, llamado "corrimiento de bits hacia la derecha/izquierda" (<< ó >>)? Ahora, si pongo >> me corre 1 hacia la derecha, y en algunos lugares vi escrito ">>7"; eso corre 7 bits hacia la derecha, o es otro operador?
Muchas gracias por su tiempo y comprensión, espero sus respuestas.
Necesito un poco de ayuda con el tema de los relojes RTC, en la parte de comunicación, y otro poco en el tema de la decodificación.
Estoy usando microcontroladores PIC. Más específicamente el 16f877a, pero más adelante voy a pasar al 16f685, que es más chico, más barato, y no hace que gaste recursos.
Estoy haciendo un proyecto de reloj digital (de más está decir), donde comunico la hora al PIC que maneja la parte gráfica, desde un DS1307. Estos integrados son de 8 patas y se comunican mediante el protocolo I2C (mediante 2 cables).
Tienen una entrada de batería de 3V, por si la alimentación general se corta, y guardar la hora.
Como tiene una RAM de 64x8 bits, de los cuales sólo 8 registros se usan para el reloj, se puede guardar más información en los registros restantes, y obviamente, salvarlos del apagón (cosa muy común donde vivo).
La hoja de datos dice que con una batería de 48mAh, el integrado funciona por 10 años, para que se den una idea de lo poco que consume.
Bueno, ahora, vamos al tema.
El tema de la comunicación ya lo tengo dominado (o al menos eso parece), porque vi bastantes ejemplos, incluyendo cómo usarlo en la hoja de datos, y coinciden con lo que yo hago.
Doy ejemplos, más o menos:
Para escribir:
Inicio de transmisión.
Dirección de esclavo + bit de escritura
Dirección donde se va a escribir
Enviar información
Fin de transmisión.
Para leer (de algún lugar específico)
Inicio de transmisión
Dirección de esclavo + bit de escritura
Dirección donde se va a escribir
Inicio de transmisión (reinicio)
Dirección de esclavo + bit de lectura
Recibir información
Fin de transmisión.
Está bien eso?
Supongamos que ese tema está resuelto.
Hoja de datos: CLICK ACÁ
Ahora, según el fabricante, el integrado muestra los datos (cuando se lo lee, obviamente) de la siguiente forma, y doy el ejemplo de un sólo registro:
8 bits: _._._._._._._._ (cada _ es 1 bit).
El primer bit (de la izquierda de todo) es un 0.
Los siguientes 3 bits son las DECENAS de los minutos.
Los siguientes (y últimos) 4 bits al anterior, son las UNIDADES de los minutos.
Entonces, si estoy en el minuto 37, me manda el 3 con 3 bits, y el 7 con 4 bits (cosa coherente porque el máximo es 59 y el 5 y el 9 se pueden codificar con 3 y 4 bits cada uno respectivamente).
Ahora, no habría sido mejor enviar el número 59b (00111011) en los 8 bits, por más que sobren algunos? Bueno, no va a cambiar la cosa, pero es un comentario nomás.
Necesitaría alguna forma de, justamente, con ese número descompuesto en decenas y unidades, generar el mismo en formato decimal.
Y digo nomás, para no quedar mal, lo que se me ocurrió:
Leer un registro y guardarlo en una variable de 8 bits.
A esa variable hacerle una máscara (con operador &), y sacar los bits importantes, de a partes.
Con las unidades parece funcionar bien (probé con papel y lápiz...), pero con las decenas me quedan ceros a la derecha. No hay un operador de C, llamado "corrimiento de bits hacia la derecha/izquierda" (<< ó >>)? Ahora, si pongo >> me corre 1 hacia la derecha, y en algunos lugares vi escrito ">>7"; eso corre 7 bits hacia la derecha, o es otro operador?
Muchas gracias por su tiempo y comprensión, espero sus respuestas.