Lección 1: MPLAB v8
Al ejecutar MPLAB (MPLAB IDE v8.92) lo primero que se observará son
las siguientes ventanas:
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:
-
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.
-
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.
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:
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:
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:
-
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:
-
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:
-
Hacemos click en Program the Target Device
-
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.
0 comentarios:
Publicar un comentario