- Mundo dsPIC
- Arquitectura Interna
- Memorias
- Camino de Datos
- Puertas E/S
- Periféricos integrados
- Gestión del Sistema y la Energía
- Descargas
Grabación de Memorias FLASH y EEPROM
Para grabar las memorias FLASH y EEPROM de los DSC existen dos métodos:
1º) Autograbación en tiempo de ejecución (RTSP).
Esta técnica la desarrolla el usuario mediante las instrucciones de Tabla que transfieren información entre la memoria de datos y la del programa. Con las 4 instrucciones de Tabla (TBLRDL, TBLWTL, TBLRDH y TBLWTH) descritas anteriormente se leen o escriben los 16 bits de la palabra baja o los bits <23:16> de la palabra alta. La dirección efectiva de la posición de la memoria de programa se forma con los 8 bits del registro TBLPAG y los 16 bits de un registro Wn, que contiene la dirección efectiva de la memoria de datos (EA).
También es posible grabar y leer la memoria de programa con datos de tamaño byte dentro de cada una de sus palabras.
Para la grabación/borrado de múltiples datos de la FLASH y la EPROM se utilizan cuatro registros de control NVM (Memoria No Volátil).
NVMCON: Registro de control NVM --> BITS DEL REGISTRO NVMCON.
Bit 15 | WR: Bit de control de escritura (borrado o grabación) |
Bit 14 | WREN: Permiso de escritura (borrado o grabación) |
Bit 13 | WRERR: Flag de error de escritura en FLASH |
Bits 12-8 | Reservado |
Bits 7-2 | PROGOP<7:2>: Código de operación de grabación |
El registro NVMCON selecciona si la operación se realizará sobre la FLASH o la EEPROM y las características principales de la misma.
VALORES DE NVMCON PARA OPERACIONES DE GRABACIÓN/BORRADO | |||
---|---|---|---|
TIPO MEMORIA | OPERACIÓN | TAMAÑO DATOS | VALOR NVMCON |
FLASH | BORRADO | 1 FILA (32 INSTRUCCIONES) | 0X4041 |
GRABACIÓN | 4 INSTRUCCIONES | 0X4001 | |
EEPROM | BORRADO | 1 PALABRA | 0X4044 |
16 PALABRAS | 0X4045 | ||
GRABACIÓN | 1 PALABRA | 0X4004 | |
16 PALABRAS | 0X4005 | ||
RESTO CONFIGURACIÓN | ESCRITURA | 1 REGISTRO CONFIGURACIÓN | 0X4008 |
NVMKEY: Registro clave NVM. Solo puede ser escrito y su misión es evitar grabaciones o borrados accidentales. Se utiliza para guardar unos valores claves o de seguridad, que se indican a continuación:
- Hay que escribir el valor clave o de seguridad 0x55 en NVMKEY.
- Hay que escribir a continuación el valor 0xAA en NVMKEY.
- Ejecutar dos instrucciones NOP.
NVMADR: Registro de dirección NVM. Contiene los 16 bits de menos peso de la dirección efectiva (EA<15:0>) de la posición a grabar o borrar. Este registro lo manejan automáticamente las instrucciones de Tabla y el usuario puede modificarlo cuando lo desee. Indica la posición de memoria en la que se quiere grabar o borrar.
NVMADRU: Byte (alto) de ampliación del registro NVMADR.
Las interrupciones deberán ser deshabilitadas durante la secuencia anterior. Tras esta secuencia, la escritura estará permitida al registro NVMCON durante un ciclo de instrucción.
Con la técnica RTSP se pueden borrar 32 instrucciones o 96 bytes simultáneamente y se pueden grabar 4 instrucciones (12 bytes) a la vez.
Las técnicas usadas para la grabación de la EEPROM de datos y la FLASH son similares cuando se usa el método RTSP. La única diferencia destacable entre ambos tipos de memoria es la cantidad de datos o información que puede ser grabado o leído en cada ciclo de grabación/borrado. Para ver ejemplos de código en ensamblador (ASM) para memorias EEPROM y FLASH hay que consultar el manual del dsPIC30F6010.
Ejemplo en código C de la Lectura, Grabación y Borrado de una memoria EEPROM
#include "p30f6010.h"
int secuenciagrabacion()
// Esta función escribe la secuencia de grabación
// tanto para borrado como para grabación
{
TBLPAG = 0x7F; //Apuntamos la página
WREG0 = 0xFC00; //Apuntamos el desplazamiento en la página
NVMKEY = 0x55; //Movemos a NVKEY la secuencia 55
NVMKEY = 0xAA; //Movemos a NVMKEY la secuencia AA
NVMCONbits.WR= 0x1; //Activamos el bit WR de NVMCON
asm("NOP"); //Esperamos 2 nops
asm("NOP");
return 0;
}
//*************************
// Programa principal
//*************************
int main(void)
{
int a = 0; //Variable auxiliar
TBLPAG = 0x7F; //Apuntamos a la página de la dirección a leer
WREG0 = 0xFC00;
asm("TBLRDL [W0],W4"); //Leemos el dato en WREG4
WREG4 = WREG4 + 1; //Sumamos 1 a WREG4
NVMCON = 0x4044; //Configuramos NVMCON para borrar EEPROM
a = secuenciagrabacion(); //Ejecutamos secuencia borrado/grabación
while(NVMCONbits.WR == 1); //Esperamos al bit WR de NVMCON que sea 0
TBLPAG = 0x7F; //Apuntamos a la página de la dirección a leer
WREG0 = 0xFC00; //Apuntamos el desplazamiento en la página
asm("TBLWTL W4, [W0]"); //Escribimos en el registro el contenido de W4
NVMCON = 0x4004; //Configuramos NVMCON para grabado EEPROM
a = secuenciagrabacion(); //Ejecutamos secuencia borrado/grabación
while(NVMCONbits.WR == 1); //Esperamos al bit WR de NVMCON que sea 0
return 0;
}
2º) Grabación serie en circuito (ICSP™).
Se trata de un protocolo registrado por Microchip destinado a la grabación en serie de dispositivos programables conectados en el circuito de aplicación, simplemente utilizando dos líneas, una para el reloj y otra para transferir los datos serie a grabar mediante el interfaz SPI y un software integral de tipo “bootloader” cuyas especificaciones técnicas pueden encontrarse en las páginas del fabricante en internet: www.microchip.com
Este sistema de grabación se utiliza con gran efectividad en todo tipo de microcontroladores y dispositivos programables, además de los DSC.
Todos los modelos de microcontroladores dsPIC se programan usando ICSP o LVP (LVP es "Low Voltage Programming”). Así mismo, todos los programadores modernos de dsPIC utilizan este método para programarlos, aunque esto no sea aparente en algunos programadores que cuentan por ejemplo con un socket ZIF, como el mostrado en la figura.
![]() |
---|
En el caso de los programadores con socket ZIF, El método de programación sigue siendo ICSP (Programación En Circuito), sólo que en este caso todas las señales ICSP están ruteadas al socket ZIF; sin embargo debido que el dsPIC debe ser removido del circuito para ubicarlo en el socket, se contradice el propósito inicial de la idea, la cual es justamente no remover el dsPIC de su circuito. Para los principiantes el uso del socket ZIF es más conveniente; sin embargo para quien debe realizar un trabajo de largo aliento, con muchas iteraciones de re-programación, programar el dsPIC sin tener que removerlo cada vez de su circuito es mucho más conveniente.
En la siguiente fotografía vemos un ejemplo de un sistema siendo programado "en circuito":
![]() |
---|
Señales y Conexiones en el Cabezal ICSP:
Las señales provistas al dsPIC por el dispositivo programador para realizar la escritura, lectura y verificación del programa son las siguientes:
- VPP (Voltaje de Programación): Es un voltaje entre 12-14 VDC aplicado al pin MCLR/VPP del dsPIC, y es usado para poner al dsPIC "en estado" de programación.
- PGC (Program Clock): Señal de reloj para sincronizar al dsPIC.
- PGD (Program Data): Línea serie de datos para escritura, lectura y verificación de la memoria de programa (ROM Flash) del microcontrolador.
- VDD (Voltaje de Alimentación 5/3.3 VDC): Voltaje de alimentación del dsPIC. La conexión de este voltaje es opcional debido a que el dsPIC puede alimentarse utilizando la alimentación propia del circuito de aplicación.
- GND (Ground): Conexión a tierra.
El siguiente diagrama de circuito muestra un método muy usual para la implementación de ICSP:
![]() |
---|
Como se puede observar, el método ICSP utiliza terminales del microcontrolador que también pueden cumplir potencialmente otras funciones.
- Funciones relacionadas a la aplicación principal del circuito.
- Funciones para la conexión con el dispositivo programador que posibilite la lectura, escritura y verificación de la memoria de programa "en circuito".
Circuito de Aislamiento:
Para que la programación se lleve a cabo de manera correcta y segura, es necesario aislar el circuito de aplicación del circuito de programación. El circuito ejemplo mostrado en la figura anterior nos muestra de qué manera se puede lograr esto:
- Conectar un diodo de señal: (como el 1N4148 u otro similar) Entre el terminal MCLR/VPP y el circuito de reset (resistencia + capacitor) de la aplicación. Esto aísla al circuito de reset de los 12-13 voltios generados por VPP en el momento de la programación.
- Conectar otro diodo de señal: Entre el terminal VDD y la alimentación de voltaje del circuito de aplicación. Esto evita que, en caso de que el VDD del circuito esté encendido, éste sea aislado de la alimentación de voltaje provista por el programador. Opcionalmente, se puede anular esta conexión y prescindir de la alimentación provista por el programador y usar en cambio la alimentación propia del circuito de aplicación, sin embargo como medida de seguridad, todavía es recomendable dejar el diodo en su lugar.
- Conectar resistencias (típicamente 10K) entre los terminales PGD y PGC y el circuito de aplicación a fin de que la reactancia vista desde estos terminales no afecte la integridad de las señales de datos y reloj utilizadas en la escritura, lectura y verificación del programa. Si la aplicación lo permite, es recomendable dejar libres estos terminales para ser usados exclusivamente para la programación ICSP.
Es importante recalcar que, si bien este típico ejemplo de circuito de aislamiento funciona para la mayoría de los casos, no es una receta segura para todos, y en algunos casos podría requerirse ligeras modificaciones o incluso un planteamiento diferente para lograr dicho aislamiento.
Depuración con ICSP:
Cabe notar también que ICSP, aparte de proveer el método para la escritura, lectura y verificación del código de programa en el microcontrolador, provee también métodos para la depuración y la emulación "en circuito"; capacidades que vienen adicionalmente implementadas en ciertos dispositivos conocidos como programadores/depuradores/emuladores. Ambas capacidades adicionales complementan grandemente la "caja de herramientas" de todo desarrollador de sistemas microcontrolados.
Programación Con Bajo Voltaje (LVP):
La Programación Con Bajo Voltaje LVP (Low Voltaje Programming) es una opción adicional de programación presente en los dsPIC la cual permite obviar VPP (12-14 VDC) y utilizar bajo voltaje. Para ello los dsPIC cuentan con otro terminal denominado PGM a través del cual el dispositivo programador toma control del dsPIC para su programación. Los detalles de este método salen del alcance de este apartado, simplemente añadiremos que, si se va a usar ICSP con VPP (12-14 VDC), es recomendable deshabilitar la Programación Con Bajo Voltaje (LVP) en el microcontrolador (mediante la escritura del bit correspondiente en la palabra de configuración (registro CONFIG) del microcontrolador, esto para evitar desprogramaciones accidentales del dsPIC.