You are on page 1of 37

UTORIAL: Programacin de microcontroladores - Entrega 1

Ariel Palazzesi . Vista 280116 veces

1133 48 1181 Votos 99 Comentarios 99>> comenta

Muchos lectores de NeoTeo se han mostrado interesados en la programacin de microcontroladores. Desde hoy tendrn en forma semanal una entrega de este tutorial que les mostrar como hacerlo. Te apuntas?

La electrnica ha evolucionado mucho. Casi todo lo que hasta hace unos aos se hacia mediante un grupo (a veces muy numeroso) de circuitos integrados conectados entre si, hoy se puede realizar utilizando un microcontrolador y unos pocos componentes adicionales. De todos los fabricantes de microcontroladores que existen, los ms elegidos por los hobbystas suelen ser los modelos de Microchip, en gran parte debido a la excelente documentacin gratuita que proporciona la empresa para cada modelo. El lenguaje nativo de estos microcontroladores es el ASM, y en el caso de la familia 16F solo posee 35 instrucciones. Pero el ASM es un lenguaje que esta mucho ms cerca del hardware que del programador, y gracias a la miniaturizacin que permite incorporar cada vez ms memoria dentro de un microcontrolador sin aumentar prcticamente su costo, han surgido compiladores de lenguajes de alto nivel. Entre ellos se encuentran varios dialectos BASIC y C. El BASIC resulta bastante ms simple de aprender. Antes de comenzar a ver los temas programacin en si mismos, debemos aclarar algunos conceptos bsicos sobre los microcontroladores para poder entender lo que hace cada instruccin BASIC. Eso ser muy til para los que vayan a comenzar a programar a partir de este artculo. Lo ms interesante de trabajar con microcontroladores es que se necesitan conocimientos tanto de electrnica (hardware) como de programacin (software) as que a lo largo de estos tutoriales iremos viendo temas de ambas disciplinas, ya que ntimamente vinculadas. Un microcontrolador es como un ordenador en pequeo: dispone de una memoria donde se guardan los programas, una memoria para almacenar datos, dispone de

puertos de entrada y salida, etc. A menudo se incluyen puertos seriales (RS-232), conversores analgico/digital, generadores de pulsos PWM para el control de motores, bus I2C, y muchas cosas ms. Por supuesto, no tienen ni teclado ni monitor, aunque podemos ver el estado de teclas individuales o utilizar pantallas LCD o LED para mostrar informacin. En general, por cada cuatro ciclos de reloj del microcontrolador se ejecuta una instruccin ASM (una instruccin BASIC consta generalmente de mas de una instruccin ASM). Esto significa que un PIC funcionando a 20MHz puede ejecutar 5 millones de instrucciones por segundo. Los pines del PIC se dedican casi en su totalidad a los puertos que mencionbamos anteriormente. El resto (2 o mas) son los encargados de proporcionar la alimentacin al chip, y a veces, un sistema de RESET. Desde BASIC es posible saber si un pin esta en estado alto (conectado a 5V o a un 1 lgico) o en estado bajo (puesto a 0V o a un 0 lgico). Tambin se puede poner un pin de un puerto a 1 o 0. De esta manera, y mediante un rele, por ejemplo, se puede encender o apagar una luz, motor, maquina, etc. Uno de los microcontroladores ms famosos de todos los tiempos ha sido, sin duda, el 16F84A, que ya es considerado obsoleto. Un buen reemplazo es el 16F628A, y es el que utilizaremos en la mayora de los ejemplos y proyectos que veamos. La disposicin de sus pines es la siguiente:

Funcin de los pines del 16F628A

Como podemos ver, los pines 1, 2, 3, 4, 15, 16, 17 y 18 tienen el nombre de RAx. Esos pines conforman el puerto A, PORTA de ahora en ms. Los pines 6 al 13 forman parte del puerto B (PORTB). El pin 5 es el que se conectara al negativo de la fuente de alimentacin. El 14 ir conectado a 5V. Como habrn notado, muchos de los pines tienen ms de una descripcin. Esto se

debe a que pueden utilizarse de varias maneras diferentes, seleccionables por programa. Por ejemplo, el pin 4 sirve como parte del PORTA, como RESET (MCLR = Master Clear) y como tensin de programacin (Vpp) No es mala idea descargar desde la web de Microchip la hoja de datos de este microcontrolador (esta en ingls) para tenerla siempre a mano. Ahora bien Cmo colocamos el programa dentro del PIC? Para ello necesitamos algunas herramientas. Por un lado, es necesario un quemador de PICs, como el que publicamos en NeoTeo, o alguno de los varios disponibles comercialmente. Uno que me gusta particularmente es el GTP-USB+, ya que al funcionar conectado al puerto USB es muy veloz. Adems, necesitaremos un software que enve el programa al PIC. Para ello usaremos el WinPIC800, que es un excelente soft gratuito. Y tambin vamos a necesitar un compilador, para traducir nuestro programa en BASIC al ASM que es capaz de entender el PIC. Despus de mirar varios candidatos, en este momento parece una buena eleccin el PIC SIMULATOR IDE, que no solo es un excelente compilador de BASIC, si no que adems (y por solo 29 euros) ofrece un entorno de simulacin de nuestros circuitos. Existe una versin de prueba que se puede bajar gratuitamente desde aqu.

El GTP USB+, un excelente programador de micros y memorias.

El WinPic800 enviara el programa al PIC.

El PIC SIMULATOR IDE, entorno de programacion BASIC.

Para comenzar, usaremos un PIC 16F628A.

El primer ejemplo que veremos, equivalente al hola mundo de cualquier otro entorno de programacin, consiste en encender y apagar continuamente un LED conectado a uno de los pines del micro. Utilizaremos el circuito siguiente:

Nuestro primer ejemplo.

A diferencia de un programa de ordenador, donde uno escribe el programa, lo compila, lo ejecuta y ya, en el mundo de los microcontroladores hay que, previamente, definir el tipo de microcontrolador que se va a utilizar, cual va a ser su frecuencia de clock, como va a ser el circuito en que se va a utilizar el mismo, etc. En primer lugar, vamos a aprovechar el oscilador interno del 16F628A y nos evitaremos el cristal y condensadores asociados. El puerto B del micro tiene su pin 9 conectado a un LED mediante una resistencia de 220ohms, que tienen como funcin limitar la corriente que circula por el LED. Esta ser nuestra "salida". El circuito debe alimentarse con 5v bien filtrados y regulados. Volviendo a nuestro programa, vamos a escribir el "hola mundo" de los microcontroladores: encender un LED. El primer paso es elegir en PIC SIMULATOR IDE, desde el men "Opciones" -> "Select Microcontroller", el microcontrolador PIC16F628A. Luego, debemos configurar los bits correspondientes, como se ve en las figuras de ms abajo. Lo destacable por ahora de esta configuracin es que estamos dejando la memoria (FLASH y EEPROM) sin proteccin, que el pin RESET se va a comportar como I/O y que usaremos como oscilador el oscilador interno INTRC.

"Opciones" -> "Select Microcontroller"

"Opciones" -> "Configuration Bits"

Una vez hecho esto, arrancamos el editor de BASIC (presionando CTRL-C, por ejemplo), y escribimos el siguiente cdigo: AllDigital TRISA = %11111111 TRISB = %00000000 loop: PORTB.3 = 1 WaitMs 500 PORTB.3 = 0 WaitMs 500 Goto loop Vamos a analizarlo lnea por lnea para entender su funcionamiento: La lnea 1 utiliza la sentencia AllDigital para convertir todos los pines del micro en pines de E/S. Esto equivale a deshabilitar los comparadores, conversores A/D y todos

los mdulos que pudiese tener nuestro microcontrolador. No es la nica manera de hacer esto, pero si la mas sencilla. Las lneas 3 y 4 convierten todos los pines del puerto A en entradas ( TRISA = %11111111 ) y los del puerto B en salidas ( TRISB = %00000000 ). El "%" indica que el numero que viene a continuacin esta en binario. Se podra haber escrito, por ejemplo TRISB = 0 y hubiera sido lo mismo. Personalmente me gusta esta manera, ya que "veo" el estado de cada pin. Por supuesto, es valido activar como entrada algunos pines, y como salidas otros, haciendo algo parecido a TRISB = %11000111. En la lnea 6 encontramos una "etiqueta" ( loop: ). Esta no hace nada, solo sirve como referencia para enviar el flujo del programa a esa lnea desde otro lugar, mediante la sentencia "Goto". La lnea 7 pone en "1" el pin correspondiente a PORTB.3, de manera que en el pin 9 del microcontrolador habr 5V. Esta tensin har que circule una corriente a travs de la resistencia limitadora y el LED1, haciendo que este se encienda, ya que el ctodo se encuentra conectado a 0V. En 8 tenemos la sentencia WaitMs 500. WaitMs se encarga de hacer una pausa en milisegundos. La duracin de la pausa esta dada por el nmero que sigue a la instruccin, en este caso 500 milisegundos, o medio segundo. Luego, en 9, otra vez se vuelve a poner en 0 el pin 9, mediante PORTB.3 = 0 , lo que provoca que ese pin se ponga a 0V, y no haya mas circulacin de corriente a travs de la resistencia y del LED, con lo que este se apaga. En la lnea 10 se hace nuevamente una pausa de medio segundo, y por ultimo, la lnea Goto Loop hace que el programa contine en la lnea 6 (que es donde esta la etiqueta Loop). El programa se repite indefinidamente, encendiendo el LED medio segundo, apagndolo otro medio segundo. Con esto, terminamos la primera entrega de este tutorial. Solamente hemos araado la superficie de un mundo apasionante. No te pierdas la segunda entrega la prxima semana.

Proyecto con un microcontrolador.

.: Sistemas microcontrolados

El diagrama de un sistema microcontrolado sera algo as

Los dispositivos de entrada pueden ser un teclado, un interruptor, un sensor, etc. Los dispositivos de salida pueden ser LED's, pequeos parlantes, zumbadores, interruptores de potencia (tiristores, optoacopladores), u otros dispositivos como rels, luces, un secador de pelo, en fin.. lo que quieras. Aqu tienes una representacin en bloques del microcontroador, para que te des una idea, y puedes ver que lo adaptamos tal y cual es un ordenador, con su fuente de alimentacin, un circuito de reloj y el chip microcontrolador, el cual dispone de su CPU, sus memorias, y por supuesto, sus puertos de comunicacin listos para conectarse al mundo exterior.

Definamos entonces al microcontrolador; Es un circuito integrado programable, capaz de ejecutar las rdenes grabadas en su memoria. Est compuesto de varios bloques funcionales, los cuales cumplen una tarea especfica. Sacado de un libro...!!!. En fin estas son bsicamente algunas de sus partes...

Memoria ROM (Memoria de slo lectura) Memoria RAM (Memoria de acceso aleatorio) Lneas de entrada/salida (I/O) Tambin llamados puertos Lgica de control Coordina la interaccin entre los dems bloques

Eso no es todo, algunos traen funciones especiales, ya hablaremos de ellas.


.: Microcontroladores PIC16CXX/FXX de Microchip

Me referir a estos porque sern los que utilizar aqu, (al menos por ahora). Estos micros pertenecen a la gama media y disponen de un set de 35 instrucciones, por eso lo llaman de tipo RISC (Reduced Instruction Set Computer) en entendible sera "Computador con Set de Instrucciones Reducido" pocas instrucciones pero muy poderosas, otras son de tipo CISC (Complex Instruction Set Computer - Computador con Set de Instrucciones Complejo), demasiadas instrucciones, y lo peor, difciles de recordar. Esta familia de microcontroladores se divide en tres rangos segn la capacidad de los microcontroladores. El ms bajo lo compone la familia 16C5X. El rango medio lo componen las familias 16C6X/ 7X/ 8X, algunos con conversores A/D, comparadores, interrupciones, etc. La familia de rango superior lo componen los 17CXX. Estas son las funciones especiales de las cuales disponen algunos micros...

Conversores anlogo a digital (A/D) en caso de que se requiera medir seales analgicas, por ejemplo temperatura, voltaje, luminosidad, etc. Temporizadores programables (Timer's) Si se requiere medir perodos de tiempo entre eventos, generar temporizaciones o salidas con frecuencia especfica, etc. Interfaz serial RS-232. Cuando se necesita establecer comunicacin con otro microcontrolador o con un computador. Memoria EEPROM Para desarrollar una aplicacin donde los datos no se alteren a pesar de quitar la alimentacin, que es un tipo de memoria ROM que se puede programar o borrar elctricamente sin necesidad de circuitos especiales. salidas PWM (modulacin por ancho de pulso) Para quienes requieren el control de motores DC o cargas resistivas, existen microcontroladores que pueden ofrecer varias de ellas.

Tcnica llamada de "Interrupciones", (sta me gust) Cuando una seal externa activa una lnea de interrupcin, el microcontrolador deja de lado la tarea que est ejecutando, atiende dicha interrupcin, y luego contina con lo que estaba haciendo.

Todo esto, slo para tener una idea de lo que son los micros, ahora vamos a un par de ellos en especial
Presentacin oficial! - PIC16C84/F84

El PIC16C84 est fabricado en tecnologa CMOS, consume baja potencia, y es completamente esttico (si el reloj se detiene, los datos de la memoria no se pierden). El 16F84 tiene las mismas caractersticas pero posee memoria FLASH, esto hace que tenga menor consumo de energa, y como si fuera poco tiene mayor capacidad de almacenamiento. El encapsulado ms comn para estos microcontrolador es el DIP (Dual In line Pin) de 18 pines, (el nuestro... ), y utiliza un reloj de 4 MHz (cristal de cuarzo). Sin embargo, hay otros tipos de encapsulado, por ejemplo, el encapsulado tipo surface mount (montaje superficial) es mucho + pequeo.

.: Terminales del microcontrolador y sus respectivas funciones:

sta sera la disposicin de sus terminales y sus respectivos nombres...

Encapsulado DIP - PIC16C84/F84 Patas 1, 2, 3, 17 y 18 (RA0-RA4/TOCKI): Es el PORT A. Corresponden a 5 lneas bidireccionales de E/S (definidas por programacin). Es capaz de entregar niveles TTL cuando la alimentacin aplicada en VDD es de 5V 5%. El pin RA4/TOCKI como entrada puede programarse en funcionamiento normal o como entrada del contador/temporizador TMR0. Cuando este pin se programa como entrada digital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer seales un poco distorsionadas y llevarlas a niveles lgicos (cero y cinco voltios). Cuando se usa

como salida digital se comporta como colector abierto; por lo tanto se debe poner una resistencia de pull-Up (resistencia externa conectada a un nivel de cinco voltios, ...no te preocupes, mas abajo lo entenders mejor). Como salida, la lgica es inversa: un "0" escrito al pin del puerto entrega a la salida un "1" lgico. Este pin como salida no puede manejar cargas como fuente, slo en el modo sumidero. Pata 4 (MCLR / Vpp): Es una pata de mltiples aplicaciones, es la entrada de Reset (master clear) si est a nivel bajo y tambin es la habilitacin de la tensin de programacin cuando se est programando el dispositivo. Cuando su tensin es la de VDD el PIC funciona normalmente. Patas 5 y 14 (VSS y VDD): Son respectivamente las patas de masa y alimentacin. La tensin de alimentacin de un PIC est comprendida entre 2V y 6V aunque se recomienda no sobrepasar los 5.5V. Patas 6, 7, 8, 9, 10, 11, 12, 13 (RB0-RB7): Es el PORT B. Corresponden a ocho lneas bidireccionales de E/S (definidas por programacin). Pueden manejar niveles TTL cuando la tensin de alimentacin aplicada en VDD es de 5V 5%. RB0 puede programarse adems como entrada de interrupciones externas INT. Los pines RB4 a RB7 pueden programarse para responder a interrupciones por cambio de estado. Las patas RB6 y RB7 se corresponden con las lneas de entrada de reloj y entrada de datos respectivamente, cuando est en modo programacin del integrado. Patas 15 y 16 (OSC1/CLKIN y OSC2/CLKOUT): Corresponden a los pines de la entrada externa de reloj y salida de oscilador a cristal respectivamente.
.: Ahora un poco de electrnica:

Esto comienza a ponerse interesante, no crees...?, ok sigamos... Como estos dispositivos son de tecnologa CMOS, todos los pines deben estar conectados a alguna parte, nunca dejarlos al aire porque se puede daar el integrado. Los pines que no se estn usando se deben conectar a la fuente de alimentacin de +5V, como se muestra en la siguiente figura...

.: Capacidad de corriente en los puertos

La mxima capacidad de corriente de cada uno de los pines de los puertos en modo sumidero (sink) es de 25 mA y en modo fuente (source) es de 20 mA. La mxima capacidad de corriente total de los puertos es: PUERTO A PUERTO B 150 mA Modo Sumidero 80 mA

Modo Fuente

50 mA

100 mA

As se vera la conexin para ambos modos de funcionamiento.

.: El oscilador externo

Es un circuito externo que le indica al micro la velocidad a la que debe trabajar. Este circuito, que se conoce como oscilador o reloj, es muy simple pero de vital importancia para el buen funcionamiento del sistema. El P1C16C84/F84 puede utilizar cuatro tipos de reloj diferentes. Estos tipos son:

RC. Oscilador con resistencia y condensador. XT. Cristal. HS. Cristal de alta velocidad. LP. Cristal para baja frecuencia y bajo consumo de potencia.

En el momento de programar o "quemar" el microcontrolador se debe especificar que tipo de oscilador se usa. Esto se hace a travs de unos fusibles llamados "fusibles de configuracin" o fuses. Aqu utilizaremos el cristal de 4 MHz, porque garantiza mayor precisin y un buen arranque del microcontrolador. Internamente esta frecuencia es dividida por cuatro, lo que hace que la frecuencia efectiva de trabajo sea de 1 MHz, por lo que cada instruccin se ejecuta en un microsegundo. El cristal debe ir acompaado de dos condensadores y el modo de conexin es el siguiente...

Si no requieres mucha precisin en el oscilador, puedes utilizar una resistencia y un condensador, como se muestra en la figura. donde OSC2 queda libre entregando una seal cuya frecuencia es la del OSC/4.

Segn las recomendaciones de Microchip R puede tomar valores entre 5k y 100k, y C superior a 20pf.
.: Reset

El PIC 16C84/F84 posee internamente un circuito temporizador conectado al pin de reset que funciona cuando se da alimentacin al micro, se puede entonces conectar el pin de MCLR a la fuente de alimentacin. Esto hace que al encender el sistema el microcontrolador quede en estado de reset por un tiempo mientras se estabilizan todas las seales del circuito (lo cual es bastante bueno, por eso siempre la usaremos...).

Este ltimo circuito, es por si deseas tener control sobre el reset del sistema, slo le conectas un botn y listo... Ahora vamos al interior del micro

.: Estructura interna del Microcontrolador

Uffff...!!!, Ya se...!!!, tranquilo que ya comenzaremos con lo que estas esperando, antes debemos saber donde alojar nuestro programa, como se va a ejecutar, y como configurar sus puertos.
.: Arquitectura interna del PIC:

Hay dos arquitecturas conocidas; la clsica de von Neumann, y la arquitectura Harvard, veamos como son... Arquitectura Von Neumann Dispone de una sola memoria principal donde se almacenan datos e instrucciones de forma indistinta. A dicha memoria se accede a travs de un sistema de buses nico (direcciones, datos y control).

Arquitectura Harvard Dispone de dos memorias independientes, una que contiene slo instrucciones, y otra que contiene slo datos. Ambas disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o escritura) simultneamente en ambas memorias, sta es la estructura para los PIC's.

Ahora vamos por partes, o creo que me voy a perder... :oP


.: El procesador o UCP

Es el elemento ms importante del microcontrolador. Se encarga de direccionar la memoria de instrucciones, recibir el cdigo OP de la instruccin en curso, decodificarlo y ejecutarlo, tambin realiza la bsqueda de los operandos y almacena el resultado.
.: Memoria de programa

Esta vendra a ser la memoria de instrucciones, aqu es donde almacenaremos nuestro programa o cdigo que el micro debe ejecutar. No hay posibilidad de utilizar memorias externas de ampliacin. Son 5 los tipos de memoria. pero slo describir dos:

Memorias EEPROM. (Electrical Erasable Programmable Read Only Memory Memoria de slo lectura Programable y borrable elctricamente) Comn en el PIC 16C84. sta tarea se hace a travs de un circuito grabador y bajo el control de un PC. El nmero de veces que puede grabarse y borrarse una memoria EEPROM es finito aproximadamente 1000 veces, no es acaso suficiente...?. Este tipo de memoria es relativamente lenta. Memorias FLASH. Disponible en el PIC16F84. Posee las mismas caractersticas que la EEPROM, pero sta tiene menor consumo de energa y mayor capacidad de almacenamiento, por ello est sustituyendo a la memoria EEPROM.

La memoria de programa se divide en pginas de 2,048 posiciones. El PIC16F84A slo tiene implementadas 1K posiciones es decir de 0000h a 03FFh y el resto no est implementado. (es aquello que se ve en gris)

Cuando ocurre un Reset, el contador de programa (PC) apunta a la direccin 0000h, y el micro se inicia nuevamente. Por esta razn , en la primera direccin del programa se debe escribir todo lo relacionado con la iniciacin del mismo (por ejemplo, la configuracin de los puertos...). Ahora, si ocurre una interrupcin el contador de programa (PC) apunta a la direccin 0004h, entonces ah escribiremos la programacin necesaria para atender dicha interrupcin. Algo que se debe tener en cuenta es la pila o Stack, que consta de 8 posiciones (o niveles), esto es como una pila de 8 platos el ltimo en poner es el primero en sacar, si seguimos con este ejemplo, cada plato contiene la direccin y los datos de la instruccin que se est ejecutando, as cuando se efecta una llamada (CALL) o una interrupcin, el PC sabe donde debe regresar (mediante la instruccin RETURN, RETLW o RETFIE, segn el caso) para continuar con la ejecucin del programa. Recuerda, slo 8 llamadas "CALL", ten en cuenta las "INTERRUPCIONES".
.: Memoria de datos

Tiene dos zonas diferentes: 1. RAM esttica SRAM: donde residen los Registros Especficos (SFR) con 24 posiciones de tamao byte, aunque dos de ellas no son operativas y los Registros de Propsito General (GPR) con 68 posiciones. La RAM del PIC16F84A se halla dividida en dos bancos (banco 0 y banco 1) de 128 bytes cada uno (7Fh)

2. EEPROM: de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentacin. O.k., ahora unas cuantas palabras finales y comenzamos con lo ms emocionante.

.: Configuracin de los puertos del PIC

Lleg el momento de ver como configurar los puertos del PIC. Para poder hacerlo es necesario conocer la tabla de registros de la memoria de datos, la cual como dijimos, est dividida en el BANCO 0 y BANCO 1. Los registros importantes en la configuracin de los puertos son: STATUS direccin 0x3 PORTA direccin 0x5 PORTB direccin 0x6 TRISA direccin 0x5 TRISB direccin 0x6 Por defecto el PIC tendr todos los I/O port's (es decir los puertos RA y RB), colocados como entrada de datos, y si queremos cambiarlos habr que configurarlos. Al configurar los puertos debers tener en cuenta que:

Si asignas un CERO (0) a un pin, ste quedar como salida y... Si le asignas un UNO (1), quedar como entrada Esta asignacin se hace en: TRISA para los pines del PUERTO A (5 bits) TRISB para los pines del PUERTO B (8 bits)
.: Por Ejemplo:

Si TRISA es igual a 11110 todos sus pines sern entradas salvo RA0 que esta como salida Si TRISB es igual a 00000001 todos sus pines sern salidas salvo RB0 que esta como entrada Cuando el PIC arranca se encuentra en el BANCO 0, como TRISA y TRISB estn en el BANCO 1 no queda otra, deberemos cambiar de banco. Esto se logra a travs del Registro STATUS STATUS es un Registro de 8 bits u 8 casillas, en el cual la N 5 (RP0) define la posicin del banco en donde nos encontramos Si pones un CERO (0) a RP0 estaremos en el BANCO 0 Si le pones un UNO (1) ya ves, estaremos en el BANCO 1 REGISTRO STATUS 5 4 3 2 RP0 TO PD Z

7 IRP

6 RP1

1 DC

0 C

Listo, ahora ya sabemos como configurar los puertos, pero lo aclararemos con un ejemplo completo. Vamos a escribir un cdigo que configure todos los pines del puerto A como entrada y todos los del puerto B como salida.

;---------------Encabezado------------list radix p=16f84 hex ; usaremos el PIC 16f84 ; y la numeracin hexadecimal

;------------mapa de memoria--------estado equ los trisa equ posicin trisb equ 0x03 0x05 0x06 ; Aqu le asignamos nombres a ; registros indicando la ; en la que se encuentran

;-------Configuracin de puertos------reset org comenzar 0x00 ; origen del programa, aqu ; siempre que ocurra un reset ; salto a "inicio" ; origen del cdigo de ; pongo rp0 a 1 y ; cargo W con 11111 ; y paso el valor a trisa ; cargo W con 00000000 ; y paso el valor a trisb ; pongo rp0 a 0 y

goto inicio org 0x05 programa inicio bsf estado,5 paso al banco1 movlw b'11111' movwf trisa movlw b'00000000' movwf trisb bcf estado,5 regreso al banco0

;-----------------------------------------end ; se acab ;-----------------------------------------.: Descripcin del cdigo:

Todo lo que escribas luego de un ";" (punto y coma) ser ignorado por el ensamblador, estos son los famosos comentarios, y sirve para saber que hace cada lnea de cdigo. Dicho esto no queda ms que describir el cdigo, as que vamos por partes.
;---------------Encabezado------------list radix p=16f84 hex ; usaremos el PIC 16f84 ; y la numeracin hexadecimal

Aqu le indicas al ensamblador para que microcontrolador estas codificando (PIC16F84). y cual ser el sistema de numeracin que utilizars (hexadecimal). Nota que hay tres columnas, en este caso la primera est vaca. Respeta las tabulaciones para no confundir al ensamblador.
;------------mapa de memoria--------estado equ los trisa equ posicin trisb equ 0x03 0x05 0x06 ; Aqu le asignamos nombres a ; registros indicando la ; en la que se encuentran

Recuerdas lo de la memoria de datos...? Bien, al registro STATUS, que est en la posicin 0x03 de la memoria de datos le puse la etiqueta "estado". equ es algo as comoooo...igual . (Es decir, le estoy asignando el nombre estado al registro que est en la posicin 0x03 de la memoria de datos).

Luego hice lo mismo con trisa y trisb. Ahora sigamos...


;-------Configuracin de puertos------reset org comenzar 0x00 ; origen del programa, aqu ; siempre que ocurra un reset ; salto a "inicio" ; origen del cdigo de ; pongo rp0 a 1 y ; cargo W con 11111 ; y paso el valor a trisa ; cargo W con 00000000 ; y paso el valor a trisb ; pongo rp0 a 0 y

goto inicio org 0x05 programa inicio bsf estado,5 paso al banco1 movlw b'11111' movwf trisa movlw b'00000000' movwf trisb bcf estado,5 regreso al banco0

La directiva org indica el sitio de la memoria en donde se escribe una parte del programa. En este caso el contador de programa apuntar a la direccin 0x00 (reset) entonces ejecutar la instruccin que sigue a continuacin, (saltar a la etiqueta inicio) y nuestro cdigo de programa comienza en la direccin de memoria 0x05 (aqu salto por encima de la interrupcin 0x04) BSF (SET FILE REGISTER), es la instruccin que pone un uno en el bit del registro especificado, en este caso pone a uno el bit 5 del registro STATUS (el rp0), para pasar al banco 1. movlw es algo as como... mueve el siguiente literal al Registro W. W es el Registro de Trabajo, y lo usamos para almacenar momentneamente los datos que queremos mover. una vez hecho esto pasamos el dato a trisa, o a trisb, segn el caso. movwf es algo as como... mueve el contenido del registro W al registro f, en este caso f sera trisa o trisb. BCF (BIT CLEAR FILE REGISTER), sta instruccin limpia el bit del registro especificado, o lo pone a cero, en este caso pone a cero el bit 5 del registro STATUS para regresar al banco 0.
;-----------------------------------------end ; se acab ;------------------------------------------

Fue suficiente por hoy...

.: Programando en serio

Debo confesar que el programa anterior aunque parezca una burrada, lo utilizaremos de tiempo completo, y lo nico que cambiaremos sern los pines de entrada y salida. Te recuerdo que lo que hicimos hasta ahora, solo fue configurar los puertos, pero no genera ninguna seal ni nada por el estilo. Ahora si programaremos en serio. Encenderemos un LED, lo mantendremos encendido por un tiempo, luego lo apagaremos y haremos que se repita todo de nuevo. Recuerda ponerle un nombre, aqu lo llamar LED1.asm (no olvides el .asm)
.: Comencemos

;---------------Encabezado------------LIST radix p=16f84 hex

;------------mapa de memoria--------estado equ TRISB equ ptob equ reg1 equ utilizar reg2 equ reg3 equ 0x03 0x06 0x06 0x0C 0x0D 0x0E ; Haciendo asignaciones

; Estos 3 registros los ; para hacer el retardo

;-------Configuracin de puertos------reset org comenzar 0x00 ; origen del programa, aqu

; siempre que ocurra un reset goto inicio ; salta a "inicio" inicio bsf estado,5 ; pone rp0 a 1 y pasa al banco1 movlw b'00000000' ; carga W con 00000000 movwf TRISB ; y pasa el valor a trisb bcf estado,5 ; pone rp0 a 0 y regresa al banco0 ;----Aqu enciende y apaga el LED----ahora bsf el LED) call bcf call goto ptob,0 retardo ptob,0 retardo ahora ; pone un 1 en RB0 (enciende ; llama al retardo ; pone a 0 RB0 (apaga el LED) ; llama al retardo ; repite todo de nuevo

;-----------Rutina de Retardo----------retardo movlw registros movwf tres movlw 10 reg1 20 ; Aqu se cargan los ; reg1, reg2 y reg3 ; con los valores 10, 20 y 30 ; respectivamente

movwf dos movlw movwf

reg2 30 reg3 reg3,1 uno reg2,1 dos reg1,1 tres 00 ; Aqu se comienza a ; ; ; ; ; ; ; Cuando reg3 llegue a 0 le quitare 1 a reg2 cuando reg2 llegue a 0 le quitare 1 a reg1 cuando reg1 llegue a 0 regresare al lugar de donde se hizo la llamada

uno decfsz decrementar goto decfsz goto decfsz goto retlw

;-----------------------------------------end ; se acab ;-----------------------------------------.: Descripcin del cdigo:

No te asustes por el tamao del cdigo, que aunque parezca difcil todo est igual que el cdigo anterior, por lo que slo describir los cambios... (lo que est en rojo) Se agregaron 3 registros mas (reg1, reg2 y reg3), stos vendran a ser como variables ubicadas en sus respectivas posiciones (0x0C, 0x0D, 0x0E,) y son registros de propsito general (recuerda que para el PIC16F84 son 68, puedes elegir cualquiera). A dems se agreg ptob, etiqueta que corresponde a la direccin del puerto B Analicemos lo que sigue..., que ste es el programa en s:
;----Aqu enciende y apaga el LED----ahora bsf el LED) call bcf call goto ptob,0 retardo ptob,0 retardo ahora ; pone un 1 en RB0 (enciende ; llama al retardo ; pone a 0 RB0 (apaga el LED) ; llama al retardo ; repite todo de nuevo

La etiqueta "ahora" es el nombre de todo este procedimiento o rutina, de tal modo que cuando quiera repetir el procedimiento solo saltare a "ahora". bsf es poner a uno un bit, en este caso al primer bit (el bit 0) del puerto B (ptob). call es una llamada, en este caso llama a la rutina de retardo, cuando regrese, continuar con el cdigo. bcf es poner a cero un bit, en este caso al primer bit (bit 0) del puerto B (ptob). y luego llama al retardo, cuando regrese se encontrar con la instruccin goto obligndolo a saltar a la etiqueta ahora para que se repita todo de nuevo. Eso es todo...!!!.

.: Rutina de retardo

Esta es la parte ms difcil, pero tratar de hacerlo sencillo as puedes continuar con lo que sigue y no te trabas en esta parte. Primero veremos como se cargan los registros para el retardo. Veamos el cdigo...
;-----------Rutina de Retardo----------retardo movlw registros movwf tres dos movlw movwf movlw movwf 10 reg1 20 reg2 30 reg3 ; Aqu se cargan los ; reg1, reg2 y reg3 ; con los valores 10, 20 y 30 ; respectivamente

Recordemos que en el mapa de memoria los registros 0x0C, 0x0D y 0x0E fueron nombrados como reg1, reg2 y reg3 respectivamente. Ahora simularemos los tres registros para ver como se cargan mediante el registro de trabajo W, (utilizamos W por que los valores 10, 20 y 30 son valores constantes). Repito, esto es una simulacin bien a lo bruto, as que vamos a suponer que en vez de 10 cargo 1, en lugar de 20 cargo 2 y en lugar de 30 cargo 3, hago esto, solo con fines didcticos as podrs comprenderlo mejor, ok?.

Lo que acabas de ver, fue la carga de los registros reg1, reg2 y reg3. Ahora vers como se comienza a decrementar cada uno de esos registros, primero reg3, luego reg2 y finalmente reg1.
tres dos movlw movwf movlw movwf 20 reg2 30 reg3 reg3,1 uno reg2,1 dos reg1,1 ; Aqu se comienza a ; ; ; ; Cuando reg3 llegue a 0 le quitare 1 a reg2 cuando reg2 llegue a 0 le quitare 1 a reg1 ; respectivamente

uno decfsz decrementar goto decfsz goto decfsz

goto retlw

tres 00

; cuando reg1 llegue a 0 ; regresare al lugar ; de donde se hizo la llamada

Veamos, decfsz reg3,1 esto es, decrementa reg3, si al decrementar te da cero saltate una lnea. El 1 que sigue a reg3, indica que guarde el valor de reg3 decrementado en el mismo reg3, es comoooo.... contador=contador-1 (se entiende...?) goto, es saltar y goto uno es saltar a la etiqueta uno. En esta pequea vuelta estoy decrementando reg3 hasta que se haga cero. Cuando reg3 llegue a 0 decrementar reg2 en una unidad, volver a cargar reg3 y lo decrementar nuevamente para recin restarle otra unidad a reg2, y as... hasta que reg2 se haga cero. Cuando eso ocurra decrementar reg1 en una unidad, cargar nuevamente reg2 y reg3, para luego decrementarlos de nuevo, todo esto ocurrir hasta que reg1 se haga igual a cero.

Esta rutina de retardo, aunque parezca absurda y larga nos permite ver como se enciende y se apaga el LED, de lo contrario no podramos notar la diferencia, o lo veramos apagado o encendido, ya que la velocidad es demasiado alta si estamos trabajando con un XT de 4 MHz. Finalmente nos queda la ltima instruccin:
;-----------------------------------------end ; se acab ;------------------------------------------

Sin palabras. Una vez cargado el programa en el PIC, necesitars ver el programa funcionando, por lo que debers armar este circuito.

El pin 4 (MCLR) est conectado por lo del Reset, para que se estabilicen los niveles de tensin.

.: Un poco de herramientas

Lo anterior estuvo brbaro, pero dnde voy a escribir el cdigo?, como se hace para ensamblar?, y cmo cargo mi programa en el PIC?, mmmmm... demasiadas preguntas, comencemos de cero... Necesitaras:

Un PC (con una 386 ms que suficiente). El programa para editar tu cdigo, que bien podra ser el Edit del DOS y as generar tu archivo .asm Como ensamblador, yo utilizo es Mpasm 2.15 y puedes bajarlo de www.microchip.com y con ste me basta para generar los archivos .hex El programa para grabar el PIC, Con el Prog V.1.41 no tuve problemas y va perfecto con mi circuito grabador, puedes buscarlo en www.webelectronica.com.ar, ahora tambin disponible desde aqu Por supuesto necesitas el Hardware (circuito electrnico que se conecta al puerto de la PC) en el que insertars el PIC para cargar el programa, hay muchsimos por la red, pero si quieres el que yo utilizo, aqu tienes el esquema elctrico, el listado de componentes y la conexin al puerto paralelo, si ya lo quieres montado y listo para usar, contacta conmigo, que ms puedo decir...

Ahora s..., con todo esto y los programas instalados en la mquina, podemos comenzar... Abre una ventana del DOS y apunta al directorio donde tienes todas tus herramientas, yo las puse en una carpeta llamada tutor, si haces lo que yo, te quedar algo as... C:\tutor>edit Una vez ah puedes escribir tu cdigo..., por ltimo lo guardamos seleccionando el men Archivo --> Guardar como --> led1.asm No olvides el .asm

Muy bien, ya tenemos led1.asm, slo resta ensamblarlo. Entonces vamos por Mpasm, lo abres, y veras algo como esto...

En Sourse File presiona Enter para seleccionar el archivo a ensamblar Haz lo mismo en Processor Type y busca el PIC16f84, que es el que usaremos, el resto lo dejas como est..., te debera quedar algo as...

sto, generar el archivo LED1.ERR, LED1.LST, y LED1.HEX, este ltimo es el que estamos buscando, los anteriores sirven para saber si se cometi algn error, si es as debes abrirlos (con el Bloc de Notas es suficiente) corregir los errores y ensamblar nuevamente. Para ensamblar slo debes presionar F10 y vers la ventana de resultados

Que como es lgico... no comet errores =P. Aunque por ah apareci un Warning, que en realidad no es causa de falla en el cdigo. Bien, ya tenemos LED1.HEX y es el que cargaremos en el pic. Lo que viene es una imagen representativa del grabador de pic, con el cable que se conectar al puerto paralelo, y la fuente de alimentacin externa. No coloques el PIC sin haber hecho las conexiones anteriores.

Ya puedes ejecutar el software de programacin, abre Prog.exe y seguramente se apagarn los LED's rojo y verde (si estaban encendidos...!). Te aparecer la siguiente ventana

haciendo click en Open File seleccionas LED1.HEX y aqu est...

Colocas el PIC en el grabador, luego Seleccionas la opcin Program y esperas a que te aparezca el mensaje Programming Complete

Ejemmmmm, perdn... este mensajito sali porque el pic ya tena un programa grabado, bueno, no importa, como es regrabable, slo le daremos a ok y listo, el nuevo programa borrar al anterior.

Ahora siiiiii...!!!, Si todo fue bien, ya puedes quitar el PIC del zcalo y llevarlo a tu circuito para ver como funciona. Algo que me estaba quedando en el tintero son los fusibles de programacin, como: Device el tipo de chip, en nuestro caso el 8x; Rom Size la cantidad de memoria, en nuestro caso de 1k; OSC el tipo de oscilador que utilizaremos, para nosotros un XT; Watchdog Timer El perro guardin, que aqu no lo utilizamos; Code protect para que nadie tenga acceso al cdigo grabado en el PIC; Power Up Timer temporizador de encendido. En el PIC16f84, funciona de modo invertido, por eso est en LOW. Para mayor detalle consulta aqu. Ahora que ya estamos listos y preparados con todo el soft y el hard necesario, lo nico que necesitamos es complicarnos un poco mas las cosas, all vamos........

.: Antes de empezar

Si bien nos vamos a complicar con las siguientes lecciones, sera bueno que consultes el Set de instrucciones, as ser mas fcil que comprendas cada lnea de cdigo que se escribe, ya que cada una est acompaada de su respectivo ejemplo, y una vez lo comprendas puedes quedarte con el Resumen de instrucciones. Lo que haremos ahora ser un programa que encienda 4 LED's en forma secuencial, y para ello recurriremos a la rutina de retardo del programa anterior, que espero lo hayas comprendido, si no es as regresa y no vengas aqu hasta que lo entiendas :o)) Ok, sigamos. El circuito ser el siguiente...

Y el cdigo que realiza la secuencia es el que viene a continuacin.


;---------------Encabezado------------LIST radix p=16f84 hex

;------------mapa de memoria--------estado TRISB ptob rotar reg1 reg2 reg3 equ equ equ equ equ equ equ 0x03 0x06 0x06 0x0A 0x0C 0x0D 0x0E ; Haciendo asignaciones ; para desplazar el dato ; para hacer el retardo

;-------Configuracin de puertos------reset org 0x00 inicio 0x05 estado,5 b'00000000' TRISB estado,5 ; salta a "inicio" ; aqu comienza el programa ; configurando el

goto org inicio bsf puerto B movlw movwf bcf

;----Realiza la secuencia de LED's-----

ahora

movlw movwf

0x01 rotar rotar,0 ptob

; carga W con 00000001 ; lo pasa al registro rotar ; pasa el contenido de rotar ; y de all al puerto B ; encendiendo el LED ; llama a retardo ; desplaza un bit el ; de rotar y lo guarda. ; prueba si se activa el 5to. ; si es as saltea una lnea ; sino, sigue rotando ; repite todo de nuevo

rotando movf a W movwf

correspondiente call retardo rlf rotar,1 contenido btfss bit goto goto rotando ahora rotar,4

;-----------Rutina de Retardo----------retardo movlw movwf tres dos uno movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto retlw 10 reg1 20 reg2 30 reg3 reg3,1 uno reg2,1 dos reg1,1 tres 00 ; ; ; ; ; Comienza a decrementar cuando termine regresar a la siguiente lnea de cdigo de donde fue llamado ; ; ; ; Carga los registros reg1, reg2 y reg3 con los valores 10, 20 y 30 respectivamente

;-----------------------------------------end ; The End ;------------------------------------------

Todo est como antes, salvo lo que est en rojo. Veamos de que se trata eso de rotar y rotando.
;----Realiza la secuencia de LED's----ahora movlw movwf 0x01 rotar rotar,0 ptob ; carga W con 00000001 ; lo pasa al registro rotar ; pasa el contenido de rotar ; y de all al puerto B ; encendiendo el LED ; llama a retardo ; desplaza un bit el

rotando movf a W movwf

correspondiente call retardo rlf rotar,1 contenido

btfss bit goto goto

rotar,4 rotando ahora

; de rotar y lo guarda. ; prueba si se activa el 5to. ; si es as saltea una lnea ; sino, sigue rotando ; repite todo de nuevo

rotar es el registro en el que almacenar momentneamente el valor del desplazamiento de los bit's. As cuando llegue al 5to. no enviar ese dato ya que se habr activado el 4to. bit del puerto B del PIC (sera el 4to. LED), y entonces volver a comenzar.
.: Descripcin del cdigo:

Ok, voy a poner a 1 el primer bit del registro rotar a travs de w, esto se hace en las dos primeras lneas. rotando, es una subrrutina: Aqu se pasa el contenido del registro rotar o sea (00000001) a W (por eso el 0) para luego enviarlo al puerto B (portb), y encender el primer LED, luego llama al retardo, cuando regrese se encontrar con la siguiente instruccin. rlf rotar,1 esto es como decirle, rota el contenido del registro rotar un lugar a la izquierda, y guarda el valor en el mismo registro rotar (por eso el 1). Es decir, que si antes rotar=00000001 luego de esta instruccin rotar=00000010. Ahora viene la verificacin del 5to. bit, para saber si complet la rotacin. btfss rotar,4 es como si le preguntaras oye, se activ tu 5to. bit?. Ok...!!! ya se lo que estas pensando como que el 5to. si aparece el 4?, bueno, es por que no estas siguiendo el tutorial, recuerda que el primer bit est en la posicin 0 y por ende, el 5to. esta en la posicin 4 ahora esta bien?. Continuemos, si resulta ser que no, saltara hasta rotando y pasar el contenido del registro rotar a W nuevamente (recuerda que ahora rotar es 00000010 por aquello del desplazamiento). luego lo enviar al puerto B, llamar al retardo y rotar nuevamente. Bien supongamos que ya paso todo eso y que ahora rotar tiene el valor 00001000 y estamos ubicados justo en la etiqueta rotando. Entonces pasar el valor a W y de all al puerto B, luego llamar al retardo, cuando regrese, rotar el contenido del registro rotar una vez ms y entonces su contenido ser 00010000. Ahora viene la pregunta... btfss rotar,4 est activo el 5to. bit del registro rotar?, Siiiiii, si Sr. est activo..., Perfecto, entonces saltar una lnea, me encontrar con goto ahora y comenzar de nuevo. Eso es todo. Ahora vemoslo en forma grfica para aclarar un poco las ideas.

Esa fue la idea, que veas como se hace la rotacin, hay varias formas de hacerlo, yo aqu te mostr una, otras utilizan el carry del registro STATUS, otras no utilizan la rotacin para hacer esta secuencia, sino van activando los bit's de a uno, en fin, tienes muchas opciones... Fue todo por hoy, ahora nos tomamos un descanso y vemos que otras herramientas tenemos...

.: Ms herramientas - Programadores:

Hay muchos programadores dando vueltas por la Red, uno de los que me llam la atencin fue el Programador PIPO2 de Jos Manuel Garca, por su sencillez, por la cantidad de PIC's que soporta, por que no requiere fuente de alimentacin, su bajo costo, y por supuesto, por que est listo para armar, jejeje. El programador anterior no es profesional pero para lo que queremos hacer, se lleva todas las de ganar. Si quieres algo ms, como un programador semi-profesional, est su pariente el Programador PP2, tambin de Jos Manuel Garca, aunque requiere unos cuantos $$$$ ms, que no creo sea la gran diferencia, por cierto... El autor, recomienda su utilizacin con el IC-Prog, un programa bien a lo windows, es ms puedes seleccionar el Idioma, pero para utilizarlo con el programador debes hacerle algunos ajustes. Bueno el mismo autor te indica cmo. Otra de las caractersticas de este programa es que puedes desensamblar un archivo .hex y ver su cdigo fuente, para luego modificarlo o hacer lo que quieras con l. oye, respeta los derechos de autor, ok? :-P Aqu tienes una imagen de su entorno de trabajo

Y aqu el cuadro de dilogo en que debes realizar los ajustes para el hardware que ests utilizando.

Eso por ahora, luego veremos ms herramientas...

.: Seales de Entrada

Lo interesante y llamativo de los microcontroladores es que obedecen tus rdenes al pie de los bit's :o) Por ejemplo, si le ordenas que vigile un pulsador, el muy pillo lo har, y cuando alguien lo active le dar su merecido, jejejeje Bien..., eso es lo que haremos ahora. Pero esta vez tambin utilizaremos el puerto A Ahhhhhhh...!!!, y para complicarlo un poco ms lo haremos con un solo pulsador. Si un

travieso lo activa encenderemos un LED, y si lo activan nuevamente, lo apagaremos, qued...? Mmmmmmmm... Lo que estoy notando es que voy a necesitar un registro que me guarde la informacin de si el LED est prendido o apagado, (sino... cmo voy a saber que hacer cuando lo presionen...!!!) bueno, ahora si... Comencemos... el pulsador lo conectar a RA1 y el LED a RB0, as se ve en el siguiente esquema

Hay varias formas de hacerlo, y ms adelante utilizaremos el mtodo de INTERRUPCIONES. Aqu lo har a mi modo, porque este tutorial es mo, Ok...? :oP Vamos a lo nuestro.
;---------------Encabezado------------List p=16F84 radix hex ;------------mapa de memoria--------STATUS 03 TRISA PORTA TRISB PORTB cont EQU EQU EQU EQU EQU EQU 03 05 05 06 06 0A ; status esta en la direccin ; el puerto a ; el puerto b

;-------Configuracin de puertos------reset ORG GOTO ORG 0 inicio 5 STATUS,5 0x02 TRISA 0x00 TRISB STATUS,5 ; ; ; ; ; configurando puertos carga w con 0000 0010 ahora RA1 es entrada carga w con 0000 0000 y el puerto B salida

inicio BSF MOVLW MOVWF MOVLW MOVWF BCF

CLRF CLRF BSF

PORTB cont cont,0

; limpio el puerto B ; limpio el contador ; pongo el contador a 1

;-----------------------------------------test BTFSC CALL GOTO PORTA,1 led test cont,0 on_led PORTB,0 cont,0 libre PORTB,0 cont PORTA,1 libre ; si alguien presiona ; voy a la etiqueta "led" ; sino me quedo esperando ; ; ; ; ; ; ; ; ; si el contador est a 1 lo atiendo en "on_led" sino, apago el LED pongo el contador a 1 y espero que suelten el enciendo el LED pongo el contador a 0 si no sueltan el pulsador me quedar a esperar

led

BTFSC GOTO BCF BSF GOTO pulsador on_led BSF CLRF libre BTFSC GOTO RETURN

; si lo sueltan regreso ; a testear nuevamente

;-----------------------------------------END ;------------------------------------------

El registro que agregu, como te habrs dado cuenta es cont y su direccin respectiva 0x0A. De la configuracin de puertos ni hablar, vamos por lo que est en rojo.
CLRF PORTB ; limpio el puerto B CLRF cont ; limpio el contador BSF cont,0 ; pongo el contador a 1 ;------------------------------------------

CLRF es borrar, o limpiar, o poner a cero, en este caso pongo a cero todo el puerto B y tambin el registro cont, y luego pongo a 1 el primer bit de este ltimo, es decir el bit 0. Con esto me aseguro de que no hay ninguna seal en el puerto B, y que el registro cont es igual a 0000001, (seal de que el LED est apagado) Sigamos...
;-----------------------------------------test BTFSC PORTA,1 ; si alguien presiona CALL led ; voy a la etiqueta "led" GOTO test ; sino me quedo esperando

Con BTFSC estoy probando el segundo bit (Bit 1) del puerto A. Si este bit esta a cero es por que nadie lo presion, entonces salto una lnea, y me encuentro con GOTO test, as que aqu estar dando vueltas un buen rato, hasta que a alguien se le ocurra presionar

el dichoso pulsador...

Ohhhhhhhhh...!!!, parece ser que alguien lo presion. Bueno, esta vez no ir a GOTO, sino a CALL led, esto es una llamada a la subrutina led, all vamos...
led BTFSC GOTO BCF BSF GOTO pulsador on_led BSF CLRF libre BTFSC GOTO RETURN cont,0 on_led PORTB,0 cont,0 libre PORTB,0 cont PORTA,1 libre ; ; ; ; ; ; ; ; ; si el contador est a 1 lo atiendo en "on_led" sino, apago el LED pongo el contador a 1 y espero que suelten el enciendo el LED pongo el contador a 0 si no sueltan el pulsador me quedar a esperar

; si lo sueltan regreso ; a testear nuevamente

Antes de hacer algo debo saber si el LED est encendido o apagado. Recuerda que si est apagado cont=0000001, de lo contrario cont=00000000 Pregunta...(BTFSC cont,0 ?) - el primer bit del registro cont es igual a uno?...

Si es as el LED est apagado as que lo atender en "on_led" ah pondr a uno el primer bit del puerto B (encender el led), luego har cont=0000000 para saber que desde este momento el LED est encendido. El tema es que nunca falta aquellos que presionan un pulsador y luego no lo quieren soltar, as que le daremos para que tengan..., y nos quedaremos en la subrrutina "libre" hasta que lo suelten, y cuando lo liberen, saltaremos una lnea hasta la instruccin RETURN.

As es que caeremos en (GOTO test) y esperamos a que opriman nuevamente el pulsador. y si quieres saber si esto funciona ponle el dedito, y caers otra vez en la subrrutina "led" Pregunta...(BTFSC cont,0 ?) - el primer bit del registro cont es 1?...

Noooooooo...!!! Eso significa que el LED esta encendido, entonces lo apagar (BCF PORTB,0), har cont=00000001 (de ahora en ms LED apagado) y me quedar en "libre" esperando a que sueltes el pulsador, y cuando lo hagas mi 16F84 estar listo para un nuevo ciclo. Te gust...?, fue fcil verdad...? Creo que es un buen punto de partida. En breve hablaremos del famoso MPLAB de Microchip, por lo pronto, trata de conseguirlo...

You might also like