3.0 U3. Microprocesadores SR
3.0 U3. Microprocesadores SR
3.0 U3. Microprocesadores SR
OBJETIVO
El estudiante conocerá los detalles internos y operativos del microcontrolador
que se utilizará para las prácticas que se indicarán en este libro e identificará el
set de instrucciones del micro para elaborar los primeros programas en
ensamblador; además, reconocerá el método para cargar el programa en el
microcontrolador y probarlo en un circuito externo.
TEMARIO
3.1 ANÁLISIS DE LAS CARACTERÍSTICAS DE UN MICROCONTROLADOR COMERCIAL DE
8 BITS
3.2 ARQUITECTURA DEL MICROCONTROLADOR DE 8 BITS
3.3 MODOS DE DIRECCIONAMIENTO DEL PIC 16F628A
3.4 CONJUNTO DE INSTRUCCIONES DEL MICROCONTROLADOR PIC 16F628A
3.5 PRIMER PROGRAMA EN ENSAMBLADOR
85
MAPA CONCEPTUAL
86
INTRODUCCIÓN
87
3.1 ANÁLISIS DE LAS CARACTERÍSTICAS DE UN MICROCONTROLADOR COMERCIAL DE 8
BITS
88
de la familia PIC 12-16 la ideal para comenzar con el mundo de los
microcontroladores.
Las características principales del micro PIC16F628A que se usará en
las prácticas, son las siguientes: Se trata de un dispositivo de 8 bits en
arquitectura RISC (computación por set de instrucciones reducido), cuyo
lenguaje ensamblador sólo posee 35 comandos individuales, lo que lo hace
muy fácil de aprender y dominar. El micro posee un oscilador interno
seleccionable entre 4MHz (reloj normal) o 48KHz (para aplicaciones de muy
bajo consumo de potencia), lo que le permite funcionar sin la presencia de una
fuente de reloj externa; pero se le puede aplicar una oscilación de hasta 20MHz
para máxima velocidad de proceso. El dispositivo puede ser alimentado con un
voltaje de 2 hasta 5.5V; se encuentra en un encapsulado de 18 terminales, de
las cuales hasta 16 pueden usarse como entradas o salidas de señal; posee
dos comparadores análogos, que pueden usar ya sea un voltaje de referencia
externo o uno interno para su labor; posee 3 temporizadores, uno de 16 bits y 2
de 8 bits; un bloque PWM para expedir señales análogas simuladas, un bloque
de comunicaciones consistente en un receptor-transmisor universal síncrono-
asíncrono (USART); y muchos bloques más para aplicaciones más
especializadas.
El 16F628A posee 2 kilobytes de
memoria flash para almacenar su programa
interno, además de 224 bytes de RAM para
guardar datos temporales y 128 bytes de
EEPROM para datos semipermanentes. La
ventaja de que la memoria de
programación sea flash es que, en caso de
Aspecto del PIC 16F628A, que se usará como base
que al desarrollar el programa, se
para las prácticas del libro.
cometiera algún error, simplemente se
corrige y se carga nuevamente en el micro.
La memoria flash se puede grabar hasta 100,000 veces antes de que
aparezcan errores, excediendo en mucho la vida útil del dispositivo.
89
Un detalle especial que tiene la memoria, es que en el bloque de flash,
cada celda tiene una extensión de 14 bits, mientras que en la RAM y la
EEPROM sus celdillas son de 8 bits; esto se debe a la arquitectura Harvard de
este dispositivo, que mantiene separados el bus de datos y el bus de programa;
y esto le permite que en una sola orden de 14 bits, se incluya el comando en
cuestión y el dato que se va a utilizar o la dirección a la que se requiere
acceder. Esto se traduce en menor tiempo para ejecutar las órdenes; de forma
típica, un comando utiliza un ciclo de reloj para procesarse, con la excepción de
los saltos, que requieren de dos ciclos. Si se considera que el micro toma la
señal del oscilador y la divide entre 4 para generar su reloj interno, y sabiendo
que la máxima frecuencia del oscilador es de 20MHz, entonces este micro es
capaz de realizar hasta 5 millones de operaciones sencillas por segundo, algo
más que razonable para un dispositivo de este precio.
ACTIVIDAD 3A
Contesta lo siguiente:
1.- ¿Cuál es la empresa que fabrica el microcontrolador que se usará como ejemplo
para las prácticas de este libro?
2.- ¿De cuántos bits es la serie PIC 12-16?
3.- ¿Qué tipo de arquitectura utiliza la familia PIC, Von Neumann o Harvard?
4.- ¿Cuál es la principal diferencia entre ambas arquitecturas?
5.- ¿Cuál es la ventaja de que la memoria de programación sea de tipo flash?
6.- ¿Cuál es la frecuencia máxima que puede manejar este dispositivo?
7.- ¿Es indispensable colocar un reloj externo al PIC 16F628A?
8.- ¿Cuántos temporizadores incluye este dispositivo?
9.- ¿Incluye comparadores analógicos? ¿Cuántos?
10.- ¿Para qué sirve el bloque de memoria EEPROM?
90
3.2 ARQUITECTURA DEL MICROCONTROLADOR DE 8 BITS
91
Sin embargo, y a pesar de su complejidad aparente, este dispositivo
mantiene la misma estructura básica que ya se explicó en unidades anteriores;
por ejemplo, se puede observar en la parte media del diagrama la unidad
aritmética lógica (ALU), que se encarga de realizar todas las operaciones dentro
del circuito. Exactamente debajo de ella está el registro de trabajo W, que es
donde se carga uno de los operandos de cualquier operación de dos bytes que
se deseen hacer en la ALU, pudiendo obtener el otro ya sea de la memoria
flash de programa, de la RAM, de la EEPROM o incluso de alguno de sus
puertos de entrada. Encima de la ALU, se observa la presencia de dos registros
especiales: el de estado y el FSR, que sirve para localizar de forma indirecta los
datos contenidos en alguna dirección de memoria. Arriba de estos registros se
encuentra la RAM, y parte de esta memoria también se usa como registros
especializados para el micro, donde se configuran las entradas/salidas de los
puertos, si se van a activar los temporizadores y cómo se configuran, si se van
a usar las interrupciones y cómo, si se van a usar los comparadores analógicos
y cómo, etc. Más adelante, se presentará un mapa detallado de la memoria
RAM de este micro, y se indicará que hay localidades que sólo se tocan durante
la configuración inicial del dispositivo, y no se pueden usar para trabajo normal.
En la parte derecha del diagrama están los dos puertos I/O generales,
cada uno de 8 bits; cada una de las terminales de estos puertos puede
configurarse como entrada o salida, independientemente de las demás, así que
en un momento dado, un puerto puede estar expidiendo órdenes por algunos
pines, y recibiendo instrucciones a través de otros pines del mismo puerto. Esto
da mucha flexibilidad al diseñador, para simplificar en la medida de lo posible
los trazos del circuito impreso donde se montará el micro.
En la parte inferior se encuentran los bloques periféricos adicionales que
incluye el 16F628A, como son los tres temporizadores, el comparador
analógico, el generador de voltaje de referencia, el generador-receptor PWM
(CCP1), el bloque de comunicaciones USART y la EEPROM para datos.
Normalmente todo esto tendría que añadirse al circuito a través de chips
92
externos, pero debido a la integración lograda por los dispositivos digitales,
ahora ya forman parte de la estructura interna de este microcontrolador.
En el bloque que se encuentra a la izquierda de la ALU, se encuentran
una serie de etapas encargadas de garantizar el buen funcionamiento del
dispositivo; por ejemplo, hay un temporizador de inicio, un oscilador de
arranque, el bloque reset, un temporizador watchdog (para vigilar que el
programa se ejecute correctamente), un reset en fr o un bloque de
programación a bajo voltaje; más a la izquierda se ubica el generador de reloj y
el control y decodificador de instrucciones. Finalmente, en la parte superior
(junto a la RAM) se encuentra el registro PC, el Stack y la memoria flash de
programación, con su respectivo registro de instrucciones. Todos estos bloques
están unidos entre sí por una serie de buses internos, casi todos de 8 bits,
excepto el de instrucciones, que es de 14 bits, y algunos otros de funciones
especiales.
93
Arquitectura Von Neumann vs. Arquitectura Harvard
ACTIVIDAD DE APRENDIZAJE 3B
Contesta lo siguiente:
1.- ¿Qué significa ALU y qué función tiene este bloque dentro del microcontrolador?
2.- ¿Hasta cuántas terminales I/O puede manejar este micro?
3.- ¿Cuántos registros de trabajo posee este dispositivo?
4.- ¿Para qué sirven los registros PC y Stack, y qué profundidad tiene este último en este PIC?
5.- ¿De qué extensión es la palabra en la memoria de programación de la familia PIC 12-16?
6.- ¿Qué significa USART y para qué sirve este bloque?
7.- ¿Cuál es el voltaje de operación normal de este micro?
8.- ¿Cuál es la función del bloque CCP1?
9.- ¿Cuál es la función del watchdog timer?
10.- ¿Para qué se necesita el bloque de memoria RAM dentro del micro? 94
3.3 MODOS DE DIRECCIONAMIENTO DEL PIC 16F628A
Como se mencionó en la unidad anterior, los procesadores lógicos, en su set de
instrucciones, pueden manejar una amplia variedad de modos de
direccionamiento para el acceso de datos hacia los registros de trabajo. Sin
embargo, al considerar que la serie PIC 12-16 sólo maneja 35 instrucciones en
su set básico de comandos, por lo tanto tiene un número muy reducido de
modos de direccionamiento; a continuación se indican cuáles son:
95
que utilizan estos modos de direccionamiento, pero se detallarán enseguida,
cuando se describan una por una las órdenes del set de instrucciones de estos
dispositivos.
ACTIVIDAD DE APRENDIZAJE 3C
Contesta lo siguiente:
1.- ¿Cuántas órdenes posee el set de instrucciones de los PIC 12-16?
2.- ¿Cuántos tipos de modos de direccionamiento posee el PIC 16F628A?
3.- Menciona dos de estos modos de direccionamiento.
96
3 CLRF Borra el contenido de F Z
4 CLRW Borra el contenido de W Z
5 COMF Operación complemento a F Z
6 DECF Decrementa el contenido de F Z
7 DECFSZ Decrementa F, salta una posición si llega a cero
8 INCF Incrementa el contenido de F Z
9 INCFSZ Incrementa F, salta una posición si llega a cero
10 IORWF Operación OR entre W y F Z
11 MOVF Mueve F Z
12 MOVWF Mueve el contenido de W a F
13 NOP No operación
14 RLF Rotar F a la izquierda a través de carry C
15 RRF Rotar F a la derecha a través de carry C
16 SUBWF Resta entre W y F C, DC, Z
17 SWAPF Intercambia los nibbles de F
18 XORWF Operación XOR entre W y F Z
Operaciones relacionadas con bits dentro de registros o localidades de memoria
19 BCF Borra un bit dentro de F
20 BSF Activa un bit dentro de F
21 BTFSC Prueba un bit dentro de F, salta una posición si es cero
22 BTFSS Prueba un bit dentro de F, salta una posición si es uno
Operaciones con literales y de control
23 ADDLW Suma el contenido de W con una literal C, DC, Z
24 ANDLW Operación AND entre W y una literal Z
25 CALL Llama a una subrutina TO PD
26 CLRWDT Borra el temporizador watchdog
27 GOTO Salto incondicional a una dirección
28 IORLW Operación OR entre W y una literal Z
29 MOVLW Mueve una literal a W
30 RETFIE Regreso de una interrupción
31 RETLW Regresa de una subrutina con una literal en W
32 RETURN Regreso de una subrutina
33 SLEEP Entrar en modo de espera y bajo consumo TO, PD
97
34 SUBLW Substrae W de una literal C, DC, Z
35 XORLW Operación XOR entre W y una literal Z
ADDLW k ADDWF
Se suma el valor de W con una literal k, Se suma el valor de W con el contenido
donde k = de 0 a 255, el resultado se en la localidad de memoria F; el
guarda en W. resultado se guarda en F si el bit de
Ejemplo: ADDLW 0x15 opción es 1, y en W si es 0.
Si W era igual a 0x10, después de la Ejemplo: ADDWF REG1, 1
instrucción, W = 0x25 En este caso, se suman W y REG1, y el
Si el resultado rebasa los 8 bits, se resultado se guarda en REG1.
activa el bit CARRY. Si el resultado rebasa los 8 bits, se
activa el bit CARRY.
ANDLW ANDWF
Operación AND entre W y una literal k, Operación AND entre W y el contenido
donde k = de 0 a 255, el resultado se de una localidad de memoria F; el
guarda en W. resultado se guarda en F si el bit de
Ejemplo: ANDLW 0x5F opción es 1, y en W si es 0.
Si W era igual a 0xA3, después de la Ejemplo: ANDWF REG1, 0
instrucción, W = 0x03 En este caso, se hace una AND entre W
y REG1, y el resultado se guarda en W.
BCF BSF
Borra un bit dentro de una localidad de Activa un bit dentro de una localidad de
memoria F. memoria F.
Ejemplo: BCF REG1, 7 Ejemplo: BSF REG1, 3
Se borra el bit 7 de REG1; si REG1 era Se activa el bit 3 de REG1, si REG1 era
0xF1, después de la orden será 0x71 0x51, después de la orden será 0x55
BTFSC BTFSS
98
Prueba un bit dentro de una localidad F, Prueba un bit dentro de una localidad F,
y el PC salta una unidad si es cero. y el PC salta una unidad si es uno.
Ejemplo: BTFSC REG1, 5 Ejemplo: BTFSS REG1, 5
Si el bit 5 de REG1 es 1, el PC sigue Si el bit 5 de REG1 es 0, el PC sigue
con su cuenta normal, pero si es 0, salta con su cuenta normal, pero si es 1, salta
una unidad. una unidad.
CALL CLRF
Se llama al contenido de una subrutina. Borra el contenido de una localidad de
Ejemplo: CALL 1SEG memoria F.
El contenido del PC se guarda en el Ejemplo: CLRF REG1
Stack, y cambia a la dirección de la Sin importar qué número estuviera
subrutina. Cuando se regresa de ella, se guardado en REG1, después de la
recupera el número del Stack hacia el orden se tendrá un 0x00
PC, y sigue con su cuenta normal.
CLRW CLRWDT
Borra el contenido de una localidad de Borra el temporizador Watchdog de
memoria F. vigilancia.
Ejemplo: CLRW Ejemplo: CLRWDT
Sin importar qué número estuviera Se reinicializa el contador interno del
guardado en W, después de la orden se WDT.
tendrá 0x00
COMF DECF
Operación complemento en el contenido Se decrementa en una unidad el
de la localidad de memoria F. Si el bit de contenido de F. Si el bit de opción es 0,
opción es 0, el resultado se guarda en el resultado se guarda en W, y en REG1
W, y en REG1 si el bit es 1. si el bit es 1.
Ejemplo: COMF REG1, 0 Ejemplo: DECF REG1, 1
Si REG1 era 0x13, luego de la Si REG1 era 0x24, después de la
operación REG1 = 0x13 y W = 0xEC instrucción REG1 = 0x23
DECFSZ GOTO
Se decrementa en una unidad el valor Salto incondicional hacia cualquier
99
de F, y cuando llega a cero, el PC hace dirección válida de memoria
un salto de una unidad en su cuenta. Ejemplo: GOTO RUTINAX
Ejemplo: DECFSZ REG1 Sin importar dónde estuviera el PC,
Si REG1 no es cero, el PC sigue con su luego de la orden irá a la dirección de la
cuenta normal, pero si llega a cero, el rutina-X
PC hace un salto de una unidad.
INCF INCFSZ
Se incrementa en una unidad el valor Se incrementa el valor de F, y si llega a
dentro de F. Si el bit de opción es 1, el cero, el PC hace un salto de una unidad.
valor se guarda dentro de F, y si es 0, se Si el bit de opción es 1, el valor se
guarda en W. guarda dentro de F, y si es 0, se guarda
Ejemplo: INCF REG1, 1 en W.
Si REG1 era 0x24, después de la orden Ejemplo: INCFSZ REG1, 1
REG1 = 0x25 Si REG1 tiene cualquier valor distinto a
cero, el PC sigue su cuenta normal, pero
si llega a cero, el PC hace un salto de
una unidad.
IORLW IORWF
Se hace una operación OR entre W y Se hace una operación OR entre W y el
una literal k, donde k = de 0 a 255; el contenido de F; si el bit de opción es 1,
resultado se guarda en W. el valor se guarda dentro de F, y si es 0,
Ejemplo: IORLW 0x35 se guarda en W.
Si W era 0x9A, luego de la instrucción Ejemplo: IORWF REG1, 0
W = 0xBF Si W = 0x91 y REG1 = 0x13, luego de la
instrucción W = 0x93
MOVLW MOVF
Carga una literal k en el registro W, El contenido de la dirección de memoria
donde k = de 0 a 255. F se mueve a W si el bit de opción es 0,
Ejemplo: MOVLW 0x3A y se queda en F si el bit de opción es 1.
Sin importar qué hubiera en W Ejemplo: MOVF REG1, 0
anteriormente, después de la orden El valor de REG1 se pasará a W
W = 0x3A después de la orden.
MOVWF NOP
El contenido del registro W se graba en Ninguna operación; se utiliza para
100
la localidad de memoria F. introducir un retardo de un ciclo de reloj,
Ejemplo: MOVWF REG1 cuando se quiere llevar un tiempo muy
Si W = 0xA1, después de la orden este preciso.
valor se cargará en REG1. Ejemplo: NOP
RETFIE RETLW
Regresa desde una interrupción: cuando Regresa de una subrutina con una literal
se recibe una interrupción, el PC hace cargada en W. Cuando termina una
un salto incondicional a una cierta subrutina y se desea regresar al
localidad de memoria, pero guarda su programa normal, pero con un dato
valor anterior en el Stack; cuando se específico en W, esta orden permite
termina de ejecutar la rutina que se hacerlo en un solo comando.
invoca por la interrupción, una orden Ejemplo: RETLW, 0xA3
RETFIE regresa al PC a la localidad de Al regresar de la subrutina, el registro W
memoria donde estaba anteriormente. tendrá en su interior un valor de 0xA3.
Ejemplo: RETFIE
RETURN RLF
Regreso desde una subrutina. Cuando Rota los bits del registro F hacia la
se termine de ejecutar una subrutina y izquierda, pasando por el bit CARRY
se desee regresar al programa normal,
una orden RETURN hace que el PC
recupere el valor guardado en el Stack,
y retome su cuenta normal.
Ejemplo: RETURN Ejemplo: RLF REG1
RRF SLEEP
Rota los bits del registro F hacia la Esta orden coloca al micro en un modo
derecha, pasando por el bit CARRY. de mínima energía, mientras espera
nuevas órdenes.
Ejemplo: SLEEP
101
Substrae el valor de W de una literal k, Substrae el valor de W del contenido de
donde k = de 0 a 255. El resultado se F. El resultado se guarda en W si el bit
guarda en W. de opción es 0, y en F si es 1.
Ejemplo: SUBLW 0x28 Ejemplo: SUBWF REG1, 1
Si W = 0x03, luego de la orden, Dependiendo si W es mayor, menor o
W = 0x25. Dependiendo si W es mayor, igual a la literal, se activan los bits C, Z y
menor o igual a la literal, se activan los DC
bits C, Z y DC
SWAPF XORLW
Intercambia los nibbles (grupos de 4 Operación XOR entre el contenido de W
bits) del contenido de F. El resultado se y una literal k, donde k = de 0 a 255. El
guarda en W si el bit de opción es 0, y resultado se guarda en W.
en F si es 1. Ejemplo: XORLW 0xAF
Ejemplo: SWAPF REG1, 1 Si W era 0xB5, después de la orden
Si REG1 = 0x9A, después de la orden W = 0x1A
REG1 = 0xA9
XORWF
Operación XOR entre W y el contenido
de F. El resultado se guarda en W si el
bit de opción es 0, y en F si es 1.
Ejemplo: XORWF REG1, 0
Si W = 0xB5 y REG1 = 0xAF, luego de
la orden W = 0x1A
De este modo, se puede tener una idea más clara de para qué sirve cada
una de las órdenes incluidas en el set de instrucciones de los
microcontroladores PIC serie 12-16. Una gran ventaja que tienen estos
dispositivos es que su set de comandos casi no ha cambiado desde que
comenzaron a fabricarlos, así que un programa que se diseñe en este momento
puede funcionar prácticamente sin modificaciones en otros micros más antiguos
o en dispositivos que aún están en la mesa de diseño; de ahí la conveniencia
de realizar los programas en forma de bloques funcionales, para que cuando
102
llegue algún proyecto con una etapa que ya se había diseñado para un circuito
anterior, se pueda retomar haciéndole sólo modificaciones mínimas.
Antes de pasar a las prácticas de programación, se debe describir un
aspecto importante de la operación de este microcontrolador: los registros
especiales donde se activan las banderas de estado; y esto implica echar un
vistazo al mapa de memoria del dispositivo.
A continuación se encuentra el mapa de memoria de un microcontrolador
PIC 16F628A; se puede observar que varias de las localidades de memoria que
posee el micro ya están ocupadas por una gran cantidad de registros, cada uno
con una función específica dentro de la estructura del micro. Se describirán los
más importantes, y se dejaran algunos para cuando se estudien ciertos temas
específicos sobre este controlador.
Se iniciará por orden numérico: en la localidad 01h se encuentra el
registro correspondiente al temporizador No. 0; por el momento no se indicará
para qué sirve, ya que este bloque sólo se utiliza para ciertas funciones
avanzadas del micro.
El registro PCL corresponde a los 8 bits inferiores del registro PC o
contador de programa; dado que el 16F628A posee 2kB de memoria de
programa, pero con 8 bits sólo se pueden direccionar 256 bits, esto implica que
necesita por lo menos 3 bits adicionales para direccionar a toda su memoria,
entonces, en PCL se guardan los 8 bits inferiores, y en PCLATH los adicionales.
El registro STATE o de estado guarda algunos de los bits más usuales
durante la programación del dispositivo, como las banderas C (carry), Z (cero) y
DC (decrement carry), además del IRP, RP0 y RP1 (elección del banco de
memoria usado), TO (Time out) y PD (Power down). En programas sencillos
sólo se usarán los bits C, Z y DC, pero en programas más complejos se llegan a
utilizar todos los demás, especialmente los tres primeros, ya que se activan o
desactivan dependiendo de en qué bloque de memoria se alojen las
instrucciones del programa.
El registro OPTION_REG controla aspectos de las interrupciones y los
temporizadores, pero hay un bit especial RBPU, que habilita o desactiva unas
103
resistencias de pull-up en las terminales de salida del micro. Si se activan esas
resistencias (poniendo este bit en 0 ), se podrá conectar un LED directamente
a las terminales del chip, sin necesidad de resistencia limitadora, lo que reduce
aún más la cantidad de componentes necesarios para los proyectos.
(Cortesía de Microchip).
104
El registro INTCON sirve para configurar las interrupciones y cómo se
utilizarán (en caso de que el programa lo requiera). Los registros PIE y PIR1
sirven para manejar las interrupciones a través de bloques periféricos como los
temporizadores, el USART, los comparadores, etc.
El registro PCON posee un bit importante para el diseño usando este
PIC: OSCF o frecuencia del oscilador interno; si se coloca en 1 , la frecuencia
ser de 4MH , en 0 ser de 48kH . Los bits POR BOR se usan para
monitorear si se ha aplicado un reset al equipo.
Los registros TRISA y TRISB sirven para determinar si las terminales de
los puertos A y B se utilizarán como entrada o como salida de señal. Para
hacerlo, se coloca un número binario en este registro, y las posiciones con un
1 quedar n como entradas, mientras las que tengan un 0 ser n salidas. Esto
se puede cambiar durante la ejecución del programa, pero normalmente se
determina desde el principio de la programación cómo se usarán las terminales,
y se configuran al inicio del programa.
Para leer o escribir algún dato a las terminales de los puertos, se tienen
los registros PORTA y PORTB; lo que significa que si se desea poner en un
ni el alto alguna terminal de un puerto, bastar con que se escriba un 1 en la
posición correspondiente de este puerto, y eso se reflejará de inmediato en la
salida del dispositivo. Lo mismo se puede decir de la entrada; si se desea saber
si en una cierta terminal ha un 1 o un 0 , simplemente se lee el bit
correspondiente del PORTA o PORTB, y con eso se sabrá qué está llegando a
esa terminal.
Todos los registros posteriores son de aplicación específica para los
bloques periféricos internos del micro; así hay registros para los temporizadores
1 y 2, para los comparadores, para el transmisor USART, etc. Estos registros
sólo se utilizarán cuando sea necesario aprovechar estos bloques funcionales,
lo cual normalmente sólo se requiere en aplicaciones complejas.
Finalmente, existe un registro muy importante, el de configuración inicial,
en el cual se fijan las condiciones operativas del dispositivo. Por ejemplo, aquí
se indica si se activará el watchdog timer, si se protegerá el código grabado en
105
el micro, qué tipo de reloj usará el dispositivo (interno, externo, RC, cristal, etc.)
y otros aspectos fundamentales para la correcta operación del controlador. Este
registro se debe configurar al inicio del programa.
Estos son los registros especiales que posee este micro. Se deben tener
siempre presentes, ya que se utilizarán constantemente durante el desarrollo
del código interno del procesador.
ACTIVIDAD DE APRENDIZAJE 3D
Contesta lo siguiente:
1.- ¿Cómo se dividen los comandos del set de instrucciones de los PIC?
2.- Menciona dos comandos relacionados con los bits dentro de los registros.
3.- Menciona tres comandos que sirvan para hacer operaciones con dos registros.
4.- ¿Cuáles son los comandos para llamar una subrutina y para volver de ella?
8.- ¿Cómo se configura en estos registros si una terminal servirá como entrada o
salida?
9.- ¿En qué registro se coloca la información que va o viene del puerto A?
106
empresa ofrece a sus consumidores: el programa MPLAB; se debe instalar en
la computadora, para tenerlo siempre a la mano, ya que en él se basarán las
explicaciones posteriores. Esto no es estrictamente necesario, ya que el
programa en sí se puede hacer en cualquier editor ASCII, como el Notepad que
incluye Windows; sin embargo, el paso final de pasar el programa de lenguaje
ensamblador a lenguaje de unos ceros del micro s se tiene que hacer con
esta herramienta, así que es mejor tenerla disponible.
107
ensamblador, las explicaciones se concentrarán estrictamente en el programa
MPLAB.
A continuación, se creará en el Notepad un archivo que llevará por
nombre SEMAFORO.ASM; donde se escribirá el código del semáforo que se
desea implementar con el PIC 16F628A. En seguida se muestra este código ya
depurado:
LIST P=16F628A
#INCLUDE <P16F628A.INC>
ORG 0000H
108
; interrupción es la 0004H, pero como en este proyecto no se usan
; las interrupciones, podemos seguir con el programa.
MOVLW b'00000000'
BSF STATUS, RP0
MOVWF TRISB
BCF STATUS, RP0
MOVWF PORTB
MOVLW b'00101000'
MOVWF TIEMPO
109
; llegue a cero, se hace un salto.
GOTO PUNTO2
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100010'
MOVWF PORTB
CALL SEG
CALL SEG
CALL SEG
110
MOVLW b'00001100'
MOVWF PORTB
MOVLW b'00101000'
MOVWF TIEMPO
GOTO PUNTO3
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
111
; Después de los tres parpadeos, se enciende Amarillo2 por 3
; segundos
MOVLW b'00010100'
MOVWF PORTB
CALL SEG
CALL SEG
CALL SEG
GOTO PUNTO1
END
112
(Cortesía de Microchip).
Se deberán pasar varias opciones, como elegir el PIC que se utilizará,
elegir el ambiente de trabajo, cargar el archivo con el programa (aquí hay que
elegir el recién creado SEMAFORO.ASM), etc. Al terminar, en el directorio
elegido aparece un archivo SEMAFORO.MCP y otro SEMAFORO.MCW, que es
el proyecto creado por el MPLAB.
Una vez creado el proyecto, hay que revisar si todo está correcto; para
ello, en la barra de tareas del programa deberá estar activada la opción
DEBUG, y luego accionar la opción MAKE a la derecha del círculo azul con una
i ; si el programa no tiene errores, aparecer un mensaje como el que se e en
la figura siguiente. Si aparece el mensaje BUILD SUCCEDED, eso significa que
el código no tiene errores, si existiera alguno, aparecerá un mensaje BUILD
FAILED, lo que significa que hay que depurar el código.
Para facilitar esta tarea, el programa crea un archivo de error, donde se
puede encontrar algo como lo siguiente:
113
Esto indica que hay un error en la línea 13, y que se debe verificar la
condición indicada en la línea 37. Un error impedirá que el proyecto se compile,
un mensaje o una advertencia no.
114
con los cuales se puede construir un programador muy económico. Uno de los
más populares es el JDM, que se muestra en la foto (armado por el autor), que
tiene la ventaja de que no necesita de fuente adicional, ya que se alimenta
directamente del puerto serial de la computadora. Si la computadora no posee
puertos seriales, entonces lo mejor será adquirir un programador vía USB como
el que se muestra, aunque esto sí implica una inversión un poco más elevada.
Para la carga del programa hacia
el PIC, en el caso del programador JDM,
es necesario utilizar algún programa
capaz de comunicarse con él, los más
populares son el IC-Prog o el Pony-Prog.
En el caso del programador USB,
seguramente está acompañado con su
programa de carga exclusivo, así que ese Programador de PICs USB.
115
Cuando el programa se haya cargado en la memoria flash del PIC, se
deberá probar. En este caso, hay que conectar el micro como se muestra en la
figura anexa; se observa que se han conectado los LED de colores a las salidas
del puerto B, verdes para RB0 y RB3, amarillos para RB1 y RB4, y rojos para
RB2 y RB5; RB6 y RB7 no tienen conexión, lo mismo que las terminales del
puerto A. Lo único adicional es la entrada de voltaje y tierra, que alimentan al
dispositivo.
Si todo se realizó de forma correcta, al momento de aplicar un voltaje de
5Vdc a la tablilla de pruebas, los LED comienzan a encenderse con la
secuencia de un par de semáforos; ¡y todo esto se consiguió con un chip y unas
cuantas líneas de código!
ACTIVIDAD DE APRENDIZAJE 3E
Contesta lo siguiente:
3.- ¿Se puede elaborar un programa en ensamblador sin contar con el MPLAB?
5.- ¿Por qué conviene fijar las variables al principio del código?
6.- ¿Qué precaución se debe tener al configurar los registros TRISA y TRISB?
7.- ¿Por qué hay que colocar marcadores a lo largo del programa?
8.- ¿Qué hay que hacer si al ejecutar un debug en el programa, aparecen errores?
116
AUTOEVALUACIÓN
117