Programación de micro chips PIC
Este es un acercamiento a la escritura de un programa, muy lineal. Muchos escriben y producen subrutinas muy pequeñas con saltos (llamados GOTO) de una subrutina a otra de modo que los productos saltan por todas partes como 'palomitas de maíz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo este tipo de disposición es muy difícil de seguir por un lector.
Es mucho más fácil seguir la secuencia de acontecimientos y así, muy pronto será capaz de escribir programas similares a los de la sección de proyectos de cualquier empresa. De nuevo recordamos que el PIC12C508A sólo debería ser usado en proyectos donde coste y ahorro espacial tiene suma importancia.
Los artículos que necesitaremos son:
Biblioteca de términos y Lista de rutinas.
Un archivo hex del final de estos artículos.
Alguna de las siguientes herramientas:
- Programador ICProg u otro similar.
- Tablero 'protoboard' para experimentos.
- Un chip reprogramable PIC16F84A.
Cualquier proyecto para un chip ' 508A.
Lo normal es que, el lector se pregunte: ¿por donde comienzo?. Este artículo es el punto de partida, con él se cubren dos de los microcontroladores más pequeños y más simples de la gama del PIC, son el '508A y el 'F84 que con los instrumentos de desarrollo que se describen, se puede entrar un programa con un bajo costo.
Los dos micros internamente, son casi idénticos excepto un par de diferencias menores, no así en lo físico:
'508A
'508A
5 líneas de entrada/salida
1 única línea de entrada
511 direcciones para programa
1 única grabación (OTP)
33 instrucciones
'F84A
13 líneas de entrada/salida
1020 direcciones para programa
1.000 grabaciones posibles
36 instrucciones
'F84A
Hay diferencias entre los dos, pero para mantener las cosas simples, podemos pensar que el 'F84 es dos veces tamaño del '508A. Si seguimos esta línea, seremos capaces de desplazarnos de un dispositivo al otro según la complejidad del proyecto. Ya que ambos microcontroladores tienen el mismo juego de instrucciones (hay diferencias muy pequeñas descritas en otros artículos en estas páginas), el lector, sólo tiene que aprender unas 33 a 36 instrucciones para ser capaz de crear un programa.
Estas 33 o 36 se amplían a más de 2.000 instrucciones cuando se considera que cada bit en cada archivo puede ser puesto a EN [1] (Encendido, Alto), limpiado ([CLEARed], aClarado) o probado (TESTed), pero sólo tenemos que recordar 33 palabras "similares al inglés" conocidas como mnemónicos, para crear un programa sin usar un leguaje de alto nivel. Una de las ventajas de los micros PIC es el margen de seguridad, esto significa que, el programa que se trasvasa a un chip no puede ser leído por nadie más, en el mejor de los casos sólo pueden conseguir un juego embrollado de figuras.
Un símil de un micro PIC es como un libro con las páginas en blanco, éste tiene un área donde se coloca el programa. El programa lo crea uno mismo y lo carga en el chip mediante un dispositivo llamado "quemador". Aquí utilizaremos el quemador IcProg ya mencionado (si utiliza el XP © o Win2000 ©, necesitará el driver adecuado), ambos son gratis y puede servir para gran número de dispositivos distintos, yo he probado algunos y todos son muy sencillos, con 4 hilos (señales) puede trazarse uno y usarlo "in-situ", como el Policristalino, del que ya trato en otro artículo.
Como ya se ha dicho en la introducción, hemos hallado un modo de permitir programar desarrollos en un '508A sin desperdiciar ningún chip. Para esto se usa un módulo que se llama Quasi '508A. Este módulo Quasi '508A, nos permite escribir programas por etapas y probarlos en un módulo llamado el Expreso 12c508A 6V.
El módulo Quasi '508A es realmente un 'F84 cableado para que funcione como un '508A y esto significa que el programa se puede reprogramar cuantas veces sea necesario, durante el desarrollo del programa. El 'F84 constituye el módulo Quasi '508A es quemado y sacado en los proyectos de Prácticas y para otras aplicaciones. Una vez se desarrolla y perfecciona el proyecto, éste puede ser quemado en un OTP más económico el '508A y ensamblado en el proyecto desarrollado, el programador mantiene la opción de modificar el contenido. Este es el motivo por el que programar con PIC puede ser una forma provechosa de trabajo.
Para crear un programa para el '508A, disponemos de los artículos que se exponen en estas páginas y otras de otros autores. Los programas pueden ser escritos en un cuaderno o sobre papel, de allí serán transferidos a un programa de computador, cada línea se escribe con la ayuda de los mnemónicos, un lenguaje de programación medio inglés, a medio camino entre usuario y compilador.
De este modo el programa es convertido a código hexadecimal mediante el programa MPLAB de MicroChip, es libre, sin costo y está disponible a través del propio enlace. El archivo .hexcreado, se envía al microcontrolador en formato binario (1's y 0's) para quemarlo en la memoria del chip.
No debe preocuparse por la falta de espacio de programa de 1FF posiciones del ' 508A. Esto equivale a más de 500 líneas de código, si en unas páginas de papel escribe 50 instrucciones, esto representa más de 10 páginas. Realmente, sólo se dispone de 255 posiciones para su uso, pero esto, evidentemente es un programa muy largo. Sin embargo, en el mejor de los casos, si se necesita un espacio mayor, recomiendo revisar la gama de productos de la empresa Microchip, es muy extensa y crece cada día.
Un punto a recordar; cuando se escribe y desarrolla un programa, éste consistirá en, muchas subrutinas que siguen a una rutina principal. Éstas subrutinas se llamarán una o muchas veces entre sí. De modo que cuando un programa se hace largo, debemos encontrar cómo puede usar las subrutinas que ya se han escrito y entonces el programa se hará más eficiente.
Todos los valores en un programa se escriben en HEX. Esto hace la escritura de un programa más compleja, por la comprensión del hex que nos acerca un poco más a cómo trabaja y nos permite resolver los valores para las líneas de entrada o salida de puerto individual.
Los valores del programa se cargan en un registro llamado registro de trabajo (W), estos valores se llaman LITERALES. Un literal es simplemente otro nombre del valor o número. El código hex tiene una base de dieciséis números que son:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A= diez, B= once, C= doce, D= trece, E= catorce y F= quince.
Como se debe recordar, 12 en decimal es igual a 0C en hex y 16 en decimal es igual a 0F. Es fácil ver que 3E (igual a sesenta y dos) es un valor hex, para hacer fácil reconocer valores hex como 23 o 41 u 82, colocaremos una 'h' pequeña después del valor, así: 41h, 23h, 82h.
Un registro puede contener un valor desde 00 a FFh que representa un valor desde cero a doscientos cincuenta y cinco en decimal. Véase que la página de hex valora de 00 a 1FF en otro de los artículos, para ver la notación estructurada en hex. Puede que nos lleve algo de tiempo entender el hex, pero mientras se lo piensa, hay otro concepto que se debe considerar: BINARIO-a-HEX.
Todos los registros del '508A y el 'F84 comprenden 8 "celdas" en las que se coloca un 'cero' o un 'uno'. Las ocho celdas se separan en dos grupos, uno de 4 celdas superiores y otro de 4 celdas inferiores. Las 4 celdas superiores llamadas 'nibble' alto y las 4 celdas inferiores, 'nibble' bajo. Para leer el valor completo de un registro hex, se combinan ambos 'nibble' alto y 'nibble' bajo.
Cada línea GP (una línea GP es una línea entada/salida de Propósito General) corresponde a un bit en el archivo 06. La línea GP0 (bit0) corresponde al Bit Menos Significativo (LSB) y GP1 corresponde al siguiente bit (bit1). Ahora, aquí viene el bit más difícil de en tender, pero esto es lógico.
REGISTRO 06h
Para poner GP0 como línea de salida, el bit menos significativo (LSB) en el archivo 06 debe ser 0, "0" significa salida.
Hacer GP0 BAJO:
MOVLW 08 ;Carga w con 0000 1000
TRIS 06 ;carga el registro TRIS
BCF 06,0 ;haz el bit 0 BAJO
Para poner GP0 como línea de entrada, el bit menos significativo (LSB) en el archivo 06 debe ser 1, "1" significa entrada.
Hacer GP0 ALTO:
MOVLW 08 ;Carga w con 0000 1000
TRIS 06; ; carga en registro de TRIS
BSF 06,0 ;haz bit 0 ALTO
Suponga que quiere hacer GP0, GP1 y GP2 como entradas. Los tres bits bajos deben ser "1", esto pone el archivo = 0000 0111 = 07. Suponga ahora que quiere configurar GP3 como entrada, el valor del archivo será = 0000 1000 = 08. Suponga ahora que quiere configurar GP5 y GP3 como entradas, el valor del archivo será = 0010 1000 = 28h, el resto serán salidas.
Se puede introducir cualquier combinación de líneas como entrada o salida y es esencial entender la notación en hex para poner el valor a cargar el archivo 06. El archivo 06 tiene un nombre genérico, se le conoce como Puerto_A y sólo tiene 6 bits funcionales (no se si es casualidad que tenga 6 bits y le llamen registro 06), todos los demás archivos tienen 8 bits. Necesitamos conocer el valor hex cuando se cargue en un archivo por que puede tengamos que saber:
a) Cuando cierto bit es puesto EN, en un archivo siendo incrementado.
b) El archivo máximo que contendrá una tabla.
c) El modelo de salida cuando un contador ha sido 'cargado'.
Al escribir programas, se implican valores binarios en todos las etapas y el hex es simplemente más corto de mostrar que el binario usando 2 dígitos. El hex es fácil de ver y leer, además mentalmente se puede convertir de binario a hex y de binario a hex muy rápidamente.
El ' 508A contiene 32 archivos o registros de los cuales los primeros siete (00h a 06h) se llaman Registros de Función eSpecial (FSR) y los siguientes 25 (07h a 1Fh) son archivos o Registros de Propósito General (GPR). El F84 tiene doce SFR (00h a 0Bh) y los siguientes sesenta y ocho (0Ch a 4Fh) se llaman 'Archivos'.
Veinte archivos son comunes al ' 508A y al F84. Estos son: 0Ch, 0Dh, 0Eh, 0Fh, 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h, 1Ah, 1Bh, 1Ch, 1Dh, 1Eh, 1Fh. Estos son, los archivos que usaremos. Cada archivo tiene 8 bits que pueden tomar el valor 0 o 1, cuando todos los bits son Cero (0000 0000), el archivo tiene valor cero.
Cuando el LSB es 1, el archivo tiene el valor de 1, ya hemos mostrado como 'nibble' bajo en los incrementos del archivo F (ver Notación de hex) al principio del artículo. El siguiente incremento después de 0F produce 0001 0000 = 10h, luego 0001 0001 = 11h. Al incrementar del archivo 1111 1111 = FF darán la vuelta a 0000 0000. Antes de dejar el hex, hay una habilidad más que necesitará. Esto convierte binario a hex luego podrá poner bits EN [1] en un archivo.
El ajuste de bits solos es fácil. Aquí está la tabla:
Binario Valor Bit
0000 0001 = 01h = bit0
0000 0010 = 02h = bit1
0000 0100 = 04h = bit2
0000 1000 = 08h = bit3
0001 0000 = 10h = bit4
0010 0000 = 20h = bit5
0100 0000 = 40h = bit6
1000 0000 = 80h = bit7
Para poner EN [a 1] DOS o MÁS BITS en el 'nibble' alto o bajo, léalo. Recuerde, se llama bit más bajo al bit0 y el más alto es el bit7. Para poner EN los bit2 y bit3, el valor binario es: 0000 1100. Tómese como referencia la tabla anterior, en la que se puede ver que esto es 08h más 04h. Y ¿cómo se suma 08h y 04h? Simple, se toma el valor más alto 08 y se añaden cuatro cuentas, así; + nueve, + A, + Be y + Ce, la cuenta nos da 0Ch.
Para poner EN los bit6, bit5 y bit4, el procedimiento es: 0111 0000. Esto es 40h más 20h más 10h. Para hacer las cosas simples, tomamos los nibble altos, o sea, 4h más 2h más1h, esto suma 7h, entonces la respuesta es 70h.
Otro ejemplo: para poner EN los bit7, bit6, bit5 y bit4, el procedimiento es: 1111 0000 = 80h mas 40h mas 20h mas 10h. El nibble alto de esto es: 8h+4h+2h+1h, empezamos con el 8 e incrementamos cuatro cuentas, así: nueve, A, Be y Ce, ahora incremento dos cuentas: De y E y entonces incremento una cuenta 'eFe'. Esto da F y le añado el nibble bajo 0, la respuesta es: F0h. Esto, le llevará algo de tiempo para tener pericia, pero trabaje sobre esto, ganará tiempo cuando lo domine.
El registro W o de trabajo es el registro más importante en el chip. Este registro actúa como una cesta en un supermercado, recogiendo un valor del programa, como un Literal, un byte de datos de una tabla, un valor de cualquiera de los archivos o bits de datos del puerto de entrada y entregándolo a otro archivo o al puerto de salida.
El puerto de salida es el archivo 06 y cualquier valor entregado a este archivo vía W, está disponible para transferirlo. Esto también ocurre al revés, cualquier valor del mundo exterior presente en este archivo, es entregado al archivo 06 y del archivo 06 éste valor puede ser pasado al registro de trabajo W. El registro de trabajo puede ser limpiado (puesto a cero) o cargado con un número (llamado literal).
Los bits del registro de trabajo W no pueden ser comprobados, limpiados o poner EN ni intercambiar los nibbles, tampoco puede ser incrementado, decrementado o rotados sus bits, estas operaciones tienen que hacerse sobre un valor en un archivo. El registro de trabajo W es un concepto, no tiene una posición de dirección, simplemente lo llamamos "W" en una instrucción, es simplemente 'El portador' o 'Ayudante' en el sistema.
Hay rasgos en el juego de instrucciones del PIC que lo hacen muy 'poderoso'. Por este motivo pensamos que una instrucción sola incorpora dos o tres cosas. En los primeros microprocesadores, una instrucción sólo hacía una cosa y por eso se necesitaban muchas instrucciones en el juego de instrucciones. Uno de los rasgos inteligentes del juego de instrucciones del PIC es el designador, éste es el número 1 o el 0 adicional a la instrucción para decirle al micro donde poner el resultado de la operación.
Si tomamos la instrucción ANDWF 0C,1 el resultado es colocado en el archivo 0C. Si usamos la instrucción ANDWF 0C,0 el resultado es colocado en el registro W. Hay una importancia obvia al seleccionar la instrucción correcta, con la primera instrucción se cambia el contenido del archivo 0C, mientras que en la segunda instrucción no cambia 0C y puede que no queramos cambiar 0C.
Con algunas instrucciones es más fácil de ver el objetivo del designador. Por ejemplo, MOVF 0C,1 simplemente mueve el contenido del archivo 0C dentro y fuera de 0C y cambia las banderas (flags). Esto no pone el contenido en W, para poner el contenido en W, debe ser usada la instrucción MOVF 0C,0.
Al escribir un programa es importante incluir el designador, si se olvida el compilador (MPASM) agregará un 'falta designador' y presentará la condición. Se debe comprobar que no falta el designador, puede producir el resultado no requerido, por ejemplo:
MOVF 0C,1 no pone el contenido de 0C en W, esto simplemente mueve el contenido (mete y saca) de 0C.
El programa en un ' 508A comienza en 000 y se extiende a 1FF, esto es un número hexadecimal y corresponde a 512 posiciones (512 líneas de código). Sólo podemos usar hasta 511 posiciones de dirección, la posición superior es usada por el micro como un valor de calibración (OSCCAL).
Por las aplicaciones podremos hablar de (juegos, demostraciones, temporizadores, contadores, etc.) 511 líneas de código es un buen tamaño de programa, especialmente cuando se considera que el chip es capaz de tomar el espacio de 5 o más chips en el proyecto. Antes de la escritura de un programa, se debería examinar los proyectos que se han incluido en este sitio, así como las Librerías de términos y rutinas, para tener alguna idea de que se puede hacer con el micro.
Esto también nos dará una idea de como son escritas las instrucciones y el tipo de instrucción requerida para una operación particular. El modo más fácil de aprender es con el ejemplo y gastando tiempo con proyectos y en mirar las rutinas de bibliotecas que nos iniciaran en los 'bloques de partida'.
La mayor parte de las ideas que acuden escribiendo un programa no llegan a verse en la versión final del proyecto, vamos a ver lo que el programador piensa cuando él produce una rutina. En primer lugar, él tiene que resolver lo que el proyecto ha de hacer. Él no se preocupa del programa o del micro, por el momento, solamente piensa lo que él quiere VER que el proyecto ha de hacer. En primer lugar produce una descripción total en forma de ensayo, toma apuntes o produce un organigrama. Todo lo referente a micro, patillas, LED's de colores, tiempos y tipos de sonidos vendrán más tarde.
Algunas escuelas de pensamiento creen que un organigrama es esencial para acertar el programa. Si el lector no está puesto con los símbolos de los organigramas o cómo producir tal carta, no se preocupe, otras escuelas consideran el tema, son absolutamente innecesarios. Para los que son entusiastas de los organigramas, sólo hay tres símbolos de organigrama que tiene que conocer. Estos son: Ovalo de inicio o parada, rectángulo que ejecuta una operación y el diamante de decisión donde tomar una decisión como un "SI" o "NO", "Entrada" o "Salida". Estas formas se conectan con líneas con flechas que indican la dirección de flujo del programa.
Un organigrama ayuda a otros a entender qué hace el programa y da una idea de su complejidad. El mejor modo de comenzar un proyecto nuevo es, escribir una descripción de la operación entera. Luego se separa en secciones y se coloca cada paso de 'operaciones' en un rectángulo. Cualquier etapa de toma de decisiones se colocan en un diamante, entonces se unen con líneas y flechas y ¡Vaya! ¡hemos producido nuestro propio organigrama!
Después se toma cada sección y se convierte en los pasos que pueden ser realizados por el microcontrolador. Aquí es donde empieza la aplicación de los conocimientos del programa. Para hacer esto tiene que entender el juego de instrucciones, sólo entonces podremos escribir las instrucciones correctas. Es muy importante ponerlas en el orden correcto entonces el resultado será exactamente como se esperaba.
El programa más simple se encarga de cargar el registro de trabajo W con el valor "1" y la salida del mismo en GP0. Si un LED en serie con una R resistencia de 470 a 1kOhms se conecta a GP0, esto iluminará el LED cuando esta instrucción se ejecute.
Pero antes de que podamos controlar este sencillo programa, tenemos que "estructurar" el puerto GP0 para que sea una salida, como se describe en el artículo. Así que, volvamos al principio.
;=============== PROGRAMA MUY SIMPLE ========== ; GP0 = SALIDA ; GP3 = ENTRADA ;===================================== Sistema MOVLW 3E TRIS 06 ;carga archivo TRISB Salida MOVLW 01 ;carga W con 1 MOVWF 06h ;pone GP0 alto GOTO salida
GP0 Es una de las líneas de entrada/salida del chip, antes de que un programa ponga un valor en la salida, esta línea del puerto debe ser "establecida" para que GP0 sea una salida. GP0 es el bit0 del registro TRIS y debe ser "0" para ser una salida. Los haremos "1" (entrada) para demostrar el hecho que el puerto del '508A tiene sólo 6 líneas, así , el registro TRIS será; 0011 1110 = 3Eh. Ya que usamos el Quasi'508A para el desarrollo del programa, las instrucciones para la "estructuración" son así:
Sistema MOVLW 3E ;pone GP0 como salida TRIS 06h ;Carga archivo TRISB
GP0 es ahora una línea de salida, esto entregará un EN al mundo exterior cuando sea cargado un "1" en el bit0 del archivo 06, se han usado estas instrucciones:
MOVLW 01 ;Carga W con 1 MOVWF 06h ;Mueve W al archivo 06
La línea GP0 producirá un EN y si tenemos un LED conectado a esta línea se iluminará cuando las dos instrucciones anteriores más las instrucciones de estructura son ejecutadas. Cuando este programa es cargado en un chip, sobre el módulo Qasi '508A, se puede pensar en un puntero imaginario que comienza en la primera instrucción y se pasa a la unidad central para la ejecución.
El 'puntero' es el Contador de Programa, este empieza en 000 e incrementa una posición a la vez y alimenta el código (en la dirección) a la unidad central donde es interpretado. Una vez el micro es puesto a operar, no se para y sigue bajo el programa. En el programa anterior, el Contador de Programa "escapará al final del programa", para impedir esto es necesario pasar instrucciones adicionales para "dirigir" el contador de programa, arriba se muestra el programa completo.
El primer 06h en el programa no es el registro de puerto, este es el TRISB. El segundo 06h es el puerto de entrada /salida. La instrucción GOTO crea un lazo para hacer ir al micro a la etiqueta "salida". Una vez el micro entra en este lazo, nunca sale, a menos que falte la energía.
Las instrucciones para hacer el LSB en el registro TRIS como salida son:
MOVLW 3Eh ;Pone 0011 1110 en W para hacer GP0 una salida TRIS 06h
El valor binario 0011 1110 muestra que los bits 6 y 7 no se usan, como el '508A tiene sólo 6 líneas de puerto y el resto de líneas serán líneas de entrada (como muestran los "1"), excepto el bit más bajo, que será una salida. En otras palabras, sólo tenemos que hacer bit0 un cero. El valor en W se moverá al registro de TRIS y esto hará del BIT Menos Significativo en TRIS una salida. El puerto se establece ahora con el LSB una salida. Esta línea se llama GP0 (línea 0 Propósito General).
Los programas se escriben usando las 33/36 instrucciones PIC en una libreta o editor y guardados con la extensión .asm (punto asm). Cuando un programa se escribe como muestra el 'programa mas simple', lo llaman código ensamblador y se guarda con la extensión .asm. Es decir, se ha escrito para un ensamblador, llamemos al ensamblador que usaremos MPASM y esto localizará todas las etiquetas y las convertirá en una dirección, convirtiendo las instrucciones para trabajar en código máquina. El resultado es un archivo con extensión .hex.
Podemos incluir un botón pulsador, a añadir en nuestro "programa más simple". El pulsador se agrega al circuito para que cuando éste sea pulsado, GP3 vea un alto [a esto se le llama lógica positiva]. Ahora el programa se activa para cuando se pulsa el botón encienda un LED, esto debe ser convertido en un juego de instrucciones que puedan ser ejecutadas por el ' 508A.
El programa necesita para hacer esto un lazo, entonces el pulsador se detectará cuando sea presionado y conectará el LED y cuando sea liberado el pulsador el LED se apagará.
ADJUNTAR AL PROGRAMA MÁS SIMPLE MOVLW 3E TRIS 06 ;GP0 salida, GP3 entrada btn BTFSS 06,3 ;comprueba GP3, detecta si es pulsado GOTO Libre ; si si, salta esta línea GOTO Pulsdo Pulsdo BSF 06,0 ;activa GP0 GOTO btn Libre BCF 06,0 ;apaga GP0 GOTO btn
De ahora en adelante, todos lo programas contienen un lazo, el programa más simple anterior es el único programa que usa un lazo "callejón sin salida", un programa normal es una forma de lazo completamente funcional, ya que el micro ejecuta instrucciones a razón de aproximadamente un millón por segundo, un lazo se ejecutará muchas veces por segundo.
Las instrucciones en el lazo deben incluir un detector de botón pulsado o no, dando una salida ALTA o BAJA sobre una línea cambiando EN o AP el LED, estableciendo el registro TRIS para que GP0 sea una salida y GP3 sea una entrada. Las dos primeras líneas del programa son las mismas que en el programa más simple, sin embargo la línea btn BTFSS 06,3 es el detector de pulsado o no. Esta instrucción comprueba el bit3 del archivo 06 (archivo del puerto), el micro 'lee' el puerto y comprueba el bit3 para ver si lo pone alto.
El micro saltará la siguiente instrucción del programa si el bit es alto, cuando el pulsador es presionado, la línea será alta y el bit3 será puesto EN. Si el bit está EN (botón pulsado) el micro ejecutará la instrucción GOTO pulsdo.
GOTO libre GOTO Pulsdo
Hemos creado dos ramas en el programa, la rama libre, cuando está liberado el pulsador y la rama pulsado, cuando está presionado.
Si el bit es EN, el pulsador estará presionado. El juego de instrucciones para la mini-rutina son: Pon alto GP0 y entonces ir a btn y vigila la entrada: Pulsdo BSF 06,0 y GOTO btn
Si el bit está limpio [Clear], entonces será bajo por lo tanto el pulsador no está presionado. Ahora tenemos que producir una o más instrucciones para la mini-rutina de 'aclarado' [Clear]. Las instrucciones para aclarado limpiarán el bit0 del puerto para que la línea GP0 sea Baja y el LED se apagará: libre BCF 06,0 ; apagar el LED.
Ahora el micro debe ser enviado atrás para vigilar el puerto otra vez y comprobar la condición del pulsador, esta instrucción es GOTO btn. El programa estará constantemente formando lazos con la instrucción para vigilar el pulsador y cambiar el LED encendido o apagado.
Si queremos hacer que un LED encienda y apague automáticamente, necesitaremos un juego de instrucciones diferente, en primer lugar necesitamos instrucciones para poner el LED alto, luego una rutina para mantenerlo encendido por un periodo de tiempo (llamado rutina de retardo), además instrucciones para poner el LED apagado y finalmente una rutina de retardo.
El programa al llegar al final vuelve atrás donde el LED se activa, el resultado es un LED intermitente. El organigrama anterior describe mejor esta secuencia usando los símbolos mostrados antes. Esto ayuda a ver el número de pasos implicados en el programa. Del organigrama podemos deducir una disposición para el programa.
Sistema - - - -- ; Las instrucciones de estructuración ; van - - - -- ; aquí GOTO principal Retardo - - - -- ; Las instrucciones de retardo ; van aquí ; RETLW 00 inicio - - - -- ;Conecta instrucciones - - - -- ; van aquí llamada de retardo - - - -- ; instrucciones apagar LED van aquí - - - -- ; instrucciones apagar LED van aquí llamada de retardo GOTO inicio
Esto sigue con una segunda parte, los proyectos diseñados para ejercitarse el lector se encuentran disponibles en otros artículos.