sábado, 28 de septiembre de 2013

Reloj con DS1307, 18F452 y LCD 16x2 en assembler

 Hola a todos: Les dejo un pequeño proyecto de reloj con un DS1307 para 18F452 y salida en display 16x2, se pueden ajustar el día de la semana, el mes y cada uno de los dígitos mostrados mediante dos pulsadores, uno conectado al pin RB5, llamado MODO que se utiliza para acceder a cada una de las variables y el otro conectado a RB4 llamado MAS para modificar el valor de dicha variable seleccionada, dentro de ciertos límites posibles.

 La parte de comunicación I2C está basada en el trabajo que realizó el amigo BRUNOF y que generosamente publicó en este link: Ejemplo de utilizacion del Modulo I2C del 16F877a Aunque adaptado para el micro 18F452 y con algunas modificaciones, como por ejemplo el carecer del aviso de error en la comunicación I2C y utilizar el set de instrucciones extendido de la familia 18F entre otras cosas. Adjunto el programa completo en este post.

 La inspiración, análisis y también gran parte del diseño del modulo para el DS1307 provienen de este hilo: Real Time Clock o el DS1307 desatado obra del maestro REDPIC.




Pido disculpas por la calidad del video, en el cual no se aprecia mucho detalle, pero que intenta mostrar como voy modificando la fecha y la hora mediante los pulsadores, Spielberg y Lucas pueden dormir tranquilos...



El esquema es muy simple, aunque no he realizado el mismo en un PCB, simplemente he utilizado los módulos de mi placa de pruebas casera.


 El programa Comienza inicializando puertos y variables como es normal, luego lee la memoria del DS1307 y verifica los bits de configuración del módulo y en caso de estar mal seteados los corrige para que empiece a funcionar el reloj, aparte de hacer pulsar todos los dígitos en el display para indicar que se debe ajustar la fecha y la hora. Una vez hecho esto, los números pasan a mostrarse en forma normal.
 Para elegir la variable a ajustar se debe pulsar el botón MODO. Para ajustar las variables se debe pulsar el botón MAS. Las variables ajustables son las siguientes: Día de la semana, mes, decena y unidad de fecha, de año, de hora, de minutos y de segundos. 

 Se debe tener cuidado al poner los valores ya que el DS1307 no reconoce los errores y sus contadores pueden seguir hasta valores extraños.

Descarga el programa en assembler.



lunes, 5 de agosto de 2013

Rutina en ASM para el manejo del generador DTMF HT9200A de HOLTEK

El circuito integrado HT9200 de la firma Holtek es un generador de tonos DTMF  (Dual-Tone Multi-Frequency) para el discado automático en líneas telefónicas.
El modelo "A" es controlado de modo serial mediante un microcontrolador como se muestra en la figura de ejemplo de la nota de aplicación de Holtek:

Como se puede apreciar utiliza una línea de datos serial, un Clock y una señal de habilitación (Chip Enable) hacia el microcontrolador. Además necesita un cristal del valor especificado en la figura para el oscilador interno del CI.

Para obtener el tono de discado deseado el pin CE debe estar en bajo y se debe enviar en forma serial un número de 5 bits de acuerdo al tono que deseemos discar (Ver tabla adjunta), además todo esto sincronizado con los pulsos de reloj (CLK).

Primero se transmite el bit "D0" (el bit menos significativo), hasta el bit "D4".
El CI toma el dato cuando el pulso de reloj baja, según se va en el gráfico de tiempos:



Acá les dejo la rutina para el control del integradito generador de DTMF. 

Antes de llamar a la subrutina dtmf se debe cargar el valor del dígito a transmitir en W.
en este ejemplo utilicé rb4 como terminal de clock y rb3 como dato, tiene además este integrado un terminal de CS (Chip Select) en lógica negada, osea que cuando está en uno el integrado se apaga y cuando está en cero se enciende.
En mi caso no lo utilicé ya que detiene el tono enviandole un 31 en decimal, aparte el control por el CS genera un ruido bastante molesto en la salida, espero que les sirva, saludos.


                 movlw .5                   ;en este caso envía el 5
                 call dtmf                    ;llama a la subrutina
                 call retardo_60ms      ;llama a la sub de retardo
                                                 ;para que suene unos 60ms
                 movlw .31                 ;con este número detiene la salida del tono
                                                 ;puede ser cualquier número que termine con 5 unos...
                 call dtmf                    ;lo envía
                 call retardo_40ms      ;suponiendo que enviamos otro dígito
                                                 ;tiene que haber un tiempo con silencio
                                                 ;entre dígito y dígito.
.
.
.
.
.

dtmf            movwf digito            ;carga el número a enviar en dígito
                  movlw d'5'                ;carga el contador en 5
                  movwf contador        ;va a contar cinco veces
                  bsf portb,rb4             ;se asegura que el pulso del clock esté en uno, en este caso es rb4
dtmf_bucle  bsf portb,rb3             ;saca el dato a transmitir por rb3
                  btfss digito,0             ;si el bit a transmitir es uno lo deja como está
                  bcf portb,rb3             ;si no lo pone en cero
                  bcf portb,rb4             ;flanco de bajada del clock, transmite el bit
                  nop                          ;el tiempo de retardo es 5 uS
                  nop                          ;para una frecuencia de 100khz aprox.
                  nop                 
                  nop                    
                  bsf portb,rb4             ;sube el pulso de reloj
                  rrf digito,1                ;va rotando el bit a transmitir
                  bcf status,c               ;limpia el carry
                  decfsz contador,1      ;si llegó a cero el contador, sale del bucle
                  goto dtmf_bucle        ;Sino vuelve al bucle
                  return                      ;retorna al programa













viernes, 19 de noviembre de 2010

Módulo de teclas y leds para la entrenadora

Cualquier entrenadora que se precie de tal debe tener al menos un par de teclas y leds para realizar las prácticas más básicas; Este fué el primer módulo que construí para adosar a la placa de pruebas, consta de ocho teclas y ocho leds.
Generalmente se suelen hacer con un jumper de selección entre led o pulsador para cada pin con el riesgo de dañar al micro en caso de error.
¿Como es esto? Bueno supongamos que por algún error un jumper está seleccionando su pulsador en lugar del Led y que el pin correspondiente está programado como salida, ¿Qué pasaría si apretamos dicho pulsador? La respuesta es bastante simple: Sin el pin de salida está en 1 y el pulsador vá a GND podemos despedirnos de dicho pin. Para esto pensé que se podía diseñar un circuito que proteja estos pines de cualquier distracción y también evitar el uso de jumpers que suelen ser bastante incómodos, en el sentido de que con un poco de uso dejan de hacer buen contacto y además se suelen perder.






miércoles, 3 de diciembre de 2008

Entrenadora de 40 pines para PICs

Hoy les voy a mostrar la pequeña entrenadora que construí hace algún tiempo para las familias de microcontroladores PIC 16F y 18F de 40 pines, la misma me ha servido para aprender mucho más sobre los PICs y para probar muchas aplicaciones.
El concepto de esta es contar con lo básico para que el micro pueda funcionar, fuente, reset, cristales de varias frecuencias, ICSP y disponer de todos los puertos del micro mediante conectores.
Para el diseño de la misma adapté a mi gusto personal los circuitos de las páginas de los amigos Diego y Ariel de los que saqué muy buenas ideas.
En el video se puede ver la placa en una de las primeras pruebas que hice.




Mi deseo principal era hacer que la entrenadora sea lo mas versátil posible en cuanto a tener acceso a todas las patas del micro, ya que en algunos modelos cada uno de los pines cumple varias funciones, incluso el que se utiliza para RESET o para los de conexión del cristal. Por ese motivo he puesto jumpers en algunos pines para conectarlos a estas funciones básicas o al conector del puerto utilizado.
Como ejemplo se puede citar el PIC 18F4550 cuyo pin 1 se puede utilizar como MCLR (Master Clear Reset) o también como pin de entrada o salida digital.
La PCB es simple faz de 10 x 10 Cm.


Descripción del circuito


El microcontrolador
Como ya dije antes, esta placa de pruebas está diseñada para microcontroladores de la línea 16F y 18F de 40 patas de la marca Microchip, el micro se inserta en un zócalo DIL de 2X20. Los capacitores C2 y C3 de 18pF, así como C8 de 1uF de tantalio van al centro del mismo zócalo. En caso de querer utilizar un zócalo ZIF, se deberán soldar estos capacitores sobre el cobre, ya que el ZIF no tiene espacio  por debajo. En este caso se puede reemplazar a C8 por uno SMD del mismo valor.
El capacitor C8 de tantalio que se vé en el esquema, debe ser de 1uF o más y debe soportar una tensión de 6V, el mismo cumple la función de filtrado de la alimentación del micro y debe estar lo más próximo a los pines del mismo.
El puente PULL UP RA4 junto con la resistencia R6 permite trabajar con la salida del puerto RA4 que en algunos micros es a drenaje abierto, Para aclarar más el asunto pueden consultar el hilo: El PORTA de los PIC's y una de sus particularidades : RA4 del foro Todopic.
El puente VUSB conecta el capacitor C1 de 10uF al pin 18 en caso de que se esté utilizando algún modelo de PIC con puerto USB. En caso contrario se debe prestar atención de desconectarlo ya que se puede dañar la salida de dicho PIN.

Los puertos
Todos los pines de los puertos está disponibles hacia el exterior mediante conectores IDC macho de 10 vias, a los cuales le conectaremos los módulos externos mediante fichas IDC hembra con su cable plano (de 10 hilos obviamente), tal como se ve en la fotografía, estas fichas son prácticas, económicas e incluso por su forma evitan cualquier conexión errónea.


Como se puede observar en el esquemático, en cada conector IDC-10 se conectan cuatro pines de cada puerto más VCC y GND, por lo que solo se han utilizado seis de los diez pines de cada IDC. Esto permite un diseño mas sencillo de la placa entrenadora y sus periféricas, además de permitir un uso mas flexible en la elección de los pines a conectar en cada uno de los módulos adicionales que iremos viendo más adelante. Según la mitad de puerto a la que está conectado el IDC tendremos la siguiente distribución de pines:
1-GND, 2-VCC, 3-D3, 5-D2, 7-D1, 9-D0.
1-GND, 2-VCC, 3-D7, 5-D6, 7-D5, 9-D4.
En ambos casos los pines 4, 6, 8 y 10 no se utilizan. En el dibujo se puede apreciar la distribución de los pines del conector visto desde arriba.


La alimentación
La alimentación ingresa por la bornera doble VDD; Tiene un interruptor S1 para desconectar esta de todo el sistema; El diodo D1 protege el circuito de cualquier inversión de polaridad, C4, C5 y C7 son capacitores de filtrado, la tensión se regula por medio de un 7805 por lo que a la entrada se puede alimentar con un voltaje de entre 7,5 y 18 Volts, aunque no es recomendable que esta sea muy alta ya que el 7805 deberá disipar una potencia considerable. D3 protege al 7805 en caso de que se ingrese tensión al circuito por alguna de las placas periféricas. Y por último el LED1 junto con la resitencia R4 nos indica el encendido del circuito.


El circuito de Reset
 El pin 1 del micro puede ser conectado tanto al circuito de Reset como a un pin de salida de la placa mediante el jumper selector de 3 pines RE3-RESET, esto es debido, como ya se explicó anteriormente, a que en algunos modelos de micros, como el 18F4550 por ejemplo, este pin puede cumplir dos funciones: MCLR (Master Clear Reset) ó RE3 (Pin 3 de E/S  del puerto E).
En la parte de Reset el diodo D2 evita que la tensión de programación afecte al resto del circuito; el capacitor C6 junto con la resitencia R5 proveen un tiempo de Reset al momento del encendido; Finalmente el pulsador RESET y R3 cumplen la función en cualquier momento que presione.


ISCP
La programación ISCP se realiza a través de un conector de cinco pines Molex, con el siguiente orden de señales: 1-GND, 2-VCC, 3-PGD, 4-PGC, 5-MCLR; También se dejaron previstas dos resitencias R1 y R2 de 1K2, para separar estas señales de cualquier carga que puedan haber conectadas en los pines RB7 y RB6 respectivamente. es probable que estas resistencias afecten el desempeño de algún periférico conectado a estos pines, en cualquier caso se pueden obviar las mismas con sendos puentes o modificar por un valor mucho menor. En mi caso generalmente trato de dejar este puerto para señales de poca corriente.





Cristales
Se ha previsto lugar para tres cristales para diferentes frecuencias, seleccionables mediante los jumpers 4MHz, 10MHz y 20MHz, en los pines 13 y 14 del micro. Tiene dos capacitores C2 y C3 de 18pF como indica la hoja de datos.
 Estos pines, 13 y 14, se pueden utilizar como puertos de E/S en algunos modelos, a los que también se podrá acceder mediante los jumpers RA7 y RA6 respectivamente. Todo esto utilizando el oscilador interno del micro.
En esta parte del esquema también se muestran lo puentes J1 al J5, que son la continuación de algunas pistas sobre la PCB debido a la complejidad de hacerla a simple faz.






En el enlace siguiente se pueden descargar los archivos en EAGLE y un PDF para hacer tu fotolito o el método de la plancha, espero que les sea útil.
Documentos