Stamp Works

Page 1

Experimentos y Código Fuente para el BASIC Stamp Versión en Castellano 1.1 Sobre la precisión de este texto: Se realizó un gran esfuerzo para asegurar la precisión de este texto y los experimentos, pero puede haber errores aún. Si usted encuentra errores o algún tema que requiera información adicional, por favor infórmelo a aalvarez@parallaxinc.com, así podemos continuar mejorando la calidad de nuestra documentación.


Garantía Parallax garantiza sus productos contra defectos en sus materiales o debidos a la fabricación por un período de 90 días. Si usted descubre un defecto, Parallax según corresponda, reparará, reemplazará o regresará el valor de la compra. Simplemente pida un número de autorización de regreso de mercadería (Return Merchandise Authorization, “RMA”), escriba el número en el exterior de la caja y envíela a Parallax. Por favor incluya su nombre, número telefónico, dirección y una descripción del problema. Nosotros le regresaremos su producto o el reemplazo, usando el mismo método de correo que usted usó para enviar el producto a Parallax.

Garantía de 14 días de regreso de dinero Si dentro de los 14 días en que usted recibió su producto, encuentra que no es conveniente para sus necesidades, puede regresarlo, recibiendo un reembolso. Parallax regresará el precio de compra del producto, excluyendo los costos de manipuleo y correo. Esto no se aplica si el producto a sido alterado o dañado.

Derechos de Copia y Marcas Registradas Esta documentación tiene derechos de copia Copyright 1999 por Parallax, Inc. BASIC Stamp (Estampilla BASIC) es una marca registrada de Parallax, Inc. Si usted decide usar el nombre “BASIC Stamp” en su página web o en material impreso, debe agregar la aclaración: “BASIC Stamp es una marca registrada de Parallax, Inc.” Otros nombres de productos son marcas registradas de sus respectivos dueños.

Desvinculación de Responsabilidad Parallax, Inc. no es responsable de daños por consecuencias, incidentes o daños especiales que resulten de cualquier violación de la garantía, bajo cualquier teoría legal, incluyendo pérdida de beneficio, tiempo, daño o reemplazo de equipo o propiedad y cualquier costo, recuperando, reprogramando o reproduciendo cualquier dato guardado o usado dentro de los productos Parallax. Parallax tampoco es responsable de cualquier daño personal, incluyendo vida o muerte, resultado del uso de cualquiera de nuestros productos. Usted tiene absoluta responsabilidad por la aplicación que desarrolle con el BASIC Stamp.

Acceso en Internet Mantenemos sistemas de Internet para su uso. Estos pueden ser usados para obtener software, comunicarse con miembros de Parallax y comunicarse con otros clientes. Las rutas de acceso a la información se muestran a continuación: E-mail: Web:

aalvarez@parallaxinc.com

http://www.parallaxinc.com y http://www.stampsenclase.com

Lista de Discusión de BASIC Stamp en Internet Mantenemos dos listas de discusión por e-mail para gente interesada en el BASIC Stamp. La lista trabaja así: mucha gente se suscribe a la lista y luego todas las preguntas y respuestas son distribuidas a todos los suscriptos. Es una forma rápida, divertida y gratis de discutir temas sobre el BASIC Stamp y obtener respuestas a preguntas técnicas. Para suscribirse a la lista de BASIC Stamp encuentre la información en www.parallaxinc.com. Esta lista genera aproximadamente 40 mensajes diarios. También mantenemos una lista exclusiva para educadores que usan el BASIC Stamp en el aula. Usted puede unirse a esta lista en el sitio web http://www.stampsinclass.com. Esta lista genera aproximadamente 5 mensajes diarios. Si busca una lista de discusión en castellano puede encontrarla en http://www.stampsenclase.com.


Contenido

Contenido Prefacio ............................................................................................................................... 3 Introducción .............................................................................................................................. 5 Obtenga el Mayor Provecho de las Prácticas de StampWorks ......................................................... 5 Tres Pasos para Tener Éxito con StampWorks .............................................................................. 5 Prepare su Plaqueta StampWorks....................................................................................... 7 Contenido de este Kit ................................................................................................................. 7 Preparación de la Protoboard ...................................................................................................... 8 Bases de la Programación ................................................................................................. 13 Contenido de un Programa ....................................................................................................... 13 Saltos – Redireccionando el Flujo de un Programa ...................................................................... 14 Bucles – Ejecutando el código una y otra vez.............................................................................. 15 Subrutinas – Código reutilizable que ahorra espacio de programa................................................. 17 Estilo de Programación ............................................................................................................. 17 Plantilla ................................................................................................................................... 18 Convención sobre Nombres....................................................................................................... 19 Hora de Experimentar ....................................................................................................... 21 Aprendiendo los Conceptos de Programación.............................................................................. 21 Construcción de Proyectos ........................................................................................................ 21 Que hacer entre proyectos........................................................................................................ 21 Experimento 1: Hacer Titilar un LED .......................................................................................... 23 Experimento 2: Hacer Titilar un LED (Versión 2) ......................................................................... 25 Experimento 3: Contador con LEDs............................................................................................ 29 Experimento 4: Pantalla de LEDs de Ciencia Ficción .................................................................... 33 Experimento 5: Gráficos con LEDs (Punto o Barra)...................................................................... 35 Experimento 6: Un Juego Simple ............................................................................................... 39 Experimento 7: Controlador de Luces......................................................................................... 43 Building Circuits On Your Own .......................................................................................... 47 Usando Displays de 7 Segmentos .............................................................................................. 49 Experimento 8: Contador de un Dígito ....................................................................................... 51 Experimento 9: Dado Digital ..................................................................................................... 55 Experimento 10: Reloj con Pantalla de LEDs ............................................................................... 59

Manual StampWorks Versión 1.1 • Página 1


Contenido Usando LCDs ......................................................................................................................65 Experimento 11: Demostración Básica con LCD .......................................................................... 67 Experimento 12: Creando Caracteres en un LCD ......................................................................... 73 Experimento 13: Leyendo la RAM del LCD .................................................................................. 79 Experimento 14: Juego de la Bola 8 Mágica................................................................................ 85 Avanzando..........................................................................................................................91 Experimento 15: Filtrando Múltiples Entradas ............................................................................. 93 Experimento 16: Contando Eventos ........................................................................................... 97 Experimento 17: Medición de Frecuencia ................................................................................... 99 Experimento 18: Medición Avanzada de Frecuencia....................................................................101 Experimento 19: Theremin Controlado por Luz ..........................................................................103 Experimento 20: Efectos de Sonido ..........................................................................................105 Experimento 21: Entrada Analógica con PULSIN ........................................................................109 Experimento 22: Salida Analógica con PWM ..............................................................................111 Experimento 23: Expandiendo Salidas.......................................................................................113 Experimento 24: Expandiendo Entradas ....................................................................................117 Experimento 25: Control de un Servo .......................................................................................121 Experimento 26: Motor Paso a Paso..........................................................................................125 Experimento 27: Medición de Tensión.......................................................................................129 Experimento 28: Medición de Temperatura ...............................................................................133 Experimento 29: Multiplexado de 7 Segmentos..........................................................................137 Experimento 30: Reloj de Tiempo Real .....................................................................................145 Experimento 31: Comunicaciones Seriales .................................................................................153 Trabajando por su Cuenta................................................................................................161 Apéndice A: Hojas de Datos .............................................................................................163 Apéndice B: Manual del BASIC Stamp II, Versión 2.0 .....................................................177

Página 2 • Manual StampWorks Versión 1.1


Prefacio

Prefacio Estimados Amigos: Probablemente existen tantas formas de aprender un nuevo tema o habilidad, como estudiantes hay, pero todos coinciden en que aprender haciendo produce los resultados más duraderos. Y para ser franco, aprender haciendo es casi siempre la forma más satisfactoria de aprender; involucra más a los sentidos en el proceso de aprendizaje. De eso se trata este manual y el Kit de StampWorks: aprender a programar el BASIC Stamp escribiendo programas en él. Las secciones de teoría son cortas y concisas. Aprenderá la teoría de programación, poniéndola en práctica. No encontrará muchos rodeos; solamente encontrará trabajo, trabajo divertido que le enseñará a programar microcontroladores con el BASIC Stamp de Parallax. ¿Por qué tomar el desafío? ¿Por qué aprender a escribir programas para el microcontrolador BASIC Stamp? La respuesta es simple, sino obvia: los microcontroladores se encuentran por todos lados. Están en nuestros televisores, hornos microondas, teléfonos celulares e incluso en nuestros autos. El hecho es que los automóviles más nuevos tienen diez o más microcontroladores controlando todo, desde el motor, la climatización del habitáculo, la rotación de las ruedas (control de tracción), el sistema de frenos (ABS) y muchas otras funciones. En resumen, los vehículos modernos son más seguros y más confortables debido, en gran medida, al uso de microcontroladores. Con microcontroladores podemos construir circuitos y dispositivos “inteligentes”. En el pasado, debíamos cambiar el conexionado o algunos componentes de un circuito para modificar o crear un nuevo comportamiento. La ventaja del uso del microcontrolador sobre las otras opciones, es que podemos cambiar el comportamiento de nuestro circuito o dispositivo, simplemente modificando el programa. La ventaja de usar el BASIC Stamp es que simplifica la escritura y modificación de programas y con el Kit de StampWorks qué tan fácil puede ser. Diviértase con estos proyectos y piense cómo podría aplicar los conceptos aprendidos en cada uno. Apreciaré recibir sugerencias (en Inglés) en cualquier momento por e-mail a jonwms@aol.com.

Manual StampWorks Versión 1.1 • Página 3


Introducciรณn

Pรกgina 4 โ ข Manual StampWorks Versiรณn 1.1


Introducción

Introducción Obtenga el Mayor Provecho de las Prácticas de StampWorks Este libro está dividido en dos secciones principales: los experimentos de StampWorks y el manual del BASIC Stamp II. Para llevar a cabo los experimentos, deberá moverse constantemente por las dos secciones. Se puede descargar información adicional de la página de StampWorks del sitio web www.parallaxinc.com, incluyendo hojas de datos, actualizaciones y detalles técnicos generados después de emitida esta publicación. Tres Pasos para Tener Éxito con StampWorks: 1. Lea la Sección 1 del manual del BASIC Stamp II (en Inglés). Esta sección le explicará el funcionamiento del BASIC Stamp II y lo guiará en el proceso de instalación del software de programación. Otro recurso útil es el capítulo 1 de ¡Robótica! (en Castellano) que puede descargarse por internet de www.stampsenclase.com. 2. Lea la sección siguiente de este manual, “Prepare su Plaqueta de StampWorks para los Experimentos”. Esta sección describe los pasos necesarios para poner en condiciones la plaqueta de experimentación. 3. Realice los experimentos por su cuenta, refiriéndose a la guía de sintaxis del manual del BASIC Stamp tanto como sea necesario. Esta es la parte divertida, trabajar con el Stamp construyendo circuitos simples y escribiendo el código. Para cuando haya podido realizar todos los experimentos, estará listo para desarrollar sus propios proyectos con el Stamp, desde algunos simples hasta los moderadamente complejos. La clave está en asegurarse haber comprendido todo sobre un experimento en particular antes de pasar al siguiente. Una última indicación: ¡Diviértase!

Manual StampWorks Versión 1.1 • Página 5



Prepare su Plaqueta StampWorks

Prepare su Plaqueta StampWorks Antes de realizar los experimentos, deberá controlar los componentes de su kit y preparar su plaqueta StampWorks. Una vez hecho esto, será capaz de construir con ella, una gran variedad de circuitos controlados por el Stamp. El Kit StampWorks incluye los siguientes componentes de Parallax: Código 150-01020 150-01030 150-02210 150-04720 200-01040 201-01061 251-03230 27000 27220 27964 28135 28162 350-00009 451-00303 602-00009 602-00010 602-00015 603-00001 604-00002 604-00005 604-00009 700-00050 700-00051 700-00052 700-00065 700-00066 750-00007 800-00003 900-00001 900-00005 ADC0831 BS2-IC

Descripción resistor 1K ohm, ¼ W, 5% resistor 10K ohm, ¼ W, 5% resistor 220 ohm, ¼ W, 5% resistor 470 ohm, ¼ W, 5% capacitor 0.1 uF capacitor 10 uF cristal de 32.768 kHz CD-ROM Parallax Manual StampWorks (en Inglés) Motor paso a paso 12 VDC/75 ohm Plaqueta NX-1000 y LCD 2x16 Multímetro Digital Fotorresistor Conector de 3 pines 74HC595 74HC165 Amp. operacional doble LM358 MAX2719, driver de LEDs 7 seg. Termómetro Digital DS1620 Reloj de tiempo real DS1302 Temporizador 555 Cable rojo Cable blanco Cable negro Juego de herramientas Corta / pela cables Fuente de alimentación 12V 1A Cable Serial Parlante Servo común Parallax Conversor A/D de 8-bits ADC0831 Módulo BASIC Stamp II

Cantidad 4 8 3 1 4 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Manual StampWorks Versión 1.1 • Página 7


Prepare su Plaqueta StampWorks Para poder realizar los experimentos de StampWorks, necesitará estos componentes: • • • • • •

Módulo BASIC Stamp II Plaqueta de laboratorio StampWorks (INEX-1000) Fuente de alimentación de 12 V Cable de programación Cables rojo y negro Corta / pela cables

Empiece quitando la envoltura del módulo BASIC Stamp II e insértelo cuidadosamente en el zócalo de StampWorks. Observará que el módulo BASIC Stamp II y la plaqueta de laboratorio StampWorks tienen una marca semicircular. El módulo BASIC Stamp II debería insertarse en el zócalo de forma que las marcas queden alineadas.

Use el cable de programación para conectar la plaqueta de laboratorio StampWorks a su PC. Es recomendable elegir un puerto serial (com) que no se encuentre en uso. Si, sin embargo, se ve forzado a desconectar otro dispositivo, por ejemplo, un PDA u organizador electrónico, de su computadora, asegúrese de deshabilitar el software de comunicación antes de intentar programar el BASIC Stamp. Si aún no ha instalado el software de programación del Stamp, vea la Sección 1 del manual de programación del Stamp II para obtener instrucciones. Asegúrese de que el interruptor de encendido de la plaqueta de laboratorio StampWorks esté en OFF. Conecte la ficha de la fuente de alimentación de 2.1 mm en la ficha DC INPUT. Conecte la fuente de alimentación a un toma (120 VCA o 220 VCA según el caso). En la parte central de la INEX-1000 hay un sector para realizar conexiones sin soldadura para que pueda montar circuitos que no se encuentren en la plaqueta del kit StampWorks (este kit incluye varios circuitos pre-armados). Es importante comprender cómo trabaja la protoboard. Con un poco de preparación, le será aún más fácil usarla en los próximos experimentos.

Página 8 • Manual StampWorks Versión 1.1


Prepare su Plaqueta StampWorks La parte central de la protoboard es la que usaremos para conectar nuestros componentes. Esta sección consiste en varias columnas de conectores (hay un número impreso al margen para referencia). Para cada columna hay dos juegos de filas. El primero está indicado con las letras A hasta la E y el segundo de la F hasta la J. En todas las columnas, los conectores de la A hasta la E se encuentran eléctricamente conectados. Lo mismo se repite entre la F y la J. Por encima y por debajo de la parte principal de la protoboard hay dos filas horizontales, cada una dividida al medio (aproximadamente en la columna 30). Estas líneas horizontales serán usadas para suministrar los +5 volts (Vdd) y masa (Vss). Para preparar la protoboard uniremos las filas para que la alimentación sea accesible en todos los sectores de la protoboard. Así se ve la protoboard desde el exterior:

Si la viéramos con rayos-X, podríamos observar las conexiones internas y los cortes en Vdd y Vss que deberemos unir. Esta es una vista de las conexiones internas de la protoboard:

Manual StampWorks Versión 1.1 • Página 9


Prepare su Plaqueta StampWorks Comience pelando medio centímetro del aislante del extremo de un cable de interconexión negro. Con una pinza, doble cuidadosamente el cable 90 grados para que se vea así:

Ahora introduzca este extremo en la fila del extremo superior (masa), en el conector que se encuentra justo arriba de la columna 29 (este conector es el que se encuentra exactamente en la línea central de la protoboard, hacia el extremo superior). Sostenga el cable de forma que salga hacia el costado derecho. Marque el aislante, realizando un corte superficial a la altura de la columna 32, asegurándose de no dañar el cable. Quite el cable de la protoboard y córtelo medio centímetro más allá de la marca que acaba de realizar. Con la pinza pelacables, quite el aislante a partir de la marca. Ahora doble este extremo a 90 de forma que el cable tome forma de “U” con el aislante en la parte central.

Si midió y cortó cuidadosamente, este cable en forma de “U” debería poder introducirse fácilmente en la fila de masa entre los conectores 29 y 32. Esto creará una fila continua de masa. Repita este procedimiento para la fila del extremo inferior, también con cable negro. Luego conecte ambas filas usando el mismo proceso, en la columna 60 (extremo derecho de cada fila). Con el cable rojo, conecte las filas de alimentación superior e inferior. Estas filas proveerán los +5 volts, o Vdd. Una las filas de Vdd por la columna 59. Ahora corte 4 cm de cable negro y 4 cm de cable rojo y pele medio centímetro en ambos extremos. Doble cada cable con forma de “U” redondeada. Estos cables no quedarán planos como los anteriores, para que sean más fáciles de retirar de la plaqueta StampWorks cuando sea necesario.

Página 10 • Manual StampWorks Versión 1.1


Prepare su Plaqueta StampWorks Enchufe cuidadosamente un extremo del cable rojo en cualquiera de los terminales del bloque de +5V (cerca del interruptor RESET) y el otro extremo a la fila Vdd (+5) en la columna 1 de la protoboard. Luego conecte un extremo del cable negro en cualquiera de los terminales del bloque GND (masa) y el otro extremo en la fila de masa en la columna 19 de la protoboard. TENGA MUCHO CUIDADO al realizar estas últimas dos conexiones. Si las filas Vdd y Vss quedan interconectadas, se podrían producir daños al conectar la alimentación a la plaqueta StampWorks. Cuando termine el conexionado, la protoboard debería verse así:

Encienda la plaqueta StampWorks moviendo el interruptor de energía a la posición ON. Debería encenderse el LED indicador de encendido (ON LED verde). Si no es así, asegúrese de que el transformador esté correctamente enchufado y busque errores en el conexionado de la protoboard. Ejecute el software editor del BASIC Stamp II e ingrese la siguiente línea de código: DEBUG “¡La plaqueta StampWorks está lista!”

Ahora ejecute el programa (Run). Si todo salió bien, el programa se descarga en el Stamp y aparece una ventana DEBUG en la pantalla, mostrando el mensaje que escribimos (en la imagen del ejemplo está en Inglés).

Manual StampWorks Versión 1.1 • Página 11


Prepare su Plaqueta StampWorks

Si ocurre un error, controle los siguientes ítems: • • • • •

¿Está el BASIC Stamp II conectado correctamente en la plaqueta NX-1000? ¿Está el interruptor de encendido en la posición ON? ¿Está encendido el LED verde? ¿El cable de programación está conectado entre la PC y la plaqueta StampWorks? ¿Ha seleccionado (manualmente) un puerto com erróneo de la PC? ¿El puerto com de la PC está siendo usado por otro programa?

Cuando la ventana DEBUG aparece y le dice que la plaqueta StampWorks está lista, es el momento de hablar sobre la programación del Stamp. Conexión de un Chip Hay dos formas de dibujar un esquema. Una considerada “chipcéntrica” en la cual los pines de E/S del chip aparecen de acuerdo a su ubicación física. En StampWorks los esquemas se dibujaron de forma más eficiente, poniendo los pines de E/S en los lugares que hagan el gráfico más claro. Los pines de E/S de todos los chips se cuentan a partir del indicador, comenzando por el Pin 1 y contando en sentido anti-horario.

Página 12 • Manual StampWorks Versión 1.1

Indicador


Bases de la Programación

Bases de la Programación Contenido de un Programa En la sección 1 de “BASIC Stamp II manual” se introduce el BASIC Stamp, su arquitectura y el concepto de variables y constantes. En esta sección, presentaremos varios elementos de un programa: código lineal, saltos, bucles y subrutinas. Los ejemplos siguientes usan pseudo-código para demostrar y describir la estructura del programa. Itálicas se usan para indicar las secciones de pseudo-código que deberían ser reemplazadas por instrucciones de programación válidas para lograr que el ejemplo pueda ser compilado y ejecutado correctamente. Usted no necesita realizar ninguno de estos ejemplos, ya que todos estos conceptos serán usados en los próximos experimentos. La gente a menudo piensa en las computadoras y los microcontroladores como dispositivos “inteligentes” cuando en realidad, no realizan ninguna tarea sin un juego específico de instrucciones. Este juego de instrucciones se llama programa. Escribirlo es nuestro trabajo. Los programas del Stamp se escriben en un lenguaje de programación llamado PBASIC, una versión específica del lenguaje de programación BASIC (Beginners All-purpose Symbolic Instruction Code= Código de Instrucciones Simbólicas Multi-propósito para Principiantes) desarrollada por Parallax. El BASIC es muy popular debido a su simplicidad y a su sintaxis similar al Inglés. Un programa puede ser tan simple como una lista de instrucciones. Algo así: instruccion 1 instruccion 2 instruccion 3 END

Esta es una estructura de programa muy simple, pero válida. Lo que encontrará sin embargo, es que la mayoría de los programas no se ejecutan en forma lineal como en el programa anterior. El flujo del programa es a menudo redirigido con saltos, bucles y subrutinas, intercalando con pequeñas secciones lineales. Los requerimientos del flujo del programa son determinados por el objetivo del programa y las condiciones bajo las cuales se ejecutará.

Manual StampWorks Versión 1.1 • Página 13


Bases de la Programación Saltos – Redireccionando el Flujo de un Programa Un comando de salto es el que causa que el flujo del programa se desvíe de su trayectoria lineal. En otras palabras, cuando el programa encuentra un comando de salto, no ejecutará, en la mayoría de los casos, la siguiente línea de código. El programa normalmente, se dirigirá a otro sector. Hay dos categorías de comandos de salto: incondicional y condicional. El PBASIC tiene dos comandos, GOTO y GOSUB que realizan saltos incondicionales. Este es un ejemplo de salto incondicional usando GOTO: Rotulo: instruccion 1 instruccion 2 instruccion 3 GOTO Rotulo

Lo llamamos salto incondicional debido a que siempre se ejecuta. GOTO redirige el programa hacia otro lugar. La ubicación se especifica como parte del comando GOTO y se denomina dirección. Recuerde que las direcciones están al principio de una línea de código y son seguidas por dos puntos (:). Verá frecuentemente GOTO al final del cuerpo principal del código, haciendo que las instrucciones del programa se ejecuten nuevamente. El salto condicional hará que el flujo del programa se modifique bajo circunstancias específicas. El salto condicional más simple se logra con la función IF-THEN. La función de PBASIC IF-THEN es diferente de la original de BASIC. En PBASIC, THEN siempre es seguido por una dirección de programa (etiqueta), mientras que en el BASIC estándar se permite colocar instrucciones a continuación del THEN. Si la condición que se evalúa es verdadera, el programa saltará a la dirección especificada. Caso contrario, continuará en la siguiente línea de código. Observe este listado: Inicio: instruccion 1 instruccion 2 instruccion 3 IF condicion THEN Inicio

Se ejecutan las instrucciones y se verifica la condición. Si se evalúa como verdadera, el programa saltará hacia atrás a la línea llamada Inicio. Si la condición se evalúa como falsa, el programa continuará por la línea que se encuentre a continuación de la instrucción IF-THEN.

Página 14 • Manual StampWorks Versión 1.1


Bases de la Programación

A medida que sus requerimientos se vuelven más complicados, podría necesitar que su programa salte a un gran número de direcciones, dependiendo de cierta condición. La primera aproximación es usar múltiples instrucciones IF-THEN. IF condicion_0 THEN Etiqueta_0 IF condicion_1 THEN Etiqueta_1 IF condicion_2 THEN Etiqueta_2

Esta aproximación es válida y puede ser usada. Afortunadamente, el PBASIC tiene un comando especial, BRANCH, que permite que un programa salte a distintas direcciones dependiendo del valor de una variable. Esto es muy útil debido a que las condiciones que mencionábamos, a menudo proceden de una variable de control. BRANCH es un poco más sofisticado en su funcionamiento, pero muy poderoso debido a que puede reemplazar múltiples instrucciones IF-THEN. BRANCH requiere una variable de control y una lista de direcciones o etiquetas. En el caso de una única variable de control, el listado anterior puede ser reemplazado por una línea de código: BRANCH controlVar,[ Etiqueta_0, Etiqueta_1, Etiqueta_2]

Cuando controlVar (variable de control) es cero, el programa saltará a Etiqueta_0, cuando controlVar es uno el programa saltará a Etiqueta_1 y así. Bucles – Ejecutando el código una y otra vez Los bucles hacen que secciones del programa se repitan. Los bucles a menudo usan saltos condicionales e incondicionales para crear varias estructuras de repetición. Este es un ejemplo de bucle incondicional: Etiqueta: instruccion 1 instruccion 2 instruccion 3 GOTO Etiqueta

Al usar GOTO las instrucciones se repiten incondicionalmente. Al usar IF-THEN, podemos crear bucles que se repetirán en ciertas condiciones. Los siguientes ejemplos son llamados bucles condicionales. Estos bucles se ejecutarán bajo ciertas circunstancias. La programación condicional es lo que le otorga a los microcontroladores su “inteligencia.”

Manual StampWorks Versión 1.1 • Página 15


Bases de la Programación Etiqueta: instruccion 1 instruccion 2 instruccion 3 IF condicion THEN Etiqueta

Con esta estructura de repetición, las instrucciones se ejecutarán mientras la condición se evalúe como verdadera. Cuando la condición se evalúe como falsa, el programa continuará por la línea de código siguiente a la instrucción IF-THEN. Es importante observar que en el listado anterior las instrucciones siempre se ejecutarán al menos una vez, incluso cuando la condición sea falsa. Para evitar que suceda esto, es necesario probar la condición antes de ejecutar las instrucciones. El código puede escribirse como se muestra a continuación para lograr que las instrucciones (1 – 3) solamente se ejecuten cuando la condición sea verdadera. Cuando la condición es evaluada como falsa, el programa continúa en Etiqueta_2. Etiqueta_1: IF NOT (condicion) THEN Etiqueta_2 instruccion 1 instruccion 2 instruccion 3 GOTO Etiqueta_1 Etiqueta_2: instruccion 4

El último ejemplo de bucle condicional se trata de un bucle programado mediante la sentencia FORNEXT. FOR controlVar = ValInicial TO ValFinal STEP tamañoPaso instruccion 1 instruccion 2 instruccion 3 NEXT

La construcción FOR-NEXT es usada para lograr que una sección de código se ejecute una cantidad determinada de veces. FOR-NEXT usa una variable de control para determinar la cantidad de repeticiones. El tamaño de la variable determinará la cantidad máxima de repeticiones. Por ejemplo, la cantidad máxima de repeticiones cuando se utiliza una variable de control tipo byte será 255.

Página 16 • Manual StampWorks Versión 1.1


Bases de la Programación La opción STEP de FOR-NEXT es usada cuando se necesita que el incremento de la variable en cada repetición sea distinto de uno. Si, por ejemplo, el bucle debe contar en valores pares, el código podría verse así: FOR controlVar = 2 TO 20 STEP 2 instruccion 1 instruccion 2 instruccion 3 NEXT

Subrutinas – Código reutilizable que ahorra espacio de programa El último concepto de programación que discutiremos es la subrutina. Una subrutina es una sección de código que puede ser llamada (ejecutada) desde cualquier punto del programa. GOSUB es usado para redirigir el programa hacia el código de la subrutina. La subrutina termina con el comando RETURN. Este comando hace que el programa salte hacia la línea de código que sigue a la llamada GOSUB original. Inicio: GOSUB MySub PAUSE 1000 GOTO Inicio MySub: instruccion 1 instruccion 2 instruccion 3 RETURN

En este ejemplo, el código de MySub es ejecutado y luego el programa salta hacia atrás a la línea PAUSE 1000. Estilo de Programación El PBASIC es un lenguaje muy flexible. Sus reglas son simples y fáciles de aprender. El PBASIC no es sensible al formato del programa, uso de espacios en blanco (espacios, tabulaciones, líneas en blanco, etc.) y no detecta diferencias entre mayúsculas y minúsculas; esto quiere decir que dirs, Dirs y DIRS significan lo mismo en PBASIC así que podremos elegir la opción que más nos guste para trabajar.

Manual StampWorks Versión 1.1 • Página 17


Bases de la Programación Los programadores experimentados tienden a adoptar o desarrollar un estilo (de formato) de programación consistente. Ya sea que elija adoptar un estilo o desarrollar uno propio, el hecho de mantener la coherencia con el mismo simplificará la solución de problemas y las revisiones futuras. Esto es especialmente cierto cuando quiere modificar un programa en el que no ha trabajado por mucho tiempo. Los programas de este libro y los que se encuentran en el CD de StampWorks usan las siguientes convenciones: Plantilla La estructura de todos los programas es similar. Ésta puede dividirse en cuatro secciones: •

Encabezado: Esta sección contiene el nombre del archivo y una corta descripción de su funcionamiento. También se registran en este sector las revisiones y actualizaciones que se realizan a la versión original. En la Versión 1.1 de este libro, también hemos agregado la directiva del compilador que indica el modelo de BASIC Stamp que estamos usando.

Declaraciones: Ésta sección contiene la declaración de los alias para los pines de E/S, valores constantes y variables. En los ejemplos de programación de esta guía, las variables PBASIC siempre tendrán nombres significativos. Los únicos nombres internos que se usarán serán Outs y Dirs y siempre en la sección de inicialización y no en el código principal.

Instrucciones DATA: Algunos programas almacenan información adicional en la EEPROM del BAISC Stamp con instrucciones DATA. Esta sección provee el espacio para dicho almacenamiento.

Inicialización: Esta sección es usada para inicializar el estado de los pines de E/S, variables del programa y cuando sea necesario, el hardware externo.

Código: Es donde reside la parte principal del código del programa.

Subrutinas: Las subrutinas están separadas del cuerpo principal del código debido a que pueden ser llamadas desde cualquier parte del programa. La separación entre subrutinas también facilita la portabilidad del código, posibilitando usar la herramienta de edición “cut and paste” (cortar y pegar) para reutilizar las subrutinas en otros programas.

La plantilla se llama BLANK.BS2. Puede cargarla cuando comienza un proyecto nuevo, asegurándose de cambiarle el nombre utilizando la opción “Save As” (Guardar como) del BASIC Stamp Editor.

Página 18 • Manual StampWorks Versión 1.1


Bases de la Programación ' ' ' ' ' ' '

========================================================================= Archivo: BLANK.BS2 { descripción } {$STAMP BS2} =========================================================================

' { pines de E/S } ' { constantes } ' { variables } ' ------------------------------------------------------------------------' { instrucciones DATA } ' ------------------------------------------------------------------------' { inicialización } ' ------------------------------------------------------------------------' { código } Principal: GOTO Principal END ' ------------------------------------------------------------------------' { subrutinas }

Convención sobre Nombres Como se dijo anteriormente, los programas de los experimentos utilizarán alias (sobrenombres) para los pines de E/S y variables internas de PBASIC. Se usarán las siguientes convenciones: •

Constantes: (incluyendo las etiquetas de direccionamiento a subrutinas) utilizarán mezcla de mayúsculas y minúsculas, comenzando siempre en mayúscula. Ejemplos: LimitSw, LMotor, DlyTm, InitLCD

Manual StampWorks Versión 1.1 • Página 19


Bases de la Programación

Variables: usarán mezcla de mayúsculas y minúsculas, comenzando siempre en minúscula. Ejemplos: lcdChar, hrs, iCount

Palabras reservadas PBASIC: todo en mayúsculas. Ejemplos: FOR, NEXT, GOSUB, RETURN

Nota del traductor La traducción fue realizada por Arístides Alvarez (aalvarez@parallaxinc.com). Los programas se dejaron en su versión original, sin traducir los nombres de variables ni etiquetas, manteniendo el formato del autor original. En algunos casos el traductor no comparte el estilo de programación del autor, pero para mantener la veracidad y equivalencia de la versión en castellano con la versión original en inglés, se mantuvo la estructura original. Si tiene comentarios o sugerencias sobre la traducción, puede enviarlas a aalvarez@parallaxinc.com. Si quiere opinar sobre el libro en sí, puede enviar sus comentarios a Jon Williams, jonwms@aol.com.

Página 20 • Manual StampWorks Versión 1.1


Hora de Experimentar

Hora de Experimentar Aprendiendo los Conceptos de Programación Lo que sigue es una serie de experimentos de programación que usted puede construir y ejecutar en su plaqueta de laboratorio StampWorks. El propósito de estos experimentos es enseñar los conceptos de programación y el uso de componentes externos con el BASIC Stamp. Los experimentos fueron pensados para que gane progresivamente experiencia en programación. Combinando los conceptos individuales aprendidos puede producir programas sofisticados. Construcción de Proyectos Esta sección del manual es simple pero importante debido a que aprenderá lecciones de programación y técnicas de construcción importantes, usando su laboratorio StampWorks. A medida que avance sobre el manual, observará menos detalles de construcción (ya contará con suficiente experiencia como para tomar sus propias decisiones) y la explicación del funcionamiento del programa será menos profunda, enfocándose específicamente en las técnicas especiales o dispositivos externos conectados al BASIC Stamp. Qué hacer entre proyectos El circuito de un proyecto puede no ser eléctricamente compatible con el siguiente pudiendo en algunos casos, causar daños al BASIC Stamp si se ejecuta el programa viejo con el circuito nuevo. Por esta razón, se debería cargar un programa vacío en el Stamp antes de conectar el circuito nuevo. Esto protegerá al Stamp configurando a todos los pines de E/S como entradas. Este es un programa simple de una sola línea que limpiará y protegerá al Stamp. DEBUG "Stamp limpio."

Este programa se llama CLEAR.BS2.

Manual StampWorks Versión 1.1 • Página 21



Experimento 1: Hacer Titilar un LED

Experimento 1: Hacer Titilar un LED El propósito de este experimento es hacer titilar un LED con el BASIC Stamp. Estos se usan a menudo como indicadores de alarma. Nuevos Elementos/Comandos PBASIC: • • • • •

CON HIGH LOW PAUSE GOTO

Construcción del Circuito Todos los experimentos de StampWorks usan una línea punteada para indicar componentes que ya se encuentran montados en la plaqueta NX-1000. El LED se encuentra en el sector “LED MONITOR 16 CHANNELS” (MONITOR DE LEDS DE 16 CANALES) de la plaqueta.

Dado que la plaqueta StampWorks tiene los LEDs montado sobre ella, todo lo que debe hacer es conectar uno al BASIC Stamp. 1. Corte 15 cm de cable blanco. Pele medio centímetro de aislante de cada extremo. 2. Conecte un extremo al Port 0 del BASIC Stamp. 3. Conecte el otro extremo al Channel 0 del LED Monitor

Manual StampWorks Versión 1.1 • Página 23


Experimento 1: Hacer Titilar un LED

' ' ' ' '

========================================================================= Archivo: BLINK1.BS2 Hace titilar un LED conectado a P0 =========================================================================

LEDpin

CON

0

' LED conectado a Pin 0

DlyTm

CON

500

' retardo en milisegundos

' ------------------------------------------------------------------------Principal: HIGH LEDpin PAUSE DlyTm LOW LEDpin PAUSE DlyTm GOTO Principal END

' ' ' '

enciende LED tiempo encendido apaga LED tiempo apagado ' repite todo

Descripción del Programa Cada uno de los pines de E/S del Stamp tiene asociado tres bits de control. Un bit de la palabra Dirs determina si el pin es una entrada (bit = 0) o una salida (bit = 1). Si el pin se configura como salida, el estado del pin dependerá del bit correspondiente de la palabra Outs. Si el pin se configura como entrada, se toma el valor actual y se almacena dentro de la palabra Ins. HIGH y LOW realizan dos funciones en un solo comando: el pin seleccionado es configurado como salida primero y luego se fija el valor correspondiente en la palabra Outs (1 para HIGH, 0 para LOW).

Por ejemplo, esta línea de código: HIGH 0

Realiza la misma función que: Dir0 = 1 Out0 = 1

Página 24 • Manual StampWorks Versión 1.1

' hace salida a Pin 0 ' pone al Pin 0 en estado alto


Experimento 2: Hacer Titilar un LED (Versión 2)

Experimento 2: Hacer Titilar un LED (Versión 2) El propósito de este experimento es hacer titilar un LED con el BASIC Stamp. El método empleado en este experimento agrega flexibilidad al control del LED. Nuevos Elementos/Comandos PBASIC: • • • • •

VAR Out0 – Out15 Dir0 – Dir15 Byte Bit0 – Bit15

Construcción del Circuito. Use el mismo circuito que en el Experimento 1. ' ' ' ' ' '

========================================================================= Archivo: BLINK2.BS2 Hace titilar un LED conectado al Pin 0. El tiempo de encendido y apagado del LED pueden ser distintos. =========================================================================

MiLED

VAR

Out0

' LED conectado a Pin 0

TiempoEnc TiempoAp Encendido Apagado

CON CON CON CON

1000 250 1 0

' tiempo encendido en milisegundos ' tiempo apagado en milisegundos

' ------------------------------------------------------------------------Inicializar: Dir0 = %1 ' hace salida al pin del LED ' ------------------------------------------------------------------------Principal: MiLED = Encendido

Manual StampWorks Versión 1.1 • Página 25


Experimento 2: Hacer Titilar un LED (Versión 2) PAUSE TiempoEnc MiLED = Apagado PAUSE TiempoAp GOTO Principal END

' pausa de encendido ' pausa de apagado ' repite todo

Descripción del Programa Esta versión de BLINK expone las capacidades técnicas de los pines de E/S del BASIC Stamp y su control. Observe cómo usar sobrenombres (o alias) para los pines de E/S, constantes y variables, logrando que el programa sea fácil de leer. No hay errores en la interpretación de: MiLED = Encendido La ventaja en este programa es la capacidad del pin de E/S del BASIC Stamp I/O de seguir el valor de una constante o una variable. Cambie el programa para que se vea como el LED puede seguir a una variable: ' ' ' ' '

========================================================================= Archivo: BLINK2b.BS2 Hace titilar un LED conectado a Pin 0. =========================================================================

MiLED

VAR

Out0

' LED conectado a Pin 0

TiempoEnc TiempoAp Encendido Apagado

CON CON CON CON

1000 250 1 0

' tiempo encendido en milisegundos ' tiempo apagado en milisegundos

cntr

VAR

Byte

' contador para controlar al LED

' ------------------------------------------------------------------------Inicializar: Dir0 = %1

' Hace el pin del LED salida

' ------------------------------------------------------------------------Principal: MiLED = cntr PAUSE TiempoEnc

Página 26 • Manual StampWorks Versión 1.1

' pone cntr.Bit0 en MiLED ' pausa de encendido


Experimento 2: Hacer Titilar un LED (Versión 2) cntr = cntr + 1 GOTO Principal END

' incrementa el contador ' repite todo

¿Puede explicar lo que sucede? Dado que MiLED es una variable tipo bit, el Bit0 de cntr la controlará. Funciona así: cuando cntr es impar (1, 3, 5, etc.), Bit0 será activado (1), haciendo que el LED se encienda. Cuando cntr es un número par, Bit0 se limpiará (0), haciendo que el LED se apague.

Manual StampWorks Versión 1.1 • Página 27



Experimento 3: Contador con LEDs

Experimento 3: Contador con LEDs El propósito de este experimento es mostrar el valor de 8 bits (un byte) usando LEDs. Múltiples LEDs se usan frecuentemente como indicadores. Nuevos Elementos/Comandos PBASIC: • • •

OutL, OutH DirL, DirH FOR-NEXT

Construcción del Circuito. Estos LEDs figuran en el sector “LED MONITOR 16 CHANNELS” de la plaqueta NX-1000.

Manual StampWorks Versión 1.1 • Página 29


Experimento 3: Contador con LEDs Dado que la plaqueta de laboratorio de StampWorks tiene los LEDs montados, lo único que deberá hacer es conectarlos al BASIC Stamp. 1. Comience con seis cables blancos de 15 cm. Pele medio centímetro de aislante en todos los extremos. 2. Conecte un extremo al Pin 0 del BASIC Stamp. 3. Conecte el otro extremo al Channel 0 del LED Monitor. 4. Repita los pasos 2 y 3 para los Channels 1-7 del LED Monitor (pines 1– 7 del Stamp) usando más cables. ' ' ' ' '

========================================================================= Archivo: LEDCNTR.BS2 Muestra un contador binario en los pines 0 - 7 =========================================================================

LEDs

VAR

OutL

' LEDs en pines 0 - 7

MinCnt MaxCnt DlyTm

CON CON CON

0 255 100

' valor inicial del contador ' valor final del contador ' retardo en milisegundos

cntr

VAR

Byte

' contador

' ------------------------------------------------------------------------Inicializar: DirL = %11111111

' hace salidas todos los pines

' ------------------------------------------------------------------------Principal: FOR cntr = MinCnt TO MaxCnt LEDs = cntr PAUSE DlyTm NEXT GOTO Principal END

Página 30 • Manual StampWorks Versión 1.1

' bucle que genera los números ' muestra el número con LEDs ' pausa entre números ' repite todo


Experimento 3: Contador con LEDs Descripción del Programa Como se explicó en el Experimento 1, el estado de salida de los pines del BASIC Stamp se almacenan en el área de memoria llamada Outs (OutL es el byte inferior de la palabra Outs). Dado que OutL es parte de la memoria (RAM) multipropósito del BASIC Stamp, se pueden escribir y leer valores en ésta. En este caso, copiar el valor de nuestro contador en OutL (LEDs es el alias) hace que éste sea mostrado en los LEDs de la plaqueta StampWorks. Desafío Modifique el programa para que cuente hacia atrás.

Manual StampWorks Versión 1.1 • Página 31



Experimento 4: Pantalla de LEDs de Ciencia-Ficción

Experimento 4: Pantalla de LEDs de Ciencia-Ficción El propósito de este experimento es hacer un “ping-pong” de luz a través de los LEDs para crear una pantalla tipo Sci-Fi (ciencia-ficción). Circuitos como éstos se usan en películas y series televisivas. Nuevos Elementos/Comandos PBASIC: • • •

<< (Operador de desplazamiento de bits hacia la izquierda) >> (Operador de desplazamiento de bits hacia la derecha) IF-THEN

Construcción del Circuito Use el mismo circuito del experimento anterior. ' ' ' ' '

========================================================================= Archivo: PONG.BS2 "Ping-Pong" en LED (uno de ocho) =========================================================================

LEDs DlyTm

VAR CON

OutL 50

' LEDs se conectan a los pines 0 - 7 ' retardo en milisegundos

' ------------------------------------------------------------------------Inicializar: DirL = %11111111 LEDs = %00000001

' configura todos los pines como salidas ' comienza con un LED encendido

' ------------------------------------------------------------------------Adelante: PAUSE DlyTm LEDs = LEDs << 1 IF LEDs = %10000000 THEN Atras GOTO Adelante

' ' ' '

Atras: PAUSE DlyTm

' muestra el LED

muestra el LED desplaza el LED a la izquierda verifica posición final continua en esta dirección

Manual StampWorks Versión 1.1 • Página 33


Experimento 4: Pantalla de LEDs de Ciencia-Ficción LEDs = LEDs >> 1 IF LEDs = %00000001 THEN Adelante GOTO Atras

' desplaza el LED a la derecha ' verifica posición final ' continua en esta dirección

END

Descripción del Programa Este programa demuestra la habilidad del BASIC Stamp para manipular sus salidas. El programa inicializa los LEDs en %00000001 (el LED 0 está encendido) luego utiliza el operador de desplazamiento a la izquierda (<<) para mover el LED encendido una posición a la izquierda. Con números binarios, desplazar un lugar a la izquierda es lo mismo que multiplicar por dos. Desplazar un lugar a la derecha (>>) es lo mismo que dividir por dos. Ambas secciones principales del código usan IF-THEN para controlar el límite de la cuenta, haciendo que el programa salte a la otra sección cuando llega al valor límite. Desafío Cree un retardo variable y agregue alguna curiosidad al programa (vea PONG2.BS2 por ejemplo).

Página 34 • Manual StampWorks Versión 1.1


Experimento 5: Gráficos con LEDs (Punto o Barra)

Experimento 5: Gráficos con LEDs (Punto o Barra) El propósito de este experimento es crear un gráfico configurable con LEDs (punto o barra). Este tipo de gráficos es muy común en equipamiento de audio, específicamente para indicadores de volumen (VU meters). El valor a graficar en el experimento se tomará de la posición de un potenciómetro. Nuevos Elementos/Comandos PBASIC: • • • • •

Word RCTIME */ (operador estrella-barra) GOSUB-RETURN DCD

Construcción del Circuito Agregue este circuito al Experimento 4.

Manual StampWorks Versión 1.1 • Página 35


Experimento 5: Gráficos con LEDs (Punto o Barra) 1. 2. 3. 4. 5. 6. ' ' ' ' ' ' '

Usando cable rojo (corte el largo necesario), conecte la pista Vdd (+5) al punto A15. Conecte un capacitor de 0.1 uF (104K) entre los puntos B14 y B15. conecte un resistor de 220-ohm (rojo-rojo-marrón) entre los puntos C10 y C14. Usando cable blanco, conecte A10 al Port 15 del BASIC Stamp. Usando cable blanco, conecte E14 al cursor del potenciómetro de 10K Usando cable negro, conecte la pista Vss (masa) al terminal inferior del potenciómetro de 10K.

========================================================================= Archivo: LEDGRAGH.BS2 Muestra una barra o un punto en la barra de 8 LEDs {$STAMP BS2} =========================================================================

LEDs PotPin

VAR CON

OutL 15

' salidas para LEDs

DotGraf BarGraf GrMode

CON CON CON

0 1 BarGraf

' define tipo de gráfico

rawVal grafVal bits newBar

VAR VAR VAR VAR

Word Byte Byte Byte

' ' ' '

' define modo gráfico actual valor medido en el potenciómetro valor a graficar bit más alto que se enciende espacio de trabajo para la barra

' ------------------------------------------------------------------------Inicializar: DirL = %11111111

' todas salidas

' ------------------------------------------------------------------------Principal: HIGH PotPin PAUSE 1 RCTIME PotPin,1,rawVal grafVal = rawVal */ $005F

Página 36 • Manual StampWorks Versión 1.1

' descarga el capacitor ' durante 1 ms ' lee el potenciómetro ' escala grafVal (0 - 255) ' – equivalente a rawVal * 0.372


Experimento 5: Gráficos con LEDs (Punto o Barra) GOSUB ShowGraph PAUSE 50 GOTO Principal END

' muestra ' repite todo

' ------------------------------------------------------------------------ShowGraph: IF GrMode = BarGraf THEN ShowBar

' salta al código de modo gráfico

ShowDot: LEDs = DCD (grafVal / 32) RETURN

' muestra el valor (punto)

ShowBar: bits = DCD (grafVal / 32) newBar = 0

' obtiene el bit más alto

BuildBar: IF bits = 0 THEN BarDone newBar = newBar << 1 newBar.Bit0 = 1 bits = bits >> 1 GOTO BuildBar BarDone: LEDs = newBar RETURN

' ' ' ' '

¿se encendieron todos los LEDs? no – desplazar a la izquierda enciende el primer LED desplaza el valor de bits continuar

' mostrar nuevo nivel

Descripción del Programa Después de inicializar las salidas, este programa lee el potenciómetro de 10K (ubicado en la plaqueta de laboratorio StampWorks) con RCTIME. Usa DEBUG para mostrar el valor directo que se obtuvo con RCTIME, entre uno (con el potenciómetro completamente en sentido anti-horario) y 685 (con el potenciómetro completamente en sentido horario). Dado que grafVal es una variable de un byte, el valor rawVal debe afectarse por un factor de escala para corregir su rango. Para determinar el factor de escala, hay que dividir 255 (el máximo valor posible para grafVal) por 685 (máximo valor que entrega rawVal). El resultado es 0.372. Trabajar con valores fraccionarios dentro del sistema algebraico de números enteros del PBASIC, es posible gracias al operador */ (estrella-barra). El parámetro para */ es una variable de 16-bit

Manual StampWorks Versión 1.1 • Página 37


Experimento 5: Gráficos con LEDs (Punto o Barra) (word). Los primeros ocho bits (byte superior) se multiplican como un número entero. Los últimos ocho bits (byte bajo) se multiplican como número fraccionario. Para determinar el valor del byte de la parte fraccionaria, multiplique el valor fraccionario decimal por 255 y conviértalo a formato hexadecimal. Ejemplo: 0.372 x 255 = 95 (o $5F) Dado que el factor en el experimento es 0.372, el valor */ es $005F. El programa usa el operador DCD para determinar el valor del bit más alto de grafVal. Con ocho LEDs en el gráfico, grafVal es dividido por 32, forzando el resultado de DCD a valores de salida entre %00000001 (DCD 0) y %10000000 (DCD 7). En el modo Dot, esto es todo lo que se requiere para encender un solo LED. En el Bar Mode, los LEDs inferiores también deben encenderse. Esto es realizado por un bucle. El valor de control del bucle es la variable bits, que también se calcula en base a DCD. Este bucle se controla por valor de bits, saliendo cuando este es igual a cero, mientras que cada iteración decrementa su valor. Si bits es mayor que cero, la variable de espacio de trabajo del gráfico, newBar, se desplaza a la izquierda y su bit 0 es activado. Por ejemplo, si DCD asigna %1000 a bits, esta es la forma en que bits y newBar se verán afectadas en cada iteración del bucle: bits

newBar

1000 0100 0010 0001 0000

0001 0011 0111 1111 (listo – salir del bucle y mostrar el valor)

El propósito de la variable newBar, es evitar que los LEDs parpadeen con cada actualización. Esto permite que el programa comience con una barra gráfica “vacía” que se construye hasta el valor actual. Con esta técnica, el programa no debe recordar el valor del gráfico anterior.

Página 38 • Manual StampWorks Versión 1.1


Experimento 6: Un Juego Simple

Experimento 6: Un Juego Simple El propósito de este experimento es crear un juego simple con el BASIC Stamp. Nuevos Elementos/Comandos PBASIC: • • • • •

RANDOM & (operador And) FREQOUT BUTTON LOOKUP

Construcción del Circuito

Manual StampWorks Versión 1.1 • Página 39


Experimento 7: Controlador de Luces Si quiere puede usar el piezoeléctrico del kit en lugar del de la NX-1000 que parece tener mejor volumen. 1. 2. 3. 4. ' ' ' ' '

Usando Usando Usando Usando

cables blancos, conecte los puertos 0 – 5 del BASIC Stamp a los LEDs 0 – 5. cable blanco, conecte el puerto 6 del BASIC Stamp al lado + del piezoeléctrico. cable negro, conecte el lado – del piezoeléctrico a masa (ground). un cable negro conecte el puerto 7 del BASIC Stamp al pulsador D0.

========================================================================= Archivo: LASVEGAS.BS2 Máquina tragamonedas basada en un BASIC Stamp =========================================================================

LEDs Spkr Swtch

VAR CON CON

OutL 6 7

' salidas LED ' salida parlante ' pulsador de entrada

randW pattern tone swData delay spin1 spin2

VAR VAR VAR VAR VAR VAR VAR

Word Byte Word Byte Word Byte Byte

' ' ' ' ' ' '

número aleatorio patrón de luces tono de salida variable para BUTTON retardo variable de "giro" contador bucle contador bucle

' ------------------------------------------------------------------------Inicializar: DirL = %00111111

' configura LEDs como salidas

' ------------------------------------------------------------------------Attention: GOSUB GetRnd FREQOUT Spkr,35,tone PAUSE 100 BUTTON Swtch,0,255,10,swData,1,Spin GOTO Attention Spin: LEDs = %00111111 PAUSE 750

Página 40 • Manual StampWorks Versión 1.1

' obtiene número aleatorio ' emite un sonido ' controla el pulsador de juego

' simula un reinicio del juego


Experimento 6: Un Juego Simple LEDs = %00000000 PAUSE 500 delay = 75

' retardo de inicialización

FOR spin1 = 1 TO 25 GOSUB GetRnd FREQOUT Spkr,25,425 PAUSE delay delay = delay */ $0119 NEXT

' ' ' ' '

IF pattern = %00111111 THEN YouWin FREQOUT Spkr,1000,150 LEDs = %00000000 PAUSE 1000 GOTO Attention

' si todos se encienden, gana ' caso contrario, pierde... ' limpia los LEDs

YouWin: FOR spin1 = 1 TO 5 FOR spin2 = 0 TO 3 LOOKUP spin2,[$00,$0C,$12,$21],LEDs LOOKUP spin2,[665,795,995,1320],tone FREQOUT Spkr,35,tone PAUSE 65 NEXT NEXT LEDs = %00000000 PAUSE 1000 GOTO Attention END

gira la rueda obtiene número aleatorio ruido de la rueda pausa entre ruidos multiplica la pausa por 1.1

' repite todo ' luces y sonidos para indicar que ´ ganó

' limpia los LEDs ' repite todo

' ------------------------------------------------------------------------GetRnd: RANDOM randW tone = randW & $7FF pattern = randW & %00111111 LEDs = pattern RETURN

' ' ' '

obtiene número pseudo aleatorio no deja que el tono sea muy alto borra bits sin uso muestra el patrón

Manual StampWorks Versión 1.1 • Página 41


Experimento 7: Controlador de Luces Descripción del Programa Este programa demuestra cómo agregar más aleatoriedad al número pseudo aleatorio generado por el comando RANDOM, agregando el efecto humano. El programa espera en un bucle llamado Attention. Al principio del bucle se llama a GetRnd para crear un valor pseudo aleatorio, un tono para el parlante y para poner un patrón nuevo en los LEDs. Al regresar a Attention, se emite el sonido y se revisa si se ha presionado el botón. El programa repetirá el bucle sobre Attention hasta que se presione el botón. El comando BUTTON es usado para eliminar el rebote en la entrada. Lo que hace aleatorio al programa es el tiempo que permanece presionado el botón. Cuando se presiona, los LEDs se encienden y luego se apagan para simular que el juego se reinicia. Luego, un bucle FOR-NEXT es usado para simular el giro de los rodillos de la máquina tragamonedas. En cada giro, un sonido “clic” es generado mientras se aumenta la pausa entre los mismos para simular la desaceleración natural de los discos de la máquina. Si se encienden los seis LEDs antes del último giro, el programa salta a YouWin. Esta rutina usa LOOKUP para encender un patrón predefinido de LEDs y sonidos antes de regresar al principio del programa. Si alguno de los LEDs no se enciende, se escuchará el sonido de la derrota en el parlante y el juego se reiniciará. Desafío Modifique el juego para que se pueda ganar con menos de seis LEDs encendidos. Por ejemplo, vea LASVGAS2.BS2.

Página 42 • Manual StampWorks Versión 1.1


Experimento 7: Controlador de Luces

Experimento 7: Controlador de Luces El propósito de este experimento es crear un pequeño controlador de luces, conveniente para árboles de navidad y decoraciones externas. Las salidas de este circuito serán solamente LEDs (Para controlar luces de alta tensión vea el libro de Matt Gilliland, Microcontroller Application Cookbook). Nuevos Elementos/Comandos PBASIC: • • • •

DATA MIN // (Operador módulo) BRANCH

Construcción del Circuito.

Manual StampWorks Versión 1.1 • Página 43


Experimento 7: Controlador de Luces 1. 2. 3. 4. 5. 6. 7.

Usando cables blancos, conecte los puertos 0-5 del BASIC Stamp a los LEDs 0– 5. Usando cable rojo, conecte la línea de Vdd (+5) al punto A15. Conecte un capacitor de 0.1 uF (104K) entre B14 y B15. Conecte un resistor de 220-ohm (rojo-rojo-marrón) entre C10 y C14. Usando cable blanco, conecte A10 al puerto 6 del BASIC Stamp. Usando cable blanco, conecte E14 al terminal superior del potenciómetro de 10K. Usando cable negro, conecte la línea de Vss (ground) al cursor (terminal central) del potenciómetro de 10K. 8. Usando un cable blanco conecte el puerto 7 del BASIC Stamp al pulsador D7. ' ========================================================================= ' Archivo: LTSHOW.BS2 ' ' mini controlador de luces ' ' {$STAMP BS2}

' ========================================================================= Select PotPin Lights

CON CON VAR

7 6 OutL

' botón en pin 7 ' pot. control veloc. en pin 6 ' salidas de control de luces

delay btnVar mode offset randW

VAR VAR VAR VAR VAR

Word Byte Byte Byte Word

' ' ' ' '

pausa entre patrones variable para BUTTON modo seleccionado offset del patrón de luz variable para RANDOM

' ------------------------------------------------------------------------SeqA SeqB SeqC SeqD SeqE

DATA DATA DATA DATA DATA DATA

%000001, %100000, %000001, %000000, %100100, %0

AMax BMax CMax DMax

CON CON CON CON

SeqB-SeqA SeqC-SeqB SeqD-SeqC SeqE-SeqD

%000010, %010000, %000010, %001100, %010010,

%000100, %001000, %000100, %010010, %001001

%001000, %010000, %100000 %000100, %000010 %001000, %010000 %100001

' calcula largo de secuencia

' -------------------------------------------------------------------------

Página 44 • Manual StampWorks Versión 1.1


Experimento 7: Controlador de Luces Inicializar: DirL = %00111111

' configura LEDs como salidas

' ------------------------------------------------------------------------Principal: HIGH PotPin PAUSE 1 RCTIME PotPin,1,delay delay = (delay */ $018A) MIN 50 PAUSE delay

' lee potenciómetro de velocidad ' calcula retardo (50 ms ~ 1 sec) ' espera entre patrones

SwitchCheck: BUTTON Select,0,255,0,btnVar,0,Show mode = mode + 1 // 5

' ¿nuevo modo? ' si, actualizar la var. mode

' descarga el capacitor

Show: BRANCH mode,[ModeA,ModeB,ModeC,ModeD,ModeE] GOTO Principal END ' ------------------------------------------------------------------------ModeA: offset = offset + 1 // AMax READ (SeqA + offset),Lights GOTO Principal

' actualiza el offset (0 - 5) ' sale nuevo patrón de luces ' repite

ModeB: offset = offset + 1 // BMax READ (SeqB + offset),Lights GOTO Principal ModeC: offset = offset + 1 // CMax READ (SeqC + offset),Lights GOTO Principal ModeD: offset = offset + 1 // DMax READ (SeqD + offset),Lights GOTO Principal ModeE:

Manual StampWorks Versión 1.1 • Página 45


Experimento 7: Controlador de Luces RANDOM randW Lights = randW & %00111111 GOTO Principal

' obtiene número aleatorio ' enciende canales aleatorios

Descripción del Programa Este programa es más simple de lo que parece. El cuerpo principal del programa es un bucle. La velocidad de ejecución del bucle principal es controlada por la posición del potenciómetro. RCTIME es usada para leer el potenciómetro y normalmente el número máximo que se obtuvo en su lectura fue 648. Multiplicando el máximo valor del potenciómetro por 1.54 (delay */ $018A) se obtiene un máximo de 1000, para producir una pausa de un segundo de duración. El operador MIN es usado para garantizar que la pausa más corta posible sea de 50 milisegundos. El código SwitchCheck revisa si D7 es presionado. Si es así, la variable mode, es incrementada (en una unidad). El operador de módulo (//) es usado para mantener a mode en el rango de cero a cuatro. Esto funciona debido a que el operador de módulo entrega el resto de una división. Dado que cualquier número dividido por sí mismo da un resto de cero, usar el operador de esta manera hace que mode esté entre cuatro y cero. El elemento final del bucle principal es Show. Este código usa BRANCH para llamar a la subrutina que emitirá la secuencia de luces especificada por mode. Los modos A hasta D trabajan en forma similar, obteniendo secuencias de luces de la EEPROM del BASIC Stamp (almacenada por las instrucciones DATA). El modo E genera un patrón aleatorio de luces. Mire el código de la subrutina ModeA. Lo primero que se hace es actualizar el valor de la variable offset, usando la técnica del operador módulo. El valor de offset es agregado al principio de la secuencia de luz especificada, y el patrón de luces actual es obtenido con READ. Observe que las instrucciones DATA de cada secuencia están etiquetadas (SeqA, SeqB, etc.). Internamente, cada una

de esas etiquetas es convertida a un valor constante que es igual a la dirección de inicio de cada secuencia. La longitud de cada secuencia es calculada con esas constantes. Al emplear esta técnica, los patrones de luces pueden ser actualizados (alargados o acortados) sin necesidad de modificar el código llamado por Show. ModeE es muy directo, usando la función RANDOM para presentar nuevos patrones de luces en cada pasada a través del bucle principal. Desafío Agregue una nueva secuencia de luces. ¿Qué secciones del programa deben ser modificadas para realizar esta tarea?

Página 46 • Manual StampWorks Versión 1.1


Construyendo Circuitos

Construyendo Circuitos por su Cuenta Con la experiencia que obtuvo en la sección anterior, ya está en condiciones de montar los circuitos restantes sin instrucciones específicas. Estos proyectos son bastante simples y los encontrará eléctricamente similares a varios de los proyectos que ya construyó. Proceda lentamente y controle dos veces sus conexiones antes de aplicar la alimentación al circuito. A partir de ahora entonces, usted deberá montar sus propios proyectos y experimentos con el Stamp. Ahora continuemos con los displays de 7 segmentos …

Manual StampWorks Versión 1.1 • Página 47



Usando Displays de 7 Segmentos

Usando Displays de 7 Segmentos Un display de 7 segmentos está formado por siete LEDs comunes (ocho contando el punto decimal) que han sido empacados con el patrón que se muestra en la Figura 8. Los LEDs tienen un elemento en común (ánodo o cátodo).

Iluminando combinaciones específicas de LEDs podemos crear los dígitos e incluso algunos caracteres alfanuméricos (letras y símbolos). Los LEDs de siete segmentos normalmente se usan en letreros numéricos. La plaqueta de StampWorks tiene cuatro displays de siete segmentos de cátodo común. Los experimentos de esta sección le mostrarán como aprovechar al máximo estos componentes tan versátiles.

Manual StampWorks Versión 1.1 • Página 49



Experimento 8: Contador de un Dígito

Experimento 8: Contador de un Dígito El propósito de este experimento es demostrar el uso del módulo de 7 segmentos, creando un contador decimal simple. Nuevos Elementos/Comandos PBASIC: •

Nib

Construcción del Circuito.

Manual StampWorks Versión 1.1 • Página 51


Experimento 8: Contador de un Dígito ' ' ' ' '

========================================================================= Archivo: 7SEGS.BS2 Muestra un dígito de 7 segmentos =========================================================================

segs

VAR

OutL

' LEDs del 7 segmentos

cntr

VAR

Nib

' contador

' ------------------------------------------------------------------------' Segmentos ' DecDig DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA

.abcdefg -------%01111110 %00110000 %01101101 %01111001 %00110011 %01011011 %01011111 %01110000 %01111111 %01111011

' ' ' ' ' ' ' ' ' '

0 1 2 3 4 5 6 7 8 9

' ------------------------------------------------------------------------Inicializar: DirL = %01111111

' configura como salidas los 7 seg.

' ------------------------------------------------------------------------Principal: FOR cntr = 0 TO 9 READ (DecDig + cntr),segs PAUSE 1000 NEXT GOTO Principal END

Página 52 • Manual StampWorks Versión 1.1

' cuenta ' muestra el dígito ' durante un segundo ' repite todo


Experimento 8: Contador de un Dígito Descripción del Programa Este programa es muy similar al del control de luces: se lee un patrón de la EEPROM y se pone en la salida de los LEDs. En este programa, el envío de patrones específicos a los LEDs del 7 segmentos, crea los dígitos del cero al nueve. Desafío Actualice el programa para crear un contador hexadecimal de un dígito. Use el patrón que se muestra a continuación para generar los últimos dígitos hexadecimales.

Manual StampWorks Versión 1.1 • Página 53



Experimento 9: Dado Digital

Experimento 9: Dado Digital El propósito de este experimento es crear un dado digital. Construcción del Circuito. Agregue este pulsador al circuito del experimento anterior.

' ' ' ' '

========================================================================= Archivo: ROLLER.BS2 Dado Digital. Muestra un número del 1 al 6 cuando se presiona D7. =========================================================================

RollBtn Segs

CON VAR

15 OutL

' botón en Pin 7 ' LEDs del 7 segmentos

swData dieVal spinPos doSpin

VAR VAR VAR VAR

Byte Nib Nib Nib

' ' ' '

datos del comando BUTTON nuevo valor del dado posición de giro control de actualización de giro

' ------------------------------------------------------------------------' ' DecDig

DATA DATA DATA DATA

.abcdefg -------%01111110 %00110000 %01101101 %01111001

' ' ' '

0 1 2 3

Manual StampWorks Versión 1.1 • Página 55


Experimento 9: Dado Digital

Bug

DATA DATA DATA DATA DATA DATA

%00110011 %01011011 %01011111 %01110000 %01111111 %01111011

' ' ' ' ' '

4 5 6 7 8 9

DATA DATA DATA DATA DATA DATA

%01000000 %00100000 %00010000 %00001000 %00000100 %00000010

' indicador de giro

' ------------------------------------------------------------------------Inicializar: DirL = %01111111

' define salidas

' ------------------------------------------------------------------------Principal: GOSUB GetDie PAUSE 5 ' ¿Está presionado el botón? BUTTON RollBtn,0,255,10,swData,1,ShowDie GOTO Principal ShowDie: READ (DecDig + dieVal),Segs PAUSE 3000 GOTO Principal END

' obtiene valor del dado

' muestra el valor ' durante tres segundos ' repite

' ------------------------------------------------------------------------GetDie: dieVal = dieVal // 6 + 1 READ (Bug + spinPos),segs doSpin = doSpin + 1 // 7 IF doSpin > 0 THEN GetDieX spinPos = spinPos + 1 // 6 GetDieX: RETURN

Página 56 • Manual StampWorks Versión 1.1

' ' ' ' '

limita entre 1 y 6 muestra patrón de giro ¿actualiza el indicador de giro? solo si doSpin = 0 actualiza el indicador de giro


Experimento 9: Dado Digital Descripción del Programa Este programa se basa en todo lo que hemos hecho hasta el momento y debería resultarle fácil de comprender. Hemos agregado un poco de creatividad en la programación para lograr que un programa simple se vea más interesante. Hay que remarcar el uso de la variable doSpin. Para crear un valor aleatorio, la variable dieVal es actualizada rápidamente hasta que el botón es presionado. Esta velocidad de cambio, es demasiado rápida para usarla en el indicador de giro del dado. La variable doSpin entonces, actúa como un retardo, haciendo que el valor indicado por los LEDs sea actualizado cada séptimo paso por la rutina GetDie. Esto nos permite ver los números claramente y crea un efecto de display agradable.

Manual StampWorks Versión 1.1 • Página 57



Experimento 10: Reloj con Pantalla de LEDs

Experimento 10: Reloj con Pantalla de LEDs El propósito de este experimento es crear una pantalla simple de reloj usando cuatro módulos LED de 7 segmentos. Nuevos Elementos/Comandos PBASIC: • • • •

OutA,OutB,OutC,OutD DirA,DirB,DirC,DirD In0 - In15 DIG

Construcción del Circuito

Manual StampWorks Versión 1.1 • Página 59


Experimento 10: Reloj con Pantalla de LEDs ' ' ' ' '

========================================================================= Archivo: CLOCK.BS2 Simula un reloj digital usando cuatro displays 7-segmentos =========================================================================

segs digSel tic

VAR VAR VAR

OutL OutC In15

' segmentos ' selector de dígito ' generador de pulsos de 1 Hz

DPoint

CON

%10000000

' bit de punto decimal

secs time digit

VAR VAR VAR

Word Word Nib

' segundos ' tiempo con formato ' dígito actual

' ------------------------------------------------------------------------' ' DecDig

DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA

.abcdefg -------%01111110 %00110000 %01101101 %01111001 %00110011 %01011011 %01011111 %01110000 %01111111 %01111011

' ' ' ' ' ' ' ' ' '

0 1 2 3 4 5 6 7 8 9

' ------------------------------------------------------------------------Inicializar: DirL = %11111111 DirC = %1111 digSel = %1111

' configura segmentos como salidas ' selector de dígito como salida ' todos los dígitos apagados

' ------------------------------------------------------------------------Principal: GOSUB ShowTime IF tic = 1 THEN IncSec GOTO Principal

Página 60 • Manual StampWorks Versión 1.1

' muestra dígito actual ' ¿nuevo segundo? ' repite


Experimento 10: Reloj con Pantalla de LEDs IncSec: secs = (secs + 1) // 3600

' actualiza el contador de seg.

Waiting: GOSUB ShowTime IF tic = 0 THEN Principal

' muestra dígito actual ' si pasó el pulso salta al inicio

' código adicional podría ponerse aquí GOTO Waiting END

' repite

' ------------------------------------------------------------------------ShowTime: time = (secs / 60) * 100 ' obtiene minutos, en centenas time = time + (secs // 60) ' obtiene segundos segs = %00000000 ' pantalla en blanco ' habilita dígito LOOKUP digit,[%1110,%1101,%1011,%0111],digSel READ (DecDig + (time DIG digit)),segs ' pone el patrón de segmento PAUSE 1 ' muestra digit = (digit + 1) // 4 ' obtiene siguiente dígito RETURN

Descripción del Programa Los dos primeros proyectos con los displays de siete segmentos usaron solamente un dígito. Este proyecto usa los cuatro. Un nuevo problema se presenta; dado que los ánodos de los cuatro displays están unidos, solamente podemos mostrar uno a la vez. Esto se realiza mediante el patrón de segmento que determina el dígito que se encuentra activo en cada momento (poniendo en estado bajo su cátodo). El objetivo de este programa sin embargo, es crear la pantalla de un reloj, en el cual los cuatro dígitos deben mostrarse al mismo tiempo. Si bien en la realidad no podemos tener a los cuatro encendidos a la vez, podemos engañar al ojo humano y hacerle creer que es así. El ojo humano tiene una propiedad conocida como Persistencia de Visión (POV), que hace que retenga una imagen durante un breve lapso de tiempo. A mayor brillo de la imagen, más tiempo permanece en nuestros ojos. Este fenómeno es el que hace que veamos un punto de luz después de observar el flash de una cámara fotográfica. Podemos usar esta propiedad en nuestro beneficio haciendo un barrido rápido a través de cada uno de los cuatro dígitos, mostrando cada dígito en un

Manual StampWorks Versión 1.1 • Página 61


Experimento 10: Reloj con Pantalla de LEDs segmento durante un corto período. Si el ciclo es suficientemente rápido, la POV de nuestros ojos nos hará creer que los cuatro dígitos se encuentran encendidos a la vez. Este proceso se llama multiplexado. Multiplexado es el proceso de compartir líneas de datos; es este caso, las líneas de los segmentos de los displays son compartidas. Si no multiplexáramos, se necesitarían 28 líneas de salida para controlar los cuatro displays de 7 segmentos. Son 12 líneas más de las que se encuentran disponibles en un BASIC Stamp. El verdadero trabajo de este programa lo realiza la subrutina llamada ShowTime. Su propósito es darle formato de tiempo (MMSS) al contador de segundos y actualizar el dígito actual. Dado que la rutina solamente puede mostrar un dígito a la vez, debe ser llamada frecuentemente, caso contrario la pantalla parpadearía. Este programa actualizará la pantalla mientras espera que sucedan otras cosas. La pantalla del reloj se crea moviendo el valor de los minutos a las columnas de millares y centenas (secs / 60) de la variable time. Los segundos restantes (secs // 60) se suman a time, colocándolos en las columnas de decenas y unidades. Así funciona el sistema: Ejemplo: 754 segundos 754 / 60 = 12 12 x 100 = 1200 (tiempo = 1200) 754 // 60 = 34 1200 + 34 = 1234 (tiempo = 1234; 12 minutos y 34 segundos) Ahora que el valor time está listo, los segmentos se borran para la próxima actualización. Este procedimiento mantiene limpia la imagen. Si esto no se hace, el valor anterior de los segmentos aparecerá como un fantasma en el display. Una tabla LOOKUP se usa para habilitar el dígito actual y los segmentos que usará ese dígito se leen con READ de una tabla DATA de la EEPROM. El display de StampWorks no tiene dos puntos (:) que normalmente se usan en los relojes digitales, así que lo reemplazaremos por un punto decimal a continuación del segundo dígito. El paso final es agregar una pequeña pausa mientras está encendido el dígito y se actualiza la variable digit. El bucle principal de este programa espera la entrada de una señal de onda cuadrada, producida por el generador de señales del StampWorks. Cuando se fija en 1 Hz, esta señal pasa de LOW (bajo) a HIGH (alto), una vez por segundo. Cuando se presenta la transición de bajo a alto, el contador de

Página 62 • Manual StampWorks Versión 1.1


Experimento 10: Reloj con Pantalla de LEDs segundos es actualizado. El operador de módulo (//) es usado para mantener los segundos en el rango de 0 a 3599 (rango de una hora). Cuando se actualiza el contador de segundos, se refresca la pantalla y luego el programa espera hasta que la señal de entrada pase a estado bajo, actualizando la pantalla durante la espera. Si el programa regresara al principio mientras la señal de entrada estuviese aún en estado alto, el contador de segundos podría actualizarse prematuramente, causando que el reloj corriera más rápido. Una vez que la señal de entrada pasa a estado bajo, el programa salta al principio, donde espera a la siguiente transición de bajo a alto del pulso del generador. Desafío Si se modifica la posición del punto decimal como se muestra a continuación, ¿qué sucederá? Modifique y descargue el programa para controlar su respuesta. segs = segs + (DPoint * time.Bit0)

' ilumina el punto decimal

Manual StampWorks Versión 1.1 • Página 63



Usando LCDs

Usando LCDs Si bien los LEDs y los displays de siete segmentos son muy buenos como dispositivos de salida, habrá proyectos que requerirán proveer información más compleja al usuario. Por supuesto, nada supera la pantalla de video de una PC, pero estos son grandes, caros y casi siempre imprácticos para concretar proyectos con microcontroladores. Los módulos LCD de caracteres por otro lado, son ideales para estas aplicaciones. Estos módulos económicos permiten imprimir salidas alfanuméricas, usando muy pocas líneas de E/S y muy poco esfuerzo del BASIC Stamp. Los módulos de caracteres LCD están disponibles en gran variedad de configuraciones: una línea, dos líneas y cuatro líneas, son los más comunes. También es variable el ancho de la pantalla, aunque normalmente es de 16 o 20 caracteres por línea.

Módulo LCD del StampWorks (2 líneas x 16 caracteres). Se puede bajar la hoja de datos desde www.parallaxinc.com. El módulo LCD del StampWorks se conecta a la plaqueta de laboratorio mediante una ficha IDC de 14 pines. La ficha tiene una traba para evitar que se conecte en sentido inverso.

Manual StampWorks Versión 1.1 • Página 65


Usando LCDs Inicialización El LCD de caracteres debe ser inicializado antes de comenzar a enviarle información. Los proyectos de este libro inicializan el LCD de acuerdo con la especificación del controlador Hitachi HD44780. El controlador Hitachi es el que se encuentra comúnmente y muchos otros controladores son compatibles con él. Modos de Operación Hay dos modos principales de operar con LCDs: enviar un caracter y enviar un comando. Cuando se envía un caracter, la línea RS está en estado alto y el dato enviado es interpretado como un caracter que debe ser mostrado en la posición actual del cursor. El caracter normalmente es enviado en código ASCII. También se pueden enviar caracteres no ASCII al LCD, así como también hasta ocho caracteres programables personalizados. Los comandos se envían al LCD luego de poner en estado bajo la línea RS. Hay varios comandos estándar para controlar y manipular la pantalla LCD. Clear Home Cursor Izq. Cursor Der. Display Izq. Display Der.

$01 $02 $10 $14 $18 $1C

Limpia el LCD y mueve el cursor a “home” o inicio Mueve el cursor a la primer posición de la primer línea Mueve el cursor a la izquierda Mueve el cursor a la derecha Desplaza todo el display a la izquierda Desplaza todo el display a la derecha

Conexión del LCD El LCD del StampWorks tiene un conector IDC de 14 pines en el extremo de su cable. Simplemente coloque la ficha sobre el puerto de conexión de LCD de la plaqueta y presiónela hasta que quede firmemente conectado.

Página 66 • Manual StampWorks Versión 1.1


Experimento 11: Demostración Básica con LCD

Experimento 11: Demostración Básica con LCD Este programa demuestra las bases del LCD poniendo a funcionar el módulo LCD del StampWorks. Nuevos Elementos/Comandos PBASIC: • • •

PULSOUT HighNib, LowNib ^ (operador OR Exclusiva)

Construcción del Circuito

' ' ' ' ' '

========================================================================= Archivo: LCDDEMO.BS2 Demostración Básica de LCD Ver 1.1 – Actualizado de acuerdo a las conexiones de LCD del BS2p =========================================================================

E RS LCDout

CON CON VAR

0 3 OutB

' pin habilitación LCD ' Selección registro (1 = carac.) ' datos de 4-bits del LCD

ClrLCD CrsrHm

CON CON

$01 $02

' limpia el LCD ' mueve el cursor a home

Manual StampWorks Versión 1.1 • Página 67


Experimento 11: Demostraciรณn Bรกsica con LCD CrsrLf CrsrRt DispLf DispRt DDRam

CON CON CON CON CON

$10 $14 $18 $1C $80

' ' ' ' '

mueve cursor a la izq. mueve cursor a la der. desplaza caracteres a la izq. desplaza caracteres a la der. control RAM de datos

char index

VAR VAR

Byte Byte

' caracter enviado al LCD ' contador del bucle

' ------------------------------------------------------------------------Msg

DATA

"El BASIC STAMP!",0

' mensaje pregrabado en EEPROM

' ------------------------------------------------------------------------Inicializar: DirL = %11111001 GOSUB LCDinit

' configura pines para el LCD ' inicializa LCD en modo 4-bits

' ------------------------------------------------------------------------Principal: char = ClrLCD GOSUB LCDcommand PAUSE 500 index = Msg ReadChar: READ index,char IF char = 0 THEN MsgDone GOSUB LCDwrite index = index + 1 GOTO ReadChar MsgDone: PAUSE 2000

' limpia el LCD ' obtiene direcciรณn EE del mensaje ' ' ' ' ' ' '

obtiene caracter de EEPROM si es 0, mensaje finalizado escribe el caracter apunta al siguiente caracter y lo obtiene mensaje completo espera 2 segundos

char = CrsrHm GOSUB LCDcommand

' mueve el cursor a home

char = %00001110 GOSUB LCDcommand

' enciende el cursor

PAUSE 500

Pรกgina 68 โ ข Manual StampWorks Versiรณn 1.1


Experimento 11: Demostración Básica con LCD char = CrsrRt FOR index = 1 TO 15 GOSUB LCDcommand PAUSE 150 NEXT

' mueve el cursor por la pantalla

FOR index = 14 TO 0 char = DDRam + index GOSUB LCDcommand PAUSE 150 NEXT

' regresa el cursor a una ' dirección específica

char = %00001101 GOSUB LCDcommand

' apaga el cursor, enciende blink

PAUSE 2000 char = %00001100 GOSUB LCDcommand FOR index = 1 TO 10 char = char ^ %00000100 GOSUB LCDcommand PAUSE 250 NEXT

' apaga blink

' invierte los bits

PAUSE 1000 FOR index = 1 TO 16 char = DispRt GOSUB LCDcommand PAUSE 100 NEXT PAUSE 1000 FOR index = 1 TO 16 char = DispLf GOSUB LCDcommand PAUSE 100 NEXT PAUSE 1000 GOTO Principal END

' desplaza la pantalla

' desplaza en sentido contrario

' repite todo

Manual StampWorks Versión 1.1 • Página 69


Experimento 11: Demostración Básica con LCD

' ------------------------------------------------------------------------LCDinit: PAUSE 500 LCDout = %0011 PULSOUT E,1 PAUSE 5 PULSOUT E,1 PULSOUT E,1 LCDout = %0010 PULSOUT E,1 char = %00001100 GOSUB LCDcommand char = %00000110 GOSUB LCDcommand RETURN LCDcommand: LOW RS LCDwrite: LCDout = char.HighNib PULSOUT E,1 LCDout = char.LowNib PULSOUT E,1 HIGH RS RETURN

' deja descansar el LCD ' modo de 8-bits

' modo de 4-bits ' enciende disp y configura

' ingresa modo comando ' salen los 4 bits altos ' pulso en línea Enable ' salen los 4 bits bajos ' regresa al modo caracter

Descripción del Programa Este es un programa muy simple que demuestra las funciones básicas de un LCD. El LCD es inicializado usando el modo de cuatro-bits de acuerdo con las especificaciones del controlador Hitachi HD44780. Este modo es usado para minimizar la cantidad de líneas de E/S del BASIC Stamp necesarias para controlar el LCD. Si bien es posible conectar y controlar el LCD con ocho líneas de datos, no se lograría una mejora notable en el rendimiento del programa y se necesitarían cuatro líneas más de E/S.

Página 70 • Manual StampWorks Versión 1.1


Experimento 11: Demostración Básica con LCD Las bases de la inicialización son apropiadas para la mayoría de las aplicaciones: • • • • •

Se enciende el display Se apaga el cursor Se deshabilita el parpadeo del display El cursor se incrementa automáticamente después de cada escritura El display no se desplaza

Con el uso de cuatro bits de datos, se necesitan dos ciclos de escritura para enviar un byte al LCD. Los modificadores de variables HighNib y LowNib del BASIC Stamp hacen que este proceso sea extremadamente fácil. Cada nibble se envía al LCD con un pulso en la línea E (habilitación) con PULSOUT. La demo comienza limpiando el LCD y mostrando un mensaje que ha sido almacenado con una instrucción DATA. Esta técnica de almacenar mensajes en la EEPROM es muy útil y hace que los programas sean fácilmente actualizables. En este programa, se escriben caracteres hasta que se encuentra un cero. Este método nos permite modificar la longitud de la cadena de texto, sin tener que preocuparnos por la configuración de un bucle FOR-NEXT. Una vez mostrado el mensaje, el cursor se envía al inicio (primera posición de la primera línea) y se enciende (aparece un cursor subrayado). El cursor se envía hacia adelante y hacia atrás por el LCD usando dos técnicas. La primera usa el comando “cursor a la derecha”. Para mover el cursor hacia atrás se optó por modificar manualmente su posición. Esta última técnica es necesaria en algunos LCD para poder brindar un formato preciso en la pantalla. Con el cursor nuevamente en el inicio, se lo apaga y se habilita la función blink (parpadeo). Blink hace que la posición actual del cursor alterne entre el caracter y un recuadro negro sólido. Esto puede ser útil para llamar la atención. Otra forma de llamar la atención es hacer parpadear la pantalla completa. Esto se logra invirtiendo el estado del bit de habilitación (enable). El operador OR exclusiva (^) simplifica esta tarea, debido a que la operación con un “1” invertirá el estado del bit (1 XOR 1 = 0, 0 XOR 1 = 1). Usando los comandos de desplazamiento de pantalla, se puede desplazar todo el texto fuera de la pantalla hacia la derecha y luego regresar. Esto demuestra que la pantalla en realidad es una ventana dentro de la memoria del LCD. Un método para sacar ventaja de esta memoria adicional es escribir mensajes fuera de la pantalla y luego desplazarlos hasta que estén visibles.

Manual StampWorks Versión 1.1 • Página 71



Experimento 12: Creando Caracteres en un LCD

Experimento 12: Creando Caracteres en un LCD Este programa demuestra cómo crear caracteres en un LCD, realizar animaciones y la inicialización del LCD en modo multi-línea. Construcción del Circuito Use el mismo circuito que en el Experimento 11. ' ' ' ' ' '

========================================================================= Archivo: LCDCHARS.BS2 Animación usando caracteres personalizados en LCD Ver 1.1 – Actualizado de acuerdo a las conexiones de LCD del BS2p =========================================================================

' pin habilitación LCD ' Selección registro (1 = carac.) ' datos de 4-bits del LCD

E

CON

0

RS LCDout

CON VAR

3 OutB

ClrLCD CrsrHm CrsrLf CrsrRt DispLf DispRt DDRam CGRam Line1 Line2

CON CON CON CON CON CON CON CON CON CON

$01 $02 $10 $14 $18 $1C $80 $40 $80 $C0

' ' ' ' ' ' ' '

limpia el LCD mueve el cursor a home mueve cursor a la izq. mueve cursor a la der. desplaza caracteres a la izq. desplaza caracteres a la der. control RAM de datos Caracter creado en RAM

char newChr index1 index2

VAR VAR VAR VAR

Byte Byte Byte Byte

' ' ' '

caracter caracter contador contador

enviado al LCD nuevo para animación de bucle de bucle

' ------------------------------------------------------------------------Msg1 Msg2

DATA DATA

"EL BASIC STAMP " " ES GENIAL! "

' mensaje pregrabado en EEPROM

Manual StampWorks Versión 1.1 • Página 73


Experimento 12: Creando Caracteres en un LCD CC0 CC1 CC2

DATA DATA DATA

$0E,$1F,$1C,$18,$1C,$1F,$0E,$00 $0E,$1F,$1F,$18,$1F,$1F,$0E,$00 $0E,$1F,$1F,$1F,$1F,$1F,$0E,$00

' caracter 0 ' caracter 1 ' caracter 2

' ------------------------------------------------------------------------Inicializar: DirL = %11111001

GOSUB LCDinit DLChars: char = CGRam GOSUB LCDcommand FOR index1 = CC0 TO (CC2 + 7) READ index1,char GOSUB LCDwrite NEXT

' configura pines para el LCD ' inicializa LCD en modo 4-bits

'descarga caracteres nuevos al LCD ' apunta al caracter creado en RAM ' prepara para escribir ' arma 3 caracteres ' obtiene byte de EEPROM ' lo pone en CG RAM del LCD

' ------------------------------------------------------------------------Principal: char = ClrLCD GOSUB LCDcommand PAUSE 250

' limpia el LCD

FOR index1 = 0 TO 15 READ (Msg1 + index1),char GOSUB LCDwrite NEXT

' obtiene mensaje de EEPROM ' lee un caracter ' lo escribe

PAUSE 2000

' espera 2 segundos

' Animaciรณn por reemplazo de caracteres FOR index1 = 0 TO 15 READ (Msg2 + index1),newChr FOR index2 = 0 TO 4 char = Line2 + index1 GOSUB LCDcommand LOOKUP index2,[2,1,0,1,newChr],char GOSUB LCDwrite PAUSE 50 NEXT NEXT

Pรกgina 74 โ ข Manual StampWorks Versiรณn 1.1

' ' ' '

cubre 16 caracteres obtiene letras del 2ยบ mensaje 5 caracteres en ciclo de animac. nuevo acceso a DDRAM

' escribe caracter de animaciรณn ' pausa entre caracteres


Experimento 12: Creando Caracteres en un LCD

PAUSE 1000 GOTO Principal END

' repite todo

' ------------------------------------------------------------------------LCDinit: PAUSE 500 LCDout = %0011 PULSOUT E,1 PAUSE 5 PULSOUT E,1 PULSOUT E,1 LCDout = %0010 PULSOUT E,1 char = %00101000 GOSUB LCDcommand char = %00001100 GOSUB LCDcommand char = %00000110 GOSUB LCDcommand RETURN LCDcommand: LOW RS LCDwrite: LCDout = char.HighNib PULSOUT E,1 LCDout = char.LowNib PULSOUT E,1 HIGH RS RETURN

' deja reposar el LCD ' modo de 8-bits

' modo de 4-bits ' modo multi-línea ' config. LCD ' config. LCD

' ingresa modo comando ' salen 4 bits altos ' pulso en línea Enable ' salen 4 bits bajos ' regresa a modo caracter

Manual StampWorks Versión 1.1 • Página 75


Experimento 12: Creando Caracteres en un LCD Descripción del Programa En este programa, el LCD es inicializado en modo multi-línea. Esto permitirá que las dos líneas del LCD de StampWorks muestren información. Con la pantalla inicializada, los caracteres nuevos son descargados en el LCD. El LCD tiene lugar para ocho caracteres definidos por el usuario. Los datos para estos caracteres se almacenan en el sector llamado CGRAM y deben ser descargados en el LCD después de encenderlo e inicializarlo (los caracteres definidos por el usuario se pierden al apagar el LCD). Cada caracter requiere ocho bytes de datos. El octavo byte normalmente es $00, debido a que es donde el cursor se posiciona, por debajo del caracter. La fuente estándar del LCD tiene 5 bits de ancho por 7 bits de alto. Puede crear caracteres personalizados de 8 bits de alto, pero la octava línea generalmente es reservada para el cursor de subrayado. Este es un ejemplo de la definición de un caracter personalizado:

La forma del caracter es determinada por los unos y ceros en los bytes de datos. Un uno en un bit de cierta posición, activará ese píxel; un cero lo apagará. Los patrones de bits de los caracteres personalizados se almacenan en la EEPROM del BASIC Stamp con instrucciones DATA. Para mover los patrones al LCD, el comando CGRam es ejecutado y los caracteres se escriben en la pantalla. Antes de poder usar los caracteres, el display debe regresar al modo “normal”. El método más común es limpiar la pantalla o enviar el cursor al inicio. Es interesante notar que el LCD entrega los patrones de bits de su memoria mientras actualiza el display. En aplicaciones avanzadas, la memoria CGRam puede ser actualizada mientras el programa se está ejecutando, para crear efectos de pantalla inusuales.

Página 76 • Manual StampWorks Versión 1.1


Experimento 12: Creando Caracteres en un LCD El corazón de este programa es el bucle de animación. Este código toma un caracter del segundo mensaje y luego muestra la secuencia de animación en la segunda línea del LCD. Una tabla LOOKUP es usada para llevar a cabo la secuencia de animación cíclica. Al final de la secuencia, se revela el nuevo caracter. Desafío Cree su propia secuencia de caracteres personalizados. Actualice la inicialización y el código de animación de acuerdo a sus propios caracteres.

Manual StampWorks Versión 1.1 • Página 77



Experimento 13: Leyendo la RAM del LCD

Experimento 13: Leyendo la RAM del LCD Este programa demuestra el uso del espacio CGRAM del LCD como memoria externa. Nuevos Elementos/Comandos PBASIC: •

InA, InB, InC, InD

Construcción del Circuito

' ' ' ' ' '

========================================================================= Archivo: LCDREAD.BS2 Use la RAM del LCD como memoria externa (64 bytes) Ver 1.1 – Actualizado según las conexiones de LCD del BS2p ========================================================================= 0 2 3 DirB OutB

pin habilitación LCD pin leer/escribir del LCD Selección registro (1 = carac.) dirección del puerto datos salida de 4-bits del LCD entrada de datos de 4-bits LCD

E RW RS LCDddir LCDout LCDin

CON CON CON VAR VAR VAR

InB

' ' ' ' ' '

ClrLCD CrsrHm

CON CON

$01 $02

' limpia el LCD ' mueve el cursor a home

Manual StampWorks Versión 1.1 • Página 79


Experimento 13: Leyendo la RAM del LCD CrsrLf CrsrRt DispLf DispRt DDRam CGRam

CON CON CON CON CON CON

$10 $14 $18 $1C $80 $40

' ' ' ' ' '

mueve cursor a la izq. mueve cursor a la der. desplaza caracteres a la izq. desplaza caracteres a la der. control RAM de datos Caracter creado en RAM

char addr index rVar tOut temp width

VAR VAR VAR VAR VAR VAR VAR

Byte Byte Byte Word Byte Word Nib

' ' ' ' ' ' '

caracter enviado al LCD dirección lectura/escritura contador de bucle número aleatorio valor de prueba a leer del LCD valor temporal ancho del número a mostrar

' ------------------------------------------------------------------------Inicializar: DirL = %11111101 GOSUB LCDinit

' configura pines para el LCD ' inicializa LCD en modo 4-bits

' ------------------------------------------------------------------------Principal: char = ClrLCD GOSUB LCDcommand FOR index = 0 TO 14 LOOKUP index,["ADDR=?? ???/???"],char GOSUB LCDwrite NEXT Loop: RANDOM rVar addr = rVar.LowByte & $3F tOut = rVar.HighByte

' limpia el LCD ' crea pantalla

' genera número aleatorio ' crea dirección (0 a 63) ' crea valor de prueba (0 a 255)

char = CGRam + addr GOSUB LCDcommand char = tOut GOSUB LCDwrite

' puntero de CGRAM

PAUSE 100

' espera y luego lo obtiene

Página 80 • Manual StampWorks Versión 1.1

' mueve el valor a CGRAM


Experimento 13: Leyendo la RAM del LCD char = CGRam + addr GOSUB LCDcommand GOSUB LCDread tIn = char

' puntero de CGRAM ' lee valor del LCD

' muestra resultados char = DDRam + 5 GOSUB LCDcommand temp = addr width = 2 GOSUB PutVal

' muestra dirección en posición 5

char = DDRam + 8 GOSUB LCDcommand temp = tOut width = 3 GOSUB PutVal

' muestra salida en posición 8

char = DDRam + 12 GOSUB LCDcommand temp = tIn width = 3 GOSUB PutVal

' muestra entrada en posición 12

PAUSE 1000 GOTO Loop END

' repite todo

' ------------------------------------------------------------------------PutVal: FOR index = (width - 1) TO 0 char = (temp DIG index) + 48 GOSUB LCDwrite NEXT RETURN LCDinit: PAUSE 500 LCDout= %0011 PULSOUT E,1 PAUSE 5 PULSOUT E,1

' muestra dígitos de izq. a der. ' convierte dígitos a ASCII ' pone dígito en display

' deja reposar el LCD ' modo de 8 bits

Manual StampWorks Versión 1.1 • Página 81


Experimento 13: Leyendo la RAM del LCD PULSOUT E,1 LCDout = %0010 PULSOUT E,1 char = %00001100 GOSUB LCDcommand char = %00000110 GOSUB LCDcommand RETURN LCDcommand: LOW RS LCDwrite: LCDout = char.HighNib PULSOUT E,1 LCDout = char.LowNib PULSOUT E,1 HIGH RS RETURN LCDread: HIGH RS HIGH RW LCDddir= %0000 HIGH E char.HighNib = LCDin LOW E HIGH E char.LowNib = LCDin LOW E LCDddir= %1111 LOW RW RETURN

Página 82 • Manual StampWorks Versión 1.1

' modo de 4-bits ' config. LCD ' config. LCD

' ingresa modo comando ' salen 4 bits altos ' pulso en línea Enable ' salen 4 bits bajos ' regresa a modo caracter

' comando de datos ' leer ' hace entradas líneas de datos ' obtiene 4 bits superiores ' obtiene 4 bits inferiores ' líneas de datos como salidas


Experimento 13: Leyendo la RAM del LCD Descripción del Programa Este programa demuestra la versatilidad de las líneas de E/S del BASIC Stamp y su capacidad para ser reconfiguradas en la mitad del programa. La escritura en el LCD se trató en los últimos dos experimentos. Para leer los datos, las líneas de E/S del BASIC Stamp deben ser reconfiguradas como entradas. Esto no representa un problema para el BASIC Stamp. Además de la reconfiguración de las líneas de E/S, para leer valores del LCD se requiere una línea de control adicional: RW. En la mayoría de los programas, ésta línea puede ser fijada en estado bajo, para poder escribir datos en el LCD. Para leer desde el LCD la línea RW se pone en estado alto. El programa genera datos y una dirección usando la función RANDOM. La dirección se mantiene en el rango de 0 a 63 poniendo una máscara en los bits más altos de LowByte que entrega la función RANDOM. HighByte representa el dato a ser guardado y leído del LCD. Los datos se almacenan en el área de CGRAM del LCD. Esto significa, en este programa, que la memoria CGRAM no puede ser usada para mostrar caracteres personalizados. En programas que requieran menos de ocho caracteres definidos por el usuario, los bytes restantes de la CGRAM pueden ser usados como memoria complementaria. Los datos se leen del LCD de la misma forma en que se escriben: se fija la dirección y se recuperan los datos. Para poder hacer esto, las líneas de datos del LCD deben ser reconfiguradas como entradas. Enviando pulsos en la línea E (habilitación) se logra que los datos (de a cuatro bits) estén disponibles para el BASIC Stamp. Nuevamente, se usan HighNib y LowNib, esta vez para armar un byte a partir de dos nibbles (paquetes de 4 bits) recibidos durante la operación de lectura. Cuando todo está listo, la dirección, los datos de salida y los datos de entrada se escriben en el LCD. La subrutina PutVal, se encarga de escribir valores numéricos en el LCD. Para usar esta subrutina, mueva el cursor a la posición deseada, coloque el valor a mostrar en temp, la cantidad de caracteres a mostrar en width, llamando luego a PutVal. La subrutina usa el operador DIG para extraer un dígito de temp y le suma 48 para convertirlo en ASCII de forma que pueda ser mostrado en el LCD.

Manual StampWorks Versión 1.1 • Página 83



Experimento 14: Juego de la Bola 8 Mágica

Experimento 14: Juego de la Bola 8 Mágica Este programa muestra la capacidad de mostrar fuentes de 8x10 del módulo LCD del StampWorks. De esta forma se pueden mostrar correctamente caracteres en minúscula que pasan por debajo del renglón (g, j, p, q e y). Nuevos Elementos/Comandos PBASIC: •

LOOKDOWN

Construcción del Circuito Agregue este pulsador al circuito del Experimento 11 (recuerde conectar LCD.RW a Vss).

' ' ' ' ' '

========================================================================= Archivo: LCD8BALL.BS2 Programa de la Bola 8 Mágica con BASIC Stamp y LCD Ver 1.1 – Actualizado de acuerdo con las conexiones de LCD del BS2p =========================================================================

E RS LCDout AskBtn

CON CON VAR CON

0 3 OutB 15

' ' ' '

pin habilitación LCD Selección registro (1 = carac.) datos salida de 4-bits del LCD pin del botón

ClrLCD CrsrHm

CON CON

$01 $02

' limpia el LCD ' mueve el cursor a home

Manual StampWorks Versión 1.1 • Página 85


Experimento 14: Juego de la Bola 8 Mágica CrsrLf CrsrRt DispLf DispRt DDRam CGRam

CON CON CON CON CON CON

$10 $14 $18 $1C $80 $40

' ' ' ' ' '

mueve cursor a la izq. mueve cursor a la der. desplaza caracteres a la izq. desplaza caracteres a la der. control RAM de datos Caracter creado en RAM

NumAns

CON

6

' 6 respuestas posibles

_g _j _p _q _y

CON CON CON CON CON

$E7 $EA $F0 $F1 $F9

' direcciones DDROM

char addr swData answer clock pntr

VAR VAR VAR VAR VAR VAR

Byte Byte Byte Nib Nib Nib

' ' ' ' ' '

caracter enviado al LCD dirección del mensaje variable para BUTTON puntero de respuesta reloj de animación puntero al caract. de animación

' ------------------------------------------------------------------------Prompt

DATA

"Pregunte",0

Ans0 Ans1 Ans2 Ans3 Ans4 Ans5

DATA DATA DATA DATA DATA DATA

"Seguro que SI",0 "Posible...",0 "Rotundamente NO",0 "No es seguro...",0 "No se...",0 "Tal vez...",0

' ------------------------------------------------------------------------Inicializar: DirL = %11111001 GOSUB LCDinit

' configura pines para el LCD ' inicializa LCD en modo 4-bits

' ------------------------------------------------------------------------Principal: char = ClrLCD

Página 86 • Manual StampWorks Versión 1.1

' limpia el LCD


Experimento 14: Juego de la Bola 8 Mágica GOSUB LCDcommand addr = Prompt GOSUB ShowMsg

' muestra cursor

Rollem: GOSUB Shuffle ' Mezcla hasta que se presiona PAUSE 5 ‘ el botón BUTTON AskBtn,0,255,10,swData,1,ShowAnswer GOTO Rollem ShowAnswer: ' obtener dirección de mensaje de respuesta LOOKUP answer,[Ans0,Ans1,Ans2,Ans3,Ans4,Ans5],addr char = ClrLCD GOSUB LCDcommand GOSUB ShowMsg PAUSE 2000 GOTO Principal END

' tiempo para leer respuesta ' repite todo

' ------------------------------------------------------------------------LCDinit: PAUSE 500 LCDout= %0011 PULSOUT E,1 PAUSE 5 PULSOUT E,1 PULSOUT E,1 LCDout = %0010 PULSOUT E,1 char = %00100100 GOSUB LCDcommand char = %00001100 GOSUB LCDcommand char = %00000110 GOSUB LCDcommand RETURN LCDcommand: LOW RS

' deja reposar el LCD ' modo de 8 bits

' modo de 4-bits ' selec. fuente 5x10 ' config. LCD ' config. LCD

' ingresa modo comando

Manual StampWorks Versión 1.1 • Página 87


Experimento 14: Juego de la Bola 8 Mágica

LCDwrite: LCDout = char.HighNib PULSOUT E,1 LCDout = char.LowNib PULSOUT E,1 HIGH RS RETURN ShowMsg: READ addr,char IF char = 0 THEN MsgDone GOSUB Translate GOSUB LCDwrite addr = addr + 1 GOTO ShowMsg MsgDone: RETURN

' salen 4 bits altos ' pulso en línea Enable ' salen 4 bits bajos ' regresa a modo caracter

' ' ' ' '

lee un caracter si es 0, mensaje listo cambia letras bajo renglón escribe el caracter apunta al caracter siguiente

' cambia las letras minúsculas que pasan por debajo del renglón ' – no modifica otros caracteres Translate: LOOKDOWN char,["g","j","q","p","y"],char LOOKUP char,[_g,_j,_q,_p,_y],char RETURN Shuffle: answer = answer + 1 // NumAns clock = clock + 1 // 15 IF (clock > 0) THEN ShuffleDone char = DDRam + 15 GOSUB LCDcommand LOOKUP pntr,["-+|*"],char GOSUB LCDwrite pntr = pntr + 1 // 4 ShuffleDone: RETURN

Página 88 • Manual StampWorks Versión 1.1

' ' ' '

actualiza puntero de respuesta actualiza puntero de reloj tiempo para actualiz. animación? si, escribe en pos. 15

' carga caracter de animación ' lo escribe ' actualiza caracter de animación


Experimento 14: Juego de la Bola 8 Mágica Descripción del Programa Las fuentes comunes de 5x7 de LCD deforman mucho las letras que tienen partes que pasan por debajo del renglón (g, j, p, q e y). Estas fuentes cortan o aplastan estos caracteres al mostrarlos en la pantalla. Muchos LCDs soportan fuentes de caracteres de 5x10 logrando que ninguna letra luzca deformada. Usar la fuente de 5x10 es muy simple; se requiere un solo comando adicional en la secuencia de inicialización. Para que estos caracteres especiales se vean correctamente sin embargo, hay que hacer un pequeño truco debido a que fueron mapeados con un desplazamiento con respecto a los demás caracteres ASCII. Por suerte, el BASIC Stamp tiene un par de comandos para manejo de tablas que simplifican el proceso de transformación. Después de la inicialización, se limpia la pantalla y se le indica al usuario que piense una pregunta. La subrutina ShowMsg muestra un mensaje en la posición actual del cursor. El mensaje es almacenado en una instrucción DATA y pasado a la subrutina por su dirección de EEPROM. ShowMsg lee los caracteres de la EEPROM hasta que encuentra un cero, pasando cada caracter a la subrutina Translate, que redibuja el valor ASCII para los caracteres especiales. Translate usa un truco astuto con LOOKUP y LOOKDOWN. Cuando se pasa un caracter a Translate, es comparado con la lista de caracteres especiales. Si el caracter está en la lista, es convertido a un valor que será usado por LOOKUP para rediseñar el caracter para que se vea correctamente en el LCD. Si el caracter no está en la lista, pasará a través de Translate sin ser afectado. El bucle principal del programa espera a que presione un botón, creando una respuesta aleatoria al llamar continuamente a la subrutina Shuffle. Shuffle actualiza la variable de respuesta y crea una animación. La animación es creada con caracteres comunes y se actualiza cada 15 pasadas por la subrutina Shuffle. Cuando finalmente se presiona el botón, la dirección de la EEPROM de la respuesta correspondiente es cargada con LOOKUP y la respuesta “mágica” es mostrada. Desafío Cree caracteres personalizados que usen el modo de fuente de 5x10. Nota: se deben usar 16 bytes por cada caracter, incluso aunque se muestren solamente 10. Vea LCD8BAL2.BS2 como ejemplo.

Manual StampWorks Versión 1.1 • Página 89



Avanzando

Avanzando Las primeras tres secciones de este manual trataron específicamente con dispositivos de salida, debido a que estos son críticos para el éxito de un proyecto. Hasta ahora, debería sentirse cómodo empleando LEDs, displays de 7 segmentos y LCDs. A partir de este momento presentaremos una variedad de experimentos, algunos simples y otros no tanto, que completarán su educación como programador del BASIC Stamp y le darán la confianza que necesita para desarrollar sus propias aplicaciones con el BASIC Stamp. Recuerde que la clave del éxito es completar cada experimento con su correspondiente desafío. Luego, avance planteando sus propios desafíos. Cada vez que modifique un programa aprenderá algo. Es normal que sus experimentos no funcionen como se esperaba, debido a que aún está aprendiendo.

Manual StampWorks Versión 1.1 • Página 91



Experimento 15: Filtrando Múltiples Entradas

Experimento 15: Filtrando Múltiples Entradas El experimento le enseñará cómo eliminar el rebote en múltiples entradas del BASIC Stamp. Con alguna modificación, se puede eliminar el rebote de cualquier número de entradas (entre 2 y 16), con este código. Nuevos Elementos/Comandos PBASIC: • • •

~ (operador de complemento a 1) CLS (modificador de DEBUG) IBIN, IBIN1 – IBIN16 (modificadores de DEBUG)

Construcción del Circuito

' ' ' ' '

========================================================================= Archivo: DEBOUNCE.BS2 Eliminación simultánea del rebote en múltiples entradas. =========================================================================

Manual StampWorks Versión 1.1 • Página 93


Experimento 15: Filtrando Múltiples Entradas SwIn swtches x

VAR VAR VAR

InA Nib Nib

' entradas pines 0 - 3 ' entradas sin rebote ' contador del bucle

' ------------------------------------------------------------------------Principal: GOSUB GetSwitches DEBUG CLS, IBIN4 swtches PAUSE 100 GOTO Principal END

' ' ' '

obtiene entradas sin rebote muestra en modo binario pausa entre lecturas repite todo

' ------------------------------------------------------------------------GetSwitches: swtches = %1111 FOR x = 1 TO 10 swtches = swtches & ~SwIn PAUSE 5 NEXT RETURN

' habilita las 4 entradas ' controla las entradas ' pausa entre controles

Descripción del Programa Cuando se quiere filtrar el rebote en una sola entrada, la función BUTTON del BASIC Stamp funciona perfectamente e incluso agrega un par de características bastante útiles (como auto repetir). Para filtrar el rebote de dos o más entradas, necesitamos crear un poco de código. El trabajo de este experimento lo realiza la subrutina GetSwitches. Como se muestra, funciona para cuatro entradas. Puede ser modificada para cualquier cantidad de entradas entre 2 y 16. El propósito de GetSwitches es asegurarse que las entradas están estables durante 50 milisegundos. El estado de las entradas es almacenado en la variable switches, equivaliendo un 1 a una entrada activada en el interruptor de esa posición. La rutina GetSwitches comienza asumiendo que todos los interruptores de entrada están presionados, poniendo todos los bits en uno. Luego, usando un bucle FOR-NEXT, se controlan las entradas y se comparan con el estado anterior. Dado que las entradas son activo bajas (cero cuando se presiona), el operador de complemento a uno (~) las invierte. El operador And (&) es usado para actualizar el estado actual. Para que un interruptor sea detectado, debe permanecer presionado durante todo el bucle FOR-NEXT.

Página 94 • Manual StampWorks Versión 1.1


Experimento 15: Filtrando Múltiples Entradas Así es como funciona la técnica para eliminar el rebote: cuando se presiona un interruptor, la entrada del BASIC Stamp será cero. El operador de complemento a uno invertirá este valor. Uno “&” uno, sigue siendo uno, así que el interruptor sigue figurando como presionado. Si no se presiona el interruptor, la entrada del BASIC Stamp será uno (debido a la resistencia de pull-up de 10K a Vdd). El uno es invertido y convertido en cero. Cero “&” cualquier otro número es cero y hará que el interruptor figure como no presionado durante todo el resto del ciclo. El filtrado del rebote de las entradas es mostrado en la ventana DEBUG con el modificador IBIN4 para lograr distinguir claramente el estado de cada interruptor de entrada. Desafío Modifique el programa para que elimine el rebote y muestre el estado de ocho interruptores.

Manual StampWorks Versión 1.1 • Página 95



Experimento 16: Contando Eventos

Experimento 16: Contando Eventos Este experimento demuestra un retardo programado por eventos externos. Construcción del Circuito

' ' ' ' ‘ '

========================================================================= Archivo: COUNTER.BS2 Retarda la ejecución del programa al esperar por una cantidad específica de eventos =========================================================================

E_in

VAR

In15

' pin de entrada de eventos

IsLow IsHigh Target

CON CON CON

0 1 1000

' cantidad final

eCount

VAR

Word

' contador de eventos

' ------------------------------------------------------------------------Principal: eCount = 0 DEBUG "Iniciado... ", CR GOSUB WaitForCount DEBUG "Cuenta completa." END

' limpia el contador ' espera por 1000 pulsos

' ------------------------------------------------------------------------WaitForCount: IF E_in = IsLow THEN WaitForCount ' espera que la ent. pase a alto eCount = eCount + 1 ' incrementa el cont. de eventos DEBUG Home, 10, "Cuenta = ", DEC eCount, CR IF eCount = Target THEN WaitDone ' compara con la cantidad final

Manual StampWorks Versión 1.1 • Página 97


Experimento 16: Contando Eventos WaitLow: IF E_in = IsHigh THEN WaitLow GOTO WaitForCount WaitDone: RETURN

' espera que la ent. pase a bajo

Descripción del Programa El propósito de la subrutina WaitForCount es hacer que el programa espere durante una cantidad específica de eventos. En una aplicación industrial por ejemplo, un sistema de empaque puede tener que hacer funcionar la cinta transportadora hasta que pasen 100 cajas. Cuando el programa pasa a WaitForCount, se controlan las transiciones de bajo a alto en el pin de entrada. Cuando la línea pasa a alto, el contador es incrementado y el programa espera hasta que la línea regresa a estado bajo. Cuando esto sucede, el código se repite buscando la siguiente transición ascendente. Cuando se alcanza el valor final, la subrutina regresa al programa principal. El tiempo que tarda la subrutina es determinado por la velocidad de los eventos externos. Observe que la subrutina espera una entrada limpia. Una entrada ruidosa podría causar una cuenta errónea, anticipando el fin de la subrutina. Un método para tratar una entrada ruidosa (cuando se conoce de antemano el tiempo estimado entre eventos) es agregar una instrucción PAUSE inmediatamente después de cada evento. La idea es hacer una pausa desde que se produce el evento y finalizarla justo antes de que se produzca el próximo. El código que sigue funciona correctamente cuando los eventos duran aproximadamente medio segundo y están separados entre sí por 2 segundos: WaitForCount: IF P_in = IsLow THEN WaitForCount ' espera un pulso en alto pCount = pCount + 1 ' incrementa contador DEBUG Home, 10, "Cuenta = ", DEC eCount, CR IF pCount = Target THEN WaitDone ' controla con valor final PAUSE 1500 ' limpia entrada ruidosa WaitLow: IF P_in = IsHigh THEN WaitLow ' espera a que pase a estado bajo GOTO WaitForCount WaitDone: RETURN

Página 98 • Manual StampWorks Versión 1.1


Experimento 17: Medición de Frecuencia

Experimento 17: Medición de Frecuencia Este experimento determina la frecuencia de un tren de pulsos usando la función COUNT del BASIC Stamp. Nuevos Elementos/Comandos PBASIC: •

COUNT

Construcción del Circuito (Note que el esquema NO es chip-céntrico)

' ' ' ' '

========================================================================= Archivo: FREQ1.BS2 Cuenta y muestra la frecuencia de los pulsos que entran por el Pin 0 =========================================================================

F_in

CON

0

' pin de entrada de pulsos

freq

VAR

Word

' frecuencia

' -------------------------------------------------------------------------

Manual StampWorks Versión 1.1 • Página 99


Experimento 17: Medición de Frecuencia

Principal: COUNT F_in, 1000, freq

' cuenta pulsos durante 1 segundo

' muestra en la pantalla DEBUG DEBUG CLS, "Frecuencia: ", DEC freq, " Hz" GOTO Principal END

' repite todo

Descripción del Programa En el experimento anterior, se usaron varias líneas de código para contar pulsos en un pin de entrada. Ese método es útil cuando se cuenta hasta un valor específico. Otros programas necesitan contar la cantidad de pulsos que arriban durante un período de tiempo específico. La función COUNT del BASIC Stamp fue diseñada para este propósito. La frecuencia de una señal oscilatoria representa la cantidad de ciclos por segundo y se expresa en Hertz. La función COUNT del BASIC Stamp controla el pin especificado durante la cantidad de tiempo dada. Para obtener la medición de frecuencia, se especificó un tiempo de 1000 milisegundos (un segundo). Desafío Mejore la respuesta (que se actualice más frecuentemente) de este programa modificando el período de COUNT. ¿Qué otro ajuste debe realizarse? ¿Cómo afecta este cambio la capacidad de medir señales de frecuencias muy bajas?

Página 100 • Manual StampWorks Versión 1.1


Experimento 18: Medición Avanzada de Frecuencia

Experimento 18: Medición Avanzada de Frecuencia Este experimento usa PULSIN para crear un frecuencímetro de respuesta rápida. Nuevos Elementos/Comandos PBASIC: •

PULSIN

Construcción del Circuito Use el mismo circuito del Experimento 17. ' ' ' ' ' ' '

========================================================================= Archivo: FREQ2.BS2 Muestra la frecuencia de los pulsos que entran por Pin 0 {$STAMP BS2} =========================================================================

F_pin

CON

0

' pin de entrada de frecuencia

pHigh pLow period freq

VAR VAR VAR VAR

Word Word Word Word

' ' ' '

ancho de pulso alto ancho de pulso bajo período (alto+bajo) frecuencia

' ------------------------------------------------------------------------Principal: PULSIN F_pin, 0, pHigh PULSIN F_pin, 1, pLow period = pHigh + pLow freq = 50000 / period * 10

' ' ' '

obtiene obtiene calcula calcula

parte alta de la entrada parte baja de la entrada el período la frecuencia

' muestra en la pantalla DEBUG DEBUG Home DEBUG "Período...... ", DEC period * 2, " uS DEBUG "Frecuencia... ", DEC freq, " Hz "

", CR

Manual StampWorks Versión 1.1 • Página 101


Experimento 18: Medición Avanzada de Frecuencia GOTO Principal END

' repite todo

Descripción del Programa En el último experimento, aprendió que la frecuencia de una señal se define como la cantidad de ciclos por segundo. Creó un frecuencímetro simple contando la cantidad de pulsos (ciclos) durante un segundo. Este método funciona bien, especialmente para señales de baja frecuencia. Habrá veces sin embargo, que un proyecto necesitará una respuesta más rápida en la medición de frecuencia. La frecuencia de una señal puede ser calculada a partir de su período, o el tiempo de un ciclo completo.

Midiendo el período de una señal entrante, su frecuencia puede ser calculada con la ecuación (donde el período es expresado en segundos): frecuencia = 1 / período La función PULSIN del BASIC Stamp está diseñada para medir el ancho de un pulso entrante. Usando PULSIN para medir las partes en estado alto y bajo de la señal, se pueden determinar el período y la frecuencia. El resultado de PULSIN está expresado en unidades de 2 microsegundos. Así, la fórmula para calcular la frecuencia sería: frecuencia = 500.000 / período Esto representa un inconveniente algebraico para el BASIC Stamp porque solamente puede realizar cálculos con números de 16-bits (el valor máximo es 65.535). Para corregir la fórmula, convertimos 500.000 en 50.000 x 10 y la rescribimos así frecuencia = 50.000 / período * 10 Ejecute el programa y ajuste el potenciómetro de 10K. Observe que la pantalla DEBUG se actualiza sin demoras y que no hay “saltos” como cuando usó COUNT para determinar la frecuencia.

Página 102 • Manual StampWorks Versión 1.1


Experimento 19: Theremin Controlado por Luz

Experimento 19 Theremin Controlado por Luz Este experimento demuestra el uso de FREQOUT creando un Theremin (primer instrumento musical electrรณnico que se produjo) controlado por luz. Construcciรณn del Circuito

' ' ' ' ' ' '

========================================================================= Archivo: THEREMIN.BS2 Usa RCTIME con una LDR para crear un a Theremin controlado por luz {$STAMP BS2} =========================================================================

Speaker Sensor

CON CON

0 1

' salida del piezo ' entrada del sensor (RCTIME)

Threshold

CON

200

' frecuencia de corte

tone

VAR

Word

' frecuencia de salida

' ------------------------------------------------------------------------Principal: HIGH Sensor PAUSE 1

' descarga el cap. ' durante 1 ms

Manual StampWorks Versiรณn 1.1 โ ข Pรกgina 103


Experimento 19: Theremin Controlado por Luz RCTIME Sensor,1,tone IF (tone < Threshold) THEN Principal FREQOUT Speaker,20,tone GOTO Principal END

' lee el sensor de luz ' saltea por luz ambiental ' toca el tono

Descripción del Programa Un Theremin es un dispositivo musical interesante usado para crear esos sonidos escalofriantes que se escuchan en las películas de terror antiguas. Esta versión usa la luz incidente en un Fotorresistor para crear el tono de salida. Dado que el Fotorresistor es un dispositivo resistivo, RCTIME puede usarse para leer su valor. FREQOUT se usa para emitir el sonido. La constante Threshold, se usa para controlar el punto de corte del Theremin. Cuando la lectura del Fotorresistor cae por debajo de este valor, no se emite ningún sonido. Este valor podría ajustarse para que el Theremin deje de tocar cuando el fotoresistor recibe la luz ambiente en forma directa. Desafío Agregue un segundo circuito RC usando un potenciómetro de 10K en lugar de un fotoresistor. Use este circuito para ajustar el valor de corte para condiciones de iluminación variables.

Página 104 • Manual StampWorks Versión 1.1


Experimento 20: Efectos de Sonido

Experimento 20 Efectos de Sonido Este experimento usa FREQOUT y DTMFOUT para crear efectos de sonido de teléfono. Nuevos Elementos/Comandos PBASIC: •

DTMFOUT

Construcción del Circuito

' ' ' ' ' ' '

========================================================================= Archivo: PHONE.BS2 Usa FREQOUT y DTMFOUT para crear (US) sonidos telefónicos {$STAMP BS2} =========================================================================

Speaker

CON

0

' piezo en pin 0

R C Cs D E F G Gs A As B

CON CON CON CON CON CON CON CON CON CON CON

0 33 35 39 41 44 49 52 55 58 62

' ' ' ' ' ' ' ' ' ' '

silencio ideal es ideal es ideal es ideal es ideal es ideal es ideal es ideal es ideal es ideal es

32.703 34.648 38.891 41.203 46.249 48.999 51.913 55.000 58.270 61.735

Manual StampWorks Versión 1.1 • Página 105


Experimento 20: Efectos de Sonido N1 N2 N3 N4 N8

CON CON CON CON CON

500 N1/2 N1/3 N1/4 N1/8

' ' ' ' '

duración nota completa media nota un tercio de nota un cuarto de nota un octavo de nota

x note octave dur

VAR VAR VAR VAR

Byte Word Nib Word

' ' ' '

contador del bucle nota a tocar octava de la nota (1 - 7) longitud de la nota

' ------------------------------------------------------------------------Principal: DEBUG CLS, "Sonidos Telefónicos", CR, CR Dial_Tone: DEBUG "Tono de Marcado", CR FREQOUT Speaker,35,35 PAUSE 100 FREQOUT Speaker,2000,350,440

' "clic" ' combina 350 Hz y 440 Hz

Dial_Number: DEBUG "Llamando a Parallax (916-624-8333)", CR DTMFOUT Speaker,[9,1,6,6,2,4,8,3,3,3] PAUSE 500 Phone_Busy: DEBUG "Señal de Ocupado", CR FOR x = 1 TO 6 FREQOUT Speaker,400,480,620 PAUSE 620 NEXT FREQOUT Speaker,35,35 PAUSE 1000 Dial_Number2: DEBUG "Llamando otra vez", CR DTMFOUT Speaker,[9,1,6,6,2,4,8,3,3,3] PAUSE 500 Phone_Rings: DEBUG "Llamando", CR FOR x = 1 TO 2

Página 106 • Manual StampWorks Versión 1.1

' combina 480 Hz y 620 Hz ' "clic"


Experimento 20: Efectos de Sonido FREQOUT Speaker,2000,440,480 PAUSE 4000 NEXT

' combina 440 Hz y 480 Hz

Play_Song: DEBUG "Pequeña melodía", CR FOR x = 0 TO 7 LOOKUP x,[ G, G, E, G, A, G, E, R],note LOOKUP x,[ 4, 4, 4, 4, 4, 4, 4, 1],octave LOOKUP x,[N2,N2,N2,N2,N2,N2,N1,N8],dur GOSUB PlayNote NEXT END ' ------------------------------------------------------------------------PlayNote: note = note << (octave-1) FREQOUT Speaker,dur,note RETURN

' frecuencia de nota + octava ' emite sonido

Descripción del Programa Con un poco de creatividad en la programación, el BASIC Stamp puede emitir unos efectos de sonido muy interesantes. Dado que la mayoría de los sonidos que escuchamos en el teléfono (que no sean de voz) son generados con dos tonos, las funciones FREQOUT y DTMFOUT del BASIC Stamp pueden ser usadas para generarlos. DTMFOUT en realidad es una versión especializada de FREQOUT. Su propósito es tocar los tonos

dobles que se requieren para marcar números telefónicos. En lugar de escribir el tono (o tonos), directamente se usan los números a ser marcados. En verdaderas aplicaciones de marcado, la duración y la separación de los tonos del DTMF puede ser especificada, para ajustarse a la calidad de la línea telefónica.

Este programa también presenta la habilidad musical básica del BASIC Stamp tocando una pequeña melodía. Las constantes con las frecuencias de las notas (primer octava) y las duraciones, simplifican el código operacional. La subrutina PlayNote ajusta la frecuencia de la nota para la octava especificada. La calidad musical puede verse afectada para octavas más altas debido a errores de redondeo. Usando los valores ideales que se muestran, la tabla de constantes puede ser expandida

Manual StampWorks Versión 1.1 • Página 107


Experimento 20: Efectos de Sonido para obtener notas musicales precisas. Tenga en cuenta que cada octava duplica la frecuencia de una nota. Octava 2 = Octava 1 * 2 Octava 3 = Octava 2 * 2 Octava 4 = Octava 3 * 2 Y así… Desafío Convierta (una parte de) su canción favorita para que suene en el BASIC Stamp.

Página 108 • Manual StampWorks Versión 1.1


Experimento 21: Entrada Analógica con PULSIN

Experimento 21 Entrada Analógica con PULSIN Este experimento lee el valor de un componente resistivo usando PULSIN y un oscilador. Construcción del Circuito (Note que el esquema NO es chip-céntrico)

' ' ' ' ' ' '

========================================================================= Archivo: A2D.BS2 Lee componente resistivo con filtro digital {$STAMP BS2} =========================================================================

P_pin

CON

0

' pin de entrada de pulso

P75 P50 P25

CON CON CON

$00C0 $0080 $0040

' 0.75 ' 0.50 ' 0.25

rValue sValue

VAR VAR

Word Word

' valor directo ' valor suavizado

' -------------------------------------------------------------------------

Manual StampWorks Versión 1.1 • Página 109


Experimento 21: Entrada Analógica con PULSIN Principal: PULSIN P_pin, 1, rValue

' obtiene parte estado bajo

sValue = (rValue */ P25) + (sValue */ P75) DEBUG Home DEBUG "Valor directo... ", DEC rValue, " DEBUG "Valor filtrado.. ", DEC sValue, " GOTO Principal END

", CR " ' repite

Descripción del Programa En este experimento, el 555 es configurado como un oscilador. Analizando la salida, el ancho de la porción de estado bajo es controlado por el valor de la resistencia del fotoresistor. Midiendo la parte baja de la señal de salida del 555 con PULSIN, el BASIC Stamp es capaz de determinar el valor relativo del fotoresistor. Una vez que el valor directo está disponible, podemos sumar una parte de éste al valor digitalmente filtrado anterior (método iterativo) para obtener un valor suavizado. La relación entre lectura directa sobre filtrada de esta ecuación, determinará la respuesta del filtro. A mayor porcentaje de valor directo, más rápidos son los cambios. Desafío Cree un valor de salida final que esté afectado por un factor de escala, de forma que el rango de salida sea de cero a 1000.

Página 110 • Manual StampWorks Versión 1.1


Experimento 22: Salida Analógica con PWM

Experimento 22: Salida Analógica con PWM Este programa muestra como crear una salida de tensión variable con PWM. Nuevos Elementos/Comandos PBASIC: •

PWM

Construcción del Circuito

Note que este circuito requiere 12V. El único lugar donde podrá obtener 12V en la plaqueta NX-1000 es desde el tornillo del terminal +V, en el sector de alta corriente que se encuentra en la esquina inferior derecha. ' ' ' ' ' ' '

========================================================================= Archivo: THROB.BS2 Cambia el brillo de un LED usando PWM {$STAMP BS2} =========================================================================

D2Aout

CON

0

' pin de salida analógica

level

VAR

Byte

' nivel analógico

' -------------------------------------------------------------------------

Manual StampWorks Versión 1.1 • Página 111


Experimento 22: Salida Analógica con PWM

Principal: FOR level = 0 TO 255 PWM D2Aout,level,25 NEXT

' aumenta la tensión del LED

PAUSE 100 FOR level = 255 TO 0 PWM D2Aout,level,25 NEXT

' disminuye la tensión del LED

GOTO Principal END

' repite

Descripción del Programa Mientras que en la mayoría de las aplicaciones el BASIC Stamp trabajará con señales digitales, en algunas necesitarán una salida analógica; una tensión variable entre cero y algún valor máximo. La función PWM del BASIC Stamp está diseñada para generar tensiones analógicas cuando se combina con un filtro RC. La función PWM genera una serie de pulsos que tienen una relación de tiempo de encendido y apagado programable (ciclo de trabajo). A mayor ciclo de trabajo, mayor tensión de salida. Un ciclo de trabajo de 255 cargará al capacitor con 5 volts. En este experimento, se usa medio LM358 como fuente de tensión para el LED. El op-amp (amplificador operacional) evita que el capacitor se descargue rápidamente bajo condiciones de trabajo. El brillo del LED varía debido a que la caída de tensión sobre el resistor que está en serie, modifica la corriente que circula a través del LED. Observe que el LED se enciende en forma cada vez más brillante y luego, se oscurece hasta apagarse. Esto sucede cuando la salida del LM358 cruza el umbral de tensión de polarización directa (la tensión mínima para que el LED se ilumine) del LED (aproximadamente 1,5 volts). Usando el Multímetro digital, controle la tensión del Pin 1 del LM358.

Página 112 • Manual StampWorks Versión 1.1


Experimento 23: Expandiendo Salidas

Experimento 23: Expandiendo Salidas Este experimento demuestra cómo expandir las salidas del BASIC Stamp con un simple registro de desplazamiento. Se emplean tres líneas para controlar ocho LEDs con un registro de desplazamiento 74x595. Nuevos Elementos/Comandos PBASIC: •

SHIFTOUT

Construcción del Circuito (Note que el esquema NO es chip-céntrico)

Manual StampWorks Versión 1.1 • Página 113


Experimento 23: Expandiendo Salidas

' ' ' ' '

========================================================================= Archivo: 74x595.BS2 Use tres líneas para controlar 8 con un registro de desplazamiento 74x595 =========================================================================

D_out Clock Latch

CON CON CON

0 1 2

DlyTm

CON

100

pattern

VAR

Byte

' salida serial (74x595.14) ' reloj de desp. (74x595.11) ' salida de latch (74x595.12)

' patrón de salida

' ------------------------------------------------------------------------Inicializar: LOW Latch pattern = %00000001

' salida en estado bajo

' ------------------------------------------------------------------------Adelante: GOSUB Out595 PAUSE DlyTm pattern = pattern << 1 IF pattern = %10000000 THEN Atras GOTO Adelante

' ' ' '

pone patrón en 74x595 desplaza patrón a la izq. comprueba posición final continua en esta dirección

Atras: GOSUB Out595 PAUSE DlyTm pattern = pattern >> 1 IF pattern = %00000001 THEN Adelante GOTO Atras END ' ------------------------------------------------------------------------Out595: SHIFTOUT D_out,Clock,MSBFirst,[pattern] PULSOUT Latch,3 RETURN

Página 114 • Manual StampWorks Versión 1.1

' envía patrón al 74x595 ' bloquea (latch) las salidas


Experimento 23: Expandiendo Salidas Descripción del Programa El BASIC Stamp es extraordinariamente flexible en su habilidad para redefinir la dirección (entrada o salida) de sus pines de E/S, aunque muy pocas aplicaciones requieren tanta flexibilidad. La mayoría de las aplicaciones de microcontroladores definirán los pines como entradas o salidas en la inicialización y esta definición quedará sin cambios durante el resto del programa. Si hay líneas que solamente se usarán como salidas podemos ahorrar líneas de E/S del BASIC Stamp usando un componente simple llamado registro de desplazamiento de entrada serial, salida paralelo. En este experimento se usó el 74x595. Con solamente tres líneas del BASIC Stamp, este programa es capaz de controlar ocho LEDs a través del 74x595. El 74x595 convierte una cadena de datos seriales sincrónicos en ocho salidas paralelas. Los datos seriales sincrónicos tienen en realidad dos componentes: los datos seriales y el reloj (clock) serial. El comando SHIFTOUT del BASIC Stamp se encarga de los detalles de las líneas de datos y reloj, escribiendo los datos en un dispositivo sincrónico, en este caso 74x595. Con el 74x595, los datos deben ser bloqueados (latch) en las salidas después del proceso de desplazamiento. El bloqueo se realiza enviando un breve pulso por la línea de control de Latch. Esto evita que las salidas se modifiquen a medida que datos nuevos son cargados “. Como dispositivos seriales, los registros de desplazamiento pueden ser conectados en cascada. De esta forma el BASIC Stamp es capaz de controlar docenas de salidas de varios 74x595s con las mismas tres líneas de control. Para conectar varios 74x595s en cascada, las líneas de reloj y de latch se conectan juntas y la salida de SQ de una etapa se conecta a la entrada serial de la siguiente. Desafío Conecte un segundo 74x595 al primero de forma que las mismas tres líneas del BASIC Stamp puedan controlar 16 salidas.

Manual StampWorks Versión 1.1 • Página 115



Experimento 24: Expandiendo Entradas

Experimento 24: Expandiendo Entradas Este experimento demuestra la expansión de entradas del BASIC Stamp con un registro de desplazamiento. Tres líneas se usan para leer un DIP-switch de ocho posiciones. Nuevos Elementos/Comandos PBASIC: •

SHIFTIN

Construcción del Circuito (Note que el esquema NO es chip-céntrico)

Manual StampWorks Versión 1.1 • Página 117


Experimento 24: Expandiendo Entradas ' ' ' ' '

========================================================================= Archivo: 74x165.BS2 Lea 8 interruptores usando solamente 3 líneas y un registro de desp. 74x165 =========================================================================

D_in Clock Load

CON CON CON

0 3 4

' desplazam. datos (74x165.7) ' reloj (74x165.2) ' carga de entrada (74x165.1)

switches

VAR

Byte

' interruptores de entrada

' ------------------------------------------------------------------------Inicializar: HIGH Load

' hace salida en estado alto

' ------------------------------------------------------------------------Principal: GOSUB ReadSwitches DEBUG Home, IBIN8 switches PAUSE 100 GOTO Principal END

' lee 8-pos. del dip switch ' muestra en modo binario ' repite

' ------------------------------------------------------------------------ReadSwitches: PULSOUT Load,3 SHIFTIN D_in,Clock,MSBPre,[switches] RETURN

' toma valores interruptores ' desplaza valores

Descripción del Programa El experimento demuestra el uso de SHIFTIN, la función complementaria de SHIFTOUT. En este caso, tres líneas de E/S del BASIC Stamp son usadas para leer el estado de ocho interruptores de entrada. Para leer datos del 74x165, las entradas paralelas son bloqueadas en sus estados mediante un breve pulso en la línea Load, luego se usa SHIFTIN para ingresar los datos al BASIC Stamp.

Página 118 • Manual StampWorks Versión 1.1


Experimento 24: Expandiendo Entradas Note que los DIP-switches tienen resistencias de pull-up a Vdd, así que al ponerlos en posición “ON” se crea una entrada lógica baja al registro de desplazamiento. Usando la salida Q\ (invertida) del 74x165, los datos llegan al BASIC Stamp con un Bit 1 que indica que el interruptor está encendido (en “on”). Desafío Conecte un segundo registro de desplazamiento 74x165 para leer 16 entradas. Vea las hojas de datos del 74HC165 para obtener información de conexionado.

Manual StampWorks Versión 1.1 • Página 119



Experimento 25: Control de un Servo

Experimento 25: Control de un Servo Este experimento demuestra cómo controlar un servo común. Los servos son muy usados en la robótica amateur. Nuevos Elementos/Comandos PBASIC: •

SDEC, SDEC1 – SDEC16 (modificador de DEBUG)

Construcción del Circuito

' ' ' ' ' ' '

========================================================================= Archivo: SERVO.BS2 Controlador de la posición de un Servo {$STAMP BS2} =========================================================================

PotCW

CON

0

' entrada pot sentido horario

Manual StampWorks Versión 1.1 • Página 121


Experimento 25: Control de un Servo PotCCW Servo

CON CON

1 2

' entrada pot sentido anti-horario ' pin control de servo

rcRt rcLf diff sPos

VAR VAR VAR VAR

Word Word Word Word

' ' ' '

lectura rc - derecha lectura rc - izquierda diferencia entre lecturas posición del servo

' ------------------------------------------------------------------------Principal: HIGH PotCW HIGH PotCCW PAUSE 1 RCTIME PotCW,1,rcRt RCTIME PotCCW,1,rcLf

' descarga capacitores ' lee sentido horario ' lee sentido anti-horario

rcRt = rcRt */ $0068 MAX 250 rcLf = rcLf */ $0068 MAX 250 sPos = rcRt - rcLf

' escala RCTIME a 0-250

PULSOUT Servo,(750 + sPos) PAUSE 15

' mueve el servo

' calcula posición (-250 a 250)

GOTO Principal END

Descripción del Programa Los servos son dispositivos electromecánicos especializados usados frecuentemente para posicionar los planos de control de aeromodelos. La posición del engranaje de salida del servo es determinada por el ancho de un pulso de control. El pulso de control normalmente tiene un ancho de entre uno y dos milisegundos. El servo se centrará cuando la señal de control es de 1,5 milisegundos. Para mantener esta posición, el servo debe ser actualizado constantemente. La frecuencia de actualización típica es de aproximadamente 50 veces por segundo. El comando PULSOUT del BASIC Stamp es ideal para controlar los servos. En este experimento, dos circuitos RCTIME se construyen sobre un potenciómetro de 10K. Este circuito y el código pueden ser usados para determinar la posición relativa del potenciómetro. Las lecturas de cada lado del potenciómetro se multiplican por un factor de escala para obtener un rango de 0 a 250 con los operadores */ y MAX. Restando un lado del otro, se obtiene un valor de posición del servo entre–250 y +250.

Página 122 • Manual StampWorks Versión 1.1


Experimento 25: Control de un Servo Este valor se agrega a la posición central de 750. Recuerde que PULSOUT trabaja en unidades de 2 microsegundos, así que un valor de PULSOUT de 750 creará un pulso de 1.5 milisegundos de ancho, haciendo que el servo se centre. Cuando la posición del servo es –250, el valor de PULSOUT es 500, creando un pulso de 1,0 milisegundos. Con un valor sPos de +250, el valor de PULSOUT es 1000, creando un pulso de control de 2,0 milisegundos. Este código demuestra que el BASIC Stamp trabaja con números negativos. Puede ver el valor de

sPos insertando esta línea después del cálculo:

DEBUG Home, "Posición: ", SDEC sPos, "

"

Los números negativos son almacenados con el formato de complemento a dos. El modificador SDEC (decimal con signo) imprime valores decimales con su signo. Desafío Reemplace el potenciómetro con dos fotorresistores y actualice el código para hacer que el servo se centre hacia la fuente de luz más brillante.

Manual StampWorks Versión 1.1 • Página 123



Experimento 26: Motor Paso a Paso

Experimento 26: Motor Paso a Paso Este experimento demuestra el control de un pequeño motor paso a paso unipolar de 12-volt. Los motores paso a paso se usan en dispositivos de posicionamiento de precisión en aplicaciones de control industrial y robótica. Nuevos Elementos/Comandos PBASIC: •

ABS

Construcción del Circuito

Manual StampWorks Versión 1.1 • Página 125


Experimento 26: Motor Paso a Paso

' ' ' ' ' ' '

========================================================================= Archivo: STEPPER.BS2 control de motor paso a paso unipolar {$STAMP BS2} =========================================================================

PotCW PotCCW Coils

CON CON VAR

0 1 OutB

' entrada pot. sentido horario 'entrada pot. sentido anti-horario ' salida a bobinas del paso a paso

speed x sAddr rcRt rcLf diff

VAR VAR VAR VAR VAR VAR

Word Byte Byte Word Word Word

' ' ' ' ' '

retardo entre pasos contador de bucle direcciรณn de EE de datos de paso lectura rc - derecha lectura rc - izquierda diferencia entre lecturas

' ------------------------------------------------------------------------' __ ' ABAB ' ----Step1 DATA %1100 ' A on B on A\ off B\ off Step2 DATA %0110 ' A off B on A\ on B\ off Step3 DATA %0011 ' A off B off A\ on B\ on Step4 DATA %1001 ' A on B off A\ off B\ on ' ------------------------------------------------------------------------Inicializar: DirB = %1111 speed = 5

' config. Pines motor como salidas ' fija velocidad inicial

' ------------------------------------------------------------------------Principal: FOR x = 1 TO 100 GOSUB StepFwd NEXT PAUSE 200 FOR x = 1 TO 100

Pรกgina 126 โ ข Manual StampWorks Versiรณn 1.1

' 1 rev. adelante

' 1 rev. atrรกs


Experimento 26: Motor Paso a Paso GOSUB StepRev NEXT PAUSE 200 StepDemo: HIGH PotCW HIGH PotCCW PAUSE 1 RCTIME PotCW,1,rcRt RCTIME PotCCW,1,rcLf

' descarga capacitores ' lee sentido horario ' lee sentido anti-horario

rcRt = rcRt MAX 600 rcLf = rcLf MAX 600

' fija límites de velocidad

diff = ABS(rcRt - rcLf) IF (diff < 25) THEN StepDemo

' obtiene dif. Entre lecturas ' zona muerta

IF (rcLf > rcRt) THEN StepCCW StepCW: speed = 60 - (rcRt / 10) GOSUB StepFwd GOTO StepDemo

' calcula velocidad ' da un paso

StepCCW: speed = 60 - (rcLf / 10) GOSUB StepRev GOTO StepDemo ' ------------------------------------------------------------------------StepFwd: sAddr = sAddr + 1 // 4 READ (Step1 + sAddr),Coils PAUSE speed RETURN StepRev: sAddr = sAddr + 3 // 4 READ (Step1 + sAddr),Coils PAUSE speed RETURN

' apunta al siguiente paso ' datos de paso de salida ' pausa entre pasos

' apunta al paso anterior

Manual StampWorks Versión 1.1 • Página 127


Experimento 26: Motor Paso a Paso Descripción del Programa Los motores paso a paso se diferencian de los motores de CC en que no giran libremente cuando se les aplica la alimentación. Para que un motor paso a paso gire, la alimentación debe pulsarse continuamente en un patrón específico. La secuencia de pasos (patrón) determina el sentido de rotación del motor paso a paso. El tiempo entre pasos determina la velocidad de giro. Cada paso hace que el motor paso a paso gire un incremento angular fijo predefinido. El motor suministrado con el kit de StampWorks rota 3,6 grados por paso. Esto significa que para lograr un giro completo (360 grados) se requieren 100 pasos. Las secuencias de pasos para el motor se almacenan en instrucciones DATA. La subrutina StepFwd leerá de la tabla, la siguiente secuencia a ser aplicada a las bobinas. La subrutina StepRev es idéntica excepto en que leerá el paso anterior. Note el truco con el operador módulo (//) usado en StepRev. Agregando el valor máximo de la secuencia al valor actual y luego aplicando el operador módulo, la secuencia va a la inversa. Esta el la matemática involucrada: 0 3 2 1

+ + + +

3 3 3 3

// // // //

4 4 4 4

= = = =

3 2 1 0

Este experimento lee ambos lados del potenciómetro de 10K para determinar su posición relativa. El valor diferencial entre las dos lecturas se mantiene positivo mediante el uso de la función ABS. La posición es usada para determinar la dirección de giro y la magnitud es la que define la velocidad angular. Recuerde, a menor pausa entre pasos, mayor es la velocidad de giro. Una zona muerta es usada para hacer que el motor deje de girar cuando las lecturas de RCTIME son muy parecidas. Desafío Rescriba el programa para hacer girar el motor en 200 medios pasos. Esta es la secuencia para lograr pasos intermedios: Step1 = %1000 Step2 = %1100 Step3 = %0100 Step4 = %0110 Step5 = %0010 Step6 = %0011 Step7 = %0001 Step8 = %1001

Página 128 • Manual StampWorks Versión 1.1


Experimento 27: Medición de Tensión

Experimento 27: Medición de Tensión Este experimento demuestra el uso de un conversor analógico-digital para leer una entrada de tensión variable. Construcción del Circuito (Note que el esquema NO es chip-céntrico)

' ' ' ' '

========================================================================= Archivo: ADC0831.BS2 Leer tensión en el cursor del potenciómetro con un ADC-0831 =========================================================================

ADdata ADclock ADcs

CON CON CON

0 1 2

' línea de datos A/D ' reloj A/D ' chip select A/D (act. bajo)

result mVolts

VAR VAR

Byte Word

' resultado de conversión ' convierte a milivolts

' ------------------------------------------------------------------------Inicializar: HIGH ADcs ' -------------------------------------------------------------------------

Manual StampWorks Versión 1.1 • Página 129


Experimento 27: Mediciรณn de Tensiรณn Principal: GOSUB Read0831 volts = result */ $139C

' x 19.6 (mv / unidad)

DEBUG Home DEBUG "ADC..... ", DEC result, " ", CR DEBUG "volts... ", DEC mVolts DIG 3, ".", DEC3 mVolts PAUSE 100 GOTO Principal END

' pausa entre lecturas ' repite

' ------------------------------------------------------------------------Read0831: LOW ADcs SHIFTIN Addata,ADclock,MSBPost,[result\9] HIGH ADcs RETURN

Pรกgina 130 โ ข Manual StampWorks Versiรณn 1.1


Experimento 27: Medición de Tensión Descripción del Programa Proyectos anteriores usaban RCTIME para leer componentes resistivos. Esto sirve para ingresar valores analógicos, pero no sirve para leer tensiones. Para medir tensiones el BASIC Stamp la ayuda de un dispositivo externo. La forma más simple de medir una tensión variable es con un conversor analógico-digital. En este experimento, el National Semiconductor ADC0831 es usado para convertir una tensión (0 – 5) en una señal serial sincrónica que puede ser leída por el BASIC Stamp con SHIFTIN. El ADC0831 requiere nueve bits para obtener el resultado. Este no es un problema para el BASIC Stamp debido a que la función SHIFTIN permite especificar la cantidad de bits que serán desplazados. El resultado de 8 bits será de cero (cero volts) a 255 (cinco volts). Dividiendo 5 (volts) por 255, obtenemos que cada bit en el resultado es igual a 19,6 milivolts. Para mostrar el resultado, convertimos el valor obtenido en milivolts multiplicándolo por 19,6 (result */ $139C). Se usa un truco interesante con DEBUG para mostrar la variable mVolts. La operación “DIG 3“ imprime el valor entero y el modificador DEC3 la parte fraccionaria. Desafío Conecte la salida del Experimento 22 (Pin 1 del LM358) a la entrada del ADC0831. Escriba un programa que cree una tensión usando PWM y lea el valor resultante con el ADC0831.

Manual StampWorks Versión 1.1 • Página 131



Experimento 28: Medición de Temperatura

Experimento 28: Medición de Temperatura Este experimento demuestra el uso de un sensor de temperatura digital. La medición de temperatura es un componente esencial en aplicaciones de control ambiental (calefacción y aire acondicionado). Construcción del Circuito (Note que el esquema NO es chip-céntrico)

' ' ' ' '

========================================================================= Archivo: DS1620.BS2 Lee la temperatura con un Dallas Semiconductor DS1620 =========================================================================

DQ Clock Reset

CON CON CON

0 1 2

' DS1620.1 (E/S de datos) ' DS1620.2 ' DS1620.3

RdTmp WrHi WrLo RdHi RdLo StartC StopC WrCfg RdCfg

CON CON CON CON CON CON CON CON CON

$AA $01 $02 $A1 $A2 $EE $22 $0C $AC

' ' ' ' ' ' ' ' '

tempIn

VAR

Word

' temperatura directa

lee temperatura escribe TH (Temp. alta) escribe TL (Temp. baja) lee TH lee TL inicia conversión detiene conversión escribe registro config. lee registro config.

Manual StampWorks Versión 1.1 • Página 133


Experimento 28: Mediciรณn de Temperatura sign tSign tempC tempF

VAR VAR VAR VAR

tempIn.Bit8 Bit Word Word

' 1 = temperatura negativa ' Celsius ' Fahrenheit

' ------------------------------------------------------------------------Inicializar: GOSUB DS1620init

' inicializa el DS1620

' ------------------------------------------------------------------------Principal: GOSUB GetTemperature DEBUG DEBUG DEBUG DEBUG DEBUG

Home "DS1620",CR "------",CR SDEC tempC," C SDEC tempF," F

' lee el DS1620

",CR ",CR

PAUSE 1000 GOTO Principal END

' pausa entre lecturas

' ------------------------------------------------------------------------DS1620init: HIGH Reset SHIFTOUT DQ,Clock,LSBFirst,[WrCfg,%10] LOW Reset PAUSE 10 HIGH Reset SHIFTOUT DQ,Clock,LSBFirst,[StartC] LOW Reset RETURN GetTemperature: HIGH Reset SHIFTOUT DQ,Clock,LSBFIRST,[RdTmp] SHIFTIN DQ,Clock,LSBPRE,[tempIn\9] LOW Reset

Pรกgina 134 โ ข Manual StampWorks Versiรณn 1.1

' activa el DS1620 ' use con CPU; func. Continuo

' inicia conversiones

' ' ' '

activa el DS1620 entrega comando leer Temp.. la lee libera al DS1620


Experimento 28: Medición de Temperatura tSign = sign tempIn = tempIn/2 IF tSign = 0 THEN NoNeg1 tempIn = tempIn | $FF00

' guarda el bit de signo ' redondea a grados enteros ' extiende bits de signo en neg.

NoNeg1: tempC = tempIn tempIn = tempIn */ $01CC IF tSign = 0 THEN NoNeg2 tempIn = tempIn | $FF00

' guarda valor Celsius ' multiplica por 1.8 ' si negativo, extiende bits signo

NoNeg2: tempIn = tempIn + 32 tempF = tempIn RETURN

' finaliza conversión C -> F ' guarda valor Fahrenheit

Descripción del Programa El órgano más grande del cuerpo humano es la piel y es el más rápidamente afectado por la temperatura. Esta es la razón por la que se pone tanto esfuerzo en los sistemas de control ambiental (calefacción y aire acondicionado). Este experimento usa el tremostato/termómetro digital Dallas Semiconductor DS1620. Este chip mide la temperatura y la pone a disponibilidad del BASIC Stamp mediante una interfaz serial sincrónica. El DS1620 es un dispositivo inteligente y una vez programado, es capaz de operar autónomamente con termostato usando las salidas T(com), T(hi) y T(lo). El DS1620 debe ser inicializado antes de usarse. En aplicaciones activas como ésta, el DS1620 es configurado para funcionar en modo continuo con una CPU. Luego de enviar los datos de configuración al DS1620, se necesita un retardo de 10 milisegundos para que la configuración sea escrita en la EEPROM interna del DS1620. Luego del retardo, el DS1620 es instruido para comenzar las conversiones continuas. Esto asegurará una lectura de la temperatura actual cuando el BASIC Stamp la solicite. Para obtener el valor de la temperatura actual, el byte de comando Read Temperature (Leer Temperatura=$AA) es enviado al DS1620. Luego se puede leer el último valor de temperatura obtenido. El dato obtenido tiene una extensión de nueve bits. El bit 8 indica el signo de la temperatura. Si es negativo (el bit de signo es 1), los 8 bits restantes almacenan el valor del complemento a dos de la temperatura. Tanto en valores positivos o negativos, cada bit de temperatura es igual a 0,5 grados Celsius (centígrados).

Manual StampWorks Versión 1.1 • Página 135


Experimento 28: Medición de Temperatura La temperatura en Celsius se calcula dividiendo por dos el valor obtenido del sensor. Si es negativo, los bits del byte superior se ponen en 1 para que los números mantengan su signo con SDEC (los números con signo en el BASIC Stamp deben tener una longitud de 16 bits). La temperatura es convertida a Fahrenheit usando la fórmula: F = (C * 1.8) + 32 Desafío Rescriba el programa para que muestre los valores de temperatura en el módulo LCD del StampWorks.

Página 136 • Manual StampWorks Versión 1.1


Experimento 29: Multiplexado de 7 Segmentos

Experimento 29: Multiplexado de 7 Segmentos Este experimento demuestra el uso de displays de 7 segmentos con un multiplexor externo. Displays de 7 segmentos de varios dígitos son usados frecuentemente en máquinas expendedoras para mostrar la cantidad de dinero ingresada. Construcción del Circuito (Note que el esquema NO es chip-céntrico)

Manual StampWorks Versión 1.1 • Página 137


Experimento 29: Multiplexado de 7 Segmentos

Pรกgina 138 โ ข Manual StampWorks Versiรณn 1.1


Experimento 29: Multiplexado de 7 Segmentos ' ' ' ' ' ' '

========================================================================= Archivo: CHNGCNTR.BS2 Cuenta monedas de 1, 5 ,10 y 25 centavos y muestra el total en cuatro displays de 7 segmentos. Se usa un MAX7219 para controlar el el multiplexado. =========================================================================

Dpin Clock Load Coins

CON CON CON VAR

7 6 5 InL

' ' ' '

pin de datos(MAX7219.1) pin de reloj(MAX7219.13) pin de carga(MAX7219.12) entradas de monedas

Decode Brite Scan ShutDn Test DecPnt Blank

CON CON CON CON CON CON CON

$09 $0A $0B $0C $0F %10000000 %1111

' ' ' ' '

decodificador bcd registro de intensidad reg. De límite de búsqueda registro de apagado (1 = enc.) modo de prueba de display

Yes No

CON CON

1 0

money deposit penny nickel dime quarter dollar digit d7219 index idxOdd

VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR

Word Byte deposit.Bit0 deposit.Bit1 deposit.Bit2 deposit.Bit3 deposit.Bit4 Nib Byte Nib index.Bit0

' limpia un dígito

' Contador de dinero ' monedas depositadas ' bits de valores

' ' ' '

muestra dígito datos para el MAX7219 contador de bucle es impar el índice? (1 = si)

' ------------------------------------------------------------------------' Segmentos ' Full DATA DATA DATA DATA

.abcdefg -------%01000111 %00111110 %00001110 %00001110

' ' ' '

F U L L

Manual StampWorks Versión 1.1 • Página 139


Experimento 29: Multiplexado de 7 Segmentos

' ------------------------------------------------------------------------Inicializar: DirL = %11100000

' salidas al 7219 ' monedas como entradas

FOR index = 0 TO 7 LOOKUP index,[Scan,3,Brite,3,Decode,$0F,ShutDn,1],d7219 SHIFTOUT Dpin,Clock,MSBFirst,[d7219] IF idxOdd = No THEN NoLoad PULSOUT Load,3 ' carga parรกmetro NoLoad: NEXT GOSUB ShowTheMoney ' ------------------------------------------------------------------------Principal: GOSUB GetCoins IF deposit = 0 THEN Principal money money money money money

= = = = =

money money money money money

+ + + + +

(penny * 1) (nickel * 5) (dime * 10) (quarter * 25) (dollar * 100)

GOSUB ShowTheMoney PAUSE 100 GOTO Principal END

' espera monedas ' suma monedas

' actualiza el display

' ------------------------------------------------------------------------GetCoins: deposit = %00011111 FOR index = 1 TO 10 deposit = deposit & ~Coins PAUSE 5 NEXT RETURN

Pรกgina 140 โ ข Manual StampWorks Versiรณn 1.1

' habilita todas las entradas ' controla entradas ' retardo entre controles


Experimento 29: Multiplexado de 7 Segmentos

ShowTheMoney: IF (money >= 9999) THEN ShowFull FOR index = 4 TO 1 d7219 = Blank IF (index = 4) AND (money < 1000) THEN PutDigit d7219 = money DIG (index - 1) IF (index <> 3) THEN PutDigit d7219 = d7219 | DecPnt ' punto decimal en DIGIT 3 PutDigit: SHIFTOUT Dpin,Clock,MSBFirst,[index,d7219] PULSOUT Load,3 NEXT RETURN ShowFull: SHIFTOUT Dpin,CLOCK,MSBFIRST,[Decode,0] ' apaga decodif. BCD PULSOUT Load,1 FOR index = 4 TO 1 READ (4 – index + Full),d7219 ' lee y envía una letra SHIFTOUT Dpin,Clock,MSBFirst,[index,d7219] PULSOUT Load,3 NEXT

Descripción del Programa Multiplexar varios displays de 7 segmentos requiere un gran esfuerzo y la mayoría de los recursos de cómputo del BASIC Stamp. Usando el multiplexor MAXIM MAX7219 solamente son necesarios tres líneas de E/S del BASIC Stamp. El MAX7219 puede ser usado para controlar hasta ocho displays de 7 segmentos, o 64 LEDs sueltos (cuatro veces la cantidad de pines de E/S disponibles en el BASIC Stamp). El MAX7219 se conecta a los displays de LEDs en una forma directa; los pines SEG A hasta SEG G y SEG DP se conectan a los segmentos A hasta G y el punto decimal de todos los displays de cátodo común. Los pines DIGIT 0 hasta DIGIT 7 se conectan individualmente a los cátodos de cada uno de los displays. Si usa menos de ocho dígitos, omita los números superiores. Por ejemplo, este experimento usa cuatro dígitos, numerados de 0 a 3, no de 4 a 7.

Manual StampWorks Versión 1.1 • Página 141


Experimento 29: Multiplexado de 7 Segmentos El MAX7219 tiene una característica que limita el barrido de displays a los dígitos 0 a n, donde n es el número de dígito más alto. Esto hace que el chip no pierda tiempo y ciclos de trabajo (perdiendo brillo) tratando de componer dígitos inexistentes. Cuando el MAX7219 es usado con displays de 7 segmentos, puede ser configurado para convertir automáticamente valores decimales codificados en binario (BCD) en patrones apropiados de segmentos. Esto hace que mostrar números decimales sea muy simple. La característica de decodificación BCD puede deshabilitarse para mostrar caracteres personalizados. Este experimento hace las dos cosas. Desde el punto de vista del software, para manejar el MAX7219 se requiere que el controlador: Desplace 16 bits de datos al dispositivo, primero el más significativo (MSB). Emita un pulso en la línea Load para transferir los datos. Cada paquete de datos de 16-bits consiste en una dirección de registro seguida por los datos a almacenar en ese registro. Por ejemplo, el valor de 16-bits $0407 (hexadecimal) escribe un “7” en el cuarto dígito del display. Si se enciende el decodificador BCD para ese dígito, el número “7” aparecerá en el display. Si no se enciende la decodificación, se encenderán tres LEDs, correspondientes a los segmentos G, F y E. En este experimento, el MAX7219 se inicializa para: Scan = 3 (Muestra dígitos 0 – 3) Brightness = 5 (Brillo) Decode = $0F (decodificación BCD 0 – 3) Shutdown = 1 (operación normal) La inicialización del MAX7219 es realizada en un bucle. En cada pasada lee una dirección de registro o valor de datos de la tabla LOOKUP. Después de que cada valor es enviado, la dirección y el dato son bloqueados en el MAX7219 mediante un pulso en la línea Load. La mayoría del trabajo tiene lugar en la subrutina llamada ShowTheMoney. Cuando la cantidad de dinero es menor que 9999, el valor será mostrado en los dígitos de 7 segmentos, caso contrario la pantalla mostrará el mensaje “FULL” (lleno). La rutina examina cada dígito del dinero y envía la posición y el valor (con el operador DIG) al MAX7219. Dado que el display muestra dólares y centavos, se habilita el punto decimal en el tercer dígito. Cuando el dígito y la posición han sido enviados, el display se actualiza enviando un pulso en la línea Load. Para mantener la pantalla prolija, el primer cero se elimina cuando el valor del dinero es menor que 1000.

Página 142 • Manual StampWorks Versión 1.1


Experimento 29: Multiplexado de 7 Segmentos

Cuando el dinero llega a 9999, el display mostrará “FULL.” Esto se logra deshabilitando el modo de decodificación BCD del MAX7219 y enviando patrones de letras personalizados al MAX7219. Estos patrones se almacenan en instrucciones DATA. El bucle principal del programa es simple: controla si se presiona algún botón con GetCoins y actualiza los contadores de cada moneda cada vez que se presiona un botón. Este código en particular es un ejemplo excelente del uso de sobrenombres o alias para las variable para mejorar la claridad del programa. Desafío Modifique el código del Experimento 27 para que muestre la tensión de entrada en los displays de 7 segmentos.

Manual StampWorks Versión 1.1 • Página 143



Experimento 30: Reloj de Tiempo Real

Experimento 30: Reloj de Tiempo Real Este experimento demuestra la capacidad de las funciones temporales del BASIC Stamp mediante el uso de un reloj de tiempo real externo (RTC). La capacidad de temporización RTC es crucial para aplicaciones que dependen de la hora del día o aquellas que deben medir el tiempo transcurrido. Construcción del Circuito (Note que el esquema NO es chip-céntrico)

' ' ' ' ' '

========================================================================= Archivo: DS1302.BS2 Este programa demuestra las funciones temporales básicas usando el DS1302 de Dallas Semiconductor. =========================================================================

Dio Clock CS_1302 BtnsIn

CON CON CON VAR

0 1 2 InB

' ' ' '

DS1302.6 DS1302.7 DS1302.5 entrada de pulsadores

Manual StampWorks Versión 1.1 • Página 145


Experimento 30: Reloj de Tiempo Real WrSecs RdSecs WrMins RdMins WrHrs RdHrs CWPr WPr1 WPr0 WrBurst RdBurst WrRam RdRam

CON CON CON CON CON CON CON CON CON CON CON CON CON

$80 $81 $82 $83 $84 $85 $8E $80 $00 $BE $BF $C0 $C1

Yes No

CON CON

1 0

Hr24 Hr12

CON CON

0 1

ClockMode

CON

Hr12

' usa modo AM/PM

index reg ioByte

VAR VAR VAR

Byte Byte Byte

' contador de bucle ' dirección DS1302 para leer/esc. ' datos hacia/desde el DS1302

secs secs01 secs10 mins mins01 mins10 hrs hrs01 hrs10 day

VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR

Byte secs.LowNib secs.HighNib Byte mins.LowNib mins.HighNib Byte hrs.LowNib hrs.HighNib Byte

' segundos

ampm tMode

VAR VAR

hrs.Bit5 hrs.Bit7

' 0 = AM, 1 = PM ' 0 = 24, 1 = 12

rawTime work oldSecs apChar

VAR VAR VAR VAR

Word Byte Byte Byte

' ' ' '

Página 146 • Manual StampWorks Versión 1.1

' ' ' ' ' ' ' ' ' ' ' '

escribe segundos lee segundos escribe minutos lee minutos escribe horas lee horas reg. de protección de escritura activa protec. de escritura desactiva protec. de escritura escribe tren de datos tren de datos control de direcciones de RAM

' minutos ' horas ' día

valores temporales directos variable para mostrar salida valor de segundos anterior "A" o "P"


Experimento 30: Reloj de Tiempo Real

btns btnMin btnHrs btnDay btnBack

VAR VAR VAR VAR VAR

Nib btns.Bit0 btns.Bit1 btns.Bit2 btns.Bit3

' ' ' ' '

botones entradas actualiza minutos actualiza horas actualiza día hacia atrás

' ------------------------------------------------------------------------Su Mo Tu We Th Fr Sa

DATA DATA DATA DATA DATA DATA DATA

"Domingo", 0 "Lunes", 0 "Martes", 0 "Miercoles", 0 "Jueves", 0 "Viernes", 0 "Sabado", 0

' ------------------------------------------------------------------------Inicializar: DirL = %00000111

' interrup. entradas

reg = CWPr ioByte = WPr0 GOSUB RTC_out

' deshabilita protec. de escritura

oldSecs = $99 hrs = $06 GOSUB SetTime

' habilita la bandera display ' fija hora del DS3102 a 6:00 AM

' -------------------------------------------------------------------------Main1: GOSUB GetTime IF secs = oldSecs THEN CheckButtons Main2: GOSUB ShowTime oldSecs = secs CheckButtons: GOSUB GetButtons IF btns = 0 THEN DoSomeTask IF btnBack = Yes THEN GoBack

' lee el DS1302 ' tiempo para actualizar? ' si, lo muestra ' lo marca

' permite al BS hacer otro trabajo ' botón hacia atrás presionado?

Manual StampWorks Versión 1.1 • Página 147


Experimento 30: Reloj de Tiempo Real

Adelante: rawTime = rawTime + btnMin rawTime = rawTime + (btnHrs * 60) day = (day + btnDay) // 7 GOTO UpdateClock GoBack: IF (btns <= %1000) THEN DoSomeTask rawTime = rawTime + (btnMin * 1439) rawTime = rawTime + (btnHrs * 1380) day = (day + (btnDay * 6)) // 7

' agrega un minuto ' agrega una hora ' día siguiente

' ' ' '

no se presiona botón actualizar resta un minuto resta una hora día anterior

UpdateClock: rawTime = rawTime // 1440 GOSUB SetRawTime GOTO Main2

' envía valor actualiz. al DS1302 ' limpia modos de tiempo ' conf. Reloj para tiempo directo

DoSomeTask:

' trabaja cuando no usa el reloj

' otro código aquí GOTO Main1 END ' ------------------------------------------------------------------------ShowTime: DEBUG Home LOOKUP day,[Su,Mo,Tu,We,Th,Fr,Sa],work ' obtiene dirección de día GetDayChar: READ work,ioByte ' obtiene un caracter IF ioByte = 0 THEN CheckClockMode ' si 0, día terminado DEBUG ioByte ' imprime el caracter work = work + 1 ' apunta al siguiente GOTO GetDayChar CheckClockMode: DEBUG " ", CR ' limpia restos de día anterior IF (ClockMode = Hr24) THEN Show24 Show12: DEBUG DEC2 12 - (24 - (hrs10 * 10 + hrs01) // 12) DEBUG ":", HEX2 mins, ":", HEX2 secs apChar = "A" ' asume AM IF (hrs < $12) THEN ShowAMPM ' controla el tiempo

Página 148 • Manual StampWorks Versión 1.1


Experimento 30: Reloj de Tiempo Real apChar = "P" ' hrs >= $12 ShowAMPM: DEBUG " ", apChar, "M" ' imprime AM o PM GOTO ShowTimeDone Show24: DEBUG HEX2 hrs, ":", HEX2 mins, ":", HEX2 secs ShowTimeDone: RETURN GetButtons: btns = %1111 FOR index = 1 TO 10 btns = btns & ~BtnsIn PAUSE 5 NEXT PAUSE 200 RETURN

' habilita todas las entradas ' controla botones ' pausa entre controles

RTC_out: HIGH CS_1302 SHIFTOUT Dio,Clock,LSBFirst,[reg,ioByte] LOW CS_1302 RETURN

' envía ioByte al reg. en DS1302

RTC_in: HIGH CS_1302 SHIFTOUT Dio,Clock,LSBFirst,[reg] SHIFTIN Dio,Clock,LSBPre,[ioByte] LOW CS_1302 RETURN

' lee ioByte del reg. del DS1302

SetRawTime: hrs10 = rawTime / 600 hrs01 = rawTime // 600 / 60 mins10 = rawTime // 60 / 10 mins01 = rawTime // 10

' convierte rawTime a BCD

SetTime: HIGH CS_1302

' escribe datos en modo burst

Manual StampWorks Versión 1.1 • Página 149


Experimento 30: Reloj de Tiempo Real SHIFTOUT Dio,Clock,LSBFirst,[WrBurst] SHIFTOUT Dio,Clock,LSBFirst,[secs,mins,hrs,0,0,day,0,0] LOW CS_1302 RETURN GetTime: ' lee datos en modo burst HIGH CS_1302 SHIFTOUT Dio,Clock,LSBFirst,[RdBurst] SHIFTIN Dio,Clock,LSBPre,[secs,mins,hrs,day,day,day] LOW CS_1302 rawTime = ((hrs10 & %11) * 600) + (hrs01 * 60) rawTime = rawTime + (mins10 * 10) + mins01 RETURN

Descripción del Programa Si bien es posible implementar funciones temporales rudimentarias con PAUSE, se encuentran inconvenientes cuando el BASIC Stamp debe supervisar otras actividades. Esto es especialmente cierto cuando la aplicación debe llevar registro de la hora y la fecha. La solución más limpia es usar un reloj de tiempo real externo. En este experimento, usamos el Dallas Semiconductor DS1302. Como el DS1620, el DS1302 requiere solamente tres líneas para comunicarse con el BASIC Stamp. Dado que los dos dispositivos son compatibles, el reloj y las líneas de datos pueden ser compartidas pudiendo el BASIC Stamp realizar mediciones de temperatura y tiempo usando solamente cuatro pines de E/S.

Página 150 • Manual StampWorks Versión 1.1


Experimento 30: Reloj de Tiempo Real

Una vez programado, el DS1302 funciona por su cuenta y mantiene registro preciso de segundos, minutos, horas (con un indicador AM/PM, si funciona en modo 12-horas), día del mes, mes, día de la semana y año con compensación de bisiestos hasta el año 2100. Como extra, el DS1302 contiene 31 bytes de RAM que podemos usar como queramos. Y para proyectos que usan la alimentación principal, el DS1302 también tiene un circuito de carga que mantiene cargada una batería de respaldo. El DS1302 es un dispositivo basado en registros, lo que quiere decir que cada elemento de tiempo y fecha es almacenado en su propio registro (dirección de memoria). Por conveniencia, están disponibles dos modos de lectura y escritura: registro y completo. Con el acceso a registros, se pueden leer o escribir elementos individuales. Con el acceso completo, se pueden escribir o leer todos los registros de una sola vez (comenzando con los segundos). Para mantener nuestra conexión con el DS1302 simple, este experimento solamente usa el modo 24horas. En este modo, no necesitamos trabajar con el bit indicador AM/PM del DS1302. Para mostrar la hora en el formato de 12-horas, calcularemos AM/PM matemáticamente. En el código, la hora es manejada como una única variable tamaño word (rawTime) que representa el número de minutos pasada la medianoche. De esta forma se pueden realizar cálculos de duraciones y comparar tiempos de alarmas con la hora actual en forma directa. Otra buena razón para usar el formato de tiempo directo es que el DS1302 almacena sus registros en formato BCD (decimal codificado en binario). BCD es un método para almacenar un valor entre cero y 99 en una variable de un byte. Las unidades ocupan la nibble inferior(cuatro bits), las decenas la superior. Ninguna nibble de un byte BCD puede tener un valor mayor que 9. Por suerte el BASIC Stamp trabaja con variables tamaño nibble y más importante aún, permite poner sobrenombres a las variables. Este experimento demuestra lo básico del DS1302 configurando el reloj y luego actualizándolo. Las conversiones del registro de formato BCD hacia y desde el DS1320 son realizadas por las subrutinas que envían y reciben datos en el modo burst (completo). Se usan cuatro pulsadores para fijar el día, horas y minutos del reloj. Normalmente, los botones incrementan cada valor. Manteniendo presionado el cuarto botón, cada elemento correrá hacia atrás. Mientras no se presiona ningún botón, el programa pasa a una subrutina llamada DoSomeTask. Este es el sector donde podría poner código adicional (leer un DS1620, por ejemplo). La salida del programa es mediante una ventana DEBUG. La subrutina ShowTime se encarga de imprimir el día y la hora en el formato especificado por ClockMode.

Manual StampWorks Versión 1.1 • Página 151


Experimento 30: Reloj de Tiempo Real Desafío (Avanzado) Agregue un DS1620 usando las conexiones que se muestran abajo. Escriba un programa que registre la temperatura actual, la mínima y la máxima y que muestre (use DEBUG) la hora y la fecha en que se tomaron estas temperaturas.

Página 152 • Manual StampWorks Versión 1.1


Experimento 31: Comunicaciones Seriales

Experimento 31: Comunicaciones Seriales Este experimento demuestra la capacidad del BASIC Stamp de comunicarse con otras computadoras a través de cualquiera de sus pines de E/S. También demuestra la capacidad de almacenar información en la EEPROM del BASIC Stamp. Nuevos Elementos/Comandos PBASIC: • • • • • •

SERIN SEROUT WAIT (modificador de SERIN) HEX (modificador de SERIN/SEROUT) BIN (modificador de SERIN/SEROUT) WRITE

Construcción del Circuito (Note que el esquema NO es chip-céntrico)

Manual StampWorks Versión 1.1 • Página 153


Experimento 31: Comunicaciones Seriales ' ' ' ' ' ' '

========================================================================= Archivo: POLLSTMP.BS2 Se comunica e intercambia información con el BASIC Stamp vía conexión RS-232 {$STAMP BS2} =========================================================================

LEDs DQ Clock Reset

VAR CON CON CON

OutA 4 5 6

' ' ' '

RxD TxD

CON CON

14 15

' entrada serial - a INEX RxD ' salida serial - a INEX TxD

Baud96

CON

84

' 9600-8-N-1 (compatible DEBUG)

CMenu CID CSet CTmp CTmpC CTmpF CStat CLEDs

CON CON CON CON CON CON CON CON

$FF $F0 $F1 $A0 $A1 $A2 $B0 $B1

' ' ' ' ' ' ' '

muestra menu de comandos obtiene ID de cadena fija ID de cadena DS1620 - display valor directo DS1620 - display en C DS1620 - display en F estado de salida digital config. LEDs salidas

RTmp WTHi WTLo RTHi RTLo StartC StopC WrCfg RdCfg

CON CON CON CON CON CON CON CON CON

$AA $01 $02 $A1 $A2 $EE $22 $0C $AC

' ' ' ' ' ' ' ' '

lee temperatura escribe TH (reg. Temp. alta) escribe TL (reg. Temp. baja) lee TH lee TL inicia conversión detiene conversión escribe reg. configuración lee reg. configuración

cmd eeAddr eeData param char tmpIn halfBit

VAR VAR VAR VAR VAR VAR VAR

Byte Byte Byte Word param.LowByte Word tmpIn.Bit0

' ' ' ' ' ' '

comando de la PC puntero de dirección EE dato EE parámetro desde la PC caracter de la terminal valor directo del DS1620 indicador de 0,5 grados C

Página 154 • Manual StampWorks Versión 1.1

salidas LED DS1620.1 (a través de 1K) DS1620.2 DS1620.3


Experimento 31: Comunicaciones Seriales sign tempC tempF potVal buttons

VAR VAR VAR VAR VAR

tmpIn.Bit8 Word Word Word Nib

' ' ' ' '

1 = temperatura negativa grados C en décimas F en décimas lectura de BSAC botones de entrada

' ------------------------------------------------------------------------ID

DATA "Parallax",CR

' cadena terminada en CR

' ------------------------------------------------------------------------Inicializar: DirA = %1111 GOSUB DS1620init

' hace salidas los LEDs ' inicializa el DS1620

GOTO ShowMenu ' ------------------------------------------------------------------------Principal: cmd = 0 SERIN RxD,Baud96,[WAIT ("?"),HEX cmd] ' espera pedido del menu IF cmd = CMenu THEN ShowMenu ' convierte el comando para saltar LOOKDOWN cmd,[CID,CSet,CTmp,CTmpC,CTmpF,CStat,CLEDs],cmd BRANCH cmd,[ShowID,SetID,ShowTemp,ShowTempC,ShowTempF,ShowStat,SetLEDs] BadCommand: SEROUT TxD,Baud96,["Comando inválido: ",HEX2 cmd,CR] GOTO Principal END ' ------------------------------------------------------------------------DS1620init: HIGH Reset SHIFTOUT DQ,Clock,LSBFirst,[WrCfg,%10] LOW Reset PAUSE 10 HIGH Reset

' activa el DS1620 ' usa con CPU; modo continuo

Manual StampWorks Versión 1.1 • Página 155


Experimento 31: Comunicaciones Seriales SHIFTOUT DQ,Clock,LSBFirst,[StartC] LOW Reset RETURN

' inicia conversiones

ShowMenu: SEROUT TxD,Baud96,[CLS] SEROUT TxD,Baud96,["========================",CR] SEROUT TxD,Baud96,[" StampWorks Monitor ",CR] SEROUT TxD,Baud96,["========================",CR] SEROUT TxD,Baud96,["?FF – Ver Menú",CR] SEROUT TxD,Baud96,["?F0 - Mostrar ID",CR] SEROUT TxD,Baud96,["?F1 - Fijar ID",CR] SEROUT TxD,Baud96,["?A0 - DS1620 (directo)",CR] SEROUT TxD,Baud96,["?A1 - Temperatura (C)",CR] SEROUT TxD,Baud96,["?A2 - Temperatura (F)",CR] SEROUT TxD,Baud96,["?B0 – Estado de LEDs",CR] SEROUT TxD,Baud96,["?B1 - Activa LEDs",CR,CR] SEROUT TxD,Baud96,["Ingrese un comando.",CR,CR] GOTO Principal ShowID: SEROUT TxD,Baud96,["ID="] eeAddr = ID GetEE: READ eeAddr,eeData SEROUT TxD,Baud96,[eeData] eeAddr = eeAddr + 1 IF (eeData <> CR) THEN GetEE GOTO Principal SetID: eeAddr = ID GetC: SERIN RxD,Baud96,[char] WRITE eeAddr,char eeAddr = eeAddr + 1 IF (char <> CR) THEN GetC GOTO ShowID

Página 156 • Manual StampWorks Versión 1.1

' etiqueta o rótulo ' puntero al primer caracter de ID ' ' ' '

lee caracter de EEPROM imprime caracter apunta al siguiente si no CR, lee otro

' apunta a ubicación ID ' ' ' ' '

obtiene caracter de PC escribe caracter en EEPROM apunta a siguiente ubicación si no CR, espera otro confirma nueva ID


Experimento 31: Comunicaciones Seriales ShowTemp: GOSUB GetTemp ' envía valor directo a la PC SEROUT TxD,Baud96,["DS1620=",DEC tmpIn,CR] GOTO Principal ShowTempC: GOSUB GetTemp IF sign = 0 THEN NoNegC tmpIn = 0 ' solo Temp. por encima de cero NoNegC: tempC = tmpIn * 5 ' conv. val. direc. en décimas C SEROUT TxD,Baud96,["TempC=",DEC (tempC/10),".",DEC (tempC//10),CR] GOTO Principal ShowTempF: GOSUB GetTemp IF sign = 0 THEN NoNegF tmpIn = 0 NoNegF: tempF = (tmpIn * 9) + 320 ' conv. val en décimas de F SEROUT TxD,Baud96,["TempF=",DEC (tempF/10),".",DEC (tempF//10),CR] GOTO Principal ShowStat: SEROUT TxD,Baud96,["Estado=", BIN4 LEDs, CR] GOTO Principal SetLEDs: ' espera bits de salida ' – como cadena binaria ' SERIN RxD,Baud96,[BIN param] LEDs = param.LowNib GOTO ShowStat

' configura salidas ' confirma nuevas salidas

GetTemp: HIGH Reset SHIFTOUT DQ,Clock,LSBFirst,[RTmp]

' activa el DS1620 ' lee la temperatura

Manual StampWorks Versión 1.1 • Página 157


Experimento 31: Comunicaciones Seriales SHIFTIN DQ,Clock,LSBPre,[tmpIn\9] LOW Reset RETURN

' obtiene la temperatura

Descripción del Programa Sin comunicación serial asincrónica el mundo no sería lo que es hoy. No habría cajeros automáticos para controlar el estado de nuestras cuentas y retirar fondos. No podría haber Internet. Los experimentos anteriores han usado comunicación serial sincrónica. En ese esquema, se necesitaban dos líneas: reloj y datos. El beneficio es la sincronización automática del transmisor y receptor. El precio que pagamos es que se necesitan al menos dos cables para enviar un mensaje. La comunicación serial asincrónica solamente necesita un cable para transmitir un mensaje. En este caso es necesario que el emisor y el receptor estén de acuerdo en la velocidad de la comunicación antes de iniciar la transmisión de datos. Algunos sistemas “inteligentes” pueden detectar la velocidad de la comunicación (baud rate), pero el BASIC Stamp no puede. En este experimento usamos SEROUT para enviar información a una terminal y SERIN para recibir datos. La entrada normalmente será un comando y a veces el comando será acompañado por datos nuevos. Después de inicializar los LEDs de salida y el DS1620, el programa ingresa en el bucle principal y espera que se produzca una entrada desde la terminal. Primero, SERIN espera el caracter “?”, ignorando cualquier otra cosa que suceda. El símbolo de interrogación, significa que comienza una pregunta. Una vez que ingresa el signo de interrogación, el modificador HEX hace que el BASIC Stamp busque caracteres hexadecimales válidos (0 - 9, A - F). La llegada de cualquier caracter no hexadecimal (normalmente un [Enter] cuando se usa la terminal) le avisa al BASIC Stamp que deje de recibir datos (a la variable llamada param en nuestro caso) y continúe con el programa. Lo que en realidad sucede es que el BASIC Stamp ha usado la función SERIN para realizar una conversión de texto a número. Ahora que está disponible un comando, el programa usa LOOKDOWN para decodificar este comando y saltar con BRANCH a la subrutina conveniente si el comando era válido. Si el comando no es válido, se muestra un mensaje indicándolo.

Página 158 • Manual StampWorks Versión 1.1


Experimento 31: Comunicaciones Seriales El BASIC Stamp responde al pedido enviando una cadena de texto usando SEROUT a 9600 baudios (así podemos usar la terminal de DEBUG del BASIC Stamp). Cada una de las cadenas consiste de una etiqueta, el signo igual, el valor del parámetro y finalmente, un salto de línea. Cuando usa un programa terminal, la salida es fácil de leer. Algo así: ID=Parallax BS2 El salto de línea al final de la salida nos envía a la línea siguiente cuando se usa un programa terminal y sirve como indicador de “fin de entrada” cuando procesemos esta entrada en nuestro programa (similar al BASIC Stamp Plot Lite). El signo igual puede ser usado como separador cuando otro programa de computadora se comunica con el BASIC Stamp. Lo usaremos para distinguir la etiqueta de su valor respectivo. La mayoría de las preguntas son pedidos de información. Dos de ellas sin embargo, pueden modificar la información que está almacenada en el BASIC Stamp. La primera es “?F1” que nos permite escribir una cadena en la EEPROM del BASIC Stamp (en la ubicación llamada ID). Cuando F1 es recibido como valor de comando, el programa salta a la subrutina llamada SetID. Al ingresar a SetID, el puntero de EE llamado addr es inicializado, luego el BASIC Stamp espera que llegue un caracter. Observe que no se usan modificadores aquí. Dado que los programas terminal y el BASIC Stamp representan caracteres usando el código ASCII, no necesitamos hacer ningún tratamiento especial. Cuando llega un caracter, WRITE es usada para almacenarlo en la EEPROM y se incrementa el puntero de dirección. Si el último caracter era un salto de línea (13), el programa emite la cadena nueva (usando el código de ShowID), caso contrario repite la secuencia esperando el próximo caracter. La segunda es “?B1” que nos permite modificar el estado de cuatro LEDs. Mire la subrutina llamada SetLEDs. Esta vez, el modificador BIN de SERIN es usado para que podamos definir fácilmente bits individuales que queramos controlar. Usando el modificador BIN, nuestra entrada será una cadena de ceros y unos (cualquier otro caracter finalizará la entrada binaria). En este programa, un “1” hará que el LED se encienda y un “0” hará que el LED se apague. Este es un ejemplo del uso de B1. ?B1 0011 <CR>

Manual StampWorks Versión 1.1 • Página 159


Experimento 31: Comunicaciones Seriales La figura de abajo muestra una sesión real usando la terminal DEBUG del BASIC Stamp. Para ejecutar el experimento, siga estos pasos: 1. 2. 3. 4. 5. 6.

Quite todos los componentes de los experimentos anteriores. Ingrese y descargue el programa Apague la plaqueta StampWorks y arme el circuito Mueva el cable de programación al puerto “RS-232 Interfacing” Abra una ventana DEBUG haciendo clic en el ícono DEBUG Encienda la plaqueta StampWorks.

Desafío (para programadores de PC) Escriba un programa de PC que se comunique con este experimento.

Página 160 • Manual StampWorks Versión 1.1


Trabajando por su Cuenta

Trabajando por su Cuenta ¡Felicitaciones, usted es un programador de BASIC Stamps! Entonces, ¿qué sigue? Bien, eso depende de usted. Muchos programadores novatos se bloquean cuando intentan desarrollar sus propios proyectos. No se preocupe, esto es natural. Las siguientes ideas lo ayudarán a llevar a la realidad sus ideas. Planifique su trabajo, Trabaje según lo planificó Lo ha escuchado millones de veces: planifique, planifique y planifique. Nada causa más problemas a un programador que una planificación inadecuada. Esto es especialmente cierto con el BASIC Stamp debido a que los recursos son limitados. La mayoría de los programas que hemos reparado habían fallado debido a falta de planificación y formato pobre (que los hace difíciles de revisar). Hable Hable sobre el programa. No solo piense, hable. Hable en voz alta como si estuviese explicando la operación del programa a un compañero programador. A menudo, escuchar su propia voz es lo que marca la diferencia. Mejor aún, hable como si la persona a la que le estuviese narrando el programa no fuese un programador. Esto lo forzará a explicar los detalles. Muchas veces tomamos cosas por ciertas cuando hablamos con personas con habilidades similares a las nuestras. Escriba Diseñe los detalles de su programa por escrito antes de sentarse en su computadora. Use muchos colores. Encontrará que al trabajar visualmente en un diseño ideará nuevas aproximaciones y el uso de estos medios le permitirá escribir segmentos de programa dentro de sus diagramas funcionales. Diseñe con “Notas Autoadhesivas” Consiga un bloque de “notas autoadhesivas”. Escriba los nombres de los módulos o fragmentos concisos de código sobre papeles individuales y luego péguelos en la pared. Luego siéntese y écheles una mirada. Luego de un pequeño paseo. Agregue notas, quite algunas; simplemente haga lo que le parece correcto. Este ejercicio funciona especialmente bien con grupos. ¿Cómo sabe que terminó de diseñar el programa? ¡Cuando las notas adhesivas dejan de moverse! Es una buena idea escribir la versión final antes de abrir el editor. Otra idea: esta técnica funciona mejor si se la mezcla con la anterior, dibujando líneas que indiquen el flujo del programa. Si se equivoca, borre las líneas o mueva las notas. Intente esto, realmente funciona.

Manual StampWorks Versión 1.1 • Página 161


Trabajando por su Cuenta Vaya más allá de la caja A esta altura de las circunstancias, su apetito por los proyectos con BASIC Stamps seguramente habrá crecido mas allá de lo que usted originalmente esperaba. Así que, ¿hacia dónde puede ir ahora? No se preocupe, hay muchos recursos relacionados a los BASIC Stamps disponibles, en formato impreso o por Internet. Esta es una lista con recursos en Ingles y Castellano: Libros y revistas • • • • • • •

Microcontroller Application Cookbook por Matt Gilliland Microcontroller Projects with BASIC Stamps por Al Williams Programming and Customizing the BASIC Stamp Computer por Scott Edwards BASIC Stamp por Claus Kühnel y Klaus Zahnert Getting Started In Electronics por Forrest Mims Engineer’s Notebook por Forrest Mims Nuts & Volts Magazine “Stamp Applications” column

Sitios Web www.parallaxinc.com

www.stampsinclass.com www.al-williams.com/awce/index.htm www.seetron.com www.hth.com/losa www.emesystems.com/BS2index.htm

Sitio principal de Parallax Sitio educativo de Parallax Sitio web de Al Williams Sitio web de Scott Edwards Electronics Fuente de ideas: List of Stamp Applications Recursos técnicos de Tracy Allen

Sitios web en castellano www.stampsenclase.com www.cursoderobotica.com.ar

Sitio educativo de Parallax en castellano Sitio web del Curso de Robotica con recursos

Libros en castellano En los sitios web en castellano encontrará manuales del programa Stamps en Clase, que puede bajar gratuitamente.

Página 162 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Apéndice A: Hojas de Datos Las primeras páginas de las hojas de datos (en Inglés) de los fabricantes se incluyeron en el Apéndice A. Las hojas de datos completas se pueden bajar de la página de StampWorks en www.parallaxinc.com o de los sitios web de los fabricantes. • • • • • • • • • • • •

Plaqueta NX-1000 - Innovative Experiment Company Conversor A/D ADC0831 8-bit– National Semiconductor Registro de desplazamiento 74HC165 entrada paralela-salida serial 8-bit– National Semiconductor Registro de desplazamiento 74HC595 entrada serial-salida paralela 8-bit– Motorola Reloj de tiempo real DS1302– Dallas Semiconductor Termómetro digital DS1620– Dallas Semiconductor Display de cristal líquido de matriz de puntos HD44780U (compatible Hitachi) – Innovative Experiment Company Driver ULN2003– Texas Instruments Motor paso a paso 12V 75 ohm– Jameco Driver de 7 segmentos MAX7219 8-Digit– Maxim Integrated Products Temporizador LM555– National Semiconductor Amplificador operacional doble LM358– National Semiconductor

Manual StampWorks Versión 1.1 • Página 163


Página 164 • Manual StampWorks Versión 1.1 FREQUENCY

GND

a b c d e f g dp

DIGIT 4 3 2 1

13 5

14 6

S1

S2

S3

S4

S5

PUSH BUTTON SWITCH

S3

S4

S5

PROTO BOARD AREA

2

10

8 0

9 1

+V 1

2

RS R/W E D0 D1 D2 D3 D4 D5 D6 D7

LCD CONNECTOR

7 6 5 4 3 2 1 0

3

11

1 2 3 4

4

12

LED MONITOR 16 CHANNELS

15 14 13 12 11 10 9 8

7

15

NX-1000 Univeersal training board

BASIC Stamp II Connector 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

LED 7 SEGMENT DISPLAY

3

4 OUTPUT

4 CHANNELS DRIVER

VR-10k

PIEZO

+

1Hz 10Hz 100Hz 1kHz

GND

TxD

RxD

+5V

BS2-IC/BS2SX-IC

PULSE GENERATOR

POWER

RESET

RS-232 INTERFACING

7805

DOWNLOAD

D7 D6 D5 D4 D3 D2 D1 D0

DC INPUT

Apéndice A: Hojas de Datos


2 3 4 5

9

6 7 8

K16 RS-232 2 3 4 5

1

+5V

R31 4k7

10 P5 11 P6 12 P7

1 Sin 2 Sout 3 ATN 4 GND 5 P0 6 P1 7 P2 8 P3 9 P4

R35 1k8

Q2 BC557 C5 10/50V

R34 4k7

R33 4k7

+5V

GND

TxD

RxD

LED1

R27 10k

K2 GND

K1 +5V

S10 FREQ.

POWER

R1 220

SW1

RESET

RS-232 INTERFACING

IC1 7805

+V

+V ~12V

P10 15 P9 14 P8 13

PWR 24 GND 23 RES\ 22 +5V 21 P15 20 P14 19 P13 18 P12 17 P11 16

C3 0.1/50V

SK1

Q1 BC547

C2 220/25V

D1-D4 1N4001 x4

D6 1N4148

R32 4k7

D5 1N4148

C1 0.1/50V

Power Supply

J1 DC IN 9-12V

7

6

K1 RS-232 DOWNLOAD

BASIC Stamp II Front-end

4

C4 0.1/50V

+5V

R2 10k*1

K5 DIP SWITCH

D7 D6 D5 D4 D3 D2 D1 D0

D7 D6 D5 D4 D3 D2 D1 D0

LED2-LED5 5 6

8

3

VR2 10k

K12 OUT

1k 100 10

HERTZ (Hz) 1

R28-R31 510 X4

PULSE GENERATOR

SP1 PIEZO SPEAKER

IC 3 7 P GX4100 2

1

+5V

+

K13

+5V

P4

P3

P2

P1

K14

K10

D2 D1 D0

RS R/W E D7 D6 D5 D4 D3

D7 D6 D5 D4 D3 D2 D1 D0

K11 INPUT

S9 DIP SW. *8

S8 S7 S6 S5 S4 S3 S2 S1

VARIABLE RESISTOR

K4 PUSH BUTTON SWITCH

Switch circuit

Piezo Speaker

-

P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P6 P5 P4 P3 P2 P1 P0

K3 BASIC Stamp CONNECTOR

3

4

5

6

DIGIT4

K9

a b c d e f g dp

8

9

R19-R26 220x8

a b c d e f g dp

DSP304

+5V

RS E D1 D3 D5 D7

IC2 ULN2003

14

13

12

11

OUT4

K13 DRIVER OUT3 OUTPUT

OUT2

+12V 500 mA(max) OUT1

HIGH CURRENT DRIVER

R/W D0 D2 D4 D6

Vo

K11 +5V UIC-LCD

LCD module connector

K8

VR1 10k Brightness

DIGIT3 DIGIT2 DIGIT1

K7 LED display 4 digit

15 14 13 12 11 10 9 8

R3-R10 220x8 P15 P14 P13 P12 P11 P10 P9 P8 K6

DSP302

DSP301

P7 P6 P5 P4 P3 P2 P1 P0

LED Monitor

Thailand

The manufacturer of en g ineering educational products in Thailand, BASIC Stamp products distributor in

Innovative Experime nt Co.,Ltd.

Design and copyright by

Universal training board for BASIC Stamp 2/2SX microcontroller module Digital circuit experiment Programmable Logic Device experiment and any small/medium microcontroller experiment

NX-1000

DSP303

7 6 5 4 3 2 1 0

R11-R18 220x8

Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 165


Apéndice A: Hojas de Datos

Página 166 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 167


Apéndice A: Hojas de Datos

Página 168 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 169


Apéndice A: Hojas de Datos

Página 170 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 171


Apéndice A: Hojas de Datos

Página 172 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 173


Apéndice A: Hojas de Datos

Página 174 • Manual StampWorks Versión 1.1


Apéndice A: Hojas de Datos

Manual StampWorks Versión 1.1 • Página 175


Apéndice A: Hojas de Datos

Página 176 • Manual StampWorks Versión 1.1


Apéndice B: Manual del BASIC Stamp II, Versión 2.0

Apéndice B: Manual del BASIC Stamp II Versión 2.0 El Manual del BASIC Stamp 2.0 es incluido en este apéndice. El manual completo (y futuras actualizaciones) se pueden comprar o descargar desde www.parallaxinc.com.

Manual StampWorks Versión 1.1 • Página 177


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.