lunes, 11 de mayo de 2015

Lección 1: MPLAB v8

Al ejecutar MPLAB (MPLAB IDE v8.92) lo primero que se observará son las siguientes ventanas:

En los rectángulos rojos se remarcan los títulos de las dos ventanas que aparecen en un inicio.

La ventana izquierda con el título UNTITLED, es la ventana en la cual al momento de crear un proyecto podremos observar un menú el cual contendrá todos los elementos adheridos a nuestro proyecto, ¿Cuáles elementos? Estos se explicarán más adelante cuando detallemos más acerca del código modular.


















En este ejemplo tenemos un programa llamado “Controlador entrada dac.ASM” la extensión .ASM nos indicá que el archivo fuente (véase que se contiene en la carpeta Source Files) es un archivo escrito en ensamblador, recuerde que MPLAB igualmente cuenta con un compilador C. Observe también que nuestra ventana pasa de llamarse UNTITLED a “Controlador entrada dac.ASM” puesto a que es el nombre que se le dio al proyecto al momento de crearse.

La ventana derecha es la ventana OUTPUT, esta ventana indica el estado y procesos de todas las herramientas relacionadas con MPLAB.

Como primer ejemplo de aplicación de la ventana OUTPUT tenemos cuando usamos el debugger.









El debugger es cualquier herramienta ya sea en hardware o software que nos ayude a detectar errores en nuestros programas.


Como segundo ejemplo de aplicación de la ventana OUTPUT tenemos cuando conectamos nuestro programador Pickit2. El programador Pickit2 tiene ciertos botones que ordenan al hardware a actuar sobre tu pic a programar, en la literatura de Microchip se refieren al dispositivo a programar como Target, mientras que al circuito donde este se encuentra lo denominan Application circuit.



He aquí los comandos del hardware programador, el primero de izquierda a derecha se llama Program the target device, con este introducimos el código a nuestro controlador (pic), el segundo se llama Read target device memory este se encarga de leer lo que esta escrito en la ROM del controlador (pic), nuestro controlador puede ser leído siempre que este no tenga activado la función Code Protection que la mayoría de los controladores pic pueden habilitar en programa. El cuarto botón verifica que exista contenido en la memoria del pic sin modificarla, mientras que el quinto es el comando que ejecuta la limpieza de la memoria del controlador y el sexto checa que la memoria este limpia. Recuerde que en la memoria ROM los microcontroladores almacenan el programa que ejecutarán al momento de alimentarse. El noveno botón verifica la comunicación con el Pickit2:











Como tercer ejemplo tenemos cuando construimos un proyecto, por construir nos referimos a que hacemos actuar al ensamblador, al linker y a todos esos elementos involucrados en dejar tu código escrito en un lenguaje máquina listo para cargar en el pic.






















En este ejemplo la ventana OUTPUT nos advierte Errors y Warnings, el primero son errores que frenan el proceso de construcción, mientras que el segundo son simples advertencias que no frenan al programa de construirse pero advierte información que pudiese causar problemas durante la operación de tu programa, tal como consideraciones que pudiesen hacer que tu programa presente algunos bugs, además existe otro tipo expresión a considerar el cual es Message, este simplemente te comunica alguna información que el programa considera que debes de notar pero su tendencia a causar problemas durante la operación de tu programa es menor a las antes mencionadas.

¿Cómo construimos?

Adelantamos la explicación de la mayoría de las herramientas importantes del MPLAB con el fin de que el lector tenga una idea de a donde dirigirse al momento de estar programando. Existen varias maneras de crear un proyecto para posteriormente poder construirlo, la que utilizaremos constantemente por ser la más completa y fácil es el crear el proyecto mediante el Project wizzard.








Como se observa en la imagen anterior simplemente desde el menú principal desplegamos Project → Project Wizzard una vez activado podremos observar la siguiente ventana:























El primer paso es seleccionar el dispositivo:

























El dispositivo seleccionado es el PIC10F202, este microcontrolador es un PICmicro de gama baja el cual tiene una memoria Flash pequeña y una RAM igualmente pequeña en comparación a controladores más grandes (en densidad). A partir de ahora nombraremos las memorias tal como Microchip las denomina:

  1. La memoria ROM: para este dispositivo Flash, más adelante veremos que existen otros pics con memoria OTP que al igual que las flash son derivados de las memorias EEPROM (Electrical Erasable Programable Read Only Memory) pero con la diferencia de ser programables una sola vez de ahí su nombre One Time Programmable, para este tipo de memoria se les denomina Memoria de Programa (Program Memory) debido a que es aquí donde nuestro programa va a estar almacenado.
  2. La memoria RAM: para este dispositivo SRAM, o RAM estática la cual esta compuesta de puros elementos electrónicos tales como flip-flops (caso contrario de las DRAM que estan compuestas de pequeños capacitores que las hacen mas lentas por requerir de un refresh de memoria) lo cual hace que nuestro controlador sea muy rápido al momento de cargar datos en esta memoria, para este tipo de memoria se les denomina Memoria de Datos (Data Memory) debido a que es aquí donde a causa del programa escrito, los datos (valores importantes) son guardados en registros (variables) de esta memoria.

Al darle siguiente a la ventana podremos ir al paso dos:
























El Active Toolsuite es el conjunto de herramientas utilizadas durante el proyecto que vamos a crear, debido a que el curso esta basado en ensamblador usaremos la suite de herramientas dedicada a este tipo de lenguaje en MPLAB la cual es Microchip MPASM Toolsuite, lo que contiene esta suite de herramientas es el MPASM, MPLINK y el MPLIB. El MPASM es el que nos presenta todos los mnemónicos, es decir todas las palabras que facilitan la lectura y escritura de nuestro programa, por ejemplo:


La operación de suma ADDWF lo que hace es es sumar dos valores y guardarlo en la memoria de datos, la dirección a la cual va ir se define por la letra d (destino, destiny). El MPASM te permite escribir la instrucción ADDWF en vez de tener que escribir todo el código de operación en binario lo cual equivaldría a escribir 0001 11df ffff, lo que significa f se explicará con mas detalle después. El destino siempre es una posición la memoria de datos.

El MPLINK es quizás la herramienta mas preciada de la toolsuite, debido a que aquí tenemos dos conceptos importantes, el primero es el código absoluto el cual es un código que consiste en construir un proyecto mediante un esquema que podemos representar de la siguiente forma:












Esta aproximación es una forma de simbolizar nuestro proyecto y expresa que todo nuestro trabajo escrito es un conjunto, este conjunto esta estructurado para un solo trabajo y no se puede introducir a otro trabajo puesto a que es el programa total, es decir el trabajo final.

La siguiente aproximación ejemplifica lo que llamamos código relocalizable:











En este caso tenemos varios fragmentos pequeños que representan secciones de código de diferente o igual longitud para las cuales tenemos un Linker, el linker se encarga de ensamblar todos esos Códigos de Objeto en el proyecto final. El código relocalizable hace al ensamblador modular, es decir que junto con los Templates que veremos a continuación podremos anexarle Include files, Macros y Object Files, de esta forma nuestro programa se hace más abierto, una de las ventajas de este tipo de estructura es que nuestro programa es fácilmente transferible de un procesador (PICmicro) a otro.

El MPLIB por ahora no es importante introducir.
El tercer paso es direccionar tu proyecto:























Debido a que MPLAB tiene una longitud límite de direcciones, como recomendación se puede optar por recortar el nombre del proyecto, para Ejemplo 1 utilizamos E1, una vez que terminemos con este paso podemos ir al cuarto paso el cual es importante para esta introducción:



















En este paso en la ventana izquierda buscamos en los Archivos de programa la carpeta de Microchip, dentro de la carpeta de Microchip buscamos y abrimos la carpeta MPASM Suite, dentro de esta subcarpeta buscamos y abrimos la carpeta Template, dentro de esta última hacemos click en la carpeta Object y como se observa en la figura tendremos un listado, en este listado hacemos click en el elemento 10F202TMP0.ASM y posteriormente le daremos en el botón ADD>>, nos aparecerá el elemento como una dirección en la caja derecha y procederemos a darle click a la letra A, hasta que cambie a la letra C, después de que tengamos la letra C podremos darle doble click a la dirección para que nos permita cambiar el nombre a uno más legible, en este ejemplo puse que nuestro proyecto se llame E1.ASM. Es importante que el nombre sostenga la extensión .ASM

Un Template es un bosquejo que incluye algunas directivas e instrucciones que facilitan la configuración inicial del pic. Estos templates vienen incluidos en tu carpeta de Microchip al momento de instalar el MPLAB IDE como bien se pudo observar en el paso cuatro. Como se ha explicado existen dos tipos de estructuras de código, la estructura que maneja MPLAB para desarrollar código absoluto es diferente a la estructura que maneja el mismo para código relocalizable, es por eso que MPASM Suite te incluye dos carpetas con templates las cuales son Code y Object, Code incluye todos los bosquejos con directivas de código absoluto, mientras la carpeta Object contiene todos los bosquejos con directivas de código reubicable, el término objeto se deriva de que en este tipo de estructura te permite desarrollar objetos, es decir código que puedes ir incluyendo en tu proyecto final:





El ejemplo siguiente es el proyec-
to con nombre L4 el cual incluye
el objeto principal L4.ASM y una
subrutina llamada
DelayX10ms.ASM

Se explicará después más a fondo
el concepto de subrutina.





Antes de explicar en detalle el Template del PIC10F202, primero se debe aclarar las letras intercambiables de la caja derecha del paso 4. Existen dos tipos de direcciones para ubicar los Templates, Relative paths y Absolute paths, estos conceptos no se deben mezclar o confundir con los tipos de estructuras previamente mencionadas puesto a que no hay relación.

Relative path es una dirección para tu proyecto, este tipo de dirección hace al proyecto más portátil a diferencia del absoluto, si adhieres el Template a tu proyecto con una dirección relativa al momento de guardarlo mediante el comando Save project as hará que el programa haga una copia en la nueva dirección que determines.

Absolute path de forma contraria al usar el mismo comando Save project as el programa cambiará la dirección del proyecto sin hacer la copia.

La letra A es por Auto, este modo de adhesión permite que MPLAB decida si la dirección es relativa o absoluta, el criterio que usa para tomar la decisión es verificar si la dirección de tu proyecto incluye este archivo lo referencia como relativo, de otra forma es absoluto.

La letra U es por User, este modo referencia una dirección relativa.

La letra S es por System, este modo referencia una dirección absoluta, este tipo de direcciones requieren corrección cuando el proyecto se mueve de un sistema a otro.

La letra C es por Copy, este modo hace una copia del archivo en el directorio del proyecto y adhiere una dirección relativa a la copia.


Al finalizar el paso 4 se generará un archivo de extensión .ASM en la carpeta Source Files, este archivo es nuestro bosquejo (Template), primero se debe resaltar que el texto en verde son comentarios y estos al momento de construir el proyecto no son tomados en cuenta por el ensamblador, para iniciar una línea de texto como comentario se usa el símbolo ;



Como se aprecia en la imagen, después de colocar el símbolo ; todo lo escrito a la derecha de este es tomado en cuenta como comentario, lo escrito a la izquierda de este símbolo no se considera comentario por el ensamblador. Debido a que este primer ejemplo será algo simple la estructura que nos da el bosquejo para documentar el archivo no será de gran utilidad, para esto se recomienda borrar esta documentación en proyectos pequeños. La documentación a la que nos referimos es todo el comentario que se describe en verde en la imagen anterior.

Para proyectos mas grandes es recomendable mantener una buena documentación tanto en el encabezado del programa como en el cuerpo del mismo. Por fines instructivos proceda a cerrar MPLAB, posteriormente vaya hacia la carpeta donde eligió almacenar el Ejemplo 1 abra el archivo de extensión .ASM, si no le reconoce el tipo de archivo de le click derecho y posteriormente click en Abrir con para abrir con MPLAB. A continuación les saldrá esta ventana:



De click en relocatable, puesto a que las directivas y formato que emplearemos en este curso es para acostumbrar a hacer código modular desde un inicio.








A continuación de click en el archivo de ejemplo para abrir el espacio de trabajo (Workspace).


La primera sección es la configuración inicial del pic, las instrucciones y directivas se colorean en azul, mientras que las labels se colorean en violeta, estas labels o etiquetas son un nombre a una constante de texto o numérico que puede contener cualquier cosa, como se ejemplifico anteriormente la instrucción ADDWF es un mnemónico que represente un valor binario que es casi el valor real que puede entender el pic, así como usamos mnemónicos para las instrucciones, de la misma manera tenemos etiquetas (labels) para representar otros valores importantes. Estas etiquetas serán frecuentemente usadas a partir de ahora conforme se vaya queriendo implementar un mismo valor más de una vez en diferentes secciones del código, en este ejemplo estas etiquetas representan números binarios, direcciones de una posición de la memoria de datos, constantes y para el caso de código con estructura modular podemos encontrar etiquetas para nombrar secciones del código es decir Objetos.
Una recomendación que facilita la corrección de errores en el proyectos es activar la numeración de línea, para esto vamos al Menú principal → Edit → Properties... a continuación nos aparecerá una ventana titulada Editor properties en esta ventana vamos a la pestaña 'ASM' File Types y en ella le damos chequeo a la caja que pertenece a Line Number.

























Ahora regresando al código observamos que en la primera línea con código tiene una directiva, esta es la directiva list.



Esta es una forma de advertir al ensamblador cual es dispositivo que vamos a emplear en este proyecto, o en palabras más simples, dispositivo para el cual se construirá este proyecto. Se le denomina directiva por ser instrucción para el ensamblador, es decir que esta instrucción (directiva) no tiene una equivalencia o uso en el programa del pic. La directiva list es redundante a la selección que se realizó en el paso uno del Project Wizzard. Otra forma de realizar la selección del dispositivo que puede ser útil cuando queremos cambiar de procesador (pic,controlador) es en el Menú principal → Configure → Select Device..., aquí podremos observar la siguiente ventana:






















Debido a que ya se asignó el procesador desde el Project Wizzard, el PIC10F202 se encuentra ya enlistado, inicialmente al dar click en esta caja desplegable nos aparecerán todos los dispositivos de Microchip, si queremos específicar cierto tipos de dispositivos, en el menú desplegable a la derecha este (Device Family), podemos encontrar todas las familias (categorías) de los procesadores y memorias de Microchip, el PIC10F202 se encuentra en la familia Baseline 8-bit MCUs. En la sección de Microchip Tool Support tenemos tres subsecciones, la sección de Programmers nos aparecen todos los programadores que soporta MPLAB, en este caso están en verde lo que significa que todos los programadores funcionan perfectamente con el procesador seleccionado. La siguiente subsección es el Language and Design Tools, este contiene todos los lenguajes de programación de dispositivos Microchip que soporta MPLAB, para este procesador se puede programar usando el ensamblador y el compilador de MPLAB, sin embargo el lenguaje VDI no tiene soporte para este controlador. Finalmente en la subsección de Debuggers se puede observar que el procesador seleccionado se le puede analizar el contenido con cualquiera de los debuggers soportados por MPLAB.

La siguiente directiva es la directiva #include


Esta directiva permite anexar el archivo p10F202.inc cada procesador tiene un archivo con extensión .inc así como los templates que se vieron anteriormente, estos no son necesarios para la construcción de un proyecto pero facilitan en gran medida la construcción de los mismos. El archivo p10F202.inc incluye una serie de directivas (instrucciones para el ensamblador) que nos permiten usar etiquetas (labels) para cada valor registro de la memoria de datos, es decir, en vez de usar instrucciones que direccionen a la dirección al registro de memoria STATUS el cual le corresponde físicamente a la dirección 03h, podemos direccionarla en cada instrucción simplemente con la etiqueta STATUS, puesto a que el archivo p10F202.inc define a STATUS como la dirección 03h. Podemos afirmar esto dirigiendonos de nuevo a la carpeta MASM Suite dentro de la carpeta de Microchip donde al abrir el archivo .inc correspondiente encontraremos la siguiente directiva:
STATUS EQU H'0003'

EQU es una directiva cuya acción es definir una igualdad. Por ahora no es imporante darle importancia a la directiva EQU, el único fin de esta demostración es justificar las etiquetas que se estarán usando durante el curso.

Dentro del archivo include podemos encontrar las siguiente igualdades:

;========================================================================
;
; Configuration Bits
;
; NAME Address
; CONFIG FFFh
;
;=========================================================================

; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG EQU H'FFF'

;----- CONFIG Options --------------------------------------------------
_OSC_IntRC EQU H'0FFF' ; This is the only option. It is here for backward compatibility
_IntRC_OSC EQU H'0FFF' ; This is the only option. It is here for backward compatibility

_WDTE_OFF EQU H'0FFB' ; WDT disabled
_WDT_OFF EQU H'0FFB' ; WDT disabled
_WDTE_ON EQU H'0FFF' ; WDT enabled
_WDT_ON EQU H'0FFF' ; WDT enabled

_CP_ON EQU H'0FF7' ; Code protection on
_CP_OFF EQU H'0FFF' ; Code protection off

_MCLRE_OFF EQU H'0FEF' ; GP3/MCLR pin fuction is digital I/O, MCLR internally tied to ;VDD
_MCLRE_ON EQU H'0FFF' ; GP3/MCLR pin function is MCLR

Estas palabras son configuraciones del pic que se realizan al momento de programarlo (en hadware) y no se pueden modificar durante la operación normal del microcontrolador. Anteriormente habíamos mencionado el Code Protection el cual hace al controlador ilegible para cualquier programador o dispositivo que realice la lectura.

Esta configuración se activa desde la palabra de configuración (Configuration Word) y las modificaciones que esta contiene varía dependiendo del procesador sin embargo las configuraciones anteriores son las básicas.

Con lo anterior detallado podemos explicar de mejor forma la siguiente línea de código:


La directiva __CONFIG instruye al ensamblador a colocar los siguientes valores dentro de la palabra de configuración (Configuration Word), seguido de las etiquetas _MCLRE_ON _CP_OFF y _WDT_OFF por ahora no es importante explicar en detalle las dos configuraciones restantes, pero si quisieramos activar el Code Protection se puede hacer simplemente cambiando la palabra _CP_OFF por _CP_ON la cual esta igualmente definida dentro del archivo p10F202.inc, el __ y el _ se utilizan debido a que el desarrollador de estas igualdades consideró que las palabra que él definió para esta configuración inicial del pic pueden ser palabras que el usuario de MPLAB puede en un momento u otro usar para definir sus propios valores. Por ejemplo al usar _MCLRE_ON podemos usar la palabra MCLREON sin correr el riesgo de que exista un traslape entre el valor predeterminado y el valor designado por el usuario. La configuración esta determinada para habilitar el MCLR, que explicaremos más adelante y un oscilador externo, el oscilador es una fuente de una señal a veces denominada señal de reloj o señal de sincronización con la cual determinamos el tiempo con el que el procesador ejecutará cada instrucción. Para este ejemplo usaremos el oscilador interno que nuestro microcontrolador tiene de fabrica mediante la etiqueta _IntRC_OSC, para realizar este anexo debemos colocar el operador &. Además desactivaremos el MCLR mediante la etiqueta _MCLRE_OFF, la palabra de configuración debe quedar de la siguiente forma:



El & es el símbolo designado para MPLAB a la operación lógica AND, la utilidad de este operador lógico y los operadores lógicos restantes se explicarán con mayor detalles en lecciones posteriores.

En programación de microcontroladores, microprocesadores y otros CI, resulta de gran importancia utilizar valores constantes o variables para realizar las operaciones que definen el programa, para esto es necesario guardar estos datos en alguna ubicación de la memoria SRAM la cual se encarga de sostener ese valor mientras realizamos otro tipo de operaciones, de ahí podemos recoger el valor que le escribimos en cualquier momento en el que le queramos ocupar:



Las direcciones que tiene la memoria SRAM se les denominan registros de memoria, Microchip los denomina como file registers, la estructura que manejamos para el ensamblador de MPLAB (MPASM) requiere de una definición previa de los registros que vamos a ocupar (no necesariamente se tienen que utilizar), la directiva UDATA viene de Uninitialized Data y determina una sección de la memoria SRAM etiquetada como TEMP_VAR (La etiquete se puede cambiar por cualquier otro nombre o incluso no etiquetarla, no etiquetarla provoca que el ensamblador asigne una etiquete default no visible).

Temp es la etiqueta de ejemplo asignada a una dirección de la SRAM, puede ser sustituida por cualquier otro nombre, para este caso las etiquetas serán asignadas a direcciones hexadecimales entre 08h y 1Fh. La directiva RES es de RESERVE y lo que indica al ensamblador es una reserva de direcciones de memoria en este caso solo se reserva una sola posición de la SRAM.

La memoria de datos o SRAM se encuentra mapeada en el datasheet de cada procesador, en este caso el mapa viene de la siguiente forma:
























De la dirección 00h a la dirección 07h hallamos registros denominados SFR (Specific Function Register), estos registros de función específica realizan acciones predeterminadas por el controlador, es decir que cada una de estas posiciones están íntimamente relacionadas con la circuitería interna (además de la memoria) el pic, es decir que dentro del microcontrolador podemos encontrar módulos distintos y registros adicionales que facilitan y evalúan la tarea de operación del controlador. En este caso tenemos el OSCCAL, el cual es un registro encargado calibrar el oscilador del pic.

Ahora será más fácil explicar el cuerpo del programa:

















La directiva CODE es el análogo de la memoria de programa a la directiva UDATA de la memoria de datos, la directiva CODE determina una sección de código en la memoria de programa. Tanto la directiva CODE como la directiva UDATA tiene una etiqueta a la izquierda, además de que a la derecha se puede asignar una dirección de memoria. Los registros de memoria de datos (SRAM) tienen una longitud de 1 byte por dirección, mientras que las direcciones de memoria de programa tienen una longitud de 12 bits, a estas direcciones de memoria de programa se denominan Word.

En la siguiente tabla se puede observar la densidad de memoria del pic extraída de sus respectiva hoja de datos:


Como se pueda observar en la imagen previa a la tabla, el código real de operación del pic inicia en una sección de código ubicado en la dirección de memoria 1FFh (en la memoria de programa):



La etiqueta que maneja esta sección es RESET_VECTOR, esta sección esta ubicada en la última dirección de la memoria de programa ¿por qué?. Porque el pic cuenta con un oscilador interno el cual es un circuito RC dedicado para genera oscilaciones a una frecuencia de 4MHz, estas oscilaciones pueden variar debido a que el circuito oscilador RC interno no siempre va a operar de la misma manera ya que este depende de una alimentación externa (al igual que el resto de la circuitería) la cual puede sufrir variaciones al igual como la temperatura puede hacer variar el mismo arreglo RC, para compensar estas variaciones Microchip coloca un valor de calibración que el pic tiene insertado de fábrica en la última dirección de la memoria de programa.

La idea es simple: El pic cuenta con un puntero PC (Program Counter), este puntero es un contador secuencial, lo que significa que cuando el pic ejecute la instrucción en la dirección 000h, procederá a incrementar en uno el contador 000h + 1, lo que hará al programa avanzar a la instrucción que puede o no estar en la dirección 001h, este conteo seguirá hasta llegar a la última dirección de la memoria del programa la cual en este caso es la 01Fh. Pero al alimentarse el pic el puntero no inicia en la dirección 000h sino en la dirección 01Fh, esto con el fin de que la primera instrucción que ejecute el controlador sea mover este valor de calibración de fabrica. ¿Cómo mueven dicho valor? Lo que esta escrito en la dirección 01Fh es una instrucción muy usada durante la actividad del pic, esta instrucción se llama movlw (Move Literal To W), Microchip define todo valor constante como Literal el cual puede tener cualquier valor de 8 bits (para poder ser guardado en un byte de la memoria de datos), esta instrucción esta colocada para mover el valor de calibración de fabrica contenida en 01Fh y colocarla en el registro Work.



El registro Work

Para explicar la función del registro Work es necesario entender un poco la idea de como funciona la lógica de computación:














La imagen anterior es extraída de la hoja de datos donde viene incluido el PIC10F202, este muestra el diagrama de bloques de los microcontroladores PIC10F20X, como se puede observar el pic tiene un multiplexor MUX cuyas entradas son cualquier registro en la memoria de datos incluyendo al Timer0 y el puerto GPIO de entrada/salida. Para que el procesador pueda realizar cualquier operación lógica o aritmética incluida en el set de 33 instrucciones de estos controladores, este debe colocar en las dos entradas de la Unidad Aritmética Lógica (ALU) un registro de la memoria de datos y el valor actual del registro W, el registro W o registro Work es el registro con el cual vamos a estar jugando constantemente.

Regresando a la instrucción colocada de fabrica en la dirección 01Fh, como decíamos el pic al alimentarse comienza en esta dirección de la memoria de programa ejecutando la instrucción:

movlw k

Donde k es el valor de calibración colocado por Microchip al momento de fabrica el pic, este valor se mueve al registro W, a continuación contador de programa o PC se le sumará un 1 para que el mismo pueda apuntar a la siguiente dirección de memoria, pero después de la dirección 01Fh no existe otra dirección de memoria (un 02Fh), por lo tanto el PC tendrá como valor de dirección la primera dirección de la memoria de programa, es decir 000h.




El programa señala que la sección de código etiquetada como MAIN comenzará en la dirección 0x000, la primera dirección colocada en esta sección de código es la instrucción:

movwf OSCCAL

Lo que significa Move Work To File Register, el valor de W el cual es k (el valor de calibración de fábrica) será movido al archivo de registro OSCCAL el cual se encargará de compensar esas variaciones que pueda sufrir el oscilador.
El resto del código es solo un ejemplo escrito como ejemplo, lo único que hace es mover la constante hexadecimal 0xFF a Work para posteriormente mover dicho valor a la variable temp.







Finalmente otra directiva de gran importancia es la directiva END con la cual debe terminar cada programa escrito. Después de END cualquier secuencia de instrucciones que sean escritas no serán ensambladas, el propósito de END es marcar el final del programa.



A continuación procederemos a quitar todo el código inútil al bosquejo y lo dejaremos listo para escribir nuestro programa:

list p=10F202 ; list directive to define processor
#include <p10F202.inc> ; processor specific variable definitions

__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.


;***** VARIABLE DEFINITIONS
UDATA



;**********************************************************************
RESET_VECTOR CODE 0x1FF ; processor reset vector

; Internal RC calibration value is placed at location 0x1FF by Microchip
; as a movlw k, where the k is a literal value.
MAIN CODE 0x000
movwf OSCCAL ; update register with factory cal value

Start


END ; directive 'end of program'



En MPLAB se verá de la siguiente forma:


Dejamos la etiqueta Start, esta sirve para que el ensamblador le de un nombre a la dirección asignada a la instrucción colocada después de esta etiqueta, con el ejemplo que haremos a continuación se entenderá de mejor forma a lo que nos referimos.

Procederemos a escribir la siguiente sección de código:





Lo que hacemos es escribir el valor binario 1111 1101 en W, posteriormente la función tris utilizará ese valor. El valor establecido en GPIO mediante la función tris indica como va a ser el comportamiento de entradas y salidas del puerto GPIO:










En la imagen anterior podemos observar los pines de entrada y salida del microcontrolador, el puerto GPIO esta compuesto de los pines de entrada/salida GP0,GP1,GP2 y GP3.

En general lo que podemos hacer en el puerto GPIO es darle lectura mediante la instrucción:

movf GPIO,w

También se le puede realizar una escritura mediante la instrucción:

movlw GPIO

Y finalmente la función que estamos utilizando ahora es la instrucción tris:
tris GPIO

La escritura y lectura del puerto mediante las dos primeras instrucciones se hacen directamente del valor que se tenga escrito en el puerto de E/S:


Mientras que la instrucción tris determina que pines del puerto son entrada y que pines son salidas:

Donde colocar un 1 determina el respectivo pin como entrada, mientras que colocar un 0 determina el respectivo pin como salida.

Al realizar la secuencia de instrucciones :





Declaramos el pin GP1 del puerto GPIO como única salida del mismo puerto, mientras todos los demás pines se como portan como entrada. Inicialmente el pic al alimentarse conserva todos sus pines como entradas hasta que se ejecute la función tris sobre el respectivo puerto, para este pic de gama baja el puerto GPIO es el único puerto que se posee.

Lo que haremos con este programa de ejemplo es esperar un valor alto en la entrada en GP0, al recibir este pulso de entrada el controlador responderá con un alto en la salida GP1.










La primera instrucción mostrada en la imagen anterior es btfsc GPIO,0 la cual significa Bit Test File Skip if Clear esta instrucción evalúa el estado que se encuentra en el bit 0 del registro GPIO, es decir GP0, en este caso si la instrucción presenta un valor lógico 0 entonces salta la siguiente instrucción, la siguiente instrucción es bsf GPIO,1 la cual significa Bit Set File y actúa en el bit 1 del puerto GPIO es decir GP1, en este caso evalúa la condición que consisten en que si GP0 se encuentra con un estado lógico 1 encienda GP1, si no está en uno es decir que esta en cero, entonces evita encender GP1.

La tercera instrucción es btfss GPIO,0 la cual significa Bit Test File Skip if Set lo cual hace lo contrario a la instrucción btfsc por lo tanto la tercera instrucción en secuencia con la segunda evaluará si GP0 tiene un estado lógico 0, si es así entonces limpiaremos la salida GP1.

Finalmente explicamos la instrucción goto, esta es una instrucción de salto, en palabras más simples la dirección escrita a un lado de la instrucción goto será la dirección donde apuntará el contador de programa y seguirá ejecutando el programa a partir de esa nueva dirección. Como ejemplo en el programa NO queremos que el pic este configurándose con la función tris una y otra vez, por lo que envolvemos en un ciclo infinito la actividad normal del pic, es decir la actividad que queremos que este realizando el controlador constantemente, en este caso la evaluación de GP0. Main_Program es la etiqueta que le damos a la dirección de la memoria de programa donde se encuentra la instrucción btfss:



La razón de por qué ocupamos etiquetas para las direcciones es porque es más fácil leer y asignar nombres o textos que leer y asignar direcciones mediante números.

Es importante resaltar el concepto de secuencia, ya que los microcontroladores PICmicro son dispositivos secuenciales, estos poseen instrucciones elementales las cuales al realizarse en ciertas secuencias podrán realizar una gran cantidad de actividades. El ensamblador puede llegar a tener un conjunto de reglas o recomendaciones en general, pero la forma de programar ensamblador depende de la forma de pensar del programador.









El código final es el siguiente:

list p=10F202 ; list directive to define processor
#include <p10F202.inc> ; processor specific variable definitions

__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.


;***** VARIABLE DEFINITIONS
UDATA



;**********************************************************************
RESET_VECTOR CODE 0x1FF ; processor reset vector

; Internal RC calibration value is placed at location 0x1FF by Microchip
; as a movlw k, where the k is a literal value.
MAIN CODE 0x000
movwf OSCCAL ; update register with factory cal value

Start
movlw b'11111101'
tris GPIO

Main_Program

btfsc GPIO,0
bsf GPIO,1
btfss GPIO,0
bcf GPIO,1

goto Main_Program

END ; directive 'end of program'









Ahora ya podemos programar el pic, para esto primero debemos construir el proyecto.

En la parte superior del MPLAB podremos observar esta pequeña barra de herramientas



Originalmente la ventana desplegable de la izquierda muestra un texto que dice:


Por ser un proyecto simple de ejemplo este no es necesario por lo que le cambiaremos a la opción:


Una vez cambiado este parámetro debemos dar click en el botón construir:




Al hacer click en este la ventana Output nos desplegará la siguiente información:






















Lo cual indica que el proyecto se construyó satisfactoriamente. Si tuviste algún problema el siguiente ejemplo te será de gran utilidad, sin embargo si seguiste detalladamente la guía no deberías tener ningún problema.

Para mayor información puedes mandar un e-mail al correo descrito en el contacto del siguiente enlace:

Ejemplo de detección de errores

Al construir nuestro proyecto la ventana Output nos expresa la siguiente información:






















Es importante recordar que los errores en programas son los que frenan la construcción del mismo, podemos ir resolviendo de forma jerárquica dándole mayor privilegio a los errores del programa, seguido por las advertencias y finalmente los mensajes. Debido a que las advertencias generalmente advierten de parámetros no especificados en ciertas instrucciones que indirectamente pueden conducir a un mal comportamiento en tu programa, mientras que los mensajes son mayormente cuestiones de la estructuración que maneja el MPLAB IDE.

Primero encontramos que tenemos únicamente un error por lo que podemos proceder directamente a él, el error marcado es el número 128. Microchip tiene documentado un listado de los errores generados por el MPASM en el siguiente documento (Capítulo 8, pág. 210):


El cual nos dice: 128 Missing argument(s) Not enough arguments for a macro call or an opcode






Como se observa en la imagen anterior la ventana Output también nos expresa información acerca del error. Resaltamos en rojo la línea de error, en azul resaltamos la línea de código en la que se halló tal error y en naranja resaltamos la descripción del error.

Haciendo doble click en la línea de error MPLAB nos muestra donde se encuentra el error:











El puntero azul nos señala la línea de error, la cual resulta ser la línea 32 concordando con lo que expresaba la ventana Output(Azul). Basándonos en la descripción del error Missing argument(s) (Naranja) podemos fácilmente descifrar que la instrucción bsf le hace falta el argumento que señala el bit en el que se ejecutará la instrucción (GP1).






Una vez arreglado podemos proceder a construir el proyecto.

Circuito ICSP

Antes de programar el microcontrolador debemos preparar el circuito donde realizaremos las conexiones seriales entre el pic y el Pickit2, si se cuenta con una tarjeta clon del Pickit2 que posee bases ZIF para las unidades se debe advertir que estas bases no son capaces de programar los microcontroladores PIC10F20X, en este caso el 202 podrá ser programado con mucha facilidad (y unos cuantos componentes) desde el puerto ICSP que posea su tarjeta clon.

Para armar el circuito requeriremos de los siguientes materiales:

  • 1 Resistencia de 10k Ohms
  • 1 Capacitor de 100 nF
  • 1 Diodo rectificador

In Circuit Serial Programming es el método de programación de microcontroladores PICmicro de Microchip, en otras líneas de microcontroladores podeemos encontrar este método bajo un nombre distinto. En si este método se usan 5 líneas de conexión para llevar a cabo la programación, la primera es una línea donde se habilita la programación mediante un voltaje de programación VPP, la segunda es una línea de alimentación VDD, la tercera es la línea común GND, la cuarta es una línea de datos bidireccional PGD o ICSPDAT, y la quinta es una línea dedicada a una señal de sincronización unidireccional PGC o ICSPCLK.


A continuación resaltamos las líneas respectivas según el diagrama del encapsulado mostrado en la hoja de datos:









En la siguiente imagen mostramos como se debe armar el circuito para programar el controlador PIC10F20X:

El lado derecho del pic lo tomamos en cuenta de arriba hacia abajo como los pines del 5 al 8. Este circuito no tiene aislamiento para el circuito de aplicación por lo que se recomienda hacer en una breadboard únicamente con los componentes mostrados. El Header ICSP son las conexiones al Pickit2 o a la tarjeta clon, posiblemente encuentre ICSPDAT como PGD e ICSPCLK como PGC lo cual hace referencia a los mismos pines. Microchip provee el siguiente circuito de programación ICSP sobre el circuito de aplicación:
















Una vez realizada todas las conexiones, conectamos el Pickit2 a la computadora e iniciamos el proceso de programación.

Programación del PICmicro

La programación para un dispositivo con el Pickit2 consiste en cuatro sencillos pasos:

  1. Cargar el Pickit2: Una vez conectado el Pickit2 a la computadora, debemos asegurarnos que este este correctamente instalado con su respectivo driver. Ahora debemos cargar el Pickit2 desde MPLAB:


















  1. Hacemos click en el botón Erase the Target Device Memories y posteriormente verificamos el borrado con el botón Verify the Target Device Memories are Erased:



  1. Hacemos click en Program the Target Device



  1. Hacemos click en Verify the Contents of the Target Device, NO confundir con el botón Read Target Device Memories, puesto a que este solo ejecuta una lectura del programa escrito en el controlador.


Si todo se realizó correctamente podremos observar que la ventana Output da una respuesta por cada comando ejecutado sobre el Pickit2.

Si el PICkit2 le mostró errores favor puede ponerse en contacto http://pugtronica.blogspot.mx/.

Igualmente se pueden realizar todo estos procedimientos desde el ejecutable de Pickit2, si quiere saber más sobre este proceso puede ponerse en contacto en el foro http://pugtronica.blogspot.mx/.



Para justificar lo aprendido realizaremos en físico el siguiente circuito esquemático:


Cuando alimente el circuito podrá observar la lógica más común de los circuitos eléctricos y electrónicos, la cual consiste en responder sí al presionar el interruptor. La ventaja de usar un CI programable es que puede solucionar en software lo que sería una problemática en hardware, un ejemplo simple: si quisiera negar la señal de entrada en GP0 se pueden encontrar dos soluciones simples en el hardware, la primera sería agregar una compuerta NOT lo cual provocaría que se ocupara más espacio en el proyecto, la segunda solución sería cambiar el arreglo Pull-Down por un arreglo Pull-Up lo cual en proyectos de mayor densidad resultaría fastidioso estar desmontando y montando componentes de (sobre todo si estos ya están soldados).

La solución en hardware consistiría en modificar la siguiente secuencia de código que ya hemos explicado antes:










Lo único que tendríamos que hacer es la negación en el prorgama de la siguiente manera:








Como se puede observar lo único que se hizo fue cambiar la instrucción btfsc por btfss en la primera instrucción, mientras que en la tercera instrucción cambiamos la instrucción btfss por btfsc. Para sistemas que están impresos con un circuito de aplicación ICSP como el que se mostró de Microchip, cambiar esta sección de código y reprogramar el pic tomaría solo unos pocos minutos.

Conclusión

Se ha presentado mucha teoría tan solo para hacer encender un simple LED, pero se ha dejado muy claro gran parte de la estructura de MPLAB IDE y su ensamblador MPASM.

Si no ha comprendido parcial o totalmente el contenido teórico de este documento puede regresar conforme la práctica y verá como poco a poco va asimilando todo lo descrito. En lo personal el método que se propuso para creación de proyectos me parece muy bueno por lo que es el que me baso para hacer todos mis proyectos por más pequeño que este sea.


Aun queda mucho por aprender en lecciones posteriores, este curso esta basado en el curso de Introduction to PIC Programming Baseline to Enhanced Mid-Range Architecture por lo que lo recomiendo personalmente, ya que este curso te lleva de la mano presentándote cada característica del microcontrolador conforme lo vayas necesitando, al final de cada lección ellos presentan el enlace de su siguiente lección.  
Next
This is the most recent post.
Previous
Entrada antigua

0 comentarios:

Publicar un comentario