-
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:
-
ahora hacé uno que dé la hora en binario y hexadecimal simultáneamente :D
-
: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
-
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
-
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?)
-
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
-
: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:
-
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.
-
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:
-
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.
-
: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)
-
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.
-
Falta algo, los indicadores de segundos (o sea los ":" entre las hora y miinutos)
-
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
-
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.
-
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.
-
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]
-
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 :)
-
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
-
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
-
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.
-
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.
-
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
-
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
-
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.... :)
-
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 --- :)
-
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:
-
Tienes...la razon... :thumbsup: :drinks: :drinks:
-
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:
-
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?
-
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
'#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
-
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:
/* 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:
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)
-
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
-
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?
-
avances de mi programa en BASIC
'#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
-
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)
-
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
http://www.mediafire.com/?c8w3w6b2wlya3pz
Codigo Basic para compilar con PIC SIMULATOR IDE v6.83 (ya contenido en el zip adjunto)
'#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)
-
un video del demo anterior
Reloj digital con PIC y displays de 7 segmentos - prueba segundos (http://www.youtube.com/watch?v=04tgnrcNNdE#)
-
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
-
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)
-
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
-
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
-
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
-
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)
-
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#)
-
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:
-
De paja en paja ya agarro forma el proyecto, bien por ti naruto :thumbsup: haber que dia te echas algo con arduino.
-
-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)
-
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:
-
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:
-
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:
-
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
-
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.
-
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
-
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:
-
@~ 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.
-
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?
-
(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?
-
nadie? x_x
-
usando como base el código de SmRenderos programé completo el calculo de las horas minutos y segundos
en pseudocodigo
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
-
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)
-
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 :)
-
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.
-
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
-
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
-
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
-
(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:
-
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#)
-
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.
-
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.
-
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
-
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