sábado, 9 de julio de 2011

RTC DS1307 Y ATMEGA8


Ver I2C + RTC DS3231 usando C

En éste post mostraré un programa que permite configurar un DS1307. Como sabemos el DS1307 se comunica por I2C.
El programa tiene dos partes que son ejecutadas por dos interrupciones.

En la interrupción del timer 1, que se ejecutará cada 1000ms (1seg), leerá la hora y fecha del DS1307 y se mostrará en un LCD.

Por el uart llega información que permite leer ó escribir el DS1307.
La información para escribir(configurarlo a una hora y fecha determinada) consta de 8 bytes que son:

| CABECERA(1) | COMANDO(1) | HORA(1) | MIN(1) | SEG(1) | FECHA(1) | MES(1) | AÑO(1) |

La cabecera es 0xBA
El comando puede ser ‘W’(0x57) para escribir y ‘R’(0x52) para leer.
El resto de datos deben estar en BCD.
Un ejemplo de esto es: BA 57 12 21 08 08 07 11
Donde la hora es 12:21:08 y la fecha es 08/07/11.

En el caso que se quiera leer solamente hay que enviar BA 52 y la respuesta a esto será por ejemplo BA 57 12 30 12 08 07 11 , donde se indica que la hora leída es 12:30:12 08/07/11

El esquema es el siguiente:

sch (Small)

Ahora mostraré las macros usadas.
  
mac2

mac3

mac4

mac5

mac6

Ahora las rutinas para I2C y DS1307.

i2c1

i2c3

i2c4

Como ya sabemos cada esclavo que se conecta al bus I2C debe tener una dirección y en éste caso la dirección del DS1307 es 0b1101000 + el bit de R/W, es por ello que para escritura se envía D0 y para lectura D1.

Ahora las rutinas del UART.

u1

u2

u3

u4

u5

Por último el mensaje principal.
Hay que tener en cuenta que se esta usando el RC interno.

main1

main2

main3

En el siguiente video se muestra el funcionamiento del programa.


El programa que se muestra para configurar el DS1307 lo hice en visual C#, éste programa lo pueden descargar de éste enlace RTC_DS1307.
Si no lo pueden abrir instalen netframework 3.5.

11 comentarios:

  1. HOLA BUEN DIA, NECESITO AYUDA ESPERO ME PUEDAS ORIENTAR HACERCA DE COMO HACER UNA DECODIFICADOR DE CONTROL REMOTO MEDIANTE ATMEGA8. NECESITO MOSTRAR EN UN LCD EL BOTON DEL CONTROL QUE PRESIONE, ESPERO QUE ME PUEDAS DAR UNA IDEA DE COMO HACERLO GRACIAS.
    SALUDOS.

    ResponderEliminar
  2. ¿En que necesitas ayuda ? ¿En el programa ?.
    La verdad es que no he trabajado con infrarrojos, pero entiendo que necesitarías de un Receptor Infrarrojo, en éste enlace hay información sobre un receptor: http://www.microingenia.com/electronics/upload/docs/ModIR38KHz/Manual_ModIR38KHz_V1.0.pdf
    Luego de tener el código del botón que se presiono seria muy sencillo poner esa información en un LCD.
    En estos otros enlaces hay algo mas de información sobre los protocolos.
    http://robots-argentina.com.ar/Comunicacion_protocolorc5.htm

    http://www.ucontrol.com.ar/Articulos/protocolo_de_los_controles_remotos_philips_RC5/protocolo_de_los_controles_remotos_philips_RC5.htm

    ResponderEliminar
  3. Si ya estube leyendo sobre el protocolo que utilizan el problema que no se como implementar el codigo para decodificar la serie de pulsos que envia el infrarojo espero me hayas entendido y me puedas ayudar gracias. saludos

    ResponderEliminar
  4. El receptor ya no te envía un tren de pulsos.
    La salida del receptor se encuentra normalmente en '1'. Si en el centro del bit hay un flanco de bajada será un '1', y si el flanco es de subida será un '0'.

    Por ejemplo:
    1 1 0 0 0 0 0 1 0 0 0 0 0 1
    -----_-__-_-_-_-_--__-_-_-_-_--_-----------

    Aquí se ve los bits de inicio(11), el bit de conmutación(0), la dirección(00001=0x05) y el comando(000001=0x01). Cada bit esta compuesta de dos estados. Alto-Bajo para el '1' y Bajo-Alto para el '0'.
    Cada bit estado demora 889us, entonces cada bits demora 1778us.
    Tu programa debe esperar los bits de Start + el bit de conmutación, luego esperar los 5 bits de dirección y por último los 6 bits de comando.
    Ya que no hay ATmega que tenga un periférico que realice la decodificación, esta debe ser hecha por programa, y la idea para hacer esto es usar retardo y testear el pin donde estará conectado el receptor para poder verificador su estado.

    ResponderEliminar
  5. En éste link encontrarás lo que quieres.
    http://www.atmel.com/dyn/resources/prod_documents/doc1473.pdf

    ResponderEliminar
  6. Gracias por el aporte, se me despejaron algunas dudas que tenia sobre el TWI del atmega y como trabajar con el DS1307, yo estoy haciendo un proyecto parecido, pero con un atmega16 y programo en C, y los datos los ingreso por un teclado matricial.

    Muy bueno el blog, definitivamente va a favoritos, saludos desde Arequipa.

    ResponderEliminar
  7. Hola, estas vendiendo esto por si acaso?, necesito armar uno, no pude descargarme el archivo que pusiste, necesito crear cuenta en 4shared me cree y no me llega el mail de verificacion hasta ahora por lo tanto no tengo cuenta para bajarme. En el programa pusiste F_SCL = 100Khz de esta manera haces que el DS1307 trabaje a esa frecuencia, supongo que tienes que ponerle un cristal externo al DS1307 pero no puedo verlo en el video de cuanto es. Hay un bloque que supongo que es solo para ver como es la comunicacion del I2C, Mencionaste: "El programa que se muestra para configurar el DS1307 lo hice en visual C#" con esto te refieres a todo el programa que muestras en esta pagina. Lo necesitaba para implementarlo en la realidad y programarlo en Assembler. Gracias

    ResponderEliminar
  8. hola, una pregunta y como hago para programar en ese mismo lenguaje la pantalla lcd?...

    ResponderEliminar
    Respuestas
    1. No entiendo tu pregunta, sé mas especifico.

      Eliminar
    2. Está pidiendo un código de ejemplo sobre cómo poner caracteres en el LCD (driver hitachi HD44780) utilizando asm (que es el lenguaje que utilizaste en este caso). Lamentablemente nunca me senté a aprender assembler, por lo que no puedo ayudar en este caso. Saludos.

      Eliminar
  9. como programo la pantalla LCD en el mismo lenguaje de programación con el que has realizado el programa de arriba?

    ResponderEliminar