Este documento proporciona información sobre una guía de aprendizaje para programar un microcontrolador. Explica cómo configurar los puertos de entrada y salida, y cómo programar el microcontrolador para controlar procesos. Incluye tutoriales sobre el software MPLAB y el hardware necesario como el microcontrolador PIC16F84, así como conceptos básicos de programación en ensamblador.
Una historia, en la cual,
entendemos que ser padre,
no es la tarea mas facil del mundo,
y como hijos pensamos, y juzgamos
injustamente a quienes en primera,
nos regalan parte de su vida
Una historia, en la cual,
entendemos que ser padre,
no es la tarea mas facil del mundo,
y como hijos pensamos, y juzgamos
injustamente a quienes en primera,
nos regalan parte de su vida
1. 1. IDENTIFICACIÓN DE LA GUÍA DE APRENDIZAJE <br />Nombre del Proyecto: MEJORAMIENTO DE INSTALACIONES Y MAQUINARIA ELÉCTRICA DEL COLEGIO APLICANDO LA NORMATIVIDAD VIGENTE.(Duración en horas)Número de horas3960Fase del Proyecto: PLANEACIÓN(Duración en horas)264Código de la Guía290201083Nombre de la Actividad:Mejorar el funcionamiento de máquinas y procesosbuscando su eficiencia y productividad(Lógica cableada y programable)Equipo EjecutorMAURICIO DIAZ GARCIAResultados de Aprendizaje29020108301Esquematizar e implementar a su alcance el problema planteado.29020108302Recopilar la información de acuerdo a la solución adoptada delautomatismo requerido como análisis de componentes: mecánicos,eléctricos, de control, proveedores y costos29020108303Presentar alternativas de solución que respondan en su totalidad concada una de las funciones del automatismo29020108304Valorar alternativas económicas del estudio preliminar de acuerdo a lasolución adoptada29020108305Definir detalladamente la estructura del automatismo de acuerdo a lametodología establecida29020108306Seleccionar los sensores, actuadores y controladores requeridos para lasolución del problema.29020108307Aplicar normas de seguridad vigentes para la alternativa de soluciónCódigo del resultado + consecutivo 1083-01<br />2. INTRODUCCIÓN<br />La guía de aprendizaje contiene la información necesaria para programar un Microcontrolador, las herramientas requeridas de hardware y software. Y la implementación de sistemas de control basado en microcontroladores. Se abordan los siguientes temas:Descripción de un Microcontrolador.Manejo del software Mplab para generar código Asembler y lenguaje de máquina.El ejercicio propuesto genera destrezas en la programación de procesos de control, donde los pequeños microswich pueden ser reemplazados por diversos tipos de sensores, y las salidas por sistemas de potencia. De esta forma tenemos un Control Lógico Programable (PLC) construido y programado con bajo presupuesto, y alto contenido didáctico.<br />3. CONOCIMIENTOS PREVIOS<br />c-108301Normatividad técnica y legalc-108302Interpretación de planos y catálogosc-108303Conocimientos de inglésc-108304Usos de medios de información, internetc-108305Manejo de manuales técnicosc-108306Sistemas informáticosc-108307Fundamentos de mecánica, electrotecniac-108308Neumática, hidráulica, electrónica y sensoresc-108309Equipos y programas para control de procesosc-108310Principios de sistemas automáticos de controlc-108311Elaboración de planos.c-108312Controles lógicos programables.c-108313Normalización: simbología estandarizadac-108314Normas de seguridad industrial.<br />4. MATERIAL DE CONSULTA<br />Estructura curricular cód.: 832223<br />Internet: www.cdachiaindustrial.blogspot.com<br /> http://micropic.galeon.com http://www.ithinkweb.com.mx/capacita/algoritmo.html http://www.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Programacion%20en%20ensamblador.pdf<br />Tutorial Microcontrolador PIC.<br />Referencia PIC 16f84, por ser de uso más común entre los estudiantes. <br />El primer paso importante es ver el diagrama de pines del PIC16F84, en el cual se observa cómo están distribuidos sus pines. Este circuito integrado cuenta con 2 puertos configurables como entradas o salidas según sea el caso y consta de 18 pines los cuales se encuentran asignados de la siguiente manera:<br /> <br />Pin 1: -----------RA2 Pin 2: -----------RA3 Pin 3: -----------RA4/TOCKI Pin 4:------------Reset Pin 5:------------Tierra (GND) Pin 6:------------RB0/INT Pin 7:------------RB1 Pin 8:-------------RB2 Pin 9:------------RB3 Pin 10:----------RB4 Pin 11:----------RB5 Pin 12:----------RB6 Pin 13:----------RB7 Pin 14:----------Vcc Pin 15:----------Osc2 Pin 16:----------Osc1 Pin 17:----------RA0 Pin18:-----------RA1 <br /> El puerto A está denotado por el color Azul oscuro, el cual tiene sólo cinco pines que puedes configurar como entrada o salida. La pata 3, o sea, RA4/TOCKI puede ser configurado a su vez como entrada/salida o como temporizador/contador. Cuando es salida se comporta como colector abierto, por lo tanto debemos poner una resistencia Pull-up a Vcc de 1 Kohm. Cuando es configurada como entrada, funciona como disparador Schmitt Trigger por lo que puede reconocer señales con un poco de distorsión.<br /> <br /> El puerto B está denotado por el color anaranjado, y tiene ocho pines que igualmente se pueden configurar como entrada o salida. Los pines 15 y 16 son únicamente para el oscilador externo el cual estudiaremos con más detalle más adelante. El pin 4, o sea, el Reset se debe conectar con una resistencia de 10 Kohm a Vcc para que el Pic funcione, si lo queremos resetear entonces pondremos un micropulsador con una resistencia de 100 Ohm a tierra.<br /> <br /> La máxima capacidad de corriente para los puertos se muestra en la siguiente tabla: <br /> PUERTO APUERTO BMODO SUMIDERO 80 mA 150 mA MODO FUENTE 50 mA 100 mA <br /> Por último tenemos los pines 14 y 5 que son la alimentación la cual no debe sobrepasar los 5 Voltios. <br /> Oscilador Externo: <br /> Es necesario para que nuestro PIC pueda funcionar, puede ser conectado de cuatro maneras diferentes. En la siguiente tabla encontraras los diagramas necesarios para su conexión y una breve descripción de cada uno. <br />XT Oscilador compuesto por un cristal y dos condensadores. RC Oscilador compuesto por una resistencia y un condensador. HS Oscilador compuesto por un cristal de alta velocidad.LPOscilador compuesto por un cristal de baja frecuencia y bajo consumo de potencia. <br /> El siguiente paso importante para tener claro como debemos empezar a programar es conocer la tabla de registros. Esta tabla está dividida en dos partes llamadas BANCO 0 y Banco 1. Nos debemos interesar momentáneamente en: STATUS, PORTA, PORTB, TRISA y TRISB. <br /> Para que nuestro PIC pueda trabajar debemos configurar sus puertos como entrada o como salida según sea el caso, si le asignamos un CERO(0) a un pin éste será SALIDA y si asignamos un UNO (1) éste será ENTRADA. <br /> Esta asignación de pines se hace programando los registros TRISA y TRIS B. <br /> TRISA es el registro donde se almacenan los bits que asignan un pin como entrada o salida del PUERTO A. Recordemos que el puerto A sólo tiene 5 pines, por lo tanto un ejemplo de esto sería: <br /> Si TRISA (puerto A) es igual a 19 (11001) entonces esto se leería,<br />TRISA ASIGNACIÓN ESTADO RA01ENTRADA RA10SALIDA RA20SALIDA RA31ENTRADA RA41ENTRADA <br /> El bit menos significativo se asigna desde RA0. <br /> Si TRISB (puerto B) es igual a 32 (00110010), entonces esto se leería, <br />TRISA ASIGNACIÓN ESTADO RA00SALIDARA11ENTRADA RA20SALIDARA30SALIDA RA41ENTRADA RA51ENTRADA RA60SALIDA RA70SALIDA <br /> NOTA: Todos los valores mencionados y que se mencionarán, están expresados en valores hexagesimales. <br /> En la siguiente parte, comenzaremos a programar el PIC y sabremos como ingresar estos valores en el TRIS A o TRIS B según sea el caso. <br />Tutorial Microcontrolador PIC.<br />Segunda parte.<br /> <br /> Para comenzar a trabajar con el programa MPLAB debemos simplemente abrir un nuevo archivo en la ventana File opción New como muestra la imagen 1. <br /> Nota: El MPlab es un programa, no es inteligente y no sabe que hacer por si solo. Es mas, les debemos dar las ordenes una a una y muy bien explicadas para que este las entienda. Estas ordenes estarán acompañadas por parámetros que le dirán a la máquina como se realizará esa tarea. De otra manera, esta no se ejecutará. <br />Fig. 1. Iniciando un nuevo programa.<br /> A continuación analizaremos las siguientes líneas: list p=16f84 #include p16f84.inc <br />port_a equ 5 port_b equ 6 trisb equ 86 trisa equ 85 estado equ 3 <br />valor1 equ 0C valor2 equ 0D <br /> clrf estado clrf port_a bsf estado,5 ;selección del banco 1 movlw 0x19 movwf port_a clrf port_b movlw 0x32 movwf port_b bcf estado,5 ;selecciona el banco 0 clrf port_a clrf port_b <br />Antes de analizar estas líneas debemos tener en claro los siguiente: <br /> para mantener un orden, se presionar la tecla TAB entre la instrucción y el parametro <br /> <br /> El símbolo de Punto y Coma quot;
; quot;
indica el comienzo de un comentario, sirve para ubicarse mejor en el avance del programa y luego encontrar mas rápidamente una línea o bloque determinado. Todo lo que siga a un quot;
; quot;
no generará código hexagesimal en nuestro proyecto. En pocas palabras, lo que siga al quot;
; quot;
no influye en el programa.<br />Primero debemos especificar con que microcontrolador estamos trabajando, en las dos primeras líneas especificamos que vamos a trabajar con el PIC 16F84. <br />Luego definimos la posición en memoria de nuestros registros, el mapa de memoria lo presento en la figura 2: <br />Figura 2: Mapa de memoria del PIC 16f84.<br /> Para comenzar destacaremos los registros: <br />PORTA posición 05hPORTB posición 06hTRISA posición 85hTRISB posición 86hSTATUS posición 03h<br />El registro STATUS que en este caso le hemos llamado quot;
estadoquot;
se compone de la siguiente forma:<br /> <br />76543210IRP RP1 RP0 TO PD Z DC C <br /> Si en la casilla 5 (RP0) del registro STATUS hay un CERO entonces estamos en el BANCO 0. <br /> Si en la casilla 5 (RP0) del registro STATUS hay un UNO entonces estamos en el BANCO 1. Desde la tercera a la séptima línea definimos los nombres de nuestros registros, en el caso del Puerto A lo llamamos port_a - es importante que siempre que nos queramos referir al Puerto A lo hagamos en minúsculas, ya que aquí lo definimos así (PORT_A port_a) si en un principio se define con mayúsculas, siempre nos tendremos que referir a este con mayúsculas - <br /> Otro ejemplo, si en la tercera línea en lugar de quot;
port_a equ 5quot;
colocamos quot;
hola equ 5quot;
cada vez que queramos referirnos al Puerto A debemos hacerlo como quot;
holaquot;
. <br /> En la octava y novena línea, definimos nuestro registros personales, los que vamos a ocupar en nuetro programa, según el mapa de memoria este comienza en la posición 0Ch. <br /> NOTA: Recuerden que todos los valores mencionados y que se mencionarán, están expresados en valores hexagesimales. <br /> El siguiente paso es definir los pines de entrada y salida, recordemos el último bloque de nuestro programa: <br />clrf estado ; limpiar el registro estado clrf port_a ; limpiar el puerto a bsf estado,5 ; selección del banco 1<br />Nota: La instrucción BSF (Bit Set f) carga un 1 en el registro (en este caso el registro estado) en el bit (en este caso el 5), como vimos anteriormente el registro estado al tener un 1 en el 5to bit, entonces estamos trabajando en el banco 1, esto para poder definir los pines de entrada o salida del micro. <br />movlw 0x19 ;cargo un 11001 en el acumulador movwf port_a ; muevo el contenido del acumulador ;al puerto a, defino los pines 0, 1 y 4 ;como entrada y 2 y 3 como salida<br />Nota: El método para definir los pines del puerto b es exactamente el mismo <br />clrf port_b ;limpiar el puerto b movlw 0x32 ;cargo un 00110010 al acumulador movwf port_b ;defino los pines 1, 4 y 5 como entrada y ;los 0, 2, 3, 6 y 7 como salida bcf estado,5 ;selecciona el banco 0 clrf port_a ; limpiar el puerto a clrf port_b ;limpiar el puerto b<br /> En la siguiente parte, haremos un pequeño programa demostrativo y veremos cómo detectar errores y simularlo.<br />Tutorial Microcontrolador PIC.<br />Tercera parte.<br /> En la parte anterior vimos como inicializar un PIC, ahora, usando esa información haremos un pequeño programa el cual solo encenderá un LED según el interruptor que se presione. <br /> Lo primero es visualizar lo que queremos, (ordenar nuestro pines de entrada y salida por ejemplo) y según eso empezar a trabajar. <br />Figura 3: Circuito a implementar.<br />Según el circuito anterior, vemos que el puerto A lo usaremos como entrada y el puerto B como salida, a los cuales hemos conectado LED'S para poder ver los resultados. <br />El puerto A está conectado directamente a la alimentación con lo cual sabemos que normalmente tiene una entrada de +5 V ( 1 lógico) y al activarse el interruptor tendremos un 0 lógico. <br />Nota: Es muy importante que todos los pines de entrada queden bien definidos si están en un nivel alto o bajo por que de lo contrario el PIC entrará en un estado de incertidumbre y no trabajará de manera correcta. Los pines de salida, no es necesario que se conecten si no los vamos a usar. <br />Comenzando con el programa.<br />Como vimos anteriormente, para abrir una nueva ventana de programación pinchamos en la ventana FILE y le damos a la opción NEW, luego debemos inicializar nuestro PIC, en este caso será: <br />; **************************************** ; * Ejemplo tutorial PIC * ; * Este programa enciende un led dependiendo * ; * de que interruptor sea activado * ; **************************************** list p=16f84 #include p16f84.incport_a equ 5 port_b equ 6 trisb equ 86 trisa equ 85 retard equ 11 ;RETARDO estado equ 3 clrf estado clrf port_a bsf estado,5 ;selección del banco 1 movlw 0x1f movwf port_a ;define RA0 como entrada clrf port_b movlw 0x00 movwf port_b ;define puerto B como salida bcf estado,5 clrf port_a clrf port_b <br /> Luego podemos hacer que vaya preguntando a cada pin de entrada, recordemos que según nuestro circuito los pines están normalmente en un nivel alto, y en nuestro caso si este esta en un nivel alto hacemos que testee el siguiente, de lo contrario lo mandamos a un subrutina donde encendemos el LED correspondiente. <br />Para esto usamos la instrucción btfss (Bit Test F, Skip if Set), es decir, testea el bit f y salta (skip) si esta en un nivel alto (set), el salto se refiere a que la siguiente instrucción no la considera y salta hasta la subsiguiente. <br />Al empezar un programa, marcamos el inicio de un bloque, en este caso lo llamaremos quot;
inicioquot;
. <br /> inicio btfss port_a,0 ;si el bit 0 del puerto a esta en nivel alto se salta una instrucción call enci0 call retardo btfss port_a,1 ;si el bit 1 del puerto a esta en nivel alto se salta una instrucción call enci1 call retardo btfss port_a,2 ;si el bit 2 del puerto a esta en nivel alto se salta una instrucción call enci2 call retardo btfss port_a,3 ;si el bit 3 del puerto a esta en nivel alto se salta una instrucción call enci3 call retardo btfss port_a,4 ;si el bit 4 del puerto a esta en nivel alto se salta una instrucción call enci4 call retardo goto inicio<br />En la primera línea, como dice el comentario adjunto, testea el bit 0 del puerto a, si este esta en un nivel alto entonces el programa se salta una instrucción llegando a la instrucción call (llamar) la cual llama a una subrrutina llamada retardo, de lo contrario, si está en un nivel bajo el programa considera la siguiente instrucción y ejecuta la instrucción call enci0, en la cual se activa el pin 0 del puerto b que es el puerto se salida. El resto del programa:<br />enci0 movlw 0x00 movwf port_b call retar2 movlw B'01' movwf port_b return enci1 movlw 0x00 movwf port_b call retar2 movlw B'10' movwf port_b return enci2 movlw 0x00 movwf port_b call retar2 movlw B'100' movwf port_b return enci3 movlw 0x00 movwf port_b call retar2 movlw B'1000' movwf port_b return enci4 movlw 0x00 movwf port_b call retar2 movlw B'10000' movwf port_b return retardo movlw 0x96 movwf retard reta3 decfsz retard,1 goto reta3 return endEn la primera línea lo que hacemos es cargar un cero en el acumulador: movlw 0x00 (MOVe Literal to W) y luego la información que tiene el acumulador (W) la movemos la puerto b: movwf port_b (MOVe W to F), con esto nos aseguramos que todos los LED's del puerto b están apagados.En la tercera línea llamamos un retardo, lo cual siempre es bueno hacer para evitar que el pic colapse, este retardo esta casi al final del programa y el mecanismo de trabajo es muy parecido al anterior:<br />Mover el literal 96 (Hexadecimal) en el acumulador, es cargar un 96 en el acumulador. <br />Mover el contenido del acumulador al registro retard, el cual fue definido al comienzo de programa y ubicado en la posición 11 en la memoria del pic, ahora el registro retard tiene cargado un 96. <br />Decrementar en una unidad el registro retard y el valor resultante se guarda en el mismo registro y cuando el valor de este sea cero, saltar una línea en el programa, con lo cual caerá en la instrucción return con lo cual vuelve a la posición desde donde se llamo a la subrutina. decfsz f,d (DECrement F, Skip if Zero) (decrementa el registro indicado y salta si es cero) si el valor de quot;
dquot;
es cero entonces el resultado se guarda en el acumulador, si este valor en cambio es uno entonces el valor se almacena en el mismo registro. <br />Luego va al bloque de nombre quot;
reta 3quot;
con lo cual se volverá a decrementar el registro, esto lo hará durante 96 veces hexadecimales, es decir, 150 veces. <br />Al volver a la 4ta línea de este bloque movlw B'01' hacemos algo muy parecido al paso anterior, sólo que ahora cargo un 1 binario en el acumulador y luego movemos esta información al puerto b, con lo cual tendremos en la salida del puerto b un 00001 considerando que se cuenta desde RB4 hasta RB0 por lo tanto se enciende el LED correspondiente al pin 0 del puerto b.<br /> De esto deducimos que si queremos encender por ejemplo el pin 3 del puerto b, debemos cargar el acumulador con un B'1000' para luego pasar esta información al puerto b. <br /> Otra alternativa seria: movlw 0x08 ya que 08h = 1000b. <br />Finalmente debemos guardar este programa, para esto pinchamos en la opcion File y luego en Save As y elegimos el directorio y un nombre, en este caso le pondremos ejemplo.asm <br /> Figura 4 <br /> En la siguiente parte veremos como compilar este programa y detectar los errores de programación. <br />Tutorial Microcontrolador PIC.<br />Cuarta parte.<br />En la parte anterior hicimos un programa el cual prende un LED según el interruptor que se activa. Ahora vamos a compilar este programa en lengua hexa el que finalmente cargaremos en el PIC. <br />Lo primero es pinchar en el menú en la opción project y luego en new project, como indica la img: <br /> El siguiente paso es darle un nombre al proyecto, se recomienda darle el mismo nombre que al archivo en assembler, en este caso ejemplo.pjt. <br />Una vez echo esto, aparece la siguiente ventana: <br />En la parte de abajo, donde dice Project Files pinchamos la opción ejemplo [.hex] al hacer esto se activa la opción Node Properties que esta abajo a la derecha, debemos pinchar esta y se abre la siguiente ventana: <br /> En esta sección, debemos dejar las cosas por defecto (es lo mejor) y simplemente pinchar en OK. Luego volveremos a la ventana anterior solo que ahora se activó la opción Add Node algunas>opciones mas arriba de la ultima que pinchamos, por supuesto elegimos esta y>abre <br />Pinchamos en la opción Browse que esta a la derecha y buscamos en el directorio el programa original, en este caso ejemplo.asm y luego en OK, con esto estamos relacionando un archivo de assembler con el proyecto en hexa. Y finalmente volvemos a la primera pantalla y le damos al OK que esta en la parte superior. A continuación debemos verificar que no haya errores para eso vamos nuevamente a la opción project y veremos que hay nuevas opción que antes no estaban disponibles, elegimos Build All, y si todo esta correcto aparecerá una pantalla como esta: <br />Donde en la parte final podemos leer: Build completed successfully. <br />En caso de haber algún error, podemos hacer doble clic en el mensaje de error y este nos enviará directamente a esta línea. <br />5. EVIDENCIAS Y EVALUACION<br />EVIDENCIA:Tipo de Evidencia:DesempeñoxConocimientoxProductoxResultados de aprendizaje asociados a la evidencia:FECHA:____________________________________, INSTRUCTOR: MAURICIO DIAZ GARCIAMATERIAL DE CONSULTA: http://micropic.galeon.com http://www.ithinkweb.com.mx/capacita/algoritmo.htmlhttp://www.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Programacion%20en%20ensamblador.pdfPIC 16F84A COMO INTERRUPTORESQUEMA DEL CIRCUITO APRENDICES: GRUPO _______________________________________________________________________________________________________________________________________________________________________MATERIALES:HERRAMIENTAS:DESCRIPCION FUNCIONAL DEL CIRCUITO:PSEUDOCODIGODIAGRAMA DE FLUJOCODIGO FUENTEDescripción:Programación de un MicrocontroladorProducto entregable:Circuito funcional, Pseudocódigo, Diagrama de flujo y Código fuenteForma de entrega:Formato informe indicado.Criterios de Evaluación:• Esquematiza e implementa a su alcance el problema planteado.• Recopila la información de acuerdo a la solución adoptada del automatismo requerido como análisis de componentes: mecánicos, eléctricos, de control, proveedores y costos.• Presenta alternativas de solución que respondan en su totalidad con cada una de lasfunciones del automatismo• Valora alternativas económicas del estudio preliminar de acuerdo a la solución adoptada• Define detalladamente la estructura del automatismo de acuerdo a la metodología establecida.• Selecciona los sensores, actuadores y controladores requeridos para la solución del problema.• Aplica normas de seguridad vigentes para la alternativa de solución. Instrumento de Evaluación:TipoCódigoCuestionarioxLista ChequeoxLista de VerificaciónOtro:<br />