Sv Community El Salvador

Soporte y Tecnología => Hardware - Electronico => Topic started by: Jaru on February 18, 2011, 02:40:13 pm

Title: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 18, 2011, 02:40:13 pm
antes que nada estoy mas que conciente que tutoriales, paso a paso, con todo ya cocinado abundan, y se preguntaran, si ya anda por ahi, para que diseñarlo desde cero?

pues primero, es un buen reto, segundo, uno lo va a hacer a su gusto, y pues es chivo poner en practica lo que uno sabe.

ademas, voy a tomar en cuenta sus ideas para el diseño de este simple circuito.

UN RELOJ DIGITAL QUE DE LA HORA (al menos originalmente eso hara, con updates se le pueden ampliar sus funciones pero primero lo primero)

en base a que hardware vamos a trabajar?

Principalmente lo que sea mas barato y facil de conseguir en nuestra cruda realidad salvadoreña.

- displays de 7 segmentos (http://image.tradevv.com/2009/11/12/wayjun_1500496_50/7-segment-single-digit-white-led-display-0-56-inch-anode.jpg)
- Microcontrolador PIC  (http://www.alliedelec.com/Images/Products/Thumbnails/383-0200_thumb.jpg)
Porque un micro y no circuiteria TTL?
 1- porque te ahorras diseño de circuito
 2- aprendes a programar un microcontrolador
 3- podes expandir las funciones actualizando el software sin modificar el hardware.

el modelo que usaremos sera el PIC16F627
porque este PIC?
las ventajas mas puntuales son:
- Lo venden en el pais (en Josnab)
- Vale al rededor de $6 (es de los mas baratos)
- Tiene oscilador interno (te ahorras el arreglo de oscilador capacitor/cristal)
- Tiene modulos que aunque no se ocuparán en este proyecto, es bueno irlos aprendiendo

y lo basico: algunos transistores, resistencias, cables, baterias, etc, tarjeta de circuito (porque la idea es tener el reloj en nuestro escritorio asi bonito y luminoso)

Este es el PINOUT del pic 16F627
(http://homepage.ntlworld.com/telescope/Projects/PICcontroller/PIC16F627pinout.jpg)

si ya analizaron la idea pensaran: pero ese chip tiene muy pocos pines! como va a controlar 4 displays de 7 segmentos (7x4=28 lineas).

para ello usaremos una técnica que se llama MULTIPLEXACION
http://es.wikipedia.org/wiki/Multiplexaci%C3%B3n (http://es.wikipedia.org/wiki/Multiplexaci%C3%B3n)

en este proyecto basicamente sera controlar todas las lineas del display con menos lineas.

esto se logra uniendo cada linea de segmento de cada display hacia un solo bus de datos, con eso tenemos solo 7 lineas para controlar,
si lo dejamos asi, los 4 displays mostrarian el mismo numero, para mostrar cada cual un numero distinto se usan habilitadores para cada display, asi se manda el valor a mostrar en el display y se selecciona que display mostrará ese valor, luego se manda el segundo numero y se selecciona el siguiente display que desplegara ese valor, asi con los 4 y luego repetir, basicamente solo se tendria activo un display a la vez, pero, si hacemos esto a una velocidad alta para el ojo humano (digamos unos 100Hz o mas) no notaremos la diferencia y parecerán que todos estan activos.

(http://www.instructables.com/image/FUODT2YG0AMES1A/What-is-multiplexing.jpg)

lo anterior puede conseguirse con transistores o con un decodificador:

con transistores:
(http://www.best-microcontroller-projects.com/image-files/seven-segmentx4.png)

( se podria usar un decodificador de direcciones de 2-4 pero estariamos usando un chip mas para una tarea simple que 4 transistores pueden lograr.)

para reducir las lineas de control del lado del Microcontrolador, podemos usar un decodificador de BCD a 7 SEGMENTOS (ya que vamos a usar valores conocidos del 0-9)
el decodificar a usar sera el : 7448

(http://www.grix.it/UserFiles/giobe2000/Image/7448pinout.gif)
http://maven.smith.edu/~thiebaut/270/datasheets/sn74ls48rev5.pdf (http://maven.smith.edu/~thiebaut/270/datasheets/sn74ls48rev5.pdf)

asi del lado de nuestro Microcontrolador solo tendriamos que controlar 4 lineas en BINARIO
el decodificador funciona como lo indica esta  tabla de verdad:
(http://img59.imageshack.us/img59/9803/21862eng.jpg)

hasta aqui ya casi tenemos diseñado todo el hardware.

lo que sigue es diseñar el programa y simularlo....

el código lo postearé aqui cuando lo tenga listo, sera un total OPEN HARDWARE SOURCE CLOCK


Este tema continuará con updates de construcción y diseño, espero sus preguntas y sugerencias al respecto

inb4 este tema no lo vera nadie, no lo comentara nadie porque prefieren comentar sobre el fin del mundo y viejas putiando en telefericos :haha:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: g00mba on February 18, 2011, 02:43:41 pm
ahora hacé uno que dé la hora en binario y hexadecimal simultáneamente :D
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: pollocampero on February 18, 2011, 03:09:24 pm
 :D vi el topic y me anime pero hoy que veo esa gran travadera de cosas  x_x neles .. pero gracias por el aporte  :thumbsup: mi hermano estudio esas voladas a ver si a el le interesa hacerme uno  jaja
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: juanca on February 18, 2011, 03:10:42 pm
hey naruto, y con el reloj r-c de el PIC no quedaria muy inexacto????

Un cristal de reloj de esos arruinados podria servir y hacerlo mas exacto
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 18, 2011, 03:18:08 pm
hey naruto, y con el reloj r-c de el PIC no quedaria muy inexacto????

Un cristal de reloj de esos arruinados podria servir y hacerlo mas exacto

que yo sepa el reloj interno del pic es suficiente para ganerar una oscilacion constante.
se puede hacer con un cristal externo si esto hace alguna diferencia.

seria de hacer las pruebas usando cristal y usando el reloj interno (claro que con cristal será mas exacto, pero que tanta inexactitud se tendrá con el oscilador interno?)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Darkness on February 18, 2011, 03:22:16 pm
Hey! donde está la parte donde hablás del fin del mundo o de jesucristo? que CACA ESTE TEMA



Sin esos PLUS no se puede llamar Thread ...  x_x
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Black Hawk on February 18, 2011, 03:23:58 pm
:rasta:

sería bueno naruto aclarar algo..

el tipo de display para este 7447 es cátodo común? (tiene salidas negadas verdad?, sorry tengo dias de no "hacer" electrónica  :embarassed:)..

fijate que una vez vi display de color "azul".. sabes donde los venden? (solo rojos he visto en josnab y casa rivas :( )

se ve interesante tu proyecto.. me interesa personalmente la parte del PIC, ya que nunca he programado/ utilizado uno.. seguiré tu tema  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: juanca on February 18, 2011, 03:24:53 pm
que yo sepa el reloj interno del pic es suficiente para ganerar una oscilacion constante.
se puede hacer con un cristal externo si esto hace alguna diferencia.

seria de hacer las pruebas usando cristal y usando el reloj interno (claro que con cristal será mas exacto, pero que tanta inexactitud se tendrá con el oscilador interno?)

Pues la temperatura afecta, y no se si como el 12f629 hay que calibrar el reloj r-c en ese PIC.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 18, 2011, 03:25:32 pm
Pues la temperatura afecta, y no se si como el 12f629 hay que calibrar el reloj r-c en ese PIC.
apues pongamosle cristal, y cual es pues ve chis!  :thumbsup:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: NightOwl on February 18, 2011, 03:25:53 pm
Muy buena iniciativa bro..., aunque muchos no tengamos el conocimiento basico y necesario en tu area de electronica en lo personal me interesa, a la espectativa del resultado y del tuto completo.
Muy buena practica para recordar sistemas digitales.

Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 18, 2011, 03:29:36 pm
:rasta:

sería bueno naruto aclarar algo..

el tipo de display para este 7447 es cátodo común? (tiene salidas negadas verdad?, sorry tengo dias de no "hacer" electrónica  :embarassed:)..

fijate que una vez vi display de color "azul".. sabes donde los venden? (solo rojos he visto en josnab y casa rivas :( )

se ve interesante tu proyecto.. me interesa personalmente la parte del PIC, ya que nunca he programado/ utilizado uno.. seguiré tu tema  :drinks:
las salidas del 7447 son negadas, tenes razon.

ya que en el ejemplo puse unos Cátodo comun, seria mejor usar un 7448  :drinks:
http://maven.smith.edu/~thiebaut/270/datasheets/sn74ls48rev5.pdf (http://maven.smith.edu/~thiebaut/270/datasheets/sn74ls48rev5.pdf)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Camus de Acuario on February 18, 2011, 04:37:54 pm
Estos proyectitoc DIY se sienten mejor cuando la base en lo que se les monta tambien es hecho por uno mismo, para estos casos una base hecha de legos armadas a nuestro gusto para alojar un circuito hecho tambien por nosotros mismos se ve doblemente bello.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: juanca on February 18, 2011, 07:52:37 pm
Falta algo, los indicadores de segundos (o sea los ":" entre las hora y miinutos)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: erudito01 on February 18, 2011, 08:23:12 pm
ey viejo esta super interesante esto pero tengo una gran duda con que pensas hacer la coneccion del programa al hardware porke yo antes use un logo o usaba una onda que no me acuerdo como se llama o sera que no entendi bien esta onda
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: ocky on February 18, 2011, 09:05:22 pm
ey viejo esta super interesante esto pero tengo una gran duda con que pensas hacer la coneccion del programa al hardware porke yo antes use un logo o usaba una onda que no me acuerdo como se llama o sera que no entendi bien esta onda

Si no me equivoco se hace ya sea con el puerto serial o con el puerto paralelo. Creo que se puede hacer por USB, pero es más dificil.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Belcboo on February 18, 2011, 09:48:56 pm
Se usa el puerto serie hasta donde recuerdo, pero tal vez naruto nos ilumina con algún circuito que podamos fabricar para poder programar PICs... a mi la verdad, me interesa bastante este tema...

Si pudieras recomendarme algún diagrama que vos estés seguro de que funcione para programar PIC's te estaría súper agradecido.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jarmandaros on February 18, 2011, 09:55:23 pm
en mi opinion me hubiese interesado mas por un proyecto de robotica, algo asi como un brazo mecanico programable  :roll: eso del reloj es muy simplista pero es solo mi opinion

[youtube]4E052SKE28Q[/youtube]
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Belcboo on February 18, 2011, 09:58:18 pm
en mi opinion me hubiese interesado mas por un proyecto de robotica, algo asi como un brazo mecanico programable  :roll: eso del reloj es muy simplista pero es solo mi opinion

Pues creo que para los pollos (como yo x_x ), sería mejor comenzar por pasitos chiquitos, además, lo que interesa es aprender las cosas básicas de programación de PICs, ya después con el tiempo, pero más que todo con la practica, creo que se podría comenzar algo ya más "avanzado"...

Pero a ver como avanza este proyecto :)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jarmandaros on February 18, 2011, 10:01:53 pm
Pues creo que para los pollos (como yo x_x ), sería mejor comenzar por pasitos chiquitos, además, lo que interesa es aprender las cosas básicas de programación de PICs, ya después con el tiempo, pero más que todo con la practica, creo que se podría comenzar algo ya más "avanzado"...

Pero a ver como avanza este proyecto :)

awe, por ese lado tenes razon XD

entonces don naruto, tiene un gran reto primero con el lenguaje de programacion de los PICs y segundo con los grabadores de PICs antes de ponernos a trevesiar XD
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: smrenderos on February 19, 2011, 12:10:39 am
Buena idea naruto  :thumbsup:

La simulacion la podemos hacer en Proteus y la programacion en Mplab(ensamblador) o mikroC

Configuracion de pines:
RB0 a RB3 ----> decoder
RB4 a Rb7 ----> selector de display
puertoA ----> control de hora

Si usamos oscilador externo creo que a 4MHz estaria bien (no pasa de $5) y los dos ceramicos de 22pF

en mi opinion me hubiese interesado mas por un proyecto de robotica, algo asi como un brazo mecanico programable  :roll: eso del reloj es muy simplista pero es solo mi opinion

Despues seguimos con un proyecto de robotica  :thumbsup: la idea del reloj es la mejor porque todos podemos participar simulandolo(si no podes comprar los elementos), en cambio con algo de robotica nos encontramos con la parte mecanica, los motores.. y para empezar con micros la idea de naruto esta buena


Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: vlad on February 19, 2011, 08:36:47 am
No veo porque preocuparse por la precisión del oscilador de un reloj que para comenzar no va a sincronizar inicialmente la hora con un servidor NTP o similar.

Total si se desajusta 1 o 2 segundos al año no es nada significativo, tomando en cuenta que hubo un desajuste inicial al programar la hora del reloj.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: juanca on February 20, 2011, 11:50:50 am
No veo porque preocuparse por la precisión del oscilador de un reloj que para comenzar no va a sincronizar inicialmente la hora con un servidor NTP o similar.

Total si se desajusta 1 o 2 segundos al año no es nada significativo, tomando en cuenta que hubo un desajuste inicial al programar la hora del reloj.

Puede que si, pero hay razones logicas para usar un cristal para el reloj.


Una de ellas es que los relojes de cuarzo usan un cristal sintonizado a 32768 Hz que equivale a 215 Hz, el cual es al dividirlo en un contador de 215 se obtiene exactamente un segundo, ademas que a esas frecuencias el consumo de energia de el circuito es mas bajo.

Asi que la mejor idea para este circuito seria: Usar el cristal para obtener el tiempo de referencia, y usar el oscilador interno r-c para las operaciones internas de el microcontrolador. Unos cktos que andan en el internet usan el esquema que estoy describiendo. Ademas de la tolerancia de el cristal le agrega mas precision.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 20, 2011, 01:10:45 pm
Puede que si, pero hay razones logicas para usar un cristal para el reloj.


Una de ellas es que los relojes de cuarzo usan un cristal sintonizado a 32768 Hz que equivale a 215 Hz, el cual es al dividirlo en un contador de 215 se obtiene exactamente un segundo, ademas que a esas frecuencias el consumo de energia de el circuito es mas bajo.

Asi que la mejor idea para este circuito seria: Usar el cristal para obtener el tiempo de referencia, y usar el oscilador interno r-c para las operaciones internas de el microcontrolador. Unos cktos que andan en el internet usan el esquema que estoy describiendo. Ademas de la tolerancia de el cristal le agrega mas precision.
solo para aclarar algunas cosas.

cuando usas un microcontrolador, podes usar la misma fuente de oscilacion para todo.
Como dice Vlad, pueda que la presicion del circuito RC interno sea "no tan exacta" como la de un cristal, de todos modos, a la hora de hacer el software, van a ver que para conseguir los cálculos de un segundo tambien se introduce un pequeño error (segun mi ultimo cálculo de al rededor de 0.16%, mas adelante les pongo el programa y la lógica)
en realidad para que no hayan dudas voy a usar un cristal de 4Mhz que es mas que suficiente para un reloj simple.

en mi opinion me hubiese interesado mas por un proyecto de robotica, algo asi como un brazo mecanico programable  :roll: eso del reloj es muy simplista pero es solo mi opinion

[youtube]4E052SKE28Q[/youtube]

si me dice que me lo patrocina usted, podremos entrar en pláticas  :drinks:

ey viejo esta super interesante esto pero tengo una gran duda con que pensas hacer la coneccion del programa al hardware porke yo antes use un logo o usaba una onda que no me acuerdo como se llama o sera que no entendi bien esta onda
talvez algunos no entienden el concepto de un microcontrolador aun.

un microcontrolador es una minicomputadora (olvidense de su case, monitor teclado y mouse)
es un CPU, que ya tiene memoria, puertos de comunicacion y modulos internos de procesamiento especial, todo eso en un pequeño chip, el cual; a traves de una interfaz especial (programador o quemador de microcontrolador) se conecta a una computadora donde se genera, compila y graba el programa hacia el chip microcontrolador.
la conexion del programador a la PC puede ser por puerto serial, paralelo, USB, etc.
el programador que yo tengo en especial es por puerto serial, para cuando lo hice (hace como 5 años, era lo mas fácil de fabricar y barato)
Belcboo anda mas en la jugada porque asi como el lo describe, se necesita un programador como anteriormente se describió para hacer que estos chips funcionen como queramos.

ahorita vamos a comenzar con algo "simple" como un reloj digital, donde la mayor parte de procesamiento y calculos de tiempo se hacen en SOFTWARE.

NOTA: ESTE RELOJ ES UN CIRCUITO INDEPENDIENTE, NO ESTA HECHO PARA ESTAR CONCETADO CON LA PC SIEMPRE, SOLO CUANDO SE PROGRAMA.
imaginense un DVD regrablable, ustedes solo lo "conectan" a la PC ciuando le van a meter informacion, y luego ya grabado (digamos una pelicula) lo sacan y lo usan aparte con su reproductor de dvd.

el microcontrolador, una vez grabado, se conecta al circuito para que cumpla su funcion de control y cálculos.

smrenderos parace el mas experimentado con esto de los PICs

-justo con proteus iba a simular el circuito completo.
-en lugar de ensamblador o C, estoy usando un compilador BASIC (usando el programa PIC SIMULATOR IDE), esta sera la primera parte, luego usando MikroC se puede reescribir el programa para pasarlo a lenguaje C
-la configuracion de pines que has puesto es justo como la habia planeado.
puerto B: selector de display y decoder
puerto A: control de hora

.......

voy a adelantar algo del programa:

El pic consta de registros internos que sirven para controlar, configurar y obtener informacion del mismo.
escribiendo en estos registros, podemos configurar la operacion del PIC, o podemos obtener informacion de su estado actual al momento de revisión.

tiene un registro de 8 bits llamado TIMER0, el cual esta constantemente contando durante el programa este en ejecución, no importa que este haciendo tu programa, el TIMER0 siempre esta contando, cuando llega al limite (255) se reinicia y asi sigue.
hay otro concepto en programacion que se llama INTERRUPCIONES, que son eventos relativamente ajenos a tu programa que desvian el curso del mismo en cualquier momento que éstas se den, hacia otra parte de ejecución de código.

el PIC tiene manejo de INTERRUPCIONES, y una de ellas es el desborde de cuenta de TIMER0, es decir, cuando TIMER0 llegue al limite y pase de nuevo a CERO, se activa la interrupcion de este registro, se salta a una zona de manejo de interrupciones, se revisa si fué el TIMER0 el cual generó la interrupcion, EN ESTE PUNTO SE EJECUTA EL CÓDIGO NECESARIO (por ejemplo incrementar un contador) limpiar la bandera de la interrupción y se regresa automaticmente desde donde el programa saltó cuando se generó la interrupcion.

USANDO UN CRYSTAL  para generar la frecuencia de operación del microcontrolador, el TIMER0 incrementa en uno cada ciclo de programa.
y cada ciclo de programa es 1/4 la frecuencia del oscilador
Si usamos una frecuencia de 4MHz
F = 4Mhz/4 = 1Mhz
es decir incrementa en 1 cada 1us (1/1Mhz)

Si se genera una interrupción en cada desborde del TIMER0, significa que entre una interrupcion y otra pasaran 256 x 1us = 256us

pero nosotros queremos que nuestros eventos sucedan cada segundo (como incrementar el conteo del reloj)

Hay otro registro del PIC donde se puede PRE-ESCALAR el TIMER0, es decir, hacerlo mas lento.
las escalas van de 1:1, 2:1, 4:1, 8:1 ... 256:1 (en potencias de 2)

es decir, EL MAXIMO TIEMPO que podemos obtener entre una interrupcion y otra (para 4Mhz de Cristal) es
256us x 256 = 65.536ms

ese es un valor no muy practico para nuestra base de tiempo.

que tal si hacemos que cuente en intervalos de 50ms, asi podemos acumular un contador y a las 20 interrupciones de 50ms estaremos obteniendo 1 segundo (50ms x 20 = 1segundo)

pero con el simple pre-escaler no podemos hacer que desborde cada 50ms.
lo que se puede hacer es ESCRIBIR UN VALOR en el TIMER0 para que cuando empieze a contar, ya tenga cargada una cantidad y asi FORZARLO a que cuente menos veces, logrando obtener el tiempo que queremos.

pero que valor le cargamos?

asi:

 65.536ms - 50ms = 15.536ms
cuantos conteos de TIMER0 hay en 15.536ms ?

si un conteo ( con pre-escaler de 256 y Cristal de 4MHz) es de: 256us entonces
en 15.536ms hay 15.536ms/256us) = 60.6875 conteos, como los conteos son enteros APROXIMAMOS al valor mas cercano y obtenemos 61

es decir, antes de habilitar las interrupciones le cargamos 61 al TIMER0, con un pre-escaler de 256 y aproximadamente en 49.9ms obtendremos una interrupcion, en la interrupcion aumentamos en 1 nuestro contador del programa (el que contara hasta 20) y de nuevo le sumamos 61 al TIMER0 antes de salir de la rutina de INTERRUPCION, asi para la próxima interrupción le tomara al TIMER0 otros 49.9ms generar una interrupcion nueva y aumentar nuestro contador, para que cuando nuestro contador llegue a 20 habremos calculado 1 segundo (aproximadamente)

calculemos el porcentaje de error con este procedimiento:

256-61 = 195 conteos hara para desbordarse
195 x 256us = 49.920ms tomara entre desborde y desborde
49.920 x 20 (que es lo que contaremos)  = 0.9984 segundos (en realidad no estaremos calculando 1 segundo si no 0.9984 segundos.

entonces el porcentaje de error queda:
((1-0.9984)/1) x100 = 0.16% de error que en ingenieria es un error aceptable  :drinks:

y TODO LO ANTERIOR solo para calcular 1 segundo en el programa  ohyea:

jueee ya no me acordaba como usar el timer0 y el preescaler, casi que me tomo 1 hora ir a leer y ver ejemplos para acordarme como manipularlo y hacerlo contar lo que uno quiera :D

que chivos estos volados
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: erudito01 on February 20, 2011, 08:19:02 pm

talvez algunos no entienden el concepto de un microcontrolador aun.
no es que no entienda sino que no sabia como se iba hacer la comunicacion eso era simplemente lo que no sabia
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: davidos on February 20, 2011, 09:15:18 pm
Me recuerdo, que anteriormente, expusistes un proyecto,lo cual me recuerdo no lo terminastes, no es por joder,,,pero para que hacer algo que ya esta inventado.... :)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: chrly on February 20, 2011, 10:57:45 pm
Me recuerdo, que anteriormente, expusistes un proyecto,lo cual me recuerdo no lo terminastes, no es por joder,,,pero para que hacer algo que ya esta inventado.... :)

comentario asi no ayudan al tema...

yo no iva a comentar pero si no se aporta al tema mejor hay que ahorrarse el comentario.

hacer algo asi no es sencillo ni gratis tienes que saber como hacerlo.

armar un simple juego de luces en una breadboard con un Ic de esto no es un juego de niños debes de tener varias nociones de electronica...

ahora hacer un reloj  x_x

vas a publicar la programacion naruto  :D

saludos espero los update --- :)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 20, 2011, 11:06:56 pm
Me recuerdo, que anteriormente, expusistes un proyecto,lo cual me recuerdo no lo terminastes, no es por joder,,,pero para que hacer algo que ya esta inventado.... :)
fijate que tu punto es bueno y comprensible.

Y el tema de el porque se hacen las cosas ya lo hemos discutido por aqui a lo largo de la vida de svc.

Será que uno debe hacer las cosas sólo cuando se las piden?
será que uno debe hacer las cosas sólo cuando se las pagan?
o será que de uno mismo salga querer practicar cosas nuevas, aprender mas cada vez, demostrarse a uno mismo que es capaz de hacer algo tan "simple" como un reloj que me puede venir gratis en un frutsi?

A mi siempre me ha gustado hacer cosas por el puro hecho de la propia satisfacción, por demostrarme a mi mismo que algo he aprendido y que no dependo que alguien me lo imponga para emprender un proyecto.

Para los que ven esto como un "proyecto inutil que no trae beneficio a la humanidad" veanlo como "un proyecto dicactico que trae beneficio a la propia mente"   :thumbsup:


@chrly

si, voy a poner absolutamente todo, diagrama electronico, diagrama de pistas, archivo de EAGLE, programa en BASIC, ASM, HEX, etc  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: davidos on February 20, 2011, 11:29:22 pm
Tienes...la razon... :thumbsup: :drinks: :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 21, 2011, 01:37:44 am
va.

El Sr ~ se nos adelanto un poco.

Pues al proyecto se le puede agregar todo lo que uno quiera y se puede complicar todo lo que uno guste.

Ahorita, para hacerlo mas "fácil" se han limitado los elementos electrónicos a usar.

*Estoy de acuerdo en la tabla de conversión, es justo como se trabaja estos problemas de codificación.
*Estoy de acuerdo con el cálculo de la correción de tiempo por la impresición en el cálculo original de tiempo, pero para poder hablar de corregir un pequeño "error" antes seria bueno determinar de cuanto error estamos hablando, por ejemplo, cada cuanto el reloj se atrasará un segundo, o un minuto, y si este error es tolerable o amerita un esfuerzo extra (no es que no quiera trabajar en la correción, me parece buena idea, pero me gustaria ir paso a paso en el diseño, luego podremos corregir errores y optimizar el código)
*Con lo de las latch no estoy de acuerdo porque no lo veo necesario, la técnica de multiplexeo a una frecuencia alta es suficiente para el ojo humano, a menos que tus ojos vean un parpadeo a mas de 100Hz.
muchos circuitos a nivel comercial usan esta técnica y no es como necesario agregarle 4 chips mas al circuito.

No me habia querido meter a programar en ensamblador porque solo esa area es casi otro tema, lo veo mas facil programar de un solo en BASIC o C.
Además que usando lenguajes de alto nivel resultarán mas comprensibles y de fácil lectura al lector
Ya queda a criterio del lector el incursionar mas en el tema del lenguaje ensamblador para microcontroladores PIC.

para hacer cencillo el circuito no consideramos el despliegue de segundos, solo Horas y Minutos (4 displays).
Los segundos si se calculan en el programa, pero no se visualizan

y repito, si queremos hacer mas complicado y con mas funciones el pequeño reloj, lo podemos hacer, pero siendo este un tema nuevo (el de los microcontroladores) para muchos, comenzaremos con algo básico.

Algo que queria hacer notar:

Al utilizar un decodificador de BCD a 7 segmentos, se gana orden en el circuito, y se ahorran lineas de comunicación en hardware, pero perdemos flexibilidad de presentación de datos, por ejemplo.
con el decodificador estamos limitado a su set de despliegue de 0-9 y una que otra letra, en cambio, si tuvieramos completo acceso a cada segmentos de todos los displays, podriamos escribir palabras y hacer animaciones.

Eso lo consideraremos para alguna actualizacion.  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 21, 2011, 02:04:15 pm
haciendo pruebas ahora, simulé el código que hice para calcular el segundo, y como selleva un error, el reloj se adelanta un segundo casi que cada media hora.

voy a hacerle la correción que bien apuntó el sr (~) 
si recordamos nuestros segundos son mas cortos, un segundo calculado por mi programa (basado en la explicacion de calculo de tiempo anteriormente expuesta) dura: 0.9984 segundos

le agregaré la corrección y lo volvere a simular, les voy a copiar una animacion de la simulacion luego

les dejo esta pregunta:

cual es la mejor forma para que el programa autocorrija su error de tiempo?
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 21, 2011, 02:39:56 pm
he aqui el programa inicial de calculo de 1 segundo.

lo que hace es que cada segundo pone en 1 la linea 4 del puerto B, el pulso dura 100ms

Quote
'#Programa de Reloj Digital
'#Codigo por : Jorge Ramirez
'#estado: Prueba de rutina de calculo de 1 segundo
'#ultima modificacion: 21/02/2011 2:00pm
'#compilado usando COMPILADOR BASIC del programa PIC SIMULATOR IDE v6.83

'todos los puertos son digitales
AllDigital
'osc 4MHz
'configurar Puerto B como salida
TRISB = 0x00
'configurar Puerto A como entrada
TRISA = 0xff

'variables
Dim seg As Byte
Dim blink As Byte
'Dim horas As Byte
'Dim minutos As Byte

'interrupcion por Timer0
'prescaler a 256
'se carga 61 para conseguir desborde cada 49.92ms
'se incrementará en 1 segundo cada 0.9984 segundos
'el error es de 0.16%

'seleccionando reloj interno
OPTION_REG.T0CS = 0
'seleccionando frecuencia de reloj interno de 4MHz
'es indiferente porque usamos reloj externo de cristal
PCON.OSCF = 1
'prescaler asignado a Timer0
OPTION_REG.PSA = 0
'valor de prescaler (1:256)
OPTION_REG.PS2 = 1
OPTION_REG.PS1 = 1
OPTION_REG.PS0 = 1
'se carga el TIMER0 con 61 para conseguir el conteo deseado
TMR0 = 61
'se activan las interrupciones de TIMER0
INTCON.T0IE = 1
'se activan las interrupciones
Enable

'se inicializan variables
seg = 0
RB4 = 0
'lazo principal de programa
'el programa esta indefinidamente en este lazo revisando las variables "seg" y "blink"
loop:

'checando que seg haya llegado a 20 cuentas (aprox 1seg)
If seg = 20 Then
'se cumple el segundo
'limpiar seg para comenzar nuevo conteo
seg = 0
'inicializar conteo de
blink = 0
'enciende led en RB4 mientras blink < 2
'cada desborde es de 50ms
'50ms x 2 = 0.1 segundos dura el blink (pulsos de 100ms de duración
While blink < 2
'levantamos la linea 4 del PuertoB
RB4 = 1
'fin de WHILE
Wend
'Bajamos la linea 4 del PuertoB
RB4 = 0

Endif

Goto loop
End                                               
'seccion de interrupciones
On Interrupt
   'salva las variables de sistema
   Save System
   'incrementa contador de segundo
   seg = seg + 1
   'incrementa contador de pulso
   blink = blink + 1
   'baja la bandera de la interrupcion de TIMER0
   INTCON.T0IF = 0
   'le agrega 61 al TIMER0 para nuevo calculo de segundo aprox
   TMR0 = TMR0 + 61
Resume                                           
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: smrenderos on February 22, 2011, 11:09:33 pm
cual es la mejor forma para que el programa autocorrija su error de tiempo?

Agregando un retardo en la subrutina de la interrupcion para complementar a los 0.9984 segundos que calculaste para generar 1 seg.

Tomando como base el analisis que hiciste para calcular el valor del TRM0, hice este programa en mikroC:
Code: [Select]
/*  Nombre de programa: Reloj Digital v0.1
    Autor: SvCommunity [smrenderos]
    Descripcion: Calculo de un segundo, se genera un conteo en el PuertoB
    Microcontrolador: PIC16F627
    Oscilador: XT, 04.0000 MHz
    Software: mikroC v8.2  */

unsigned contador=0x00;
void interrupt() {
  contador++;
  TMR0 = 61;
  INTCON = 0x20;
}
void main(){
  int temp=1;
  CMCON = 0x07;
  PCON.OSCF = 1;
  OPTION_REG = 0x07;
  TRISB = 0;
  PORTB = 0x00;
  TMR0 = 61;
  INTCON = 0xA0;
  while(1) {
      if (contador == 20) {
         PORTB += 0x10;
         if (PORTB >= 0xA0) {
            PORTB = temp++;
            if (temp == 0x06)
               temp=0;
         }
         contador = 0;
      }
   }
}

Simulandolo en proteus es visible el error a un determinado tiempo..

(http://img203.imageshack.us/img203/7111/relojl.png)

Haciendo el ajuste que comente, realizo un retardo de 70us dentro de la funcion de interrupcion:
Code: [Select]
unsigned contador=0x00;
unsigned rutina=0x00;
void interrupt() {
  contador++;
  asm {
    movlw  7
    movwf  rutina
    retardo10:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    decfsz rutina,F
    goto retardo10
  }
  TMR0 = 61;
  INTCON = 0x20;
}

Se obtiene algo mejor :yahoo: aunque siempre hay error..

(http://img215.imageshack.us/img215/9320/reloj2k.jpg)

Nota: el retardo ideal tiene que ser 1-0.9984 que son 1.6ms pero cuando realice la prueba con este valor (cargando la variable rutina con un valor decimal de 160) el reloj de simulacion de proteus se adelanta 1 segundo a los 5 minutos con respecto de nuestro conteo :-/, me imagino que es por el pequeño retraso que lleva el motor de simulacion. Haciendo pruebas obtuve el retardo de 70us.

Les dejo el link con el archivo del proyecto(mikroC v8.2) y la simulacion(Proteus 7.6 SP4), tambien un archivo txt con los link para descargar los programas :thumbsup:

http://www.megaupload.com/?d=LXIDIZ5P (http://www.megaupload.com/?d=LXIDIZ5P)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 22, 2011, 11:28:50 pm
juela   :)

que nice.

fijate que corregi el retardo haciendo este calculo

Reloj = XT
Fosc = 4MHz
F = 4MHz/4 = 1MHz -> 1uS

preescaler de 1:4

cada conteo de TIMER0 = 4uS
Cada desborde de TIMER0 = 4us x 256 = 1024us

si queremos interrupciones cada 1000us:
1024us - X = 1000us
x = 24us
Cuentas a sumar = 24us / 4us = 6 cuentas (a pre-sumar a TIMER0)

cada desborde es de 1ms (1000us)

1S / 1mS = 1000 Conteos

variable a declarar debe ser WORD para poder contar mas de 255

asi resolvemos el problema del error de 1 segundo

@SMRENDEROS.
quebrate vos tu programa en MikroC y yo lo voy a hacer en BASIC y vemos las diferencias.
cuando actualize el código lo subo  :drinks:

PS:
la simulacion del PROTEUS no la senti del todo tiempo real.
creo que lo mejor será continuar asumiendo que la rutina de calculo del segundo esta bien y seguir con el resto del programa, ya cualquier ajuste creo que se puede hacer ya teniendo armado el circuito en la vida real
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: smrenderos on February 23, 2011, 01:06:02 am
preescaler de 1:4

cada conteo de TIMER0 = 4uS
Cada desborde de TIMER0 = 4us x 256 = 1024us

si queremos interrupciones cada 1000us:
1024us - X = 1000us
x = 24us
Cuentas a sumar = 24us / 4us = 6 cuentas (a pre-sumar a TIMER0)

cada desborde es de 1ms (1000us)

1S / 1mS = 1000 Conteos

variable a declarar debe ser WORD para poder contar mas de 255

asi resolvemos el problema del error de 1 segundo
...  :thumbsup:

tambien:
preescaler de 1:8
TMR0 inicializado con 6 para generar 2ms con cada desbordamiento
500 conteos

disculpa mi ignorancia pero empiezo con C para micros, solo habia programado en ensamblador, pura programacion orientada a byte (hablo de micros con registros de 8 bit). Como genera Basic o C una variable con datos mayor a 255 y en mikroC que tipo de variable es?
 
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on March 02, 2011, 02:11:40 pm
avances de mi programa en BASIC
Code: [Select]
'#Programa de Reloj Digital
'#Codigo por : Jorge Ramirez
'#estado: Prueba de rutina de calculo de 1 segundo
'#ultima modificacion: 02/03/2011 2:00pm
'#compilado usando COMPILADOR BASIC del programa PIC SIMULATOR IDE v6.83

'todos los puertos son digitales
AllDigital
'osc 4MHz
'configurar Puerto B como salida
TRISB = 0x00
'configurar Puerto A como entrada
TRISA = 0xff

'variables
Dim mseg As Word
Dim segundos As Byte
'Dim blink As Byte
Dim horas As Byte
Dim minutos As Byte

'interrupcion por Timer0
'prescaler a 8
'se carga 6 para conmseguir desborde cada 2ms


'seleccionando reloj interno
OPTION_REG.T0CS = 0
'seleccionando frecuencia de reloj interno de 4MHz
'es indiferente porque usamos reloj externo de cristal
PCON.OSCF = 1
'prescaler asignado a Timer0
OPTION_REG.PSA = 0
'valor de prescaler (1:8) (0-1-0)
OPTION_REG.PS2 = 0
OPTION_REG.PS1 = 1
OPTION_REG.PS0 = 0
'se carga el TIMER0 con 6 para conmseguir el conteo deseado
TMR0 = 6
'se activan las interrupciones de TIMER0
INTCON.T0IE = 1
'se activan las interrupciones
Enable

'se inicializan variables
mseg = 0
RB4 = 0
segundos = 0
minutos = 0
horas = 0

'lazo principal de programa
'el programa esta indefinidamente en este lazo revisando las variables "mseg"
loop:

'checando que mseg haya llegado a 500 cuentas (1segundo)
If mseg = 500 Then
'se cumple el segundo
'limpiar mseg para comenzar nuevo conteo
mseg = 0
'####### ETAPA DE CONTROL DE VARIABLES DE TIEMPO #######
segundos = segundos + 1
If segundos = 60 Then
'inicia nueva cuenta de segundos
segundos = 0
'aumenta minutos en 1
minutos = minutos + 1
If minutos = 60 Then
minutos = 0
'aumenta horas en 1 (horas formato 24)
horas = horas + 1
If horas = 24 Then
'reinicia horas
horas = 0
Endif
Endif
Endif
'####### ETAPA DE CONTROL DE VARIABLES DE TIEMPO #######

'####### ETAPA DE DESPLIEGUE DE HORA ####
'-- escriba despliegue de hora aqui --
'####### ETAPA DE DESPLIEGUE DE HORA ####

Endif

Goto loop
End                                               
'seccion de interrupciones
On Interrupt
'salva las variables de sistema
Save System
'incrementa contador de msegundo
mseg = mseg + 1
'baja la bandera de la interrupcion de TIMER0
INTCON.T0IF = 0
'le agrega 6 al TIMER0 para nuevo calculo de msegundo aprox
TMR0 = TMR0 + 6
Resume                                           

(http://i53.tinypic.com/v7s0p3.png)

Hasta el momento se ha agregado el calculo de horas, minutos y segundos, éstos se van guardando en variables e incrementando en base al calculo del segundo.

les debo la simulacion
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on March 04, 2011, 12:46:48 pm
hey todavia hay gente que nos sigue con este volado?


tomando en cuenta la sugerencia de smrenderos puse el preescaler de 1:8 ( es igual que ponerlo de 1:4 y contar 1000 veces pero lo cambie a su sugerencia para que vean que hay muchas formas de resolver el problema)

explicación:

Reloj = XT
Fosc = 4MHz
F = 4MHz/4 = 1MHz -> 1uS

preescaler de 1:8

cada conteo de TIMER0 = 8uS
Cada desborde de TIMER0 = 8us x 256 = 2048us = 2.048ms

si queremos interrupciones cada 2000us = 2ms
2048us - X = 2000us
X = 2048us - 2000us = 48us
Cuentas a sumar = 48us / 8us = 6 cuentas (a pre-sumar a TIMER0)

cada desborde es de 2ms (2000us)

1S / 2mS = 500 Conteos

variable a declarar debe ser WORD para poder contar mas de 255

asi resolvemos el problema del error de 1 segundo



Por cierto, la lógica de cálculo de tiempo que usó (~) es la misma que use yo.

usando horario de 24 horas (no "am" ni "pm", mas fácil de programar)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on March 29, 2011, 11:35:33 pm
actualizando el tema.

ya probe el codigo para convertir el valor BINARIO a BCD en DOS DIGITOS
por ejemplo

en las variables

horas, minutos y segundos llevamos los valores actuales de las respectivas variables de tiempo.

pero para desplegar horas necesitamos 2 displays asi tambien para los minutos

un ejemplo de la conversion seria:

minutos contiene 45
en binario es %00101101

pero necesitamos tener el numero 4 en un display y el 5 en otro, y no se puede simplemente agarrar de 4 en 4 los bits del numero binario, no funciona asi.

los procesos matematicos a seguir son los siguientes

se divide el valor entre 10, asi tendremos el valor correspondiente a las decenas de la parte entera de la division
45/10 = 4.5 -> cuya parte entera es 4


se opera el valor con MOD 10 para obtener el RESIDUO de la division del valor entre 10
45 MOD 10 = 5 -> obtenemos directamente las unidades en base 10

en el codigo mostrado en este post, despliego el valor de las unidades de la respuesta BCD en la parte baja del puerto B y el resultado de las decenas en la parte alta del Puerto B

en la simulacion use unos displays que ya vienen decodificados para aceptar BCD (en nuestro circuito final usaremos decodificadores de BCD a 7 segmentos (el 74LS48)


Adjunto a este post:

Paquete zip con archivos de codigo y simulacion
- archivo de simulacion para usar con el software PROTEUS
- archivos de codigo creados y generados con el software PIC SIMULATOR IDE V6.83
Code: [Select]
http://www.mediafire.com/?c8w3w6b2wlya3pz
Codigo Basic para compilar con PIC SIMULATOR IDE  v6.83 (ya contenido en el zip adjunto)
Code: [Select]
'#Programa de Reloj Digital
'#Codigo por : Jorge Ramirez
'#estado: Prueba de rutina de calculo de 1 segundo
'#ultima modificacion: 29/03/2011 11:00pm
'#compilado usando COMPILADOR BASIC del programa PIC SIMULATOR IDE v6.83

'todos los puertos son digitales
AllDigital
'osc 4MHz
'configurar Puerto B como salida
TRISB = 0x00
'configurar Puerto A como entrada
TRISA = 0xff

'variables
Dim mseg As Word
Dim segundos As Byte
'Dim blink As Byte
Dim horas As Byte
Dim minutos As Byte
Dim numhigh As Byte
Dim numlow As Byte
Dim aux As Byte
Dim aux2 As Byte

'interrupcion por Timer0
'prescaler a 8
'se carga 6 para conmseguir desborde cada 2ms


'seleccionando reloj interno
OPTION_REG.T0CS = 0
'seleccionando frecuencia de reloj interno de 4MHz
'es indiferente porque usamos reloj externo de cristal
PCON.OSCF = 1
'prescaler asignado a Timer0
OPTION_REG.PSA = 0
'valor de prescaler (1:8) (0-1-0)
OPTION_REG.PS2 = 0
OPTION_REG.PS1 = 1
OPTION_REG.PS0 = 0
'se carga el TIMER0 con 6 para conmseguir el conteo deseado
TMR0 = 6
'se activan las interrupciones de TIMER0
INTCON.T0IE = 1
'se activan las interrupciones
Enable

'se inicializan variables
mseg = 0
RB4 = 0
segundos = 0
minutos = 0
horas = 0

'lazo principal de programa
'el programa esta indefinidamente en este lazo revisando las variables "mseg"
loop:

'checando que mseg haya llegado a 500 cuentas (1segundo)
If mseg = 500 Then
'se cumple el segundo
'limpiar mseg para comenzar nuevo conteo
mseg = 0
'####### ETAPA DE CONTROL DE VARIABLES DE TIEMPO #######
segundos = segundos + 1
If segundos = 60 Then
'inicia nueva cuenta de segundos
segundos = 0
'aumenta minutos en 1
minutos = minutos + 1
If minutos = 60 Then
minutos = 0
'aumenta horas en 1 (horas formato 24)
horas = horas + 1
If horas = 24 Then
'reinicia horas
horas = 0
Endif
Endif
Endif
'####### ETAPA DE CONTROL DE VARIABLES DE TIEMPO #######

'####### ETAPA DE DESPLIEGUE DE HORA ####
'-- escriba despliegue de hora aqui --
'guardo variable segundos por una posible interrupcion
aux = segundos
'llamamos rutina de convertir a bcd las unidades
numlow = tobcdl(aux)
'hacemos una mascara al PORTB para obtener su nibble alto
aux2 = %11110000 And PORTB
'unimos el nibble alto de PORTB con el bajo de numlow
'-> para formar el nuevo valor de PORTB
PORTB = aux2 Or numlow

'llamamos rutina de convertir a bcd las decenas
'(el valor ya viene en el nibble alto)
numhigh = tobcdh(aux)
'mascara para capturar el nibble bajo de PORTB
aux2 = %00001111 And PORTB
'unimos el nibble bajo de PORTB con el alto de numhigh
PORTB = aux2 Or numhigh
'####### ETAPA DE DESPLIEGUE DE HORA ####

Endif

Goto loop
End                                               

'##### seccion de Funciones
Function tobcdl(decn As Byte) As Byte
tobcdl = decn Mod 10
End Function                                     

Function tobcdh(decn As Byte) As Byte
aux = decn / 10
tobcdh = ShiftLeft(aux, 4)
End Function                                     


'##### seccion de interrupciones
On Interrupt
'salva las variables de sistema
Save System
'incrementa contador de msegundo
mseg = mseg + 1
'baja la bandera de la interrupcion de TIMER0
INTCON.T0IF = 0
'le agrega 6 al TIMER0 para nuevo calculo de msegundo aprox
TMR0 = TMR0 + 6
Resume                                           

Codigo para facil lectura
(http://www.webpagescreenshot.info/img/598449-330201172023am.png)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on March 30, 2011, 07:58:01 am
un video del demo anterior
Reloj digital con PIC y displays de 7 segmentos - prueba segundos (http://www.youtube.com/watch?v=04tgnrcNNdE#)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on March 31, 2011, 11:21:31 pm
ahora con respecto a las opciones que tendra el relojito.

originalmente es solo para dar la hora, pero como es programa y el firmware(osea el programa que controla el funcionamiento) puede actualizarse, seria bueno dejar los controles del reloj listos para un posible upgrade de codigo y funcionalidades

los controles que propongo son los siguientes:

RA2 -> (INPUT) Function / Edit  {F/E}
RA3 -> (INPUT) Selection / Change   {E/C}
RA4 -> (OUTPUT) a un led

dejo libres RA0 y RA1 porque son entradas analogicas y podrian servir para en un futuro agregarle un sensor de temperatura y que nuestro reloj despliegue la temperatura ambiente.

el funcionamiento lo he imaginado asi

(http://img141.imageshack.us/img141/2907/capturewgd.png)
   
Nomenclatura:

{} BOTON
()  ACCION
-*:  El asterisco indica que si se presiona el mismo ejecuta la accion y se queda en el mismo estado,
-F/E: Funcion / Edicion
-E/C: Seleccion/Cambio 
-IDLE:   fuera de opciones, desplegando la ultima opcion seleccionada, lo mas comun, la hora
-F1:   Seleccion Configurar Tiempo (hh:mm)
-F2:   Seleccion Configurar Alarma  (hh:mm)
-Fn:   Seleccion Cualquier funcion extra que pudiera agregarse
-ET:   Modo configuracion de Tiempo
-EH:   Modo configuracion de HORAS
-EMD:   Modo configuracion de LAS DECENAS DE LOS MINUTOS
-EMU:   Modo configuracion de LAS UNIDADES DE LOS MINUTOS
-EHu:   Cambio de HORAS hacia ARRIBA
-EMDu:   Cambio de LAS DECENAS DE LOS MINUTOS hacia ARRIBA
-EMUu:   Cambio de LAS UNIDADES DE LOS MINUTOS hacia ARRIBA
-Fx:   Funcion siguiente al estado en que se encuentre
   
hijole talvez me entienden, me pegue una fumadita para inventarme ese flujo de comandos, y otra media hora para hacerles el muñequito del diagrama de flujo
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: smrenderos on April 01, 2011, 01:21:24 am
Excelente  :thumbsup:

Hasta ayer me puse de nuevo con esto, hay un problema con la simulacion del circuito final en proteus.
Se congela cuando se realiza el barrido de display a la frecuencia propuesta(10Hz), ya no digamos si lo hacemos a una frecuencia estandar como 60Hz.

Realice la prueba con la idea de formar el numero 5 5 5 5 en los cuatro display a 50Hz y se congela, asi que tendriamos que realizar de aqui en adelante pruebas con el circuito fisico.

(http://img218.imageshack.us/img218/589/reloj3.png)

Dejo el link del archivo:
http://www.megaupload.com/?d=P779YL9B (http://www.megaupload.com/?d=P779YL9B)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 10, 2011, 12:57:50 pm
Se simulo el circuito con los 4 displays tomando en cuenta los siguientes parametros para la simulacion:

• Se aumento la velocidad del tiempo
• Se disminuyo la frecuencia de barrido del despliegue en los displays
• Se precargo horas con 23 y minutos con 58 para verificar el apropiado calculo.

aun asi, el simulador no podia con los calculos despues de cierto tiempo.

Simulation proteus clock - 7 segment display using pic (http://www.youtube.com/watch?v=k-5_rHO2KTU#ws)

les debo el codigo
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: webo_09 on April 10, 2011, 01:07:05 pm
Uta muy interesante el tema y fumado a la vez  x_x felicidades naruto con temas asi da gusto entrar a la comunidad, ya le voy a decir a mi hermano que me explique la mitad del tema XD

Segui asi viejo
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 11, 2011, 02:10:19 pm
gracias webo_09

Resulta que yo de rato en rato tengo que poner a prueba mis conocimientos y me da de hacer proyectos asi, normalmente los hago para mi mismo o simplemente los muestro ya terminados y no digo como los hice.

Para que todos aprendamos un poco estoy compartiendo un poco de mis conocimientos con este pequeño proyecto, tomando en cuenta sugerencias de ustedes y explicando hasta donde se puede lo que aqui se crea.

Comentarios sobre el avance del proyecto:

una limitacion que no me gusta es el uso del integrado 7448 (decodificador de BCD a 7 segmentos)
el uso de este integrado tiene PROs y CONTRAS

PRO:
se usan solo 4 lineas para desplegar caracteres en los displays, distintas a las 7 lineas que se ocuparian si se controlaran los displays directamente en paralelo.

CONTRAS: estamos limitados al set de digitos y caracteres que el 7448 despliega (0-9 y unos caracteres sin sentido)
no podemos escribir letras ni otro caracter.

FUTURA MODIFICACION:
usar un SHIFT REGISTER para enviar los datos de los 7 segmentos de forma serial, en este caso solo se usaran 2 lineas, la de datos y la de reloj,
 - Ventajas: Nos ahorramos MAS LINEAS (2 mas que con el uso del 7448) y tenemos la posibilidad de controlar cada segmento de cada display, asi podriamos desplegar animaciones, letras, numeros, etc, solo nos limitaria nuestra imaginacion y el programa.

Como funciona un SHIFT REGISTER?
(http://i56.tinypic.com/2s7yhxc.gif)

Un shift register va desplazando por sus lineas de salida el dato en la linea de entrada en cada pulso de reloj que recibe, asi podriamos enviar 8 datos en serie y al final del 8vo pulso, tendriamos el valor final presente en las salidas.

(http://www.ict.edu.om/elibrary/engg-ebooks/ebooks/EECP2270-Digital%20Electronics/Book15-WikipediaCom_files/Shift_register_files/4-Bit_Shift_Register_SISO.gif)

como ya compre el 7448 esa opcion usare para armar el circuito, luego hare la version 2 con el shift register y desplegando palabras en los displays
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 14, 2011, 05:08:17 pm
solo quiero ponerle el sello apropiado al proyecto.

El dia de hoy se dió a conocer el nuevo logo de

OPEN SOURCE HARDWARE (http://freedomdefined.org/OSHW)

y este proyecto cae en esta categoria

(http://evilmadscientist.s3.amazonaws.com/media/2011/04/oshw-logo2.png)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 19, 2011, 02:03:32 pm
otro mod de este proyecto será usar un LCD grafico en lugar de displays de 7 segmentos.
se hara con la libreria de LCD GRAFICOS del MikroC para PIC
se usará un LCD de un NOKIA 3310 (monocromo)

(http://jsco.org/blog/images/pinkylcd_800.JPG)

CAR Meter with ATMEGA8 and NOKIA 3310 LCD (http://www.youtube.com/watch?v=YKV3Sqr41a4#)

Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 24, 2011, 05:41:45 pm
bueno, armé el circuito hasta el ultimo código que hice, ya con el despliegue multiplexado de los displays de 7 segmentos usando el 74ls48

lo bueno:

-despliega de forma apropiada los numeros
-la frecuencia de 100hz parece bastar para hacer parecer todos los displays encendidos
-el multiplexeo funciona bien.

lo malo:
-el tiempo no esta correcto, se adelanta segun veo,  creo que es porque estoy usando el oscilador interno y los calculos los hice tomando en cuenta un cristal externo.

dificultades técnicas:
-dos displays que tengo venian defectuosos, el segmento "e" no se enciende como los demas y no se nota cuando esta encendido (vean el video)

les dejo el video  que grabé desde la programacion del PIC hasta la prueba ya en físico.

pic microcontroller 16f627 clock using 74ls48 and 7 segment display. count test (http://www.youtube.com/watch?v=UygGl0sjJhg#)

TO DO:
- reemplazar los 2 displays y buscar un set de 4 displays ya multiplexados.
- corregir el tiempo
- agregar el codigo y los botones de configuracion de hora.  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hkadejo on April 24, 2011, 06:09:24 pm
De paja en paja ya agarro forma el proyecto, bien por ti naruto  :thumbsup: haber que dia te echas algo con arduino.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: vlad on April 24, 2011, 06:55:18 pm
-el tiempo no esta correcto, se adelanta segun veo,  creo que es porque estoy usando el oscilador interno y los calculos los hice tomando en cuenta un cristal externo.

Estuve viendo el video y asumiendo que el video no haya comprimido el tiempo si hay un cambio de 2:42 a 3:39, son 57 segundos.

Y en el simulador te da el tiempo exacto?. Ademas, como estas generando el retraso?, un loop de NOPs?

PD:
Muy apropiado:
http://www.sonofsofaman.com/hobbies/electronics/pic/16f84/code/delays.asp (http://www.sonofsofaman.com/hobbies/electronics/pic/16f84/code/delays.asp)

En especial esta nota:
If you are driving your CPUs clock with a resistor/capacitor, all bets are off. The only way to get a remotely accurate calculation is to measure the clock rate with a frequency counter. Even then, temperature changes can alter the run rate significantly.

jejeje al principio yo estaba en contra del cristal pero al parecer hasta para esto tan simple será necesario...

PD2:
http://www.piclist.com/cgi-bin/delay.exe?Delay=1&Type=seconds&Regs=d1+d2+d3+d4&clock=4&name=Delay&CPU=PIC (http://www.piclist.com/cgi-bin/delay.exe?Delay=1&Type=seconds&Regs=d1+d2+d3+d4&clock=4&name=Delay&CPU=PIC)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 25, 2011, 11:02:24 am
Estuve viendo el video y asumiendo que el video no haya comprimido el tiempo si hay un cambio de 2:42 a 3:39, son 57 segundos.

Y en el simulador te da el tiempo exacto?. Ademas, como estas generando el retraso?, un loop de NOPs?

PD:
Muy apropiado:
http://www.sonofsofaman.com/hobbies/electronics/pic/16f84/code/delays.asp (http://www.sonofsofaman.com/hobbies/electronics/pic/16f84/code/delays.asp)

En especial esta nota:
If you are driving your CPUs clock with a resistor/capacitor, all bets are off. The only way to get a remotely accurate calculation is to measure the clock rate with a frequency counter. Even then, temperature changes can alter the run rate significantly.

jejeje al principio yo estaba en contra del cristal pero al parecer hasta para esto tan simple será necesario...

PD2:
http://www.piclist.com/cgi-bin/delay.exe?Delay=1&Type=seconds&Regs=d1+d2+d3+d4&clock=4&name=Delay&CPU=PIC (http://www.piclist.com/cgi-bin/delay.exe?Delay=1&Type=seconds&Regs=d1+d2+d3+d4&clock=4&name=Delay&CPU=PIC)

En los post anteriores explicamos con ecuaciones y calculos como se obtiene el retardo, se hace a traves de interrupciones, y lo que hay que hacer notar es que el calculo para el retardo de la interrupcion es distinto entre oscilador externo y el interno, el detalle fué que el cálculo que se posteó aqui fue hecho para un oscilador externo  y yo en el circuito usé el interno.

Voy a revisar la configuracion y usaré un cristal de 4Mhz

El próximo circuito que armaré será usando una pantalla gráfica (que teniendo la libreria, es mucho mas facil que desplegar la información en display se 7 segmentos).

esoy revisando con el simulador la rutina de interrupcion y estoy viendo donde se me generan los retardos o adelantos innecesarios.

cuando la tenga depurada se las pongo  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: vlad on April 26, 2011, 11:59:48 pm
En los post anteriores explicamos con ecuaciones y calculos como se obtiene el retardo [snip]

Y en consecuencia del evidente problema en ellos es la sugerencia de utilizar un generador de codigo para retardos  :thumbsup:

Pero supongo que la idea es aprender, asi que suerte  :thumbsup:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on April 27, 2011, 07:57:31 am
Y en consecuencia del evidente problema en ellos es la sugerencia de utilizar un generador de codigo para retardos  :thumbsup:

Pero supongo que la idea es aprender, asi que suerte  :thumbsup:
se usan interrupciones, que es la solucion mas apropiada para controlar tiempo.

usar NOP o loops no es la mejor forma de resolver este problema.

y el problema no es la tecnica en si, pues para eso está, lo mas exacto es el uso del contador interno en lugar de confiar en los ciclos de ejecucion de código y esperando que loops y NOPs se tarden x cantidad de tiempo.
El problema aqui es que estoy usando el oscilador interno y el momento cuando le recargo la variable al contador, estuve haciendo pruebas ya con el simulador moviendo varias lineas de código y ya estoy consiguiendo resultados estables.

Otro detalle es que no estoy programando en Assembler directamente, si no en BASIC, y como bien se sabe, entre mas se eleva uno en el lenguaje, menos control del codigo ensamblador tenés. siempre hay código extra que se va a ejecutar para poder ejecutar esas rutinas de alto nivel.

publicaré resultados dentro de poco  :drinks:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 09, 2011, 03:29:44 pm
por cuestiones de trabajo ya no habia podido seguir con este proyecto.

y pues, muchos no le veian la gracia a diseñar un simple reloj de displays.

como todo buen geek a mi me gustan las cosas geeks, es asi como decidí cambiar los displays por algo mas interesante.

Pensando en la idea de g00mba de hacer un reloj BINARIO me puse a buscar otras posibilidades siempre dentro del campo geek.
Descarté lo del reloj binario porque lo siento muy rebuscado, talvez algo mas llamativo que le guste  mas gente.

Q&A: How Do I Read Your Binary Clock? (http://www.youtube.com/watch?v=1fFiVjNUjB8#ws)

asi que me decidi por un modelo distinto y me gustó este reloj que vende ThinkGeek ($US 39.99)

Think Geek: TIX Clock Review (http://www.youtube.com/watch?v=5lxyGU6ZkEc#ws)

es facil de leer
solo usa leds
es decorativo
bien geek

a mi me saldria mucho mas barato hacerlo de lo que lo vale en thinkgeek.

TO DO:
-revisar las rutinas de tiempo para tener la base del segundo lo mas exacta posible.
-simular el circuito con leds
-construir prototipo
-construir circuito final

TO DO para upgrades:
- poner alarmas
- crear animaciones
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: yaasurs on September 09, 2011, 04:49:30 pm
mi opinión es que en vez de estar haciendo un reloj, se debería de tratar de buscar hacer algo no inventado, algo innovador.
es solo mi opinión.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hkadejo on September 09, 2011, 04:57:03 pm
mi opinión es que en vez de estar haciendo un reloj, se debería de tratar de buscar hacer algo no inventado, algo innovador.
es solo mi opinión.

Date una leida a todo el topic...el objetivo de este topic es educativo...al menos segun entiendo ese fue el objetivo de naruto desde el principio
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 09, 2011, 05:54:34 pm
mi opinión es que en vez de estar haciendo un reloj, se debería de tratar de buscar hacer algo no inventado, algo innovador.
es solo mi opinión.
asi es, yo se que se pueden hacer mejores cosas, pero que sentido tiene comenzar a utilizar modulos, hardware y lenguaje mas especializado  cuando es un tema de introduccion al diseño por microcontroladores.

Para serte sincero el primer proyecto de muchos es encender un LED y ya, este tutorial va orientado al estudiante/practicamente de electronica/sistemas para introducirlo al mundo de los microcontroladores a un nivel intermedio.

cuando se complete este haremos otro proyecto mas práctico y facil de hacer :thumbsup:
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: yaasurs on September 10, 2011, 01:44:57 pm
@~ deverias de mostrar tu invento funcionando.
solo veo lo que hiciste, pero creo que hace falta verlo en accion. si funciona vien me cambio.
no he estudiado electronica pero me imagino que ha de gastar mas de 1watt pero y la fuente? gasta o no.
yo no lo se, como te digo no he estudiado electronica ni nada parecido.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 12, 2011, 11:21:06 am
UPDATE: estuve modificando el código por la impresición en el calculo de la base de 1 segundo que habiamos tenido.

a pesar de que los cálculos estaban correctos, siempre hay que tomar en cuenta el tiempo que toma la rutina de interrupción en ejecutarse.
Revisando foros donde gente exponia el mismo problema, muchos conocedores recomendaban que, a pesar de que el microcontrolador puede calcular tiempos exactos, era mejor utilizar un chip aparte de tipo RTC (Real Time Clock), esto para avitarse lidiar con el tiempo en el microcontrolador y estar totalmente seguros que la base de tiempo se esta generando aparte y sin ningun retardo ni interacción externa.

Para este proyecto vamos a seguir con el cálculo como lo habiamos estado llevando, se puede hacer un ajuste en la práctica para que la base sea lo mas exacta posible.

cambié el codigo a C modificando el código que publicó SmRenderos, hice el cálculo para
F = 4Mhz
Preescaler =  1:16
precarga al TMR0 = 6
Cuentas calculadas = 500   (se desborda cada 0.00200000 sec)

en la práctica hice la prueba haciendo 499 cuentas (osea restarle un approx de 0.00200000 sec)
Dejé corriendo el codigo en el simulador como 3 horas y media y en todo ese tiempo no se atrasó ni se adelantó ni un segundo. asi que creo que ya procederé a la etapa de pruebas físicas y luego hare el diseño de los controles y luego del display de leds

los que nos leen me gustaria que nos comentaran sobre el proyecto, que les parece? les gustaría tener un reloj de patrones bien geek como el recientemente propuesto?

Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 13, 2011, 09:46:37 am
(http://i.imgur.com/OfaiR.jpg)

en el diseño de el nuevo estilo del reloj me topé con algo.

y es que hay que manejar 27 leds con los pines del pic elegido (16F627)
se que hay que usar multiplexeo, pero a alguien se le ocurre la mejor manera de agrupar o como tratar los valores para convertirlos a los leds
y tomar en cuenta que se debe tener la posibilidad de crear patrones aleatorios.

he designado 8 lineas de datos y 4 de control para el multiplexeo

alguna idea?
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 13, 2011, 01:15:06 pm
nadie?  x_x
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 22, 2011, 08:48:30 am
usando como base el código de SmRenderos programé completo el calculo de las horas minutos y segundos

en pseudocodigo

Code: [Select]
while (1) {

if(se_cumple_segundo){
segundos++
if (segundos == 60) {
segundos = 0
minutos++
if(minutos == 60){
minutos = 0
horas++
if(horas == 24){
horas = 0

}
}
}
}

}

para la simulación solo queria estar seguro que todos los valores se estaban calculando apropiadamante asi que lo simule con 6 displays multiplexados

(http://img37.imageshack.us/img37/7964/relojckto.jpg)

integrados usados:

►PIC 16f627 ( microcontrolador )
►7448 ( decodificador BCD a 7 segmentos )
►74138 ( decodificador/multiplexador de 3 a 8 )
►set de 6 display multiplexados

Proxima prueba:

eliminar el 7448 y generar en software el código para generar los caracteres en los displays
 - Que se gana con esto?
    * eliminar un integrado
    * no estar limitado al set de caracteres que el 7448 ofrece
    * Flexibilidad para desplegar letras y caracteres a voluntad.

el código completo y los archivos se los debo
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 24, 2011, 01:33:13 pm
AVANCE:

-se eliminó el IC 7448
-Ahora la decodificacion de los numero se hace en SOFTWARE
- 3 MODOS DE DESPLIEGUE :
► Decimal
► HEXADECIMAL
► BINARIO (se usan 4 segmentos para representar 4 bits)
► Boton de seleccion de modo

ahora el reloj se ve cada vez mas GEEK.

TODO:

► Optimizar código
► agregar mas botones
► agregar modos como CAMBIO DE HORA, SELECCION DE DESPLIEGUE, ETC

Digital Clock - Pic microcontroller - 3 modes: decimal, hex, binary (http://www.youtube.com/watch?v=JFStfjoRRJI#ws)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on September 26, 2011, 03:58:38 pm
ahora hacé uno que dé la hora en binario y hexadecimal simultáneamente :D

:roll: talvez no simultaneamente pero si por selección de modo :)



por cierto, programando el código en el C del copilador del MikroC me acabe la memoria del pic, no alcanza 1K de memoria, asi que pueda que me mueva a otro microcontrolador para seguirle metiendo mas funciones :)
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hkadejo on September 28, 2011, 12:48:25 pm
Hey virguilla tal vez deberias abrir un post con tu proyecto para no ir mezclando ambas cosas...y asi llevar los dos proyectos ordenados.

Una sugerencia nada mas.
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on February 22, 2012, 11:45:55 pm
retomo el proyecto porque tengo una forma mas eficiente de manejar todo esto:

les dejo un video de un demo de hardware con el que estoy trabajando:

CAMBIOS:

- Para controlar el tiempo uso un chip dedicado: es un RTC (Real Time Clock) DS1307
- Para desplegar la hora en el demo lo hago de dos formas:
  * Pantalla 2x16 LCD (HD44780)
  * 7 segment Module (TM1638)
   >> con alguno de estos dos quedará al final, ahi ya es gusto de cada quien
- para controlar el programa un módulo ARDUINO

Porque los cambios:
1. Es una buena oportunidad para aprender a usar hardware dedicado
2. a nivel de construcción es mucho mas fácil armar esto que un circuito completo de la nada
3. la eleccion de un RTC tiene muchas ventajas, La principal es que al usar una unidad independiente, con su propia fuente de voltaje (su bateria) ésta es totalmente autónoma y no importa si le el programa se traba o se resetea, el conteo de la fecha/hora siempre seguira pudiendose retomar en cualqueir momento, ésto le da mas confiabilidad a el establecimiento de la hora exacta.
4. las pantallas LCD y 7 SEGMENTOS ya armadas son mas fáciles de usar y ofrecen muchas posibilidades por parte de los fabricantes de las mismas
5. El uso de un módulo ARDUINO no solo nos va a ayudar a aprender mas sobre él, si no que nos disminuye el tiempo de desarrollo a MUY POCO ( este demo lo armé y programé de la nada en menos de 2 horas).
haciendo asi mas productivo el tiempo y dando la oportunidad de presentar un producto mas confiable y presentable.


http://www.youtube.com/watch?v=vn72RrmLdiw#ws (http://www.youtube.com/watch?v=vn72RrmLdiw#ws)

les publico el código luego, lo que tengo que hacer es aprovechar los botones que tiene integrado el panel de numeros para por ahi, hacer el seteo de la hora.
Luego se podrán agregar características extras como ALARMAS y MENSAJES PERSONALIZADOS
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: cuzcatleco on May 20, 2012, 10:59:28 am
Hola Estimados entusiastas de la electronica+programacion.

los felicito por el bonito proyecto.
hace poco encontre este proyeco  desarrollado en una universidad del pais, pero con ATMEGA

http://microcontroladores2utec.wordpress.com/2011/04/23/proyecto-reloj-con-calendario-avr8-pt1/ (http://microcontroladores2utec.wordpress.com/2011/04/23/proyecto-reloj-con-calendario-avr8-pt1/)

(http://microcontroladores2utec.files.wordpress.com/2011/04/img_0474.jpg?w=320&h=240&h=240)

Opiniones son bienvenidas

Cuidense amigos
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on May 20, 2012, 01:31:04 pm
Hola Estimados entusiastas de la electronica+programacion.

los felicito por el bonito proyecto.
hace poco encontre este proyeco  desarrollado en una universidad del pais, pero con ATMEGA

http://microcontroladores2utec.wordpress.com/2011/04/23/proyecto-reloj-con-calendario-avr8-pt1/ (http://microcontroladores2utec.wordpress.com/2011/04/23/proyecto-reloj-con-calendario-avr8-pt1/)

(http://microcontroladores2utec.files.wordpress.com/2011/04/img_0474.jpg?w=320&h=240&h=240)

Opiniones son bienvenidas

Cuidense amigos

sorry por haber dejado tirado el proyecto, cuando lo termine posteo TODO, tal vez alguien se anima a hacerlo tambien.

el proyecto que pones es igualito al que yo puse en el video arribita, solo que no usan una tarjeta de desarrollo, Igual se podria hacer sin el arduino completo, solo programando el ATMega con su bootloader y el código hecho en el arduino (de seguro asi hicieron).

Solo que viendo el producto final les salió una caja ENORME!

mi solucion no es tan cara tampoco y creo que al ser módulos ya implementados es mas elegante.

RTC+LCD+ARDUINO+BOTONES
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hepl2000 on May 20, 2012, 08:05:41 pm
(http://i.imgur.com/OfaiR.jpg)

en el diseño de el nuevo estilo del reloj me topé con algo.

y es que hay que manejar 27 leds con los pines del pic elegido (16F627)
se que hay que usar multiplexeo, pero a alguien se le ocurre la mejor manera de agrupar o como tratar los valores para convertirlos a los leds
y tomar en cuenta que se debe tener la posibilidad de crear patrones aleatorios.

he designado 8 lineas de datos y 4 de control para el multiplexeo

alguna idea?
Poooww... pense que habia quedado botado el proyecto pero veo que ahora cambio el rumbo,

Ese reloj si que me llega mas  :thumbsup:, tratare de hacer un prototipo, usando unos "Serial to paralel shift registers" 74LS164 para ver como manejo los 27 leds.

Creo que lo mejor seria usar 3 lineas de control para las 3 filas y uno o dos shift registers para las 9 columnas.

Por ahi me quedaron tirados unos pics 16F684, 16F876 y un 16F877A de 40 pines por si no logro hacerlo funcionar con los shifts  :thumbsup:
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on May 20, 2012, 08:20:21 pm
podes usar un led driver como el MAX7219 o el 4794

4794
Arduino 16 LED Bar Graph (http://www.youtube.com/watch?v=x0UKqRsVHw0#)

MAX7219
MAX7219 LED Matrix demo (http://www.youtube.com/watch?v=zC1bzVhNd4E#)
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hepl2000 on May 21, 2012, 07:13:11 pm
podes usar un led driver como el MAX7219 o el 4794

4794
Arduino 16 LED Bar Graph (http://www.youtube.com/watch?v=x0UKqRsVHw0#)

MAX7219
MAX7219 LED Matrix demo (http://www.youtube.com/watch?v=zC1bzVhNd4E#)
Los venden aca o hay que traerlos de la USA? porque si los venden aca si lo veo factible, porque una vez de pura casualidad encontre unos max232 para puerto serial.
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: hepl2000 on June 14, 2013, 05:47:17 pm
retomo el proyecto porque tengo una forma mas eficiente de manejar todo esto:

les dejo un video de un demo de hardware con el que estoy trabajando:

CAMBIOS:

- Para controlar el tiempo uso un chip dedicado: es un RTC (Real Time Clock) DS1307
- Para desplegar la hora en el demo lo hago de dos formas:
  * Pantalla 2x16 LCD (HD44780)
  * 7 segment Module (TM1638)
   >> con alguno de estos dos quedará al final, ahi ya es gusto de cada quien
- para controlar el programa un módulo ARDUINO

Porque los cambios:
1. Es una buena oportunidad para aprender a usar hardware dedicado
2. a nivel de construcción es mucho mas fácil armar esto que un circuito completo de la nada
3. la eleccion de un RTC tiene muchas ventajas, La principal es que al usar una unidad independiente, con su propia fuente de voltaje (su bateria) ésta es totalmente autónoma y no importa si le el programa se traba o se resetea, el conteo de la fecha/hora siempre seguira pudiendose retomar en cualqueir momento, ésto le da mas confiabilidad a el establecimiento de la hora exacta.
4. las pantallas LCD y 7 SEGMENTOS ya armadas son mas fáciles de usar y ofrecen muchas posibilidades por parte de los fabricantes de las mismas
5. El uso de un módulo ARDUINO no solo nos va a ayudar a aprender mas sobre él, si no que nos disminuye el tiempo de desarrollo a MUY POCO ( este demo lo armé y programé de la nada en menos de 2 horas).
haciendo asi mas productivo el tiempo y dando la oportunidad de presentar un producto mas confiable y presentable.


http://www.youtube.com/watch?v=vn72RrmLdiw#ws (http://www.youtube.com/watch?v=vn72RrmLdiw#ws)

les publico el código luego, lo que tengo que hacer es aprovechar los botones que tiene integrado el panel de numeros para por ahi, hacer el seteo de la hora.
Luego se podrán agregar características extras como ALARMAS y MENSAJES PERSONALIZADOS
Mira y no sabes como poder sincronizar un pic con un rtc solo para que el pic guarde el conteo exacto de ciclos por segundo para lograr una mayor exactitud o sea usando el oscilador interno del pic, pero calibrarlo con el rtc para que sea mas exacto sin tanto calculo. y una vez calibrado que cuarde la info en su eeprom pues cada pic tiene sus diferencias de frecuencia de sus osciladores aunque sean minimas.
Title: Re:[PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: Jaru on June 14, 2013, 07:33:47 pm
Mira y no sabes como poder sincronizar un pic con un rtc solo para que el pic guarde el conteo exacto de ciclos por segundo para lograr una mayor exactitud o sea usando el oscilador interno del pic, pero calibrarlo con el rtc para que sea mas exacto sin tanto calculo. y una vez calibrado que cuarde la info en su eeprom pues cada pic tiene sus diferencias de frecuencia de sus osciladores aunque sean minimas.
si tenes el RTC que mas queres calcular? ademàs el oscilador interno de un PIC es mas impreciso que cuaquier otra coosa
Title: Re: [PROYECTO COMUNO] DISEÑEMOS UN RELOJ DIGITAL - OPEN SOURCE
Post by: mesie1976 on July 21, 2013, 11:28:00 pm
Hola buenas noches, ya he trabajado con ds1307 que venia en un kit de desarrollo de la parallax, por medio de protocolo I2C se le pone la hora y se extrae la hora, fecha, los comandos estan en la hoja técnica de la dallas semiconductor.

Enviado desde mi GT-P3110 usando Tapatalk 2