Академический Документы
Профессиональный Документы
Культура Документы
1
Sobre la precisin de este texto: Se realiz un gran esfuerzo para asegurar la precisin de este texto y los experimentos, pero puede haber errores an. Si usted encuentra errores o algn tema que requiera informacin adicional, por favor infrmelo a aalvarez@parallaxinc.com, as podemos continuar mejorando la calidad de nuestra documentacin.
Garanta
Parallax garantiza sus productos contra defectos en sus materiales o debidos a la fabricacin por un perodo de 90 das. Si usted descubre un defecto, Parallax segn corresponda, reparar, reemplazar o regresar el valor de la compra. Simplemente pida un nmero de autorizacin de regreso de mercadera (Return Merchandise Authorization, RMA), escriba el nmero en el exterior de la caja y envela a Parallax. Por favor incluya su nombre, nmero telefnico, direccin y una descripcin del problema. Nosotros le regresaremos su producto o el reemplazo, usando el mismo mtodo de correo que usted us para enviar el producto a Parallax.
Desvinculacin de Responsabilidad
Parallax, Inc. no es responsable de daos por consecuencias, incidentes o daos especiales que resulten de cualquier violacin de la garanta, bajo cualquier teora legal, incluyendo prdida de beneficio, tiempo, dao 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 dao personal, incluyendo vida o muerte, resultado del uso de cualquiera de nuestros productos. Usted tiene absoluta responsabilidad por la aplicacin 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 informacin se muestran a continuacin: E-mail: Web:
aalvarez@parallaxinc.com
http://www.parallaxinc.com y http://www.stampsenclase.com
Contenido
Contenido Prefacio ............................................................................................................................... 3 Introduccin .............................................................................................................................. 5 Obtenga el Mayor Provecho de las Prcticas de StampWorks ......................................................... 5 Tres Pasos para Tener xito con StampWorks .............................................................................. 5 Prepare su Plaqueta StampWorks....................................................................................... 7 Contenido de este Kit ................................................................................................................. 7 Preparacin de la Protoboard ...................................................................................................... 8 Bases de la Programacin ................................................................................................. 13 Contenido de un Programa ....................................................................................................... 13 Saltos Redireccionando el Flujo de un Programa ...................................................................... 14 Bucles Ejecutando el cdigo una y otra vez.............................................................................. 15 Subrutinas Cdigo reutilizable que ahorra espacio de programa................................................. 17 Estilo de Programacin ............................................................................................................. 17 Plantilla ................................................................................................................................... 18 Convencin sobre Nombres....................................................................................................... 19 Hora de Experimentar ....................................................................................................... 21 Aprendiendo los Conceptos de Programacin.............................................................................. 21 Construccin de Proyectos ........................................................................................................ 21 Que hacer entre proyectos........................................................................................................ 21 Experimento 1: Hacer Titilar un LED .......................................................................................... 23 Experimento 2: Hacer Titilar un LED (Versin 2) ......................................................................... 25 Experimento 3: Contador con LEDs............................................................................................ 29 Experimento 4: Pantalla de LEDs de Ciencia Ficcin .................................................................... 33 Experimento 5: Grficos 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 Dgito ....................................................................................... 51 Experimento 9: Dado Digital ..................................................................................................... 55 Experimento 10: Reloj con Pantalla de LEDs ............................................................................... 59
Contenido Usando LCDs ......................................................................................................................65 Experimento 11: Demostracin Bsica 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 Mgica................................................................................ 85 Avanzando..........................................................................................................................91 Experimento 15: Filtrando Mltiples Entradas ............................................................................. 93 Experimento 16: Contando Eventos ........................................................................................... 97 Experimento 17: Medicin de Frecuencia ................................................................................... 99 Experimento 18: Medicin Avanzada de Frecuencia....................................................................101 Experimento 19: Theremin Controlado por Luz ..........................................................................103 Experimento 20: Efectos de Sonido ..........................................................................................105 Experimento 21: Entrada Analgica con PULSIN ........................................................................109 Experimento 22: Salida Analgica 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: Medicin de Tensin.......................................................................................129 Experimento 28: Medicin 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 Apndice A: Hojas de Datos .............................................................................................163 Apndice B: Manual del BASIC Stamp II, Versin 2.0 .....................................................177
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 ms duraderos. Y para ser franco, aprender haciendo es casi siempre la forma ms satisfactoria de aprender; involucra ms 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 teora son cortas y concisas. Aprender la teora de programacin, ponindola en prctica. No encontrar muchos rodeos; solamente encontrar trabajo, trabajo divertido que le ensear a programar microcontroladores con el BASIC Stamp de Parallax. Por qu tomar el desafo? Por qu aprender a escribir programas para el microcontrolador BASIC Stamp? La respuesta es simple, sino obvia: los microcontroladores se encuentran por todos lados. Estn en nuestros televisores, hornos microondas, telfonos celulares e incluso en nuestros autos. El hecho es que los automviles ms nuevos tienen diez o ms microcontroladores controlando todo, desde el motor, la climatizacin del habitculo, la rotacin de las ruedas (control de traccin), el sistema de frenos (ABS) y muchas otras funciones. En resumen, los vehculos modernos son ms seguros y ms confortables debido, en gran medida, al uso de microcontroladores. Con microcontroladores podemos construir circuitos y dispositivos inteligentes. En el pasado, debamos 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 modificacin de programas y con el Kit de StampWorks qu tan fcil puede ser. Divirtase con estos proyectos y piense cmo podra aplicar los conceptos aprendidos en cada uno. Apreciar recibir sugerencias (en Ingls) en cualquier momento por e-mail a jonwms@aol.com.
Introduccin
Introduccin
Introduccin
Obtenga el Mayor Provecho de las Prcticas 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 informacin adicional de la pgina de StampWorks del sitio web www.parallaxinc.com, incluyendo hojas de datos, actualizaciones y detalles tcnicos generados despus de emitida esta publicacin. Tres Pasos para Tener xito con StampWorks: 1. Lea la Seccin 1 del manual del BASIC Stamp II (en Ingls). Esta seccin le explicar el funcionamiento del BASIC Stamp II y lo guiar en el proceso de instalacin del software de programacin. Otro recurso til es el captulo 1 de Robtica! (en Castellano) que puede descargarse por internet de www.stampsenclase.com. 2. Lea la seccin siguiente de este manual, Prepare su Plaqueta de StampWorks para los Experimentos. Esta seccin describe los pasos necesarios para poner en condiciones la plaqueta de experimentacin. 3. Realice los experimentos por su cuenta, refirindose a la gua 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 cdigo. 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 indicacin: Divirtase!
Prepare su Plaqueta StampWorks Para poder realizar los experimentos de StampWorks, necesitar estos componentes: Mdulo BASIC Stamp II Plaqueta de laboratorio StampWorks (INEX-1000) Fuente de alimentacin de 12 V Cable de programacin Cables rojo y negro Corta / pela cables
Empiece quitando la envoltura del mdulo BASIC Stamp II e insrtelo cuidadosamente en el zcalo de StampWorks. Observar que el mdulo BASIC Stamp II y la plaqueta de laboratorio StampWorks tienen una marca semicircular. El mdulo BASIC Stamp II debera insertarse en el zcalo de forma que las marcas queden alineadas.
Use el cable de programacin 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 electrnico, de su computadora, asegrese de deshabilitar el software de comunicacin antes de intentar programar el BASIC Stamp. Si an no ha instalado el software de programacin del Stamp, vea la Seccin 1 del manual de programacin del Stamp II para obtener instrucciones. Asegrese de que el interruptor de encendido de la plaqueta de laboratorio StampWorks est en OFF. Conecte la ficha de la fuente de alimentacin de 2.1 mm en la ficha DC INPUT. Conecte la fuente de alimentacin a un toma (120 VCA o 220 VCA segn 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 cmo trabaja la protoboard. Con un poco de preparacin, le ser an ms fcil usarla en los prximos experimentos.
Prepare su Plaqueta StampWorks La parte central de la protoboard es la que usaremos para conectar nuestros componentes. Esta seccin consiste en varias columnas de conectores (hay un nmero 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 elctricamente 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 lneas horizontales sern usadas para suministrar los +5 volts (Vdd) y masa (Vss). Para preparar la protoboard uniremos las filas para que la alimentacin sea accesible en todos los sectores de la protoboard. As se ve la protoboard desde el exterior:
Si la viramos con rayos-X, podramos 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:
Prepare su Plaqueta StampWorks Comience pelando medio centmetro del aislante del extremo de un cable de interconexin 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 lnea 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, asegurndose de no daar el cable. Quite el cable de la protoboard y crtelo medio centmetro ms 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 debera poder introducirse fcilmente 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, tambin 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 alimentacin superior e inferior. Estas filas proveern 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 centmetro en ambos extremos. Doble cada cable con forma de U redondeada. Estos cables no quedarn planos como los anteriores, para que sean ms fciles de retirar de la plaqueta StampWorks cuando sea necesario.
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 podran producir daos al conectar la alimentacin a la plaqueta StampWorks. Cuando termine el conexionado, la protoboard debera verse as:
Encienda la plaqueta StampWorks moviendo el interruptor de energa a la posicin ON. Debera encenderse el LED indicador de encendido (ON LED verde). Si no es as, asegrese 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 lnea de cdigo:
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 Ingls).
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 posicin ON? Est encendido el LED verde? El cable de programacin est conectado entre la PC y la plaqueta StampWorks? Ha seleccionado (manualmente) un puerto com errneo 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 programacin del Stamp. Conexin de un Chip Hay dos formas de dibujar un esquema. Una considerada chipcntrica en la cual los pines de E/S del chip aparecen de acuerdo a su ubicacin fsica. En StampWorks los esquemas se dibujaron de forma ms eficiente, poniendo los pines de E/S en los lugares que hagan el grfico ms 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.
Indicador
Bases de la Programacin
Bases de la Programacin
Contenido de un Programa En la seccin 1 de BASIC Stamp II manual se introduce el BASIC Stamp, su arquitectura y el concepto de variables y constantes. En esta seccin, presentaremos varios elementos de un programa: cdigo lineal, saltos, bucles y subrutinas. Los ejemplos siguientes usan pseudo-cdigo para demostrar y describir la estructura del programa. Itlicas se usan para indicar las secciones de pseudo-cdigo que deberan ser reemplazadas por instrucciones de programacin vlidas para lograr que el ejemplo pueda ser compilado y ejecutado correctamente. Usted no necesita realizar ninguno de estos ejemplos, ya que todos estos conceptos sern usados en los prximos 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 especfico de instrucciones. Este juego de instrucciones se llama programa. Escribirlo es nuestro trabajo. Los programas del Stamp se escriben en un lenguaje de programacin llamado PBASIC, una versin especfica del lenguaje de programacin BASIC (Beginners All-purpose Symbolic Instruction Code= Cdigo de Instrucciones Simblicas Multi-propsito para Principiantes) desarrollada por Parallax. El BASIC es muy popular debido a su simplicidad y a su sintaxis similar al Ingls. 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 vlida. Lo que encontrar sin embargo, es que la mayora 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 pequeas secciones lineales. Los requerimientos del flujo del programa son determinados por el objetivo del programa y las condiciones bajo las cuales se ejecutar.
Bases de la Programacin Saltos Redireccionando el Flujo de un Programa Un comando de salto es el que causa que el flujo del programa se desve de su trayectoria lineal. En otras palabras, cuando el programa encuentra un comando de salto, no ejecutar, en la mayora de los casos, la siguiente lnea de cdigo. El programa normalmente, se dirigir a otro sector. Hay dos categoras 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 ubicacin se especifica como parte del comando GOTO y se denomina direccin. Recuerde que las direcciones estn al principio de una lnea de cdigo y son seguidas por dos puntos (:). Ver frecuentemente GOTO al final del cuerpo principal del cdigo, haciendo que las instrucciones del programa se ejecuten nuevamente. El salto condicional har que el flujo del programa se modifique bajo circunstancias especficas. El salto condicional ms simple se logra con la funcin IF-THEN. La funcin de PBASIC IF-THEN es diferente de la original de BASIC. En PBASIC, THEN siempre es seguido por una direccin de programa (etiqueta), mientras que en el BASIC estndar se permite colocar instrucciones a continuacin del THEN. Si la condicin que se evala es verdadera, el programa saltar a la direccin especificada. Caso contrario, continuar en la siguiente lnea de cdigo. Observe este listado:
Inicio: instruccion 1 instruccion 2 instruccion 3 IF condicion THEN Inicio
Se ejecutan las instrucciones y se verifica la condicin. Si se evala como verdadera, el programa saltar hacia atrs a la lnea llamada Inicio. Si la condicin se evala como falsa, el programa continuar por la lnea que se encuentre a continuacin de la instruccin IF-THEN.
Bases de la Programacin
A medida que sus requerimientos se vuelven ms complicados, podra necesitar que su programa salte a un gran nmero de direcciones, dependiendo de cierta condicin. La primera aproximacin es usar mltiples instrucciones IF-THEN.
IF condicion_0 THEN Etiqueta_0 IF condicion_1 THEN Etiqueta_1 IF condicion_2 THEN Etiqueta_2
Esta aproximacin es vlida 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 mencionbamos, a menudo proceden de una variable de control. BRANCH es un poco ms sofisticado en su funcionamiento, pero muy poderoso debido a que puede reemplazar mltiples 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 lnea de cdigo:
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 cdigo 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 repeticin. 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 repetirn en ciertas condiciones. Los siguientes ejemplos son llamados bucles condicionales. Estos bucles se ejecutarn bajo ciertas circunstancias. La programacin condicional es lo que le otorga a los microcontroladores su inteligencia.
Bases de la Programacin
Etiqueta: instruccion 1 instruccion 2 instruccion 3 IF condicion THEN Etiqueta
Con esta estructura de repeticin, las instrucciones se ejecutarn mientras la condicin se evale como verdadera. Cuando la condicin se evale como falsa, el programa continuar por la lnea de cdigo siguiente a la instruccin IF-THEN. Es importante observar que en el listado anterior las instrucciones siempre se ejecutarn al menos una vez, incluso cuando la condicin sea falsa. Para evitar que suceda esto, es necesario probar la condicin antes de ejecutar las instrucciones. El cdigo puede escribirse como se muestra a continuacin para lograr que las instrucciones (1 3) solamente se ejecuten cuando la condicin sea verdadera. Cuando la condicin es evaluada como falsa, el programa contina 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 tamaoPaso instruccion 1 instruccion 2 instruccion 3 NEXT
La construccin FOR-NEXT es usada para lograr que una seccin de cdigo se ejecute una cantidad determinada de veces. FOR-NEXT usa una variable de control para determinar la cantidad de repeticiones. El tamao de la variable determinar la cantidad mxima de repeticiones. Por ejemplo, la cantidad mxima de repeticiones cuando se utiliza una variable de control tipo byte ser 255.
Bases de la Programacin La opcin STEP de FOR-NEXT es usada cuando se necesita que el incremento de la variable en cada repeticin sea distinto de uno. Si, por ejemplo, el bucle debe contar en valores pares, el cdigo podra verse as:
FOR controlVar = 2 TO 20 STEP 2 instruccion 1 instruccion 2 instruccion 3 NEXT
Subrutinas Cdigo reutilizable que ahorra espacio de programa El ltimo concepto de programacin que discutiremos es la subrutina. Una subrutina es una seccin de cdigo que puede ser llamada (ejecutada) desde cualquier punto del programa. GOSUB es usado para redirigir el programa hacia el cdigo de la subrutina. La subrutina termina con el comando RETURN. Este comando hace que el programa salte hacia la lnea de cdigo 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 cdigo de MySub es ejecutado y luego el programa salta hacia atrs a la lnea PAUSE 1000. Estilo de Programacin El PBASIC es un lenguaje muy flexible. Sus reglas son simples y fciles de aprender. El PBASIC no es sensible al formato del programa, uso de espacios en blanco (espacios, tabulaciones, lneas en blanco, etc.) y no detecta diferencias entre maysculas y minsculas; esto quiere decir que dirs, Dirs y DIRS significan lo mismo en PBASIC as que podremos elegir la opcin que ms nos guste para trabajar.
Bases de la Programacin Los programadores experimentados tienden a adoptar o desarrollar un estilo (de formato) de programacin consistente. Ya sea que elija adoptar un estilo o desarrollar uno propio, el hecho de mantener la coherencia con el mismo simplificar la solucin 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 seccin contiene el nombre del archivo y una corta descripcin de su funcionamiento. Tambin se registran en este sector las revisiones y actualizaciones que se realizan a la versin original. En la Versin 1.1 de este libro, tambin hemos agregado la directiva del compilador que indica el modelo de BASIC Stamp que estamos usando. Declaraciones: sta seccin contiene la declaracin de los alias para los pines de E/S, valores constantes y variables. En los ejemplos de programacin de esta gua, las variables PBASIC siempre tendrn nombres significativos. Los nicos nombres internos que se usarn sern Outs y Dirs y siempre en la seccin de inicializacin y no en el cdigo principal. Instrucciones DATA: Algunos programas almacenan informacin adicional en la EEPROM del BAISC Stamp con instrucciones DATA. Esta seccin provee el espacio para dicho almacenamiento. Inicializacin: Esta seccin es usada para inicializar el estado de los pines de E/S, variables del programa y cuando sea necesario, el hardware externo. Cdigo: Es donde reside la parte principal del cdigo del programa. Subrutinas: Las subrutinas estn separadas del cuerpo principal del cdigo debido a que pueden ser llamadas desde cualquier parte del programa. La separacin entre subrutinas tambin facilita la portabilidad del cdigo, posibilitando usar la herramienta de edicin 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, asegurndose de cambiarle el nombre utilizando la opcin Save As (Guardar como) del BASIC Stamp Editor.
Bases de la Programacin
' ' ' ' ' ' ' ========================================================================= Archivo: BLANK.BS2 { descripcin } {$STAMP BS2} =========================================================================
' { pines de E/S } ' { constantes } ' { variables } ' ------------------------------------------------------------------------' { instrucciones DATA } ' ------------------------------------------------------------------------' { inicializacin } ' ------------------------------------------------------------------------' { cdigo } Principal: GOTO Principal END ' ------------------------------------------------------------------------' { subrutinas }
Convencin sobre Nombres Como se dijo anteriormente, los programas de los experimentos utilizarn alias (sobrenombres) para los pines de E/S y variables internas de PBASIC. Se usarn las siguientes convenciones: Constantes: (incluyendo las etiquetas de direccionamiento a subrutinas) utilizarn mezcla de maysculas y minsculas, comenzando siempre en mayscula. Ejemplos: LimitSw, LMotor, DlyTm, InitLCD
Bases de la Programacin
Variables: usarn mezcla de maysculas y minsculas, comenzando siempre en minscula. Ejemplos: lcdChar, hrs, iCount Palabras reservadas PBASIC: todo en maysculas. Ejemplos: FOR, NEXT, GOSUB, RETURN
Nota del traductor La traduccin fue realizada por Arstides Alvarez (aalvarez@parallaxinc.com). Los programas se dejaron en su versin 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 programacin del autor, pero para mantener la veracidad y equivalencia de la versin en castellano con la versin original en ingls, se mantuvo la estructura original. Si tiene comentarios o sugerencias sobre la traduccin, puede enviarlas a aalvarez@parallaxinc.com. Si quiere opinar sobre el libro en s, puede enviar sus comentarios a Jon Williams, jonwms@aol.com.
Hora de Experimentar
Hora de Experimentar
Aprendiendo los Conceptos de Programacin Lo que sigue es una serie de experimentos de programacin que usted puede construir y ejecutar en su plaqueta de laboratorio StampWorks. El propsito de estos experimentos es ensear los conceptos de programacin y el uso de componentes externos con el BASIC Stamp. Los experimentos fueron pensados para que gane progresivamente experiencia en programacin. Combinando los conceptos individuales aprendidos puede producir programas sofisticados. Construccin de Proyectos Esta seccin del manual es simple pero importante debido a que aprender lecciones de programacin y tcnicas de construccin importantes, usando su laboratorio StampWorks. A medida que avance sobre el manual, observar menos detalles de construccin (ya contar con suficiente experiencia como para tomar sus propias decisiones) y la explicacin del funcionamiento del programa ser menos profunda, enfocndose especficamente en las tcnicas especiales o dispositivos externos conectados al BASIC Stamp. Qu hacer entre proyectos El circuito de un proyecto puede no ser elctricamente compatible con el siguiente pudiendo en algunos casos, causar daos al BASIC Stamp si se ejecuta el programa viejo con el circuito nuevo. Por esta razn, se debera cargar un programa vaco 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 lnea que limpiar y proteger al Stamp.
DEBUG "Stamp limpio."
Construccin del Circuito Todos los experimentos de StampWorks usan una lnea 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 centmetro 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
========================================================================= Archivo: BLINK1.BS2 Hace titilar un LED conectado a P0 ========================================================================= CON CON 0 500 ' LED conectado a Pin 0 ' retardo en milisegundos
LEDpin DlyTm
' ------------------------------------------------------------------------Principal: HIGH LEDpin PAUSE DlyTm LOW LEDpin PAUSE DlyTm GOTO Principal END ' ' ' ' enciende LED tiempo encendido apaga LED tiempo apagado ' repite todo
Descripcin 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).
' ------------------------------------------------------------------------Inicializar: Dir0 = %1 ' hace salida al pin del LED ' ------------------------------------------------------------------------Principal: MiLED = Encendido
Descripcin del Programa Esta versin de BLINK expone las capacidades tcnicas de los pines de E/S del BASIC Stamp y su control. Observe cmo usar sobrenombres (o alias) para los pines de E/S, constantes y variables, logrando que el programa sea fcil de leer. No hay errores en la interpretacin 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. ========================================================================= VAR CON CON CON CON VAR Out0 1000 250 1 0 Byte ' LED conectado a Pin 0 ' tiempo encendido en milisegundos ' tiempo apagado en milisegundos
' ------------------------------------------------------------------------Principal: MiLED = cntr PAUSE TiempoEnc ' pone cntr.Bit0 en MiLED ' pausa de encendido
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 nmero par, Bit0 se limpiar (0), haciendo que el LED se apague.
Construccin del Circuito. Estos LEDs figuran en el sector LED MONITOR 16 CHANNELS de la plaqueta NX-1000.
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 centmetro 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 ms cables.
' ' ' ' ' ========================================================================= Archivo: LEDCNTR.BS2 Muestra un contador binario en los pines 0 - 7 ========================================================================= VAR CON CON CON VAR OutL 0 255 100 Byte ' LEDs en pines 0 - 7 ' valor inicial del contador ' valor final del contador ' retardo en milisegundos ' contador
' ------------------------------------------------------------------------Inicializar: DirL = %11111111 ' hace salidas todos los pines
' ------------------------------------------------------------------------Principal: FOR cntr = MinCnt TO MaxCnt LEDs = cntr PAUSE DlyTm NEXT GOTO Principal END ' bucle que genera los nmeros ' muestra el nmero con LEDs ' pausa entre nmeros ' repite todo
Experimento 3: Contador con LEDs Descripcin 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) multipropsito 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. Desafo Modifique el programa para que cuente hacia atrs.
LEDs DlyTm
' ------------------------------------------------------------------------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 desplaza el LED a la izquierda verifica posicin final continua en esta direccin
Descripcin 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 posicin a la izquierda. Con nmeros 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 cdigo usan IF-THEN para controlar el lmite de la cuenta, haciendo que el programa salte a la otra seccin cuando llega al valor lmite. Desafo Cree un retardo variable y agregue alguna curiosidad al programa (vea PONG2.BS2 por ejemplo).
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-marrn) 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 potencimetro de 10K Usando cable negro, conecte la pista Vss (masa) al terminal inferior del potencimetro de 10K.
========================================================================= Archivo: LEDGRAGH.BS2 Muestra una barra o un punto en la barra de 8 LEDs {$STAMP BS2} ========================================================================= VAR CON CON CON CON VAR VAR VAR VAR OutL 15 0 1 BarGraf Word Byte Byte Byte ' salidas para LEDs ' define tipo de grfico ' define modo grfico actual ' ' ' ' valor medido en el potencimetro valor a graficar bit ms alto que se enciende espacio de trabajo para la barra
' ------------------------------------------------------------------------Principal: HIGH PotPin PAUSE 1 RCTIME PotPin,1,rawVal grafVal = rawVal */ $005F ' descarga el capacitor ' durante 1 ms ' lee el potencimetro ' escala grafVal (0 - 255) ' equivalente a rawVal * 0.372
' ------------------------------------------------------------------------ShowGraph: IF GrMode = BarGraf THEN ShowBar ShowDot: LEDs = DCD (grafVal / 32) RETURN ShowBar: bits = DCD (grafVal / 32) newBar = 0 BuildBar: IF bits = 0 THEN BarDone newBar = newBar << 1 newBar.Bit0 = 1 bits = bits >> 1 GOTO BuildBar BarDone: LEDs = newBar RETURN ' salta al cdigo de modo grfico ' muestra el valor (punto)
se encendieron todos los LEDs? no desplazar a la izquierda enciende el primer LED desplaza el valor de bits continuar
Descripcin del Programa Despus de inicializar las salidas, este programa lee el potencimetro 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 potencimetro completamente en sentido anti-horario) y 685 (con el potencimetro 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 mximo valor posible para grafVal) por 685 (mximo valor que entrega rawVal). El resultado es 0.372. Trabajar con valores fraccionarios dentro del sistema algebraico de nmeros enteros del PBASIC, es posible gracias al operador */ (estrella-barra). El parmetro para */ es una variable de 16-bit
Experimento 5: Grficos con LEDs (Punto o Barra) (word). Los primeros ocho bits (byte superior) se multiplican como un nmero entero. Los ltimos ocho bits (byte bajo) se multiplican como nmero fraccionario. Para determinar el valor del byte de la parte fraccionaria, multiplique el valor fraccionario decimal por 255 y convirtalo 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 ms alto de grafVal. Con ocho LEDs en el grfico, 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 tambin deben encenderse. Esto es realizado por un bucle. El valor de control del bucle es la variable bits, que tambin se calcula en base a DCD. Este bucle se controla por valor de bits, saliendo cuando este es igual a cero, mientras que cada iteracin decrementa su valor. Si bits es mayor que cero, la variable de espacio de trabajo del grfico, 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 vern afectadas en cada iteracin del bucle:
bits newBar
0001 0011 0111 1111 (listo salir del bucle y mostrar el valor)
El propsito de la variable newBar, es evitar que los LEDs parpadeen con cada actualizacin. Esto permite que el programa comience con una barra grfica vaca que se construye hasta el valor actual. Con esta tcnica, el programa no debe recordar el valor del grfico anterior.
Experimento 7: Controlador de Luces Si quiere puede usar el piezoelctrico del kit en lugar del de la NX-1000 que parece tener mejor volumen. 1. 2. 3. 4.
' ' ' ' '
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 piezoelctrico. cable negro, conecte el lado del piezoelctrico a masa (ground). un cable negro conecte el puerto 7 del BASIC Stamp al pulsador D0.
========================================================================= Archivo: LASVEGAS.BS2 Mquina tragamonedas basada en un BASIC Stamp ========================================================================= VAR CON CON VAR VAR VAR VAR VAR VAR VAR OutL 6 7 Word Byte Word Byte Word Byte Byte ' salidas LED ' salida parlante ' pulsador de entrada ' ' ' ' ' ' ' nmero aleatorio patrn de luces tono de salida variable para BUTTON retardo variable de "giro" contador bucle contador bucle
LEDs Spkr Swtch randW pattern tone swData delay spin1 spin2
' ------------------------------------------------------------------------Attention: GOSUB GetRnd FREQOUT Spkr,35,tone PAUSE 100 BUTTON Swtch,0,255,10,swData,1,Spin GOTO Attention Spin: LEDs = %00111111 PAUSE 750 ' obtiene nmero aleatorio ' emite un sonido ' controla el pulsador de juego
' retardo de inicializacin ' ' ' ' ' gira la rueda obtiene nmero aleatorio ruido de la rueda pausa entre ruidos multiplica la pausa por 1.1
' si todos se encienden, gana ' caso contrario, pierde... ' limpia los LEDs ' repite todo ' luces y sonidos para indicar que gan
' ------------------------------------------------------------------------GetRnd: RANDOM randW tone = randW & $7FF pattern = randW & %00111111 LEDs = pattern RETURN ' ' ' ' obtiene nmero pseudo aleatorio no deja que el tono sea muy alto borra bits sin uso muestra el patrn
Experimento 7: Controlador de Luces Descripcin del Programa Este programa demuestra cmo agregar ms aleatoriedad al nmero 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 patrn nuevo en los LEDs. Al regresar a Attention, se emite el sonido y se revisa si se ha presionado el botn. El programa repetir el bucle sobre Attention hasta que se presione el botn. 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 botn. 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 mquina tragamonedas. En cada giro, un sonido clic es generado mientras se aumenta la pausa entre los mismos para simular la desaceleracin natural de los discos de la mquina. Si se encienden los seis LEDs antes del ltimo giro, el programa salta a YouWin. Esta rutina usa LOOKUP para encender un patrn 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. Desafo Modifique el juego para que se pueda ganar con menos de seis LEDs encendidos. Por ejemplo, vea LASVGAS2.BS2.
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 lnea 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-marrn) entre C10 y C14. Usando cable blanco, conecte A10 al puerto 6 del BASIC Stamp. Usando cable blanco, conecte E14 al terminal superior del potencimetro de 10K. Usando cable negro, conecte la lnea de Vss (ground) al cursor (terminal central) del potencimetro 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 delay btnVar mode offset randW CON CON VAR VAR VAR VAR VAR VAR 7 6 OutL Word Byte Byte Byte Word ' botn en pin 7 ' pot. control veloc. en pin 6 ' salidas de control de luces ' ' ' ' ' pausa entre patrones variable para BUTTON modo seleccionado offset del patrn de luz variable para RANDOM
' ------------------------------------------------------------------------SeqA SeqB SeqC SeqD SeqE AMax BMax CMax DMax DATA DATA DATA DATA DATA DATA CON CON CON CON %000001, %100000, %000001, %000000, %100100, %0 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
' -------------------------------------------------------------------------
' ------------------------------------------------------------------------Principal: HIGH PotPin PAUSE 1 RCTIME PotPin,1,delay delay = (delay */ $018A) MIN 50 PAUSE delay SwitchCheck: BUTTON Select,0,255,0,btnVar,0,Show mode = mode + 1 // 5 ' descarga el capacitor ' lee potencimetro de velocidad ' calcula retardo (50 ms ~ 1 sec) ' espera entre patrones ' nuevo modo? ' si, actualizar la var. mode
Show: BRANCH mode,[ModeA,ModeB,ModeC,ModeD,ModeE] GOTO Principal END ' ------------------------------------------------------------------------ModeA: offset = offset + 1 // AMax READ (SeqA + offset),Lights GOTO Principal 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: ' actualiza el offset (0 - 5) ' sale nuevo patrn de luces ' repite
Descripcin del Programa Este programa es ms simple de lo que parece. El cuerpo principal del programa es un bucle. La velocidad de ejecucin del bucle principal es controlada por la posicin del potencimetro. RCTIME es usada para leer el potencimetro y normalmente el nmero mximo que se obtuvo en su lectura fue 648. Multiplicando el mximo valor del potencimetro por 1.54 (delay */ $018A) se obtiene un mximo de 1000, para producir una pausa de un segundo de duracin. El operador MIN es usado para garantizar que la pausa ms corta posible sea de 50 milisegundos. El cdigo SwitchCheck revisa si D7 es presionado. Si es as, la variable mode, es incrementada (en una unidad). El operador de mdulo (//) es usado para mantener a mode en el rango de cero a cuatro. Esto funciona debido a que el operador de mdulo entrega el resto de una divisin. Dado que cualquier nmero 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 cdigo 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 patrn aleatorio de luces. Mire el cdigo de la subrutina ModeA. Lo primero que se hace es actualizar el valor de la variable offset, usando la tcnica del operador mdulo. El valor de offset es agregado al principio de la secuencia de luz especificada, y el patrn de luces actual es obtenido con READ. Observe que las instrucciones DATA de cada secuencia estn etiquetadas (SeqA, SeqB, etc.). Internamente, cada una
de esas etiquetas es convertida a un valor constante que es igual a la direccin de inicio de cada secuencia. La longitud de cada secuencia es calculada con esas constantes. Al emplear esta tcnica, los patrones de luces pueden ser actualizados (alargados o acortados) sin necesidad de modificar el cdigo llamado por Show. ModeE es muy directo, usando la funcin RANDOM para presentar nuevos patrones de luces en cada pasada a travs del bucle principal. Desafo Agregue una nueva secuencia de luces. Qu secciones del programa deben ser modificadas para realizar esta tarea?
Construyendo Circuitos
Iluminando combinaciones especficas de LEDs podemos crear los dgitos e incluso algunos caracteres alfanumricos (letras y smbolos). Los LEDs de siete segmentos normalmente se usan en letreros numricos. La plaqueta de StampWorks tiene cuatro displays de siete segmentos de ctodo comn. Los experimentos de esta seccin le mostrarn como aprovechar al mximo estos componentes tan verstiles.
segs cntr
' ------------------------------------------------------------------------' 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 ' cuenta ' muestra el dgito ' durante un segundo ' repite todo
Experimento 8: Contador de un Dgito Descripcin del Programa Este programa es muy similar al del control de luces: se lee un patrn de la EEPROM y se pone en la salida de los LEDs. En este programa, el envo de patrones especficos a los LEDs del 7 segmentos, crea los dgitos del cero al nueve. Desafo Actualice el programa para crear un contador hexadecimal de un dgito. Use el patrn que se muestra a continuacin para generar los ltimos dgitos hexadecimales.
========================================================================= Archivo: ROLLER.BS2 Dado Digital. Muestra un nmero del 1 al 6 cuando se presiona D7. ========================================================================= CON VAR VAR VAR VAR VAR 15 OutL Byte Nib Nib Nib ' botn en Pin 7 ' LEDs del 7 segmentos ' ' ' ' datos del comando BUTTON nuevo valor del dado posicin de giro control de actualizacin de giro
0 1 2 3
' ------------------------------------------------------------------------Principal: GOSUB GetDie PAUSE 5 ' Est presionado el botn? BUTTON RollBtn,0,255,10,swData,1,ShowDie GOTO Principal ShowDie: READ (DecDig + dieVal),Segs PAUSE 3000 GOTO Principal END ' obtiene valor del dado
' ------------------------------------------------------------------------GetDie: dieVal = dieVal // 6 + 1 READ (Bug + spinPos),segs doSpin = doSpin + 1 // 7 IF doSpin > 0 THEN GetDieX spinPos = spinPos + 1 // 6 GetDieX: RETURN ' ' ' ' ' limita entre 1 y 6 muestra patrn de giro actualiza el indicador de giro? solo si doSpin = 0 actualiza el indicador de giro
Experimento 9: Dado Digital Descripcin del Programa Este programa se basa en todo lo que hemos hecho hasta el momento y debera resultarle fcil de comprender. Hemos agregado un poco de creatividad en la programacin para lograr que un programa simple se vea ms interesante. Hay que remarcar el uso de la variable doSpin. Para crear un valor aleatorio, la variable dieVal es actualizada rpidamente hasta que el botn es presionado. Esta velocidad de cambio, es demasiado rpida para usarla en el indicador de giro del dado. La variable doSpin entonces, acta como un retardo, haciendo que el valor indicado por los LEDs sea actualizado cada sptimo paso por la rutina GetDie. Esto nos permite ver los nmeros claramente y crea un efecto de display agradable.
' ------------------------------------------------------------------------' ' DecDig .abcdefg -------%01111110 %00110000 %01101101 %01111001 %00110011 %01011011 %01011111 %01110000 %01111111 %01111011
DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA
' ' ' ' ' ' ' ' ' '
0 1 2 3 4 5 6 7 8 9
' ------------------------------------------------------------------------Inicializar: DirL = %11111111 DirC = %1111 digSel = %1111 ' configura segmentos como salidas ' selector de dgito como salida ' todos los dgitos apagados
' ------------------------------------------------------------------------Principal: GOSUB ShowTime IF tic = 1 THEN IncSec GOTO Principal ' muestra dgito actual ' nuevo segundo? ' repite
' actualiza el contador de seg. ' muestra dgito actual ' si pas el pulso salta al inicio
' ------------------------------------------------------------------------ShowTime: time = (secs / 60) * 100 ' obtiene minutos, en centenas time = time + (secs // 60) ' obtiene segundos segs = %00000000 ' pantalla en blanco ' habilita dgito LOOKUP digit,[%1110,%1101,%1011,%0111],digSel READ (DecDig + (time DIG digit)),segs ' pone el patrn de segmento PAUSE 1 ' muestra digit = (digit + 1) // 4 ' obtiene siguiente dgito RETURN
Descripcin del Programa Los dos primeros proyectos con los displays de siete segmentos usaron solamente un dgito. Este proyecto usa los cuatro. Un nuevo problema se presenta; dado que los nodos de los cuatro displays estn unidos, solamente podemos mostrar uno a la vez. Esto se realiza mediante el patrn de segmento que determina el dgito que se encuentra activo en cada momento (poniendo en estado bajo su ctodo). El objetivo de este programa sin embargo, es crear la pantalla de un reloj, en el cual los cuatro dgitos deben mostrarse al mismo tiempo. Si bien en la realidad no podemos tener a los cuatro encendidos a la vez, podemos engaar al ojo humano y hacerle creer que es as. El ojo humano tiene una propiedad conocida como Persistencia de Visin (POV), que hace que retenga una imagen durante un breve lapso de tiempo. A mayor brillo de la imagen, ms tiempo permanece en nuestros ojos. Este fenmeno es el que hace que veamos un punto de luz despus de observar el flash de una cmara fotogrfica. Podemos usar esta propiedad en nuestro beneficio haciendo un barrido rpido a travs de cada uno de los cuatro dgitos, mostrando cada dgito en un
Experimento 10: Reloj con Pantalla de LEDs segmento durante un corto perodo. Si el ciclo es suficientemente rpido, la POV de nuestros ojos nos har creer que los cuatro dgitos se encuentran encendidos a la vez. Este proceso se llama multiplexado. Multiplexado es el proceso de compartir lneas de datos; es este caso, las lneas de los segmentos de los displays son compartidas. Si no multiplexramos, se necesitaran 28 lneas de salida para controlar los cuatro displays de 7 segmentos. Son 12 lneas ms de las que se encuentran disponibles en un BASIC Stamp. El verdadero trabajo de este programa lo realiza la subrutina llamada ShowTime. Su propsito es darle formato de tiempo (MMSS) al contador de segundos y actualizar el dgito actual. Dado que la rutina solamente puede mostrar un dgito a la vez, debe ser llamada frecuentemente, caso contrario la pantalla parpadeara. 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, colocndolos 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 prxima actualizacin. 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 dgito actual y los segmentos que usar ese dgito 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 continuacin del segundo dgito. El paso final es agregar una pequea pausa mientras est encendido el dgito y se actualiza la variable digit. El bucle principal de este programa espera la entrada de una seal de onda cuadrada, producida por el generador de seales del StampWorks. Cuando se fija en 1 Hz, esta seal pasa de LOW (bajo) a HIGH (alto), una vez por segundo. Cuando se presenta la transicin de bajo a alto, el contador de
Experimento 10: Reloj con Pantalla de LEDs segundos es actualizado. El operador de mdulo (//) 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 seal de entrada pase a estado bajo, actualizando la pantalla durante la espera. Si el programa regresara al principio mientras la seal de entrada estuviese an en estado alto, el contador de segundos podra actualizarse prematuramente, causando que el reloj corriera ms rpido. Una vez que la seal de entrada pasa a estado bajo, el programa salta al principio, donde espera a la siguiente transicin de bajo a alto del pulso del generador. Desafo Si se modifica la posicin del punto decimal como se muestra a continuacin, qu suceder? Modifique y descargue el programa para controlar su respuesta.
segs = segs + (DPoint * time.Bit0) ' ilumina el punto decimal
Usando LCDs
Usando LCDs
Si bien los LEDs y los displays de siete segmentos son muy buenos como dispositivos de salida, habr proyectos que requerirn proveer informacin ms compleja al usuario. Por supuesto, nada supera la pantalla de video de una PC, pero estos son grandes, caros y casi siempre imprcticos para concretar proyectos con microcontroladores. Los mdulos LCD de caracteres por otro lado, son ideales para estas aplicaciones. Estos mdulos econmicos permiten imprimir salidas alfanumricas, usando muy pocas lneas de E/S y muy poco esfuerzo del BASIC Stamp. Los mdulos de caracteres LCD estn disponibles en gran variedad de configuraciones: una lnea, dos lneas y cuatro lneas, son los ms comunes. Tambin es variable el ancho de la pantalla, aunque normalmente es de 16 o 20 caracteres por lnea.
Mdulo LCD del StampWorks (2 lneas x 16 caracteres). Se puede bajar la hoja de datos desde www.parallaxinc.com. El mdulo 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.
Usando LCDs Inicializacin El LCD de caracteres debe ser inicializado antes de comenzar a enviarle informacin. Los proyectos de este libro inicializan el LCD de acuerdo con la especificacin del controlador Hitachi HD44780. El controlador Hitachi es el que se encuentra comnmente y muchos otros controladores son compatibles con l. Modos de Operacin Hay dos modos principales de operar con LCDs: enviar un caracter y enviar un comando. Cuando se enva un caracter, la lnea RS est en estado alto y el dato enviado es interpretado como un caracter que debe ser mostrado en la posicin actual del cursor. El caracter normalmente es enviado en cdigo ASCII. Tambin se pueden enviar caracteres no ASCII al LCD, as como tambin hasta ocho caracteres programables personalizados. Los comandos se envan al LCD luego de poner en estado bajo la lnea RS. Hay varios comandos estndar para controlar y manipular la pantalla LCD. Clear Home Cursor Izq. Cursor Der. Display Izq. Display Der. Conexin 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 conexin de LCD de la plaqueta y presinela hasta que quede firmemente conectado. $01 $02 $10 $14 $18 $1C Limpia el LCD y mueve el cursor a home o inicio Mueve el cursor a la primer posicin de la primer lnea 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
========================================================================= Archivo: LCDDEMO.BS2 Demostracin Bsica de LCD Ver 1.1 Actualizado de acuerdo a las conexiones de LCD del BS2p ========================================================================= CON CON VAR CON CON 0 3 OutB $01 $02 ' pin habilitacin LCD ' Seleccin registro (1 = carac.) ' datos de 4-bits del LCD ' limpia el LCD ' mueve el cursor a home
' ------------------------------------------------------------------------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 char = CrsrHm GOSUB LCDcommand char = %00001110 GOSUB LCDcommand PAUSE 500 ' limpia el LCD ' obtiene direccin 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
' ------------------------------------------------------------------------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
' ingresa modo comando ' salen los 4 bits altos ' pulso en lnea Enable ' salen los 4 bits bajos ' regresa al modo caracter
Descripcin del Programa Este es un programa muy simple que demuestra las funciones bsicas 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 lneas de E/S del BASIC Stamp necesarias para controlar el LCD. Si bien es posible conectar y controlar el LCD con ocho lneas de datos, no se lograra una mejora notable en el rendimiento del programa y se necesitaran cuatro lneas ms de E/S.
Experimento 11: Demostracin Bsica con LCD Las bases de la inicializacin son apropiadas para la mayora de las aplicaciones: Se enciende el display Se apaga el cursor Se deshabilita el parpadeo del display El cursor se incrementa automticamente despus 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 fcil. Cada nibble se enva al LCD con un pulso en la lnea E (habilitacin) con PULSOUT. La demo comienza limpiando el LCD y mostrando un mensaje que ha sido almacenado con una instruccin DATA. Esta tcnica de almacenar mensajes en la EEPROM es muy til y hace que los programas sean fcilmente actualizables. En este programa, se escriben caracteres hasta que se encuentra un cero. Este mtodo nos permite modificar la longitud de la cadena de texto, sin tener que preocuparnos por la configuracin de un bucle FOR-NEXT. Una vez mostrado el mensaje, el cursor se enva al inicio (primera posicin de la primera lnea) y se enciende (aparece un cursor subrayado). El cursor se enva hacia adelante y hacia atrs por el LCD usando dos tcnicas. La primera usa el comando cursor a la derecha. Para mover el cursor hacia atrs se opt por modificar manualmente su posicin. Esta ltima tcnica 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 funcin blink (parpadeo). Blink hace que la posicin actual del cursor alterne entre el caracter y un recuadro negro slido. Esto puede ser til para llamar la atencin. Otra forma de llamar la atencin es hacer parpadear la pantalla completa. Esto se logra invirtiendo el estado del bit de habilitacin (enable). El operador OR exclusiva (^) simplifica esta tarea, debido a que la operacin 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 mtodo para sacar ventaja de esta memoria adicional es escribir mensajes fuera de la pantalla y luego desplazarlos hasta que estn visibles.
E
RS LCDout ClrLCD CrsrHm CrsrLf CrsrRt DispLf DispRt DDRam CGRam Line1 Line2 char newChr index1 index2
CON
CON VAR CON CON CON CON CON CON CON CON CON CON VAR VAR VAR VAR
0
3 OutB $01 $02 $10 $14 $18 $1C $80 $40 $80 $C0 Byte Byte Byte Byte
' pin habilitacin LCD ' Seleccin registro (1 = carac.) ' datos de 4-bits del LCD
' ' ' ' ' ' ' ' 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
' ------------------------------------------------------------------------Msg1 Msg2 DATA DATA "EL BASIC STAMP " " ES GENIAL! " ' mensaje pregrabado en EEPROM
' ------------------------------------------------------------------------Inicializar:
DirL = %11111001 ' configura pines para el LCD ' inicializa LCD en modo 4-bits
GOSUB LCDinit DLChars: char = CGRam GOSUB LCDcommand FOR index1 = CC0 TO (CC2 + 7) READ index1,char GOSUB LCDwrite NEXT
'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 FOR index1 = 0 TO 15 READ (Msg1 + index1),char GOSUB LCDwrite NEXT PAUSE 2000 ' Animacin 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 ' ' ' ' cubre 16 caracteres obtiene letras del 2 mensaje 5 caracteres en ciclo de animac. nuevo acceso a DDRAM ' limpia el LCD
' obtiene mensaje de EEPROM ' lee un caracter ' lo escribe ' espera 2 segundos
' ------------------------------------------------------------------------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-lnea ' config. LCD ' config. LCD
' ingresa modo comando ' salen 4 bits altos ' pulso en lnea Enable ' salen 4 bits bajos ' regresa a modo caracter
Experimento 12: Creando Caracteres en un LCD Descripcin del Programa En este programa, el LCD es inicializado en modo multi-lnea. Esto permitir que las dos lneas del LCD de StampWorks muestren informacin. 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 despus 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 estndar del LCD tiene 5 bits de ancho por 7 bits de alto. Puede crear caracteres personalizados de 8 bits de alto, pero la octava lnea generalmente es reservada para el cursor de subrayado. Este es un ejemplo de la definicin 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 posicin, activar ese pxel; 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 mtodo ms comn 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.
Experimento 12: Creando Caracteres en un LCD El corazn de este programa es el bucle de animacin. Este cdigo toma un caracter del segundo mensaje y luego muestra la secuencia de animacin en la segunda lnea del LCD. Una tabla LOOKUP es usada para llevar a cabo la secuencia de animacin cclica. Al final de la secuencia, se revela el nuevo caracter. Desafo Cree su propia secuencia de caracteres personalizados. Actualice la inicializacin y el cdigo de animacin de acuerdo a sus propios caracteres.
========================================================================= Archivo: LCDREAD.BS2 Use la RAM del LCD como memoria externa (64 bytes) Ver 1.1 Actualizado segn las conexiones de LCD del BS2p ========================================================================= CON CON CON VAR VAR VAR CON CON 0 2 3 DirB OutB
InB
pin habilitacin LCD pin leer/escribir del LCD Seleccin registro (1 = carac.) direccin del puerto datos salida de 4-bits del LCD entrada de datos de 4-bits LCD
$01 $02
' ------------------------------------------------------------------------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 char = CGRam + addr GOSUB LCDcommand char = tOut GOSUB LCDwrite PAUSE 100 ' limpia el LCD ' crea pantalla
' genera nmero aleatorio ' crea direccin (0 a 63) ' crea valor de prueba (0 a 255) ' puntero de CGRAM ' mueve el valor a CGRAM ' espera y luego lo obtiene
' ------------------------------------------------------------------------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 dgitos de izq. a der. ' convierte dgitos a ASCII ' pone dgito en display
' ingresa modo comando ' salen 4 bits altos ' pulso en lnea Enable ' salen 4 bits bajos ' regresa a modo caracter
' comando de datos ' leer ' hace entradas lneas de datos ' obtiene 4 bits superiores ' obtiene 4 bits inferiores ' lneas de datos como salidas
Experimento 13: Leyendo la RAM del LCD Descripcin del Programa Este programa demuestra la versatilidad de las lneas 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 lneas de E/S del BASIC Stamp deben ser reconfiguradas como entradas. Esto no representa un problema para el BASIC Stamp. Adems de la reconfiguracin de las lneas de E/S, para leer valores del LCD se requiere una lnea de control adicional: RW. En la mayora de los programas, sta lnea puede ser fijada en estado bajo, para poder escribir datos en el LCD. Para leer desde el LCD la lnea RW se pone en estado alto. El programa genera datos y una direccin usando la funcin RANDOM. La direccin se mantiene en el rango de 0 a 63 poniendo una mscara en los bits ms altos de LowByte que entrega la funcin RANDOM. HighByte representa el dato a ser guardado y ledo 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 direccin y se recuperan los datos. Para poder hacer esto, las lneas de datos del LCD deben ser reconfiguradas como entradas. Enviando pulsos en la lnea E (habilitacin) se logra que los datos (de a cuatro bits) estn 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 operacin de lectura. Cuando todo est listo, la direccin, los datos de salida y los datos de entrada se escriben en el LCD. La subrutina PutVal, se encarga de escribir valores numricos en el LCD. Para usar esta subrutina, mueva el cursor a la posicin 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 dgito de temp y le suma 48 para convertirlo en ASCII de forma que pueda ser mostrado en el LCD.
Construccin del Circuito Agregue este pulsador al circuito del Experimento 11 (recuerde conectar LCD.RW a Vss).
========================================================================= Archivo: LCD8BALL.BS2 Programa de la Bola 8 Mgica con BASIC Stamp y LCD Ver 1.1 Actualizado de acuerdo con las conexiones de LCD del BS2p ========================================================================= CON CON VAR CON CON CON 0 3 OutB 15 $01 $02 ' ' ' ' pin habilitacin LCD Seleccin registro (1 = carac.) datos salida de 4-bits del LCD pin del botn
caracter enviado al LCD direccin del mensaje variable para BUTTON puntero de respuesta reloj de animacin puntero al caract. de animacin
' ------------------------------------------------------------------------Prompt Ans0 Ans1 Ans2 Ans3 Ans4 Ans5 DATA DATA DATA DATA DATA DATA DATA "Pregunte",0 "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
Rollem: GOSUB Shuffle ' Mezcla hasta que se presiona PAUSE 5 el botn BUTTON AskBtn,0,255,10,swData,1,ShowAnswer GOTO Rollem ShowAnswer: ' obtener direccin 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
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 lnea Enable ' salen 4 bits bajos ' regresa a modo caracter
lee un caracter si es 0, mensaje listo cambia letras bajo rengln escribe el caracter apunta al caracter siguiente
' cambia las letras minsculas que pasan por debajo del rengln ' 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
actualiza puntero de respuesta actualiza puntero de reloj tiempo para actualiz. animacin? si, escribe en pos. 15
' carga caracter de animacin ' lo escribe ' actualiza caracter de animacin
Experimento 14: Juego de la Bola 8 Mgica Descripcin del Programa Las fuentes comunes de 5x7 de LCD deforman mucho las letras que tienen partes que pasan por debajo del rengln (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 inicializacin. Para que estos caracteres especiales se vean correctamente sin embargo, hay que hacer un pequeo truco debido a que fueron mapeados con un desplazamiento con respecto a los dems caracteres ASCII. Por suerte, el BASIC Stamp tiene un par de comandos para manejo de tablas que simplifican el proceso de transformacin. Despus de la inicializacin, se limpia la pantalla y se le indica al usuario que piense una pregunta. La subrutina ShowMsg muestra un mensaje en la posicin actual del cursor. El mensaje es almacenado en una instruccin DATA y pasado a la subrutina por su direccin 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 redisear el caracter para que se vea correctamente en el LCD. Si el caracter no est en la lista, pasar a travs de Translate sin ser afectado. El bucle principal del programa espera a que presione un botn, creando una respuesta aleatoria al llamar continuamente a la subrutina Shuffle. Shuffle actualiza la variable de respuesta y crea una animacin. La animacin es creada con caracteres comunes y se actualiza cada 15 pasadas por la subrutina Shuffle. Cuando finalmente se presiona el botn, la direccin de la EEPROM de la respuesta correspondiente es cargada con LOOKUP y la respuesta mgica es mostrada. Desafo 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.
Avanzando
Avanzando
Las primeras tres secciones de este manual trataron especficamente con dispositivos de salida, debido a que estos son crticos para el xito de un proyecto. Hasta ahora, debera sentirse cmodo 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 completarn su educacin como programador del BASIC Stamp y le darn 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 desafo. Luego, avance planteando sus propios desafos. Cada vez que modifique un programa aprender algo. Es normal que sus experimentos no funcionen como se esperaba, debido a que an est aprendiendo.
========================================================================= Archivo: DEBOUNCE.BS2 Eliminacin simultnea del rebote en mltiples entradas. =========================================================================
' ------------------------------------------------------------------------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
Descripcin del Programa Cuando se quiere filtrar el rebote en una sola entrada, la funcin BUTTON del BASIC Stamp funciona perfectamente e incluso agrega un par de caractersticas bastante tiles (como auto repetir). Para filtrar el rebote de dos o ms entradas, necesitamos crear un poco de cdigo. 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 propsito de GetSwitches es asegurarse que las entradas estn 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 posicin. La rutina GetSwitches comienza asumiendo que todos los interruptores de entrada estn 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.
Experimento 15: Filtrando Mltiples Entradas As es como funciona la tcnica 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 nmero 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. Desafo Modifique el programa para que elimine el rebote y muestre el estado de ocho interruptores.
========================================================================= Archivo: COUNTER.BS2 Retarda la ejecucin del programa al esperar por una cantidad especfica de eventos ========================================================================= VAR CON CON CON VAR In15 0 1 1000 Word ' pin de entrada 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
Descripcin del Programa El propsito de la subrutina WaitForCount es hacer que el programa espere durante una cantidad especfica de eventos. En una aplicacin 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 lnea pasa a alto, el contador es incrementado y el programa espera hasta que la lnea regresa a estado bajo. Cuando esto sucede, el cdigo se repite buscando la siguiente transicin 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 podra causar una cuenta errnea, anticipando el fin de la subrutina. Un mtodo para tratar una entrada ruidosa (cuando se conoce de antemano el tiempo estimado entre eventos) es agregar una instruccin PAUSE inmediatamente despus de cada evento. La idea es hacer una pausa desde que se produce el evento y finalizarla justo antes de que se produzca el prximo. El cdigo que sigue funciona correctamente cuando los eventos duran aproximadamente medio segundo y estn 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
========================================================================= Archivo: FREQ1.BS2 Cuenta y muestra la frecuencia de los pulsos que entran por el Pin 0 ========================================================================= CON VAR 0 Word ' pin de entrada de pulsos ' frecuencia
F_in freq
' -------------------------------------------------------------------------
Principal: COUNT F_in, 1000, freq ' muestra en la pantalla DEBUG DEBUG CLS, "Frecuencia: ", DEC freq, " Hz" GOTO Principal END
Descripcin del Programa En el experimento anterior, se usaron varias lneas de cdigo para contar pulsos en un pin de entrada. Ese mtodo es til cuando se cuenta hasta un valor especfico. Otros programas necesitan contar la cantidad de pulsos que arriban durante un perodo de tiempo especfico. La funcin COUNT del BASIC Stamp fue diseada para este propsito. La frecuencia de una seal oscilatoria representa la cantidad de ciclos por segundo y se expresa en Hertz. La funcin COUNT del BASIC Stamp controla el pin especificado durante la cantidad de tiempo dada. Para obtener la medicin de frecuencia, se especific un tiempo de 1000 milisegundos (un segundo). Desafo Mejore la respuesta (que se actualice ms frecuentemente) de este programa modificando el perodo de COUNT. Qu otro ajuste debe realizarse? Cmo afecta este cambio la capacidad de medir seales de frecuencias muy bajas?
' ------------------------------------------------------------------------Principal: PULSIN F_pin, 0, pHigh PULSIN F_pin, 1, pLow period = pHigh + pLow freq = 50000 / period * 10 ' muestra en la pantalla DEBUG DEBUG Home DEBUG "Perodo...... ", DEC period * 2, " uS DEBUG "Frecuencia... ", DEC freq, " Hz " ", CR ' ' ' ' obtiene obtiene calcula calcula parte alta de la entrada parte baja de la entrada el perodo la frecuencia
Descripcin del Programa En el ltimo experimento, aprendi que la frecuencia de una seal se define como la cantidad de ciclos por segundo. Cre un frecuencmetro simple contando la cantidad de pulsos (ciclos) durante un segundo. Este mtodo funciona bien, especialmente para seales de baja frecuencia. Habr veces sin embargo, que un proyecto necesitar una respuesta ms rpida en la medicin de frecuencia. La frecuencia de una seal puede ser calculada a partir de su perodo, o el tiempo de un ciclo completo.
Midiendo el perodo de una seal entrante, su frecuencia puede ser calculada con la ecuacin (donde el perodo es expresado en segundos): frecuencia = 1 / perodo La funcin PULSIN del BASIC Stamp est diseada para medir el ancho de un pulso entrante. Usando PULSIN para medir las partes en estado alto y bajo de la seal, se pueden determinar el perodo y la frecuencia. El resultado de PULSIN est expresado en unidades de 2 microsegundos. As, la frmula para calcular la frecuencia sera: frecuencia = 500.000 / perodo Esto representa un inconveniente algebraico para el BASIC Stamp porque solamente puede realizar clculos con nmeros de 16-bits (el valor mximo es 65.535). Para corregir la frmula, convertimos 500.000 en 50.000 x 10 y la rescribimos as frecuencia = 50.000 / perodo * 10 Ejecute el programa y ajuste el potencimetro de 10K. Observe que la pantalla DEBUG se actualiza sin demoras y que no hay saltos como cuando us COUNT para determinar la frecuencia.
========================================================================= Archivo: THEREMIN.BS2 Usa RCTIME con una LDR para crear un a Theremin controlado por luz {$STAMP BS2} ========================================================================= CON CON CON VAR 0 1 200 Word ' salida del piezo ' entrada del sensor (RCTIME) ' frecuencia de corte ' frecuencia de salida
' ------------------------------------------------------------------------Principal: HIGH Sensor PAUSE 1 ' descarga el cap. ' durante 1 ms
Descripcin del Programa Un Theremin es un dispositivo musical interesante usado para crear esos sonidos escalofriantes que se escuchan en las pelculas de terror antiguas. Esta versin 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 ningn sonido. Este valor podra ajustarse para que el Theremin deje de tocar cuando el fotoresistor recibe la luz ambiente en forma directa. Desafo Agregue un segundo circuito RC usando un potencimetro de 10K en lugar de un fotoresistor. Use este circuito para ajustar el valor de corte para condiciones de iluminacin variables.
========================================================================= Archivo: PHONE.BS2 Usa FREQOUT y DTMFOUT para crear (US) sonidos telefnicos {$STAMP BS2} ========================================================================= CON CON CON CON CON CON CON CON CON CON CON CON 0 0 33 35 39 41 44 49 52 55 58 62 ' piezo en pin 0 ' ' ' ' ' ' ' ' ' ' ' 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
Speaker R C Cs D E F G Gs A As B
' ------------------------------------------------------------------------Principal: DEBUG CLS, "Sonidos Telefnicos", CR, CR Dial_Tone: DEBUG "Tono de Marcado", CR FREQOUT Speaker,35,35 PAUSE 100 FREQOUT Speaker,2000,350,440
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 "Seal 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
Play_Song: DEBUG "Pequea meloda", 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
Descripcin del Programa Con un poco de creatividad en la programacin, el BASIC Stamp puede emitir unos efectos de sonido muy interesantes. Dado que la mayora de los sonidos que escuchamos en el telfono (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 versin especializada de FREQOUT. Su propsito es tocar los tonos
dobles que se requieren para marcar nmeros telefnicos. En lugar de escribir el tono (o tonos), directamente se usan los nmeros a ser marcados. En verdaderas aplicaciones de marcado, la duracin y la separacin de los tonos del DTMF puede ser especificada, para ajustarse a la calidad de la lnea telefnica.
Este programa tambin presenta la habilidad musical bsica del BASIC Stamp tocando una pequea meloda. Las constantes con las frecuencias de las notas (primer octava) y las duraciones, simplifican el cdigo operacional. La subrutina PlayNote ajusta la frecuencia de la nota para la octava especificada. La calidad musical puede verse afectada para octavas ms altas debido a errores de redondeo. Usando los valores ideales que se muestran, la tabla de constantes puede ser expandida
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 Desafo Convierta (una parte de) su cancin favorita para que suene en el BASIC Stamp.
========================================================================= Archivo: A2D.BS2 Lee componente resistivo con filtro digital {$STAMP BS2} ========================================================================= CON CON CON CON VAR VAR 0 $00C0 $0080 $0040 Word Word ' pin de entrada de pulso ' 0.75 ' 0.50 ' 0.25 ' valor directo ' valor suavizado
' -------------------------------------------------------------------------
Descripcin del Programa En este experimento, el 555 es configurado como un oscilador. Analizando la salida, el ancho de la porcin de estado bajo es controlado por el valor de la resistencia del fotoresistor. Midiendo la parte baja de la seal 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 (mtodo iterativo) para obtener un valor suavizado. La relacin entre lectura directa sobre filtrada de esta ecuacin, determinar la respuesta del filtro. A mayor porcentaje de valor directo, ms rpidos son los cambios. Desafo 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.
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} ========================================================================= CON VAR 0 Byte ' pin de salida analgica ' nivel analgico
D2Aout level
' -------------------------------------------------------------------------
Principal: FOR level = 0 TO 255 PWM D2Aout,level,25 NEXT PAUSE 100 FOR level = 255 TO 0 PWM D2Aout,level,25 NEXT GOTO Principal END
' repite
Descripcin del Programa Mientras que en la mayora de las aplicaciones el BASIC Stamp trabajar con seales digitales, en algunas necesitarn una salida analgica; una tensin variable entre cero y algn valor mximo. La funcin PWM del BASIC Stamp est diseada para generar tensiones analgicas cuando se combina con un filtro RC. La funcin PWM genera una serie de pulsos que tienen una relacin de tiempo de encendido y apagado programable (ciclo de trabajo). A mayor ciclo de trabajo, mayor tensin de salida. Un ciclo de trabajo de 255 cargar al capacitor con 5 volts. En este experimento, se usa medio LM358 como fuente de tensin para el LED. El op-amp (amplificador operacional) evita que el capacitor se descargue rpidamente bajo condiciones de trabajo. El brillo del LED vara debido a que la cada de tensin sobre el resistor que est en serie, modifica la corriente que circula a travs del LED. Observe que el LED se enciende en forma cada vez ms brillante y luego, se oscurece hasta apagarse. Esto sucede cuando la salida del LM358 cruza el umbral de tensin de polarizacin directa (la tensin mnima para que el LED se ilumine) del LED (aproximadamente 1,5 volts). Usando el Multmetro digital, controle la tensin del Pin 1 del LM358.
========================================================================= Archivo: 74x595.BS2 Use tres lneas para controlar 8 con un registro de desplazamiento 74x595 ========================================================================= CON CON CON CON VAR 0 1 2 100 Byte ' patrn de salida ' salida serial (74x595.14) ' reloj de desp. (74x595.11) ' salida de latch (74x595.12)
' ------------------------------------------------------------------------Inicializar: LOW Latch pattern = %00000001 ' salida en estado bajo
' ------------------------------------------------------------------------Adelante: GOSUB Out595 PAUSE DlyTm pattern = pattern << 1 IF pattern = %10000000 THEN Atras GOTO Adelante 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 ' enva patrn al 74x595 ' bloquea (latch) las salidas
pone patrn en 74x595 desplaza patrn a la izq. comprueba posicin final continua en esta direccin
Experimento 23: Expandiendo Salidas Descripcin del Programa El BASIC Stamp es extraordinariamente flexible en su habilidad para redefinir la direccin (entrada o salida) de sus pines de E/S, aunque muy pocas aplicaciones requieren tanta flexibilidad. La mayora de las aplicaciones de microcontroladores definirn los pines como entradas o salidas en la inicializacin y esta definicin quedar sin cambios durante el resto del programa. Si hay lneas que solamente se usarn como salidas podemos ahorrar lneas 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 lneas del BASIC Stamp, este programa es capaz de controlar ocho LEDs a travs del 74x595. El 74x595 convierte una cadena de datos seriales sincrnicos en ocho salidas paralelas. Los datos seriales sincrnicos 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 lneas de datos y reloj, escribiendo los datos en un dispositivo sincrnico, en este caso 74x595. Con el 74x595, los datos deben ser bloqueados (latch) en las salidas despus del proceso de desplazamiento. El bloqueo se realiza enviando un breve pulso por la lnea 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 lneas de control. Para conectar varios 74x595s en cascada, las lneas 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. Desafo Conecte un segundo 74x595 al primero de forma que las mismas tres lneas del BASIC Stamp puedan controlar 16 salidas.
' ------------------------------------------------------------------------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
Descripcin del Programa El experimento demuestra el uso de SHIFTIN, la funcin complementaria de SHIFTOUT. En este caso, tres lneas 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 lnea Load, luego se usa SHIFTIN para ingresar los datos al BASIC Stamp.
Experimento 24: Expandiendo Entradas Note que los DIP-switches tienen resistencias de pull-up a Vdd, as que al ponerlos en posicin ON se crea una entrada lgica 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). Desafo Conecte un segundo registro de desplazamiento 74x165 para leer 16 entradas. Vea las hojas de datos del 74HC165 para obtener informacin de conexionado.
========================================================================= Archivo: SERVO.BS2 Controlador de la posicin de un Servo {$STAMP BS2} ========================================================================= CON 0 ' entrada pot sentido horario
PotCW
' ------------------------------------------------------------------------Principal: HIGH PotCW HIGH PotCCW PAUSE 1 RCTIME PotCW,1,rcRt RCTIME PotCCW,1,rcLf rcRt = rcRt */ $0068 MAX 250 rcLf = rcLf */ $0068 MAX 250 sPos = rcRt - rcLf PULSOUT Servo,(750 + sPos) PAUSE 15 GOTO Principal END ' descarga capacitores ' lee sentido horario ' lee sentido anti-horario ' escala RCTIME a 0-250 ' calcula posicin (-250 a 250) ' mueve el servo
Descripcin del Programa Los servos son dispositivos electromecnicos especializados usados frecuentemente para posicionar los planos de control de aeromodelos. La posicin 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 seal de control es de 1,5 milisegundos. Para mantener esta posicin, el servo debe ser actualizado constantemente. La frecuencia de actualizacin tpica 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 potencimetro de 10K. Este circuito y el cdigo pueden ser usados para determinar la posicin relativa del potencimetro. Las lecturas de cada lado del potencimetro 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 posicin del servo entre250 y +250.
Experimento 25: Control de un Servo Este valor se agrega a la posicin 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 posicin 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.
sPos insertando esta lnea despus del clculo:
Este cdigo demuestra que el BASIC Stamp trabaja con nmeros negativos. Puede ver el valor de
"
Los nmeros negativos son almacenados con el formato de complemento a dos. El modificador SDEC (decimal con signo) imprime valores decimales con su signo. Desafo Reemplace el potencimetro con dos fotorresistores y actualice el cdigo para hacer que el servo se centre hacia la fuente de luz ms brillante.
========================================================================= Archivo: STEPPER.BS2 control de motor paso a paso unipolar {$STAMP BS2} ========================================================================= CON CON VAR VAR VAR VAR VAR VAR VAR 0 1 OutB Word Byte Byte Word Word Word ' entrada pot. sentido horario 'entrada pot. sentido anti-horario ' salida a bobinas del paso a paso ' ' ' ' ' ' retardo entre pasos contador de bucle direccin 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 ' 1 rev. adelante
Experimento 26: Motor Paso a Paso Descripcin del Programa Los motores paso a paso se diferencian de los motores de CC en que no giran libremente cuando se les aplica la alimentacin. Para que un motor paso a paso gire, la alimentacin debe pulsarse continuamente en un patrn especfico. La secuencia de pasos (patrn) determina el sentido de rotacin 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 idntica excepto en que leer el paso anterior. Note el truco con el operador mdulo (//) usado en StepRev. Agregando el valor mximo de la secuencia al valor actual y luego aplicando el operador mdulo, la secuencia va a la inversa. Esta el la matemtica involucrada: 0 3 2 1 + + + + 3 3 3 3 // // // // 4 4 4 4 = = = = 3 2 1 0
Este experimento lee ambos lados del potencimetro de 10K para determinar su posicin relativa. El valor diferencial entre las dos lecturas se mantiene positivo mediante el uso de la funcin ABS. La posicin es usada para determinar la direccin 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. Desafo 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
========================================================================= Archivo: ADC0831.BS2 Leer tensin en el cursor del potencimetro con un ADC-0831 ========================================================================= CON CON CON VAR VAR 0 1 2 Byte Word ' lnea de datos A/D ' reloj A/D ' chip select A/D (act. bajo) ' resultado de conversin ' convierte a milivolts
DEBUG Home DEBUG "ADC..... ", DEC result, " ", CR DEBUG "volts... ", DEC mVolts DIG 3, ".", DEC3 mVolts PAUSE 100 GOTO Principal END ' pausa entre lecturas ' repite
Experimento 27: Medicin de Tensin Descripcin del Programa Proyectos anteriores usaban RCTIME para leer componentes resistivos. Esto sirve para ingresar valores analgicos, pero no sirve para leer tensiones. Para medir tensiones el BASIC Stamp la ayuda de un dispositivo externo. La forma ms simple de medir una tensin variable es con un conversor analgico-digital. En este experimento, el National Semiconductor ADC0831 es usado para convertir una tensin (0 5) en una seal serial sincrnica que puede ser leda 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 funcin SHIFTIN permite especificar la cantidad de bits que sern 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 multiplicndolo por 19,6 (result */ $139C). Se usa un truco interesante con DEBUG para mostrar la variable mVolts. La operacin DIG 3 imprime el valor entero y el modificador DEC3 la parte fraccionaria. Desafo Conecte la salida del Experimento 22 (Pin 1 del LM358) a la entrada del ADC0831. Escriba un programa que cree una tensin usando PWM y lea el valor resultante con el ADC0831.
========================================================================= Archivo: DS1620.BS2 Lee la temperatura con un Dallas Semiconductor DS1620 ========================================================================= CON CON CON CON CON CON CON CON CON CON CON CON VAR 0 1 2 $AA $01 $02 $A1 $A2 $EE $22 $0C $AC Word ' DS1620.1 (E/S de datos) ' DS1620.2 ' DS1620.3 ' ' ' ' ' ' ' ' ' lee temperatura escribe TH (Temp. alta) escribe TL (Temp. baja) lee TH lee TL inicia conversin detiene conversin escribe registro config. lee registro config.
DQ Clock Reset RdTmp WrHi WrLo RdHi RdLo StartC StopC WrCfg RdCfg tempIn
' ------------------------------------------------------------------------Principal: GOSUB GetTemperature DEBUG DEBUG DEBUG DEBUG DEBUG Home "DS1620",CR "------",CR SDEC tempC," C SDEC tempF," F ' lee el DS1620
' ------------------------------------------------------------------------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 ' activa el DS1620 ' use con CPU; func. Continuo
Descripcin del Programa El rgano ms grande del cuerpo humano es la piel y es el ms rpidamente afectado por la temperatura. Esta es la razn por la que se pone tanto esfuerzo en los sistemas de control ambiental (calefaccin y aire acondicionado). Este experimento usa el tremostato/termmetro digital Dallas Semiconductor DS1620. Este chip mide la temperatura y la pone a disponibilidad del BASIC Stamp mediante una interfaz serial sincrnica. El DS1620 es un dispositivo inteligente y una vez programado, es capaz de operar autnomamente 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 configuracin al DS1620, se necesita un retardo de 10 milisegundos para que la configuracin 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 extensin 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 (centgrados).
Experimento 28: Medicin 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 nmeros mantengan su signo con SDEC (los nmeros con signo en el BASIC Stamp deben tener una longitud de 16 bits). La temperatura es convertida a Fahrenheit usando la frmula: F = (C * 1.8) + 32 Desafo Rescriba el programa para que muestre los valores de temperatura en el mdulo LCD del StampWorks.
Dpin Clock Load Coins Decode Brite Scan ShutDn Test DecPnt Blank Yes No money deposit penny nickel dime quarter dollar digit d7219 index idxOdd
muestra dgito 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
' ------------------------------------------------------------------------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 parmetro 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)
' ------------------------------------------------------------------------GetCoins: deposit = %00011111 FOR index = 1 TO 10 deposit = deposit & ~Coins PAUSE 5 NEXT RETURN ' habilita todas las entradas ' controla entradas ' retardo entre controles
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 enva una letra SHIFTOUT Dpin,Clock,MSBFirst,[index,d7219] PULSOUT Load,3 NEXT
Descripcin del Programa Multiplexar varios displays de 7 segmentos requiere un gran esfuerzo y la mayora de los recursos de cmputo del BASIC Stamp. Usando el multiplexor MAXIM MAX7219 solamente son necesarios tres lneas 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 ctodo comn. Los pines DIGIT 0 hasta DIGIT 7 se conectan individualmente a los ctodos de cada uno de los displays. Si usa menos de ocho dgitos, omita los nmeros superiores. Por ejemplo, este experimento usa cuatro dgitos, numerados de 0 a 3, no de 4 a 7.
Experimento 29: Multiplexado de 7 Segmentos El MAX7219 tiene una caracterstica que limita el barrido de displays a los dgitos 0 a n, donde n es el nmero de dgito ms alto. Esto hace que el chip no pierda tiempo y ciclos de trabajo (perdiendo brillo) tratando de componer dgitos inexistentes. Cuando el MAX7219 es usado con displays de 7 segmentos, puede ser configurado para convertir automticamente valores decimales codificados en binario (BCD) en patrones apropiados de segmentos. Esto hace que mostrar nmeros decimales sea muy simple. La caracterstica de decodificacin 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 ms significativo (MSB). Emita un pulso en la lnea Load para transferir los datos. Cada paquete de datos de 16-bits consiste en una direccin 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 dgito del display. Si se enciende el decodificador BCD para ese dgito, el nmero 7 aparecer en el display. Si no se enciende la decodificacin, se encendern tres LEDs, correspondientes a los segmentos G, F y E. En este experimento, el MAX7219 se inicializa para: Scan = 3 (Muestra dgitos 0 3) Brightness = 5 (Brillo) Decode = $0F (decodificacin BCD 0 3) Shutdown = 1 (operacin normal) La inicializacin del MAX7219 es realizada en un bucle. En cada pasada lee una direccin de registro o valor de datos de la tabla LOOKUP. Despus de que cada valor es enviado, la direccin y el dato son bloqueados en el MAX7219 mediante un pulso en la lnea Load. La mayora del trabajo tiene lugar en la subrutina llamada ShowTheMoney. Cuando la cantidad de dinero es menor que 9999, el valor ser mostrado en los dgitos de 7 segmentos, caso contrario la pantalla mostrar el mensaje FULL (lleno). La rutina examina cada dgito del dinero y enva la posicin y el valor (con el operador DIG) al MAX7219. Dado que el display muestra dlares y centavos, se habilita el punto decimal en el tercer dgito. Cuando el dgito y la posicin han sido enviados, el display se actualiza enviando un pulso en la lnea Load. Para mantener la pantalla prolija, el primer cero se elimina cuando el valor del dinero es menor que 1000.
Cuando el dinero llega a 9999, el display mostrar FULL. Esto se logra deshabilitando el modo de decodificacin 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 algn botn con GetCoins y actualiza los contadores de cada moneda cada vez que se presiona un botn. Este cdigo en particular es un ejemplo excelente del uso de sobrenombres o alias para las variable para mejorar la claridad del programa. Desafo Modifique el cdigo del Experimento 27 para que muestre la tensin de entrada en los displays de 7 segmentos.
========================================================================= Archivo: DS1302.BS2 Este programa demuestra las funciones temporales bsicas usando el DS1302 de Dallas Semiconductor. ========================================================================= CON CON CON VAR 0 1 2 InB ' ' ' ' DS1302.6 DS1302.7 DS1302.5 entrada de pulsadores
' ------------------------------------------------------------------------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 reg = CWPr ioByte = WPr0 GOSUB RTC_out oldSecs = $99 hrs = $06 GOSUB SetTime ' interrup. entradas ' deshabilita protec. de escritura
' 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 ' botn hacia atrs presionado?
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 UpdateClock: rawTime = rawTime // 1440 GOSUB SetRawTime GOTO Main2 DoSomeTask: ' otro cdigo aqu GOTO Main1 END
' enva valor actualiz. al DS1302 ' limpia modos de tiempo ' conf. Reloj para tiempo directo ' trabaja cuando no usa el reloj
' ------------------------------------------------------------------------ShowTime: DEBUG Home LOOKUP day,[Su,Mo,Tu,We,Th,Fr,Sa],work ' obtiene direccin de da GetDayChar: READ work,ioByte ' obtiene un caracter IF ioByte = 0 THEN CheckClockMode ' si 0, da terminado DEBUG ioByte ' imprime el caracter work = work + 1 ' apunta al siguiente GOTO GetDayChar CheckClockMode: DEBUG " ", CR ' limpia restos de da 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
' habilita todas las entradas ' controla botones ' pausa entre controles
Descripcin 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 aplicacin debe llevar registro de la hora y la fecha. La solucin ms 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 lneas para comunicarse con el BASIC Stamp. Dado que los dos dispositivos son compatibles, el reloj y las lneas de datos pueden ser compartidas pudiendo el BASIC Stamp realizar mediciones de temperatura y tiempo usando solamente cuatro pines de E/S.
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), da del mes, mes, da de la semana y ao con compensacin de bisiestos hasta el ao 2100. Como extra, el DS1302 contiene 31 bytes de RAM que podemos usar como queramos. Y para proyectos que usan la alimentacin principal, el DS1302 tambin tiene un circuito de carga que mantiene cargada una batera 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 (direccin de memoria). Por conveniencia, estn 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 conexin 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 matemticamente. En el cdigo, la hora es manejada como una nica variable tamao word (rawTime) que representa el nmero de minutos pasada la medianoche. De esta forma se pueden realizar clculos de duraciones y comparar tiempos de alarmas con la hora actual en forma directa. Otra buena razn para usar el formato de tiempo directo es que el DS1302 almacena sus registros en formato BCD (decimal codificado en binario). BCD es un mtodo 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 tamao nibble y ms importante an, permite poner sobrenombres a las variables. Este experimento demuestra lo bsico del DS1302 configurando el reloj y luego actualizndolo. Las conversiones del registro de formato BCD hacia y desde el DS1320 son realizadas por las subrutinas que envan y reciben datos en el modo burst (completo). Se usan cuatro pulsadores para fijar el da, horas y minutos del reloj. Normalmente, los botones incrementan cada valor. Manteniendo presionado el cuarto botn, cada elemento correr hacia atrs. Mientras no se presiona ningn botn, el programa pasa a una subrutina llamada DoSomeTask. Este es el sector donde podra poner cdigo adicional (leer un DS1620, por ejemplo). La salida del programa es mediante una ventana DEBUG. La subrutina ShowTime se encarga de imprimir el da y la hora en el formato especificado por ClockMode.
Experimento 30: Reloj de Tiempo Real Desafo (Avanzado) Agregue un DS1620 usando las conexiones que se muestran abajo. Escriba un programa que registre la temperatura actual, la mnima y la mxima y que muestre (use DEBUG) la hora y la fecha en que se tomaron estas temperaturas.
LEDs DQ Clock Reset RxD TxD Baud96 CMenu CID CSet CTmp CTmpC CTmpF CStat CLEDs RTmp WTHi WTLo RTHi RTLo StartC StopC WrCfg RdCfg cmd eeAddr eeData param char tmpIn halfBit
' entrada serial - a INEX RxD ' salida serial - a INEX TxD ' 9600-8-N-1 (compatible DEBUG) ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 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 lee temperatura escribe TH (reg. Temp. alta) escribe TL (reg. Temp. baja) lee TH lee TL inicia conversin detiene conversin escribe reg. configuracin lee reg. configuracin comando de la PC puntero de direccin EE dato EE parmetro desde la PC caracter de la terminal valor directo del DS1620 indicador de 0,5 grados C
' ------------------------------------------------------------------------Inicializar: DirA = %1111 GOSUB DS1620init 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 invlido: ",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 ' hace salidas los LEDs ' inicializa el DS1620
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
' etiqueta o rtulo ' puntero al primer caracter de ID ' ' ' ' lee caracter de EEPROM imprime caracter apunta al siguiente si no CR, lee otro
' apunta a ubicacin ID ' ' ' ' ' obtiene caracter de PC escribe caracter en EEPROM apunta a siguiente ubicacin si no CR, espera otro confirma nueva ID
Descripcin del Programa Sin comunicacin serial asincrnica el mundo no sera lo que es hoy. No habra cajeros automticos para controlar el estado de nuestras cuentas y retirar fondos. No podra haber Internet. Los experimentos anteriores han usado comunicacin serial sincrnica. En ese esquema, se necesitaban dos lneas: reloj y datos. El beneficio es la sincronizacin automtica del transmisor y receptor. El precio que pagamos es que se necesitan al menos dos cables para enviar un mensaje. La comunicacin serial asincrnica solamente necesita un cable para transmitir un mensaje. En este caso es necesario que el emisor y el receptor estn de acuerdo en la velocidad de la comunicacin antes de iniciar la transmisin de datos. Algunos sistemas inteligentes pueden detectar la velocidad de la comunicacin (baud rate), pero el BASIC Stamp no puede. En este experimento usamos SEROUT para enviar informacin a una terminal y SERIN para recibir datos. La entrada normalmente ser un comando y a veces el comando ser acompaado por datos nuevos. Despus 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 smbolo de interrogacin, significa que comienza una pregunta. Una vez que ingresa el signo de interrogacin, el modificador HEX hace que el BASIC Stamp busque caracteres hexadecimales vlidos (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 contine con el programa. Lo que en realidad sucede es que el BASIC Stamp ha usado la funcin SERIN para realizar una conversin de texto a nmero. 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 vlido. Si el comando no es vlido, se muestra un mensaje indicndolo.
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 parmetro y finalmente, un salto de lnea. Cuando usa un programa terminal, la salida es fcil de leer. Algo as: ID=Parallax BS2 El salto de lnea al final de la salida nos enva a la lnea 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 mayora de las preguntas son pedidos de informacin. Dos de ellas sin embargo, pueden modificar la informacin 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 ubicacin 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 cdigo ASCII, no necesitamos hacer ningn tratamiento especial. Cuando llega un caracter, WRITE es usada para almacenarlo en la EEPROM y se incrementa el puntero de direccin. Si el ltimo caracter era un salto de lnea (13), el programa emite la cadena nueva (usando el cdigo de ShowID), caso contrario repite la secuencia esperando el prximo 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 fcilmente 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>
Experimento 31: Comunicaciones Seriales La figura de abajo muestra una sesin 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 programacin al puerto RS-232 Interfacing Abra una ventana DEBUG haciendo clic en el cono DEBUG Encienda la plaqueta StampWorks.
Desafo (para programadores de PC) Escriba un programa de PC que se comunique con este experimento.
Trabajando por su Cuenta Vaya ms 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 dnde 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 Khnel y Klaus Zahnert Getting Started In Electronics por Forrest Mims Engineers Notebook por Forrest Mims Nuts & Volts Magazine Stamp Applications column
Sitios Web
www.parallaxinc.com
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 tcnicos de Tracy Allen
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.
BS2-IC/BS2SX-IC
RESET 7
7 6 5 4 3 2 1 0
D7 D6 D5 D4 D3 D2 D1 D0
LCD CONNECTOR
TxD
RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
GND PIEZO
VR-10k
1 2 3 4 +V 1 2
4 CHANNELS DRIVER
3 4
FREQUENCY
S4
S5
S3
S4
S5
OUTPUT
BASIC Stamp II Front-end K3 BASIC Stamp CONNECTOR K4 PUSH BUTTON SWITCH R3-R10 220x8 R11-R18 220x8
Switch circuit
LED Monitor
RESET
R2 10k*1 +5V R19-R26 220x8
SW1
S8 S7 S6 S5 S4 S3 S2 S1
7 6 5 4 3 2 1 0
P7 P6 P5 P4 P3 P2 P1 P0
10 P5 11 P6 12 P7
K8 D7 D6 D5 D4 D3 D2 D1 D0 a b c d e f g dp K9
DIGIT4 DIGIT3 DIGIT2 DIGIT1
DSP301
P10 15 P9 14 P8 13
Piezo Speaker
VARIABLE RESISTOR
NX-1000
J1 DC IN 9-12V
D1-D4 1N4001 x4
K14
C2 220/25V C3 0.1/50V
RS R/W E D7 D6 D5 D4 D3 D2 D1 D0
R/W D0 D2 D4 D6
RS E D1 D3 D5 D7
C1 0.1/50V
POWER
LED1
Universal training board for BASIC Stamp 2/2SX microcontroller module Digital circuit experiment Programmable Logic Device experiment and any small/medium microcontroller experiment
K10
RS-232 INTERFACING
+5V
+5V D5 1N4148 +5V Q1 BC547 R33 4k7 Q2 BC557 R34 4k7 C5 10/50V R35 1k8 R27 10k 1
R31 4k7
PULSE GENERATOR
HERTZ (Hz) 1k 100 10 LED2-LED5 1 C4 0.1/50V
RxD
K16 RS-232
1 R32 4k7
P2
4
OUT2
IC 3 7 P GX4100 2
3 8
The manufacturer of en ineering g educational products in Thailand, BASIC Stamp products distributor in
P3 K12 OUT P4
4 3 8 13 14 IC2 ULN2003
6 7 8 9 2 3 4 5 D6 1N4148
TxD
S10 FREQ. GND
Thailand