Autor Tema: El Relojito  (Leído 181187 veces)

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
El Relojito
« en: Septiembre 23, 2008, 04:55:03 pm »
El Relojito

Introducción
“El relojito” es un reloj de pared bastante especial. Además de dar la hora (como todo reloj que se precie de tal), también nos puede mostrar la temperatura ambiente. Pero lo que lo hace diferente a la mayoría de los relojes electrónicos cuyos esquemas puedes encontrar navegando por la web es la forma en que está construido su particular segundero. En efecto, en lugar de indicar el transcurso de los segundos mediante un par de display LED de 7 segmentos como es habitual, lo hace mediante 60 diodos LED dispuestos en forma de circulo a lo largo del borde exterior del circuito impreso que aloja todos los componentes del reloj.



Descripción del proyecto
El reloj que vamos a construir puede indicar la hora y los minutos mediante 4 display LED de 7 segmentos, en el formato “HH:MM”, donde los “:” centrales están constituidos por dos pequeños LEDs de 3mm. Estos displays también se utilizan para mostrar la temperatura, que se obtiene mediante un sensor de temperatura Dallas DS1820. Para mantener funcionando el reloj con una exactitud razonable se ha utilizado un reloj de tiempo real DS1307.

El segundero, como decíamos, es una circunferencia formada por 60 LEDs de 5mm, controlados mediante solamente dos pines del PIC16F628A. Esto es posible gracias a la utilización de un registro de desplazamiento construido a partir de 8 circuitos integrados 74HC164N. En este mismo número de la Revista uControl encontraras la explicación de su funcionamiento.

Además hemos dotado al reloj de 4 pequeños pulsadores, que servirán para llevar a cabo las tareas de puesta en hora, selección del modo de funcionamiento, etc.


"El relojito", listo para comenzar a funcionar.


El circuito
Si bien el circuito del Relojito puede resultar intimidante por su tamaño (emplea 18 circuitos integrados y más de 100 resistores) en realidad no es tan complejo como parece. El esquema se basa en un PIC16F628A, que se encarga de llevar a cabo todas las tareas necesarias.


Circuito del "Relojito", descargarlo para más destalle.

Este microcontrolador emplea como oscilador generador de pulsos de reloj un cristal de 4MHz, con dos condensadores de 22pF, conectados a los pines 15 y 16.

Los pulsadores encargados de la gestión de la puesta en hora y selección del modo de funcionamiento se encuentran conectados a los pines 10, 11, 12 y 13, que corresponden a los bits 4, 5 ,6 y 7 del PORTB. Cada uno de estos pines se ha puesto a GND mediante un resistor de 10K. Cada vez que presiona un pulsador, el pin correspondiente se pone a +V.

La temperatura se lee desde un sensor Dallas DS1820, conectado al pin 4 del microcontrolador. Este pin corresponder al bit 5 del PORTA.

Para mantener la exactitud del reloj empleamos un pequeño circuito integrado, también de Dallas, que se encarga de contar el tiempo por nosotros. Se trata del DS1307, de 8 pines, que dispone de su propio cristal (de 32.768 Hz) y de una pila CR-2032 de 3V de respaldo. Esta pila se proporciona la energía necesaria para que el DS1307 siga funcionando en caso de producirse algún fallo o desconexión de la fuente de alimentación principal. Esto evita el tener que volver a poner en hora el Relojito cada vez que lo desenchufemos de la red eléctrica.

Para mostrar tanto la información correspondiente a las horas y minutos como los datos de la temperatura, se emplearon 4 display LED de 7 segmentos de unos 3.5 centímetros de altura. El modelo elegido fue el C-1021H de Paralight. Se trata de display de cátodo común, donde cada segmento está constituido por dos LEDs rojos en serie. Los “:” centrales están formados por dos LEDs de 3mm conectados en serie, del mismo color que los displays, y son manejados desde el pin 7 del microcontrolador (PORTB.1)

Dado que el multiplexar estos displays mediante las técnicas tradicionales hubiese exigido un elevado número de pines de E/S del microcontrolador PIC16F628A, se utilizó un registro de desplazamiento construido a partir de cuatro circuitos integrados 74HC164N conectados en cascada. Cada una de las salidas de estos integrados controla uno de los segmentos de los displays. El pin 17 del microcontrolador (bit 0 del PORTA) se encarga de proporcionar los datos al registro de desplazamiento, mientras que el pin 18 (bit 1 del PORTA) entrega los pulsos de CLOCK necesarios.

El mismo truco del registro de desplazamiento se utilizó para controlar los 60 LEDs que conforman el segundero. Esta vez fueron necesarios 8 circuitos integrados 74HC164N. Este registro dispone de 64 salidas, de las que se aprovechan solo las primeras 60. Cada una de estas salidas controla uno de los LEDs a través de un resistor que limita la corriente que los atraviesa.

Dado que el consumo máximo posible de este proyecto es bastante elevado para lo que estamos acostumbrados, hemos dividido la etapa de alimentación en tres partes, cada una de ellas encargada de proporcionar energía a una de las secciones del reloj.

De esta manera, una de las etapas construidas alrededor de un regulador de voltaje LM7805 proporciona la corriente que necesita el microcontrolador, el sensor de temperatura y el reloj de tiempo real. Otra de las etapas alimenta los displays y el registro de desplazamiento que lo controla, y la tercera hace lo propio con los LEDs del segundero y sus circuitos integrados de control.

Si bien no figuran en el esquema eléctrico, hemos colocado condensadores cerámicos de 0.1uF entre los pines de alimentación de cada uno de los 74HC164N. Se pueden ver en las fotos, están soldados directamente sobre las pistas del PCB.


El circuito impreso
Como es de suponer, para albergar todo esto hace falta un circuito impreso bastante grande. Dado que en uControl intentamos mantener las cosas simples, por lo general no utilizamos circuitos integrados ni componentes de montaje superficial ni PCB de doble faz. Esto también ayudo a que el PCB sea grande.


El circuito impreso mide 18 centímetros de diámetro.

Quizás el rasgo más representativo de este circuito impreso sea su forma, ya que nos hemos apartado del clásico diseño rectangular o cuadrado y lo hemos dibujado como una circunferencia, de forma que los LEDs del segundero adopten la misma disposición que tendrían las marcas en la esfera de un reloj de aguja.

El diámetro de la placa de circuito impreso es de 18 centímetros. Cortarla con forma de circunferencia es bastante trabajoso, pero no imposible. De todos modos, aquellos que no se animen a cortar el PCB con esta forma, pueden simplemente utilizar un PCB cuadrado de 18 centímetros de lado con el dibujo que proponemos en el centro.

Para construir el PCB basta con utilizar el diseño que puede descargarse en formato PDF desde aqui, e imprimirlo siguiendo los pasos de nuestro tutorial "Como construir tus propios PCB".


El PCB puede ser construido utilizando el método "de la plancha"
que explicamos en uControl.


Diseño del PCB.


Componentes
La lista de componentes que vamos a emplear es bastante extensa, pero afortunadamente se trata de componentes de bajo costo, por lo se trata de un proyecto al alcance de todos los bolsillos.


Estos son los componentes que utilizaremos.

La lista de materiales necesarios es la siguiente:
    * 12 circuitos integrados 74HC164N.
    * 92 resistores de 220 ohm, 1/8 de Watt.
    * 7 resistores de 10K, 1/8 de Watt.
    * 1 circuito integrado DS1307.
    * 1 microcontrolador PIC16F628A.
    * 1 sensor de temperatura DS1820
    * 1 cristal de 4 MHz.
    * 1 cristal de 32.768 KHz.
    * 14 condensadores cerámicos de 100 nF (0.1uF).
    * 2 condensadores cerámicos de 22pF.
    * 1 condensador electrolítico de 220uF/16V.
    * 1 zócalo para pila CR-2032
    * 4 displays de cátodo común C-1021H de Paralight.
    * 2 LEDs rojos de 3mm.
    * 60 LEDs rojos de 5mm.
    * 1 diodo 1N4001.
    * 1 bornera para circuito impreso de dos tornillos.
    * 4 pulsadores de 8mm para circuito impreso.
    * 3 reguladores de voltaje LM7805.

También necesitarás un trozo de PCB virgen de una sola cara, con un tamaño de 18x18 centímetros, y zócalos para los circuitos integrados


Montaje
No hay mucho para decir sobre el montaje de los componentes de este proyecto. Puede ser una buena idea comenzar el trabajo de soldadura por los puentes y zócalos, para luego seguir con los resistores y condensadores. Los displays, reguladores de voltaje y LEDs deberían montarse en último lugar, cuidando de que estén en la posición correcta. Será un trabajo que tomara al menos una o dos horas, así que hay que encararlo con paciencia.

Una vez que todo esté en su lugar, y antes de colocar los circuitos integrados en sus zócalos, podemos alimentar el relojito y comprobar que a la salida de cada regulador de voltaje tenemos 5V. También podemos medir la tensión en los pines de los zócalos encargados de alimentar a cada integrado, para no tener alguna sorpresa desagradable. Entre los pines 7 y 14 de cada 74HC164N debería haber 5V, lo mismo que entre los pines 5 y 14 del zócalo correspondiente al microcontrolador.

Si todo está bien, podemos poner cada integrado en su sitio, cuidando de no ponerlos en la dirección opuesta.


Más abajo veremos cómo programar el microcontrolador.



El software
Ya vimos como desarrollar el hardware, y ahora comenzaremos a ver como sacar provecho de este diseño, explicando cada una de las rutinas necesarias para transformar ese montón de componentes en algo útil. Escribiremos el software desde cero, explicando cada uno de los pasos a seguir, de forma que todos puedan comprender a fondo cada una de las rutinas, y así ser capaces de modificarlas a gusto. Hemos decidido presentar versiones en PIC BASIC y CCS de cada trozo de código, como una manera de llegar a un mayor numero de lectores.
Configuración de los pines de E/S

El primer paso antes de comenzar a utilizar los pines de entrada o salida, es configurar correctamente su función. Este es un paso muy simple, y que no requiere de demasiadas explicaciones. Los comentarios incluidos en el código fuente serán suficientes para entender que hace cada línea de programa.

Veamos primero como hacerlo en PIC BASIC (recordemos que utilizamos la versión correspondiente al PIC SIMULATOR IDE):

Código: [Seleccionar]
'-----CONFIGURAMOS PUERTOS----------
AllDigital  'Todos los pines del PORTA como E/S

'Configuro el PORTA:
TRISA.0 = 0  'DATA Segundero
TRISA.1 = 0  'CLOCK Segundero
TRISA.2 = 0  'DATA HH:MM
TRISA.3 = 0  'CLOCK HH:MM
TRISA.4 = 0  'Salida
TRISA.5 = 0  'DS1820

'Configuro el PORTB:
TRISB.0 = 1  'Entrada pulsos del DS1307
TRISB.1 = 0  'Salida, LEDs ":" en display "HH:MM"
TRISB.2 = 0  'pin SCA del DS1307
TRISB.3 = 0  'pin SCL del DS1307
TRISB.4 = 1  'Entrada Pulsador 1
TRISB.5 = 1  'Entrada Pulsador 2
TRISB.6 = 1  'Entrada Pulsador 3
TRISB.7 = 1  'Entrada Pulsador 4

Ahora, vemos como hacer la misma tarea en CCS:

Código: [Seleccionar]
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.H>            //Usamos un 16F628A
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Con oscilador a cristal...
#use delay(clock=4000000)       //..de 4MHz.
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //No protegemos el código.
#FUSES NOBROWNOUT               //No Brownout Reset
#FUSES NOLVP                    //No low voltage prgming
#FUSES NOCPD                    //No EE protection

//Declaramos la posición de los puertos-----------------------
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE PORTA_TRIS = 0x85
#BYTE PORTB_TRIS = 0x86

//Y asignamos cada pin como E/S según corresponda:
PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA

Una vez listo este tramite, pasemos a las rutinas propiamente dichas.

Escribiendo los segundos.
La característica más sobresaliente de este reloj es su segundero. Compuesto por 60 LEDs ubicados sobre la circunferencia del reloj, se controlan mediante solo dos pines del microcontrolador. Esto es posible gracias a la utilización de un registro de desplazamiento.

Como ya hemos visto, este tipo de registro incorpora los datos presentes en su entrada con cada pulso de reloj que se aplica a su terminal CLOCK. Debemos respetar los tiempos de respuesta de los circuitos integrados que conforman los registros de desplazamiento. En este caso, el 74HC164N que henos utilizado puede funcionar a una frecuencia mas elevada que los 4 MHz (o el MIP) a los que funciona el PIC16F628A, por lo que no serán necesarios los tiempos de espera entre el envió de un dato y el siguiente.

Los pines implicados en el control de los LEDs del segundero son los correspondientes a PORTA.0 (o RA0, pin 17) y PORTA.1 (o RA1, pin 18), para las funciones de DATA y CLOCK respectivamente. Como no es el único registro de desplazamiento presente en el proyecto, nos referiremos a estas señales como DATA2 y CLOCK2.

Concretamente, el dato presente en la entrada del registro de desplazamiento se hace presente en la primera de sus salidas (“empujando” a los demás una posición hacia delante) cuando el pin CLOCK pasa de estado bajo a estado alto. Esto quiere decir que deberemos seguir el siguiente orden para cada bit que queramos enviar al registro:

   1. Poner el dato a enviar en el pin DATA2 (PORTA.0)
   2. Poner CLOCK2 (PORTA.1) en estado bajo.
   3. Poner CLOCK2 (PORTA.1) en estado alto.


Como se ve, es algo muy sencillo de implementar.

Veamos como hacerlo en PIC BASIC:

Código: [Seleccionar]
escribo_segundo:
data1 = bit_aux  'Pongo el valor en DATA
clock1 = 0  'Pongo el CLOCK en bajo...
clock1 = 1  '...y de nuevo en alto. Listo!
Return     


Esta rutina envía el valor de la variable “bit_aux” al registro de desplazamiento.

La subrutina supone que antes de llamarla hemos declarado las variables (usando DIM) y las “macros” (mediante SYMBOL) necesarias:

Código: [Seleccionar]
'------DECLARO VARIABLES y MACROS------------------
Dim bit_aux As Bit  'Declaro la variable auxiliar
Symbol data1 = PORTA.0  'Nos referimos a PORTA.0 como "data1"
Symbol clock1 = PORTA.1  'Nos referimos a PORTA.1 como "clock1"


Veamos la forma de hacer esto en CCS.

Código: [Seleccionar]
//Declaramos la Variable:
int1 bit_aux;         //Declaro la variable auxiliar

//--------------------------------------------------
//---Envia un DATO al registro de desplazamiento:
//--------------------------------------------------
void escribo_segundo(int1){
   if (bit_aux) {output_high(DATA2);} //Si es "1", lo escribo en DATA2.
   if (!bit_aux) {output_low(DATA2);} //Si es "0", lo escribo en DATA2. 
   output_low(CLOCK2);   //Pongo el CLOCK en bajo...
   output_high(CLOCK2);  //...y de nuevo en alto. Listo!
}

main(){
   //Asignamos cada pin como E/S según corresponda:
   PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
   PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA
}
En CCS, para hacer uso de la función “escribo_segundo”, basta con invocarla desde el programa principal, de la siguiente manera:

Código: [Seleccionar]
escribo_segundo (valor);
Donde “valor” será “0” o “1” dependiendo si queremos apagar o encender el LED correspondiente a la primera posición del registro de desplazamiento.


Haciendo limpieza
Antes de comenzar a enviar datos útiles al registro de desplazamiento, conviene “limpiar” el contenido de sus 60 bits, dado que al alimentar El Relojito pueden contener información aleatoria, que en la practica se verían como una serie de LEDs encendidos. Si no lo hiciéramos, cada dato que enviemos al registro “empujaría” a los bit-basura una posición hacia delante, algo que no quedaría demasiado bien.

La forma de evitar esto es bien simple: ni bien comienza nuestro programa, debemos escribir 60 ceros en el registro de desplazamiento, asegurándonos que todos los LEDs se encuentran apagados.

Dado que puede se trata de una acción que puede requerirse mas de una vez en nuestro programa, también la vamos a implementar como una subrutina (en PIC BASIC) o como una función (en CCS). Dado que ya tenemos el codito necesario para escribir un valor en el registro de desplazamiento, la nueva rutina/función solo deberá encargarse de “llamar” 60 veces seguidas a la que vimos antes, con el valor “0”.

Veamos como hacerlo en PIC BASIC:

Código: [Seleccionar]
borro_segundero:
bit_aux = 0  'Asigno el valor a enviar a la variable auxiliar...
For i = 0 To 59  '"i" irá de 0 a 59, de 1 en 1.
Gosub escribo_segundo  'envío bit_aux al registro
Next i
Return   
 

Y ahora, lo mismo pero en CCS:

Código: [Seleccionar]
void borro_segundero(void){
   int i;
   for (i=0;i<60;i++) {   // "i" irá de 0 a 60, de 1 en 1.
      escribo_segundo(0); //Envio un "0" al registro de desplazamiento
   }
}

Esto es todo lo que necesitamos saber para manejar correctamente los 60 LEDs del relojito.

Horas y minutos
Ahora le toca el turno al display que debe mostrar las horas y los minutos. Montado a partir de 4 displays de 7 segmentos y un registro de desplazamiento, la construcción de rutinas o funciones que lo controlen representa un desafío muy interesante, que ya mismo abordaremos.


Conexionado de los displays
Como vimos más arriba, en la descripción del hardware de este proyecto, la visualización de las horas y los minutos se realiza mediante cuatro displays de 7 segmentos de cátodo común. Esto significa que para encender alguno de sus segmentos debemos proporcionar tensión al pin correspondiente de cada módulo. Para evitar utilizar varios pines del microcontrolador PIC16F628A elegido como “cerebro” del proyecto al control de este display, se utilizó un registro de desplazamiento compuesto por 4 circuitos integrados 74HC164N. Cada uno de ellos se encarga del control de los 7 segmentos y del punto decimal de un display.

El nombre de los segmentos de cada display, según la mayoría de las hojas de datos, es el de la figura:


Displays utilizados.

Allí podemos ver que se nombran con letras de la “a” (el segmento superior del “8”) hasta la “g” (el segmento central), avanzando en sentido horario. El punto decimal suele llamarse “dp” (supongo que por “dot point” ), pero nosotros lo llamaremos “h”.

Cada uno de los segmentos (y el punto decimal) de cada display se encuentran conectados, mediante un resistor que limita la corriente que los atraviesa, a una de las salidas de los 74HC164N. Estos están conectados en “cascada”, por lo que cuando un dato “sale” de unos de los integrados se aplica a la entrada del siguiente. Esto significa que con solo dos pines (CLOCK y DATA) podemos escribir los 4 displays.

Los primeros 8 bits enviados al registro de desplazamiento serán los encargados de determinar el encendido de los segmentos del display de la izquierda (las decenas de las horas). Los siguientes 8 bits controlarán las unidades de las horas, los 8 que vienen a continuación manejarán el display que muestra las decenas de los minutos, y los últimos 8 bits determinaran el contenido del display que muestra las unidades de los minutos.

Esto quiere decir que si quisiésemos mostrar “23:15” en el display, primero deberíamos enviar los datos del “2”, luego los del “3”, los del “1” y finalmente los correspondientes al “5”.

Para saber cual es el contenido que debemos enviar para representar cada digito es necesario que tengamos bien presente la forma en que los circuitos integrados 74HC164N están conectados a los displays.


Conexión entre los 74HC164N y los displays.

Si miramos el esquema eléctrico anterior, veremos que el primer bit ingresado se encarga del encendido (o apagado) del segmento “d” del display, luego de ser “empujado” por los 7 bits correspondientes a los demás segmentos del display. Concretamente, el orden en que deben ingresarse los datos es “d”, “h”, “c”, “g”, “b”, “a”, “f” y “e”. La tabla de la figura siguiente muestra el valor de cada uno de estos bits para formara cada uno de los dígitos del 0 al 9. Hemos incluido el valor del byte en decimal y binario, para facilitar al lector la programación del display.


Tabla con los bits a enviar.


(Continúa en el próximo post)
« Última modificación: Enero 24, 2010, 06:24:36 pm por Ariel »
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: El Relojito
« Respuesta #1 en: Septiembre 23, 2008, 05:19:59 pm »
¡A programar!
Una vez que tenemos claro como debemos proceder, veamos como escribir un programa que muestre información en el display. Comencemos por un ejemplo que muestra como enviar un “2” al registro desplazamiento. El código en PIC BASIC es el siguiente:

Código: [Seleccionar]
'-----CONFIGURO PUERTOS----------
AllDigital

'Configuro el portA:
TRISA.2 = 0  'DATA HH:MM
TRISA.3 = 0  'CLOCK HH:MM
'Configuro el portB:
TRISB.1 = 0  'Salida, LEDs : en HH:MM

'------VARIABLES------------------
Dim i As Byte  
Dim col As Byte
Dim aux As Byte  

'----- Symbol -----------------
Symbol clock7 = PORTA.3
Symbol data7 = PORTA.2

'Limpio el contenido del registro de desplazamiento
'escribiendo 32 "0" seguidos:
For i = 1 To 32
data7 = 0
clock7 = 0
clock7 = 1
Next i

'Escribo un "2" en el primer display
aux = 157  'Valor decimal de "2" (ver tabla)

'Este bucle recorre el byte enviando sus bits
'al registro de desplazamiento:
For col = 1 To 8
'Si el bit es "0", escribo un "0".
If aux.0 = 0 Then
data7 = 0
clock7 = 0
clock7 = 1
Else
'Si el bit es "1", escribo un "1".
data7 = 1
clock7 = 0
clock7 = 1
Endif
'Paso al bit siguiente
aux = ShiftRight(aux, 1)
Next col

Casi al final de este artículo encontrarás videos que muestra como se van “corriendo” los datos por el registro de desplazamiento. Por supuesto, hemos agregado un retardo de un segundo después de enviar cada bit, para que pueda verse como funciona.


Ahora, modifiquemos el programa anterior para que podamos mostrar la hora “23:15” en el display. Como puede verse, hemos transformado las instrucciones que se encargan de enviar los 8 bits en una rutina, a la que llamamos 4 veces, pasándole como dato (en “aux”) el byte a escribir:

Código: [Seleccionar]
'-----CONFIGURO PUERTOS----------
AllDigital

'Configuro el portA:
TRISA.2 = 0  'DATA HH:MM
TRISA.3 = 0  'CLOCK HH:MM
'Configuro el portB:
TRISB.1 = 0  'Salida, LEDs : en HH:MM

'------VARIABLES------------------
Dim i As Byte  'Variable auxiliar
Dim col As Byte
Dim aux As Byte  'Variable auxiliar uso gral (WORD)

'----- Symbol -----------------
Symbol clock7 = PORTA.3
Symbol data7 = PORTA.2

'Limpio el contenido del registro de desplazamiento
'escribiendo 32 "0" seguidos:

For i = 1 To 32
data7 = 0
clock7 = 0
clock7 = 1
Next i
'Escribo un "2" en el primer display
aux = 157  'Valor decimal de "2" (ver tabla)
Gosub escribo
'Escribo un "3" en el segundo display
aux = 188  'Valor decimal de "3" (ver tabla)
Gosub escribo
'Escribo un "1" en el tercer display
aux = 40  'Valor decimal de "1" (ver tabla).
Gosub escribo
'Escribo un "5" en el cuarto display
aux = 182  'Valor decimal de "5" (ver tabla)
Gosub escribo

End                                              
'Este bucle recorre el byte enviando sus bits
'al registro de desplazamiento:
escribo:
For col = 1 To 8
'Si el bit es "0", escribo un "0".
If aux.0 = 0 Then
data7 = 0
clock7 = 0
clock7 = 1
Else
'Si el bit es "1", escribo un "1".
data7 = 1
clock7 = 0
clock7 = 1
Endif
'Paso al bit siguiente
aux = ShiftRight(aux, 1)
Next col
Return
           

Veamos este último ejemplo, pero escrito en CCS:

Código: [Seleccionar]
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.H>            //Usamos un 16F628A
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Con oscilador a cristal...
#use delay(clock=4000000)       //..de 4MHz.
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //No protegemos el codigo.
#FUSES NOBROWNOUT               //No Brownout Reset
#FUSES NOLVP                    //No low voltage prgming
#FUSES NOCPD                    //No EE protection

//Declaramos la posición de los puertos-----------------------
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE PORTA_TRIS = 0x85
#BYTE PORTB_TRIS = 0x86

//Definimos el valor de CLOCK y DATA
#DEFINE DATA7  PIN_A2 //Nos referimos a PORTA.2 como "data7"
#DEFINE CLOCK7 PIN_A3 //Nos referimos a PORTA.3 como "clock7"

//--------------------------------------------------
//---Envia un digito al registro de desplazamiento:
//--------------------------------------------------
void escribo(int8 aux){
   int i;
   for (i=0;i<8;i++) {   // "i" irá de 0 a 7, de 1 en 1.
      //Si el bit es "0", escribo un "0".
      if (bit_test(aux,i) == 0) {
         output_low(DATA7);    //Pongo "0" en DATA7...
         output_low(CLOCK7);   //Pongo el CLOCK en bajo...
         output_high(CLOCK7);  //...y de nuevo en alto. Listo!  
      }
      //Si el bit es "1", escribo un "1".
      if (bit_test(aux,i) == 1) {
         output_high(DATA7);    //Pongo "1" en DATA7...
         output_low(CLOCK7);   //Pongo el CLOCK en bajo...
         output_high(CLOCK7);  //...y de nuevo en alto. Listo!  
      }
   }
}
//--------------------------------------------------
//---Limpia el display:
//--------------------------------------------------
void borro_display(void){
   int i;
   for (i=1;i<33;i++) {   // "i" irá de 1 a 32, de 1 en 1.
         output_low(DATA7);    //Pongo "0" en DATA7...
         output_low(CLOCK7);   //Pongo el CLOCK en bajo...
         output_high(CLOCK7);  //...y de nuevo en alto. Listo!
   }
}
main(){
   //Asignamos cada pin como E/S según corresponda:
   PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
   PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA
   //Limpiamos el display
   borro_display();
   //Escribo un "2" en el primer display
   escribo(157); //  'Valor decimal de "2" (ver tabla)
   //Escribo un "3" en el segundo display
   escribo(188); //  'Valor decimal de "3" (ver tabla)
   //Escribo un "1" en el tercer display
   escribo(40); //  'Valor decimal de "1" (ver tabla)
   //Escribo un "5" en el cuarto display
   escribo(182); //  'Valor decimal de "5" (ver tabla)
}
Como puede suponerse, el redibujado del display ocurre a tal velocidad que es imperceptible para el ojo. Y al no tener los dígitos correspondientes a los segundos, solo debe escribirse el display una vez por minuto. El tiempo que insume enviar los 32 datos al registro de desplazamiento ronda los 160 microsegundos.


Suponiendo que tenemos resuelto el mecanismo que cada un segundo pone un flan en alto (algo que veremos en el próximo numero, usando interrupciones), deberíamos escribir una rutina (o una función, si usamos CCS) que actualice el display y el “segundero” cuanto corresponda. Cada un tiempo determinado una “bandera” se pondría en “1”, y el cuerpo principal del programa debería actualizar la hora y mostrarla en el display. Eso, justamente, es lo que hace el siguiente ejemplo en PIC BASIC:

Código: [Seleccionar]
'Esta rutina muestra HH:MM
muestro_hhmm:
'Muestro las decenas de las horas
aux1 = hora / 10
aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1
Gosub escribo

'Muestro las unidades de las horas
aux1 = hora - (hora / 10) * 10
aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1
Gosub escribo

'Muestro las decenas de los minutos
aux1 = minu / 10
aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1
Gosub escribo

'Muestro las unidades de los minutos
aux1 = minu - (minu / 10) * 10
aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1
Gosub escribo
Return  

Se asume que aux1 y aux están declaradas como “BYTE”, y que la rutina “escribo” vista antes esta presente en el programa.


Firmware para el PIC
NO TENEMOS UN ARCHIVO HEX LISTO PARA GRABAR EN EL PIC. La idea detrás de este proyecto es el aprendizaje, asi que iremos explicando paso a paso el funcionamiento de todas las rutinas que componen el programa para que el usuario sea capaz de escribirlo por si mismo.


Videos

El Relojito en funcionamiento:
Escribiendo en el display "23:15":


Conclusión
Invitamos a los lectores a escribir sus propios programas, ya que es un buen ejercicio de aprendizaje.

Temas relacionados
Estos proyectos y tutoriales pueden servirte de ayuda a la hora de modificar este circuito, o para diseñar tu propio reloj:

Tutoriales
    * Como construir tus propios PCB (Tutorial completo)
    * El lenguaje BASIC del PIC SIMULATOR IDE (Tutorial)
    * Entorno de programación y simulación PIC SIMULATOR IDE (Tutorial completo)
    * ¿Cómo funciona un registro de desplazamiento? (Tutorial completo)

Proyectos
    * Construye tu propia Matriz de LEDS de 8x8 (Proyecto completo)
    * Construye tu propia Matriz de LEDS de 7x32 (Proyecto completo)
    * Teoria de funcionamiento de una matriz de LEDs (Tutorial completo)


Autor: Ariel
« Última modificación: Enero 24, 2010, 06:26:40 pm por Ariel »
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: El Relojito
« Respuesta #2 en: Septiembre 23, 2008, 06:02:05 pm »
**POST RESERVADO - uControl **
« Última modificación: Enero 24, 2010, 05:54:05 pm por Ariel »
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #3 en: Septiembre 23, 2008, 06:40:07 pm »
Bueno, como no sabia donde colocarlo, pos lo pongo aqui, Ariel verá si se puede quedar como el post oficial de este proyecto, que tanto me gustó desde su aparicion.
El caso es que despues de haber hecho la placa, haber descansado un buen tiempo, y montado los componentes excepto los leds (que tardaron en llegar del Ebay), al final, el domingo terminé de soldar los 62 leds, y haciendo pruebas de funcionamiento, creo haber descubierto un fallo de diseño, explico:

A ver, en la parte de los leds correspondientes al segundero (los 60) al enlazar un registro de desplazamiento con el siguiente (74hc164n), resulta que la union se hace despues de la resistencia del ultimo led del registro de desplazamiento, con lo cual, no le llegan los 5 volts necesarios, y al menos a mi, eso me hacia que solo se iluminasen los primeros 8 leds, la solución, muy sencillo, cortar la pista despues del octavo led de cada registro, y hacer la union desde los pines  del registro directamente.

Una vez modificado esto, ya funcionan todos los leds, comprobado.
si se me explica como subir fotos, subo fotos del proceso de montaje que tengo (aunque la placa no me quedó muy bien definida, funciona), y de las pistas cortadas.
Ahora solo me falta intentar empaparme bien del tema de programación, para que el reloj sea un reloj verdadero, jejeje
Un saludo y gracias por leer el tocho de post.
Que alguien mueva este mensaje a proyectos/relojito, que me he dado cuenta que ahi tb esta abierto un post!!!!!



No, no hay ningun HEX por ahora. Como habras deducido, esta pagina es mi hobby, y aunque me encanta hacerla, no siempre tengo todo el tiempo que quisiera para encarar cosas.

Por eso es que el reloj tiene un monton de funciones sueltas, pero no un programa terminado. Quizas ahora con el foro entre 5 o 6 usuarios lo terminemos! :)

Por lo pronto, si el registro te hace esas "cosas raras" puede ser ruido en alguna parte... ¿pusiste los condensandores de 1uF entre los pines de alimentacion de cada 74HC164N? Yo los tuve que soldar del lado de las pistas del impreso, por que no los preví, y me hicieron falta.

Saludos!
Hola Mad! :)

Ya esta hecho.

Tienes mucha razon con lo que dices.

No he verificado el esquema, pero en mi caso (como puede verse en los videos y demas) eso no ha sido problema....Se ve que luego de la resistencia queda una tension que esta al limite de lo que para el 74HC164N es un "1" o algo por el estilo. No encuentro otra explicacion.

Tengo que encontrar el tiempo para hacer ese PCB bien, con un programa como el PCB Wizard o Eagle, por que el que estamos discutiendo lo hice con el ....PAINT!! :)

Saludos, y bienvenido al foro. 8)

Pues tu dominio con el PAINT es soberbio, respecto al limite, mis integrados, serán mas sensibles que los tuyos, los mios son philips, y como ke no funcionan sin la modificacion, asi ke puentes de cable al canto por la parte de las pistas y solucionado, ahora lo que veo raro (que será problema mio) es que no consigo hacer la secuencia de encendido de leds correcta, siempre me sale algun registro por ahi funcionando, tengo ke intentar aprender rapido a programar estos pics, ya que me quiero meter en un proyectito que tengo en mente y me va a hacer falta aprender a programar y sobre todo, a aclarar los conceptos.
Tengo unas ganas enormes de verlo funcionar con sensor de temperatura y todo
Hay algun hex por ahi que funcione medianamente?? solo quiero saberlo, por ahora no lo quiero, quiero intentar sacarlo yo tarde o temprano.
Un saludo

No, no hay ningun HEX por ahora. Como habras deducido, esta pagina es mi hobby, y aunque me encanta hacerla, no siempre tengo todo el tiempo que quisiera para encarar cosas.

Por eso es que el reloj tiene un monton de funciones sueltas, pero no un programa terminado. Quizas ahora con el foro entre 5 o 6 usuarios lo terminemos! :)

Por lo pronto, si el registro te hace esas "cosas raras" puede ser ruido en alguna parte... ¿pusiste los condensandores de 1uF entre los pines de alimentacion de cada 74HC164N? Yo los tuve que soldar del lado de las pistas del impreso, por que no los preví, y me hicieron falta.

Saludos!


Si, los condensadores estan puestos, pero lo que noto, es que cuando toco el primer 76hc164, de repente se apagan todos los leds, al igual que algun plano de masa, o en ciertos momentos, con solo pasar la mano por encima de la zona del pic...
Me tiene muy moskeado, no se de donde puede venir el fallo...


« Última modificación: Enero 24, 2010, 05:44:57 pm por Ariel »
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #4 en: Septiembre 23, 2008, 07:03:57 pm »
Otra foto mas, echas con el movil, cuando pueda, pongo las del pcb echas con la camaara digital, y las de las cosas raras de los registros.
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #5 en: Septiembre 23, 2008, 07:04:28 pm »
otra mas
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #6 en: Septiembre 23, 2008, 07:04:57 pm »
y la ultima por ahora
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: El Relojito
« Respuesta #7 en: Septiembre 24, 2008, 01:36:16 pm »
Impresionante!!!!
Me parece estar viendo el mio!  :P

Tenemos que organizar una galeria de trabajos asi en uControl! :)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #8 en: Septiembre 24, 2008, 04:05:13 pm »
Jeje, el tuyo está cortado en circulo, el mio no, y los displays, me costó lo suyo encontrarlos por aqui, al final en rs on line, encontré, eso si, un pokito caros.
Por cierto, cuando rutees el circuito, kizas estaria bien el contemplar usar diodos azules de alta luminosidad, tiene que quedar muy curioso, yo al menos, cuando llegue a funcionar, haré las modificaciones oportunas, y montaré otro (como la parte de programacion estaria lista), para la sala quedaria muy chulo, con un metacrilato en frente.
En otro orden de cosas, sigo sin encontrar la causa de que me funcionen mal los registros de desplazamiento, y de que me salgan ruidos por ahí
Si mañana tengo tiempo, subo un video a youtube para que se vean los extraños que me hace.
TENGO MUCHAS GANAS DE VERLO 100% OPERATIVO
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

jucemoar

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #9 en: Septiembre 26, 2008, 11:51:41 pm »
hoal ariel
 una pregunta lo tienes en asm ?   salu2 julio

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: El Relojito
« Respuesta #10 en: Septiembre 27, 2008, 08:09:43 am »
Hola!
Nunca programe en ASM  :(
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

ShaVo

  • PIC10F
  • *
  • Mensajes: 1
Re: El Relojito
« Respuesta #11 en: Octubre 07, 2008, 12:51:13 pm »
wenas !!! como os va a todos, este es mi primer post en el foro
sabes ariel soy alumno de 5año de electronica
y he elegido como proyecto el relojito "muy especial"
xD el problema es q como micro debemos usar el at89s52
no trabajamos con pics y el soft debe estar en ASM
crees q es mas dificil hacerlo en este micro y en asm??
claro esta en la cantidad de puertos que tieneel 89s52
y es masgrande... pero bueno debo usar este micro para el proyecto
muchisimas gracias de antemano y ta muy buena la pagina !!  ;D

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #12 en: Octubre 07, 2008, 03:44:38 pm »
Buenas, yo creo ke la dificultad radicará en tu conocimiento del micro y del lenguaje elegido, en este caso para ti, asm, al respecto de la placa, con replantearla y diseñarla, supongo que seria suficiente, hablo desde la casi ignorancia, por ke yo voy poco a poco aprendiendo por mi cuenta, y aunque no se grandes cosas, algunos conceptos si ke estan claros.
Pero amos, en base seria lo mismo.
Un saludo.
Se que no soy Ariel, pero me ha dado por responder, jejeje
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??

jucemoar

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #13 en: Octubre 10, 2008, 03:55:23 pm »
hola mad-mam
me gustaria saber si te es posible de conpartir el HEX de eseproyecto es que estoy que lo hago pero como ya saben solo medio programo pero en ASM y de C  no se ndad atte JULIO

Mad-Man

  • PIC10F
  • *
  • Mensajes: 12
Re: El Relojito
« Respuesta #14 en: Octubre 12, 2008, 05:45:44 am »
Pues vamos listos, por ke todavia no se programar.... jejeje, ademas ahora estoy inmerso en un cambio de trabajo, con lo cual, no puedo dedicarle tiempo al relojito, pero algun dia, juro que ese reloj funcionará.
Electronica, Aermodelismo, Automodelismo, Informatica, Fotografia... Ya hay tiempo para todo??