Está en la página 1de 7

ADIS AL 16.

BIE
conoce la serie PIC18F (I)
Ron Coates

Han aparecido
muchos artculos que usan la
serie PIC16 de Microchip
Microcomputers, pero hasta ahora se
han usado poco en la prctica a sus "primos" de mucha
ms potencia de la serie 18F. Los dispositivos
microcontroladores de la serie 18Fxx2, que han sido
recientemente introducidos, son compatibles pin a pin con la
serie 16F87x e incorporan mejoras significativas.
52 elektor
ENVENIDO PIC18F
En este primer artculo de una serie de dos, examina- car la localizacin (direccin). Normalmente, las locali-
remos brevemente las principales diferencias entre zaciones de la RAM (frecuentemente llamados registros)
las series 16F y 18F y con ms detalle los cambios se identificarn por un nombre que se relacione con su
de la estructura de la RAM (Memoria de Datos). La utilidad general y que los defina al principio del pro-
Tabla 1 resume las caractersticas clave compara- grama, por ejemplo:
das con la serie 16F. Hay un incremento de la ROM
y un gran aumento de la RAM, slo esto justificara COUNT EQU 0x24
su uso por parte de cierto pblico. Pero tambin hay
otras mejoras: El 0x24 es la posicin en hexadecimal dentro de la RAM
y slo tenemos un rango de 256 posibles posiciones.
- Reloj de hasta 40 MHz (comparado con 20 MHz). Puesto que hay muchos ms de 256 bytes de RAM, debe
- Multiplicador hardware de ciclo sencillo. usarse un sistema de bancos para acceder a todos. Este
- Tablas de bsqueda grandes. tambin era el caso de la serie PIC16, pero en el caso
- Posibilidad de escribir en la Flash ROM durante el fun- de la serie PIC18F el arreglo es completamente diferente.
cionamiento del programa. Hay diecisis bancos potenciales disponibles, numera-
- Multitud de nuevas instrucciones. dos del 0 al 15. Slo los bancos 0,1, 2 y 15 estn
- Direccionamiento mejorado tanto para la RAM como implementados en el 242 442. El 252 y el 452
para la ROM. tambin tienen los bancos 3, 4 y 5 implementados. El
banco 15 se usa para Registros de Funcin Especial, as
que tenemos disponibles tres o seis bancos (768
Memoria y su acceso 1.536 bytes para registros de propsito general). Estos
Entre las principales mejoras sobre las series de PIC ms bancos pueden seleccionarse usando el registro de selec-
antiguos se encuentran no slo la mayor cantidad de cin de bancos BSR, pero, como veremos, normalmente
ROM y RAM, sino tambin los mtodos de direccionar- no tendremos que preocuparnos de esto.
las. Antes de discutir esto en detalle, necesitamos aclarar
algunos de los trminos que usa Microchip.
Direccionamiento directo
A la EEPROM se la llama siempre por su nombre, con El direccionamiento directo es mucho ms sencillo que
lo que no representa ninguna confusin. La EEPROM no con la serie PIC16F y tenemos razones para dudar que
es voltil, y sus contenidos no slo pueden modificarse muchos programas necesiten usar los comandos de
durante la programacin del chip sino tambin por el banco en absoluto.
cdigo ejecutado por el PIC. La EEPROM es asimismo Como puede verse en el mapa de memoria, la primera
el rea de memoria que se usa preferentemente para mitad del banco 0 y la segunda mitad del banco 15 se
almacenar las preferencias del usuario. Un ejemplo ha designado como Banco de Acceso. Leyendo la hoja
puede ser la representacin de la informacin de un del catlogo de Microchip podra pensarse que esto nos
sistema de medida de temperatura, ya sea en grados da acceso a los 128 registros de propsito general y a
Celsius o Fahrenheit. Si la variable que controla esto todos los registros de funcin especial a los que se
est almacenada en la EEPROM, el usuario puede cam- podra acceder directamente sin necesidad de usar los
biarlo y esto se recordara, incluso cuando se desco- comandos de banco.
necte la alimentacin. Esto estara bien, pero la realidad es incluso mejor,
puesto que en la practica pueden usarse los 256 regis-
Microchip denomina memoria de datos y memoria tros del banco 0 y todos los registros de funcin especial
de programa a la RAM y la ROM respectivamente. sin usar comandos de banco y sin incurrir en conflictos.
Esto es confuso, especialmente en la serie PIC18F, en Puesto que ms arriba hemos dicho que slo puede
la que grandes bloques de datos se guardan en la accederse a 256 bytes sin usar comandos de banco,
ROM en forma de tablas de bsqueda. Los datos cmo funciona esto?
almacenados en la RAM se pierden cuando se desco- Su funcionamiento se basa en el uso del bit de acceso
necta la alimentacin del PIC. Por otro lado, los datos (a) para seleccionar el banco de acceso o el banco
almacenados en la ROM se mantienen. Tanto los seleccionado por el BSR.
datos de la ROM como de la RAM pueden modifi- Supongamos que queremos definir un registro llamado
carse por el programa ejecutado. En esta primera TESTREG de la siguiente manera:
aplicacin, el autor ha usado un chip de la serie 18
en el que se usaron 12k de ROM para datos y menos TESTREG EQU 0x84
de 1k para el programa. En este articulo de dos par-
tes, usaremos los trminos RAM y ROM para estas Una mirada al mapa de registros de funcin especial nos
reas de memoria. muestra que el 84 en el banco de acceso es el puerto E.
La tabla 2 muestra el mapa de memoria de la RAM. Podra pensarse que entonces existira un conflicto entre estos
Cuando accedemos a la RAM directamente, slo tene- y, a pesar de todo, podra, pero por la forma en la que
mos un byte (el bit de direccin) disponible para identifi- Microchip ha definido el valor por defecto del bit de acceso.

elektor 53
TABLA 1. Comparacin rpida entre PIC16 y PIC18F
Denominacin / I/O RAM FLASH ROM EEPROM
Encapsulado
tipo (lneas) (bytes) (bytes) (bytes)
16F873 28 pin DIL 22 192 4k 128
16F874 40 pin DIL 33 192 4k 128
16F876 28 pin DIL 22 368 8k 256
16F877 40 pin DIL 33 368 8k 256
18F242 28 pin DIL 22/23 * 768 8/16 k ** 256
18F442 40 pin DIL 33/34 * 768 8/16 k ** 256
18F252 28 pin DIL 22/23 * 1536 16/32 k ** 256
18F452 40 pin DIL 33/34 * 1536 16/32 k ** 256

* El pin de salida extra (RA6) se puede implementar en lugar del pin OSC2, en el que se utiliza un reloj externo.
** Ver descripcin de la ROM Flash para la explicacin de esas figuras dobles.

Consideremos el siguiente cdigo: No se preocupe si no comprende totalmente todo lo


anterior, lo que importa es que pueda usar todos los
MOVLW 02 registros de propsito general que quiera desde 00 a FF,
MOVWF TESTREG y todos los registros de funcin especial que necesite, sin
tener que preocuparse en absoluto del tema de los ban-
MOVLW 04 cos. Si precisa usar ms de 256 registros, probable-
MOVWF PORTE mente estar usando direccionamiento por ndice de
cualquier modo.
Aunque no hayamos usado el bit de acceso, estas lneas
sern traducidas por el compilador como si lo que hubi-
semos escrito fuera: Direccionamiento indirecto
Si piensa que el direccionamiento directo es bueno, el
MOVLW 02 indirecto es incluso mejor, porque tenemos un nmero de
MOVWF TESTREG,1 12 bits para hacer el direccionamiento, dndonos
acceso directo a los 16 bancos. Despus de todo, tanto
MOVLW 04 212 como 16 x 256 es igual a 4,096.
MOVWF PORTE,0 En primer lugar, ahora tenemos tres registros FSR libres,
FSR0, FSR1 y FSR2. Asociados a ellos hay tres registros
Para el primer comando MOVWF el bit de acceso es 1, lo INDF.
que significa que usa el banco especificado por el BSR, Para el propsito de esta explicacin hablaremos sola-
cuyo valor por defecto es 0. El 02 ser puesto por tanto en mente de FSR0 e INDF0, pero puede aplicarse exacta-
la localizacin 0x084. Para el segundo comando MOVWF mente igual a los otros dos.
el bit de acceso es 0, lo que quiere decir que usa el banco La gran diferencia es que ahora hay un registro FSR0L (L
de acceso. El 04 se almacenar en la posicin 0xF84. de low) que tiene 8 bits y que es equivalente al registro
La interesante de esto es que no tenemos que pensar en FSR de la serie 16F. Tambin tenemos un registro FSR0H
ello en absoluto, el compilador lo hace por nosotros, por (H de high) del cual slo podemos acceder a los cuatro
supuesto, todas las declaraciones necesarias (etiquetas bits ms bajos, ya que son los que necesitamos para
y/o declaraciones de funcin) estn presentes al direccionar los diecisis bancos.
comienzo del cdigo del programa.
Usando estos dos registros juntos podemos apuntar a
cualquier sitio de la memoria RAM. An mejor, si incre-
mentamos FSR0L, entonces vamos a 0FF e incrementa-
TABLA 2. Mapa de memoria RAM del PIC18F mos FSR0L otra vez, FSR0L cambia a 00 y FSR0H se
incrementa automticamente, as que podemos mover,
Banco n / Rango de por ejemplo, FF en el banco 2 a 00 en el banco 3.
Comentario Las cosas mejoran an ms puesto que hay formas adi-
nombre direcciones
00 7F cionales de trabajar con direccionamiento indirecto
0 000 0FF como las siguientes (donde n es 0 1 2):
es acceso a banco
1 100 1FF INDFn Lleva a cabo el comando al registro indi-
2 200 2FF recto y nada ms. Lo mismo que el INDF
Donde est imple- de la serie 16.
3-5 300 5FF
mentado POSTDECn Como el de arriba, pero despus de lle-
6 -14 600 EFF No usado var a cabo el comando, el FSR se reduce
automticamente.
15 F00 F7F No usado
Registros de fun-
POSTINCn Despus de llevar a cabo el comando, el
F80 FFF (Acceso a banco) FSR se incrementa.
cin especial

54 elektor
Me suena a chino
Nos imaginamos que este artculo es desalentador para los principiantes. La mayor parte de la dificultad para entender art-
culos sobre microcontroladores es el desconcertante nmero de abreviaturas que usan los fabricantes y programadores:
PIC controlador de interfaz programable pero Microchip aconseja que la abreviatura no tenga sentido.
RAM memoria de acceso aleatorio
ROM memoria de slo lectura
DIL dual-in-line
F en cdigos de chips PIC usualmente flash
EEPROM memoria programable borrable elctricamente de slo lectura.
BSR registro de seleccin de banco
REG registro
SFR registro de funcin especial
GPR registro de propsito general

PREINCn El FSR se incrementa antes de llevar a hexadecimal de tres dgitos. El primer dgito ir en el
cabo el comando. bit bajo de FSR0H y el otro en FSRL. As el efecto de
PLUSWn El valor del registro W se usa como off- nuestra primera lnea es asegurar que el FSR est
set para el FSR. Despus del comando, apuntando al primer registro de nuestro espacio de
tanto el FSR como el W se mantienen RAM.
La siguiente lnea es una etiqueta NEXT, seguida por el
igual.
familiar CLRF. El operando POSTINC0 resultara con la
Un ejemplo del ltimo de estos comandos puede ser: localizacin 000 del registro borrada y el registro FSR0
incrementado.
INCF PLUSW0 Despus de la instruccin GOTO NEXT el valor en
0x001 ser borrado y esta secuencia continuar hasta
Si el valor de FSR0 era 0x023 y el valor en W era 04, que el comando BTFSS FSR0H, 0 provoque que el pro-
entonces el efecto del comando anterior sera incremen- grama salga del bucle cuando el valor en FSR0 alcance
tar el valor en la direccin 0x027. Despus del 0x100. La ltima posicin de memoria borrada ser
comando, los valores de FSR0 y W se mantienen sin 0x0FF.
cambios. En la serie PIC18F, con slo cuatro lneas de cdigo,
Considere los siguientes fragmentos de cdigo que siem- hemos borrado los 256 bytes del banco 0. Para borrar
pre debera usar en la parte de inicializacin de cual- la misma cantidad de memoria con la serie PIC16F
quier programa para limpiar la RAM. habramos necesitado repetir las seis lneas dos veces
Para la serie 16 escribiramos: ms para los bancos 1 y 2, sumando un total de diecio-
cho lneas.
MOVLW 0x20
MOVWF FSR
NEXT CLR INDF Mes prximo
INCF FSR En la entrega del prximo mes se estudiarn las mejoras
BTFSS FSR,7 en el direccionamiento de la ROM y la implementacin
GOTO NEXT de las tablas de bsqueda largas.
(040036-1)
Este segmento de cdigo comienza en la localizacin
0x20 de la RAM (despus de los registros de funcin
especial) y borra todas las localizaciones de la RAM
hasta 0x7F, esto es, el banco 1 completo. Puesto que Pgina web
0x80-0x9F son registros de funcin especial, tendrn PIC18F242/252/442/452 datasheet at
que escribirse segmentos separados para los bancos 2, http://ww1.microchip.com/downloads/en/
3 y 4. DeviceDoc/39564b.pdf
Para los dispositivos PIC18F, podemos escribir:

LFSR FSR0,0x000
NEXT CLRF POSTINC0
BTFSS FSR0H,0
GOTO NEXT

Examinando esto lnea por lnea, la lnea 1 comienza


con una nueva instruccin LFSR. Pueden ponerse valo-
res en FSR0L y FSR0H de forma separada usando los
comandos normales MOVLW y MOVWF. Sin
embargo, se pueden inicializar ambos registros de
una sola vez usando el comando LFSR seguido de
FSR0 (1 2), y luego una coma seguida de un numero

elektor 55
ADIS A LA FAMILIA 16,
Parte 2: ROM (memoria de programa) y consulta de grandes

Ron Coates

La serie de procesadores 18Fxx2 tiene una memoria


ROM Flash de 16 32 K. Sin embargo, cada
instruccin de programa tarda al menos una palabra
(es decir, dos bytes), as, en trminos del nmero de
lneas de cdigo de programa que debemos escribir,
estamos hablando de un mximo de 8 16 K. Como
consecuencia de ello, en trminos de programacin,
slo podemos tener acceso a las posiciones de
memoria ROM numeradas.

36 elektor
BIENVENIDA LA PIC18F!
s tablas

Si miramos la ventana donde vemos la memoria de pro- dad mxima como un nmero hexadecimal. Observe
grama para un micro de la serie 16F, vemos que la que la primera lnea de la tabla corresponde a un valor
direccin se incrementa de uno en uno a cada lnea, es W de 0. Debido a que en este ejemplo no deberamos
decir, 0000, 0001, 0002, etc. Este mismo cdigo en un haber usado nunca el valor cero, insertaremos un valor
18F nos dara un programa donde cada lnea se incre- ficticio de (FF).
menta de dos en dos, es decir, 0000, 0002, 0004, etc. La limitacin del valor superior es que el valor en W
Esto no es importante en un funcionamiento normal de slo puede variar entre 00 y FF (o lo que es lo mismo
eventos, pero cuando nos referimos a la consulta de entre 0 y 255 en decimal), de manera que slo pode-
tablas, s puede serlo. mos tener 256 lneas en la tabla. Si necesitamos una
La totalidad de la memoria ROM es completamente tabla mayor que sta, tendremos que dividirla en
lineal y no hay problemas con las instrucciones CALL y 256 trozos de lneas y usar clculos adicionales para
GOTO, no importa cul sea la longitud del programa. asegurarnos la consulta de la posicin exacta. Est
claro que para valores de varios miles, esto no es
prctico.
Consulta de tablas El mtodo descrito anteriormente puede usarse para la
Uno de los motivos por los cuales los procesadores PIC serie de micro 18, siendo todava til para tablas cor-
han sido muy criticados en el pasado es que era muy tas. Sin embargo, ahora la situacin es incluso peor,
difcil de implementar para la consulta de tablas de porque el contador de programa slo reconoce nme-
una longitud razonable. Sin embargo, una de las ros. Esto significa que si W contiene 0 1 no hay dife-
caractersticas ms tiles de la serie 18 es que virtual- rencia y el programa saltar a la primera lnea de la
mente pueden escribirse tablas de consulta de cual- tabla (0xFF en el ejemplo superior). Para que el pro-
quier longitud, dependiendo de la cantidad de memo- grama de arriba trabaje de forma correcta con un 18F,
ria ROM Flash disponible. necesitaramos valores de 2, 4, 6 y 8 en el registro W.
En este punto resulta interesante profundizar sobre Esto tambin significa que la longitud mxima de nues-
cmo podemos implementar una tabla de consulta en tra tabla es de slo 128.
la serie 16, lo que en la jerga de Microchip se Si necesitamos utilizar tablas mayores, deberemos usar
conoce como la computacin de un goto y requiere un mtodo alternativo, el cual se describe con detalle en
que el programador prepare la tabla de consulta la seccin 5 de las hojas de caractersticas, pero slo
como si de una subrutina se tratara, comenzando con hay principios generales.
el comando aadir al valor del contador de pro- El programador puede usar cualquier cantidad de
grama el valor del registro W. ste ser seguido por Flash ROM disponible como una tabla de consulta (o
una lista de valores que sern retornados. Para usar series de tablas de consulta). As, si estamos usando
la tabla nos aseguraremos que el valor que hay en un chip con 32 K de ROM y slo necesitamos 4 K
W es la posicin requerida de la tabla antes de lla- para el programa (recordar que esto sera equivalente
mar a la subrutina. Despus de la subrutina, el pro- a unas dos mil lneas de cdigo), los 28 K restantes
grama principal debera tener el valor consultado en estaran disponibles como espacio para una tabla de
el registro W. consulta.
El siguiente ejemplo nos devolver la velocidad mxima ste es un importante paso adelante y puede signifi-
a la que puede trabajar un driver en el momento que car que las aplicaciones usadas anteriormente que uti-
est ejecutando una tarea determinada, llamando a la lizan una EPROM externa para almacenar datos pue-
subrutina SPEED: den sustituirse por aplicaciones con un simple inte-
grado, ahorrando en complejidad, tamao y, por
SPEED ADDWF PCL supuesto, coste.
RETLW 0xFF Tambin hay chips mayores que el 18F que disponen
RETLW 0x0A de hasta 128 K de ROM. Para obtener la ltima
RETLW 0x20 informacin puede consultar la pgina web de
RETLW 0x3C Microchip.
RETLW 0x50 La habilidad para direccionar esta cantidad de espa-
cio depende de la tabla de punteros. Hay tres de
Si el programa principal tuviera el valor del momento ellos, TBLPTRU (Table Pointer Upper) de los cuales slo
(1, 2, 3 4) en W, la llamada siguiente a esta subru- estn disponibles 5 bits, TBLPTRH (Table Pointer High)
tina debera producir un salto en el programa a la y TBLPTRL (Table Pointer Low). Se usan junto con estos
lnea que corresponde a la tarea y retornar la veloci- para formar una direccin de 21 bits de longitud, la

elektor 37
cual permite acceder hasta 2 megabytes. En la prc- puertos de I/O con los registros TRIS. Por tanto, todas
tica, con los procesadores de los que estamos las referencias a ellos se deben borrar.
hablando, TBLPTRU se puede dejar a 0 porque los Por otra parte, si nuestro programa original utiliza
diecisis bits de los otros punteros son ms que sufi- direcciones indexadas se producir otro problema,
ciente para direccionar la cantidad de memoria ROM ya que tendremos ciertas referencias a los registros
disponible. FSR. Ahora tenemos tres registros FSR etiquetados
Durante el funcionamiento normal del programa esas como FSR0, FSR1 y FSR2, y cada uno de estos tiene
tablas se pueden leer y escribir, por lo que debemos un byte bajo y un byte alto. As que todas las referen-
tener cuidado con la configuracin de los punteros, ya cias a FSR se tienen que cambiar a FSR0L. Un pro-
que es perfectamente posible sobre-escribir nuestro blema similar ocurrir con las referencias al registro
cdigo de programa. INDF. Esto se puede sortear rpidamente usando
Ahora vamos a ver cmo obtener un dato en esas buscar y sustituir, facilidad que nos proporciona el
tablas. Llegados a este punto las hojas de caractersti- editor.
cas enmudecen. Lo que no puede hacerse es escri- Por ltimo, si las opciones de nuestro CONFIG estn
birlo con el programa, el camino para hacerlo es con embebidas en el cdigo fuente, tambin se mostrarn
el goto computado. Podemos ir a la ventana de la como si fuese un error. Las opciones del CONFIG
memoria del programa en MPLAB y corregir directa- para la serie 18F son completamente diferentes en
mente los valores, lo cual puede ser de una gran utili- formato a las de la serie 16F y lo mejor es borrar
dad para propsitos de depuracin. Sin embargo, no todas las del programa del 16F y comenzar de nuevo
hay forma de salvar esas correcciones y tan pronto usando el 18F, hacindolo con el fichero INCLUDE
como salgamos del editor, la informacin se perder. como gua.
En cualquier caso, si tenemos una tabla de 8 Kbytes Los errores de sintaxis se pueden eliminar de forma
ser difcil que podamos meter todos los valores a rpida. Por ello, es importante revisar la estructura del
mano. programa para darnos cuenta tambin de las importan-
Hay dos formas de hacer esto, aunque es posible que tes ventajas que nos proporcionan estos nuevos circuitos
algunos lectores puedan sugerir otra. Como ejemplo, integrados.
tomaremos los valores de un instrumento musical de
sonido muestreado, por ejemplo, un piano. Sera normal
usar un PC para manipular y almacenar datos de este Un vistazo ms all: el DSP
tipo, as que asumiremos que la tabla que queremos Hasta el comienzo de este ao, la serie 18F era la que
meter en el PIC est residente como si fuera un fichero en tena el procesador ms potente de todos los de la casa
nuestro PC. Microchip. Lo cual en este momento no es cierto, ya que
Si podemos escribir un programa adecuado para el apenas unos meses despus se han introducido en el
PC, el puerto paralelo o serie se podra usar para des- mercado una serie de dsPIC. Estos disponen de un com-
cargar el fichero. Los PICs de los que estamos pleto procesador de 16 bits, el cual tambin incorpora
hablando incorporan una USART (Universal Synchro- caractersticas como las que podemos encontrar slo en
nous/Asynchronous Receiver Transmitter) la cual puede los DSPs Procesadores Digitales de Seal-. Como siem-
configurarse fcilmente para comunicarse con una pre, en Elektor tenemos la primicia en informacin sobre
interface RS232 de un PC. tecnologa electrnica.
Si entre nuestras habilidades no est la programacin (040036-2)
del PC, un mtodo alternativo es usar un programador
de EPROM para transferir la informacin a una
EPROM, y despus escribir un programa en el PIC para
transferir la informacin desde la EPROM a la memoria
del PIC. Esto es bastante amplio, lo cual significa que
tenemos que programar el cdigo (usando un progra-
mador PICSTART o algn equivalente) y despus trans-
ferir el PIC a una placa, lo cual se hace para transferir
datos desde la EPROM al PIC, antes de usar el PIC en
la tarjeta de aplicacin.

Transferencia de una aplicacin


16F existente
En la pgina 1 de las hojas de caractersticas del
18FXX2 se afirma de manera muy optimista que el
cdigo fuente del 18F es compatible con el set de ins-
trucciones del 16C.
Esto podra hacernos pensar que todo lo que tene-
mos que hacer es coger una aplicacin existente,
cambiar las referencias del modelo de micro y que
entonces todo funcionar perfectamente. En reali-
dad, si hacemos esto saldr una gran lista de men-
sajes de error, pero tranquilos, ser bastante fcil
corregirlos.
Lo primero de todo, el registro de estado, que corres-
ponde a los bits RP0 y RP1, los cuales fueron usados
para la conmutacin de banco en el 16F, no existen.
Tendremos ciertas referencias a ellos para configurar los

38 elektor