SE – uC: Organización De Memoria Del PIC18F14K50

Este uC tiene los siguientes tipos de memoria:

  • Memoria de programa (Program Memory):
    En esta memoria flash se almacena el código del programa que se ejecutara (Software o Firmware), también se pueden almacenar datos o tablas. Esta memoria se puede escribir durante la ejecución del programa.
  • Pila LIFO (Stack):
    Esta pila LIFO sirve para almacenar y recuperar las direcciones de memoria de programa en cada salto que se realice durante la ejecución del programa (CALL, RCALL, RETURN, RETFIE, RETLW).
  • Memoria de datos (Data Memory):
    Esta memoria se utiliza para almacenar las variables y datos temporales necesarios por el programa y el usuario. Esta memoria es volátil, lo que significa que se pierden los datos una vez apagado el uC.
  • Memoria de configuración (Configuration Memory):
    Esta memoria se utiliza para configurar algunos aspectos iniciales del uC como el oscilador, la velocidad, activación y desactivación de algunos periféricos, etc.

Memoria De Programa (Program Memory) y Pila LIFO (Stack):

Todos los uC PIC18 tienen un PC (Program Counter) de 21 bits, el cual puede acceder a 2 MB de memoria de programa, pero si se lee arriba de la cantidad de memoria implementada regresara cero (NOP). Este uC tiene implementada 16 KB o 8K Words (0000h-3FFFh) de memoria de programa. La función del PC consiste en apuntar a la dirección de memoria de programa de la siguiente instrucción que debe buscar para ejecutar.

También tienen una memoria conocida como Stack que se utiliza para guardar el PC al realizar un salto (CALL, RCALL) y regresar esa dirección al PC al regresar (RETURN, RETLW, RETFIE). El Stack tiene un tamaño de 31 words o niveles por 21-bit, el cual tiene su propia memoria RAM para esta tarea. El stack se puede utilizar en software para almacenar datos del usuario pero no se recomienda por que se puede afectar el funcionamiento del uC.

Los PIC18 tienen vectores de interrupción los cuales generan que el programa brinque a una dirección específica cuando ocurre algún evento específico, los vectores son los siguientes:

  • Vector de reinicio (Reset Vector): 0000h
  • Vector de interrupción de alta prioridad (High Priority Interrupt Vector): 0008h
  • Vector de interrupción de baja prioridad (Low Priority Interrupt Vector): 0018h

El siguiente diagrama muestra la organización de memoria de programa (On-Chip Program Memory, Reset & Interrupt Vector), Stack y el PC:

Memoria De Datos (Data Memory):

La memoria de datos (Data Memory) de los PIC18 esta implementada como SRAM (Static RAM), cada registro de esta memoria tiene una dirección de 12-bit, permitiendo acceder a 4096 direcciones (000h-FFFh). Este uC tiene en especifico 768 Bytes de memoria de datos, leer alguna dirección arriba de esta cantidad regresara cero.

La memoria de datos esta dividida en 16 bancos (Bank 0 to Bank 15) donde cada banco es de 256 Bytes y se clasifican en:

  • GPR (General Propose Register):
    Son utilizados para almacenar datos y valores temporales del usuario (B0-B14: 000h-EFFh).
  • Access RAM:
    Los primeros 96 Bytes (B0: 000h-05Fh) es una área de memoria de acceso rápido.
  • GPR (DPRAM):
    Es utilizado por el USB como buffer, si no se utiliza el USB se puede ocupar como GPR (B2: 200h-2FFh).
  • SFR (Special Function Register):
    Son utilizados para controlar y administrar el estado del CPU y de los periféricos. Se encuentran en las últimas direcciones de memoria (B15: F60h-FFFh).

El diagrama de mapeo de la memoria de datos del PIC18F/LF14K50 es el siguiente:

Memoria De Configuración (Configuration Memory):

La memoria de configuración de bits puede ser programada o leída para seleccionar entre varias configuraciones del uC (tipo de oscilador, configuración de algunos periféricos, protección de código, etc.). Esta memoria es flash y esta mapeada en las direcciones 300000h-3FFFFFh, la cual esta fuera del rango de memoria de programa, por lo que solo se puede acceder utilizando escritura y lectura de tablas durante la ejecución del programa, o pueden ser definidos en código y ser programados junto con el firmware que es lo mas común.

En la siguiente tabla se muestran los bits de configuración, la explicación de cada uno en detalle se llevara a cabo en cada sección correspondiente:

Para definir estos bits en código hay dos maneras:

  • Utilizando el agente de MPLAB IDE:
    Ir al menú “Configure” >> Configuration Bits.. y aquí podemos seleccionar cada opción que deseamos.
  • Definidas en el código del programa utilizando #pragma configbit=estado:
    Lo primero que hay que hacer es entrar en el agente para configurar los bits y activar la casilla “Configuration Bits set in code”. Para obtener los nombres y los estados de los bits se debe consultar el archivo de ayuda “hlpPIC18ConfigSet.chm”. La información obtenida del archivo se acomodó en un archivo fuente quedando de la siguiente manera:
/*
 *	Copyright (c) 2011-2012, http://www.proprojects.wordpress.com
 *	All rights reserved.
 *
 * 	Redistribution and use in source and binary forms, with or without modification, 
 *	are permitted provided that the following conditions are met:
 *
 *	1.- Redistributions of source code must retain the above copyright notice,
 *		this list of conditions and the following disclaimer.
 *	2.- Redistributions in binary form must reproduce the above copyright notice, 
 *		this list of conditions and the following disclaimer in the documentation 
 *		and/or other materials provided with the distribution.
 *
 *	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 *	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
 *	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 *	IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 *	INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *	LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
 *	OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 *	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
 *	WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*********************************************************************
 * By:              Omar Gurrola
 * Company:         https://proprojects.wordpress.com
 * Processor:       PIC18
 * Compiler:        C18 v3.4
 * File Name:       pic18f14k50_cbits.h
 * Description:     Configuration Bits for PIC18F14K50
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Rev.     Date        Comment
 * 1.0      10/31/12    Initial version
 *********************************************************************/

#ifndef __PIC18F14K50_CBITS_H
#define __PIC18F14K50_CBITS_H

    /** CONFIGURATION BITS *********************************************/
	#pragma config CPUDIV=NOCLKDIV 	// CPU System Clock Selection bit:
									// NOCLKDIV		No CPU System Clock divide  
									// CLKDIV2		CPU System Clock divided by 2  
									// CLKDIV3		CPU System Clock divided by 3  
									// CLKDIV4		CPU System Clock divided by 4  
	#pragma config USBDIV=OFF		// USB Clock Selection bit:
	 								// OFF 			USB Clock comes directly from the OSC1/OSC2 oscillator block; no divide  
									// ON			USB clock comes from the OSC1/OSC2 divided by 2  
	#pragma config FOSC=HS			// Oscillator Selection bits:
	 								// LP			LP oscillator
									// XT			XT oscillator  
									// HS			HS oscillator  
									// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
									// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
									// ECH			EC (high)  
									// ERC			External RC oscillator  
									// IRC			Internal RC oscillator  
									// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
									// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
									// ECM			EC (medium)  
									// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
									// ECL			EC (low)  
	#pragma config PLLEN=ON			// 4 X PLL Enable bit:
	 								// OFF			PLL is under software control  
									// ON			Oscillator multiplied by 4  
	#pragma config PCLKEN=ON		// Primary Clock Enable Bit:
	 								// OFF			Primary clock is under software control  
									// ON			Primary clock enabled
	#pragma config FCMEN=OFF		// Fail-Safe Clock Monitor Enable bit:
	 								// OFF			Fail-Safe Clock Monitor disabled  
									// ON			Fail-Safe Clock Monitor enabled  
	#pragma config IESO=OFF			// Internal/External Oscillator Switchover bit:
									// OFF			Oscillator Switchover mode disabled  
									// ON			Oscillator Switchover mode enabled
	#pragma config PWRTEN=OFF		// Power-up Timer Enable bit:
	 								// ON			PWRT enabled  
									// OFF			PWRT disabled  
	#pragma config BOREN=ON			// Brown-out Reset Enable bits:
	 								// OFF			Brown-out Reset disabled in hardware and software  
									// ON			Brown-out Reset enabled and controlled by software (SBOREN is enabled)  
									// NOSLP		Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)  
									// SBORDIS		Brown-out Reset enabled in hardware only (SBOREN is disabled)  
	#pragma config BORV=30			// Brown Out Voltage:
	 								// 30			VBOR set to 3.0 V nominal  
									// 27			VBOR set to 2.7 V nominal  
									// 22			VBOR set to 2.2 V nominal  
									// 19			VBOR set to 1.9 V nominal  
	#pragma config WDTEN=OFF		// Watchdog Timer Enable bit:
									// OFF			WDT is controlled by SWDTEN bit of the WDTCON register  
									// ON			WDT is always enabled. SWDTEN bit has no effect.  
	#pragma config WDTPS = 1		// Watchdog Timer Postscale Select bits:
									// 1			1:1  
									// 2			1:2  
									// 4			1:4  
									// 8			1:8  
									// 16			1:16  
									// 32			1:32  
									// 64			1:64  
									// 128			1:128  
									// 256			1:256  
									// 512			1:512  
									// 1024			1:1024  
									// 2048			1:2048  
									// 4096			1:4096  
									// 8192			1:8192  
									// 16384		1:16384  
									// 32768		1:32768  
	#pragma config MCLRE=OFF		// MCLR Pin Enable bit:
									// OFF			RE3 input pin enabled; MCLR disabled  
									// ON			MCLR pin enabled, RE3 input pin disabled  
	#pragma config HFOFST=OFF		// HFINTOSC Fast Start-up bit:
									// OFF			The system clock is held off until the HFINTOSC is stable.  
									// ON			HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize. 
	#pragma config STVREN=ON		// Stack Full/Underflow Reset Enable bit:
									// OFF 			Stack full/underflow will not cause Reset  
									// ON			Stack full/underflow will cause Reset  
	#pragma config LVP=ON			// Single-Supply ICSP Enable bit:
									// OFF			Single-Supply ICSP disabled  
									// ON			Single-Supply ICSP enabled
	#pragma config BBSIZ=OFF		// Boot Block Size Select Bit:
									// OFF			1kW boot block size  
									// ON			2kW boot block size 
	#pragma config XINST=OFF		// Extended Instruction Set Enable bit:
									// OFF			Instruction set extension and Indexed Addressing mode disabled (Legacy mode)  
									// ON			Instruction set extension and Indexed Addressing mode enabled  
	#pragma config CP0=OFF			// Code Protection bit:
									// ON			Block 0 code-protected
									// OFF			Block 0 not code-protected
	#pragma config CP1=OFF			// Code Protection bit:
									// ON			Block 1 code-protected  
									// OFF			Block 1 not code-protected  
	#pragma config CPB=OFF			// Boot Block Code Protection bit:
									// ON			Boot block code-protected  
									// OFF			Boot block not code-protected  
	#pragma config CPD=OFF			// Data EEPROM Code Protection bit:
									// ON			Data EEPROM code-protected  
									// OFF			Data EEPROM not code-protected
	#pragma config WRT0=OFF			// Write Protection bit:
									// ON			Block 0 write-protected  
									// OFF			Block 0 not write-protected
	#pragma config WRT1=OFF			// Write Protection bit:
									// ON			Block 1 write-protected  
									// OFF			Block 1 not write-protected  
	#pragma config WRTB=OFF			// Boot Block Write Protection bit:
									// ON			Boot block write-protected  
									// OFF			Boot block not write-protected
	#pragma config WRTC=OFF			// Configuration Register Write Protection bit:
									// ON			Configuration registers write-protected  
									// OFF			Configuration registers not write-protected 
	#pragma config WRTD=OFF			// Data EEPROM Write Protection bit:
									// ON			Data EEPROM write-protected  
									// OFF			Data EEPROM not write-protected
	#pragma config EBTR0=OFF		// Table Read Protection bit:
									// ON			Block 0 protected from table reads executed in other blocks  
									// OFF			Block 0 not protected from table reads executed in other blocks
	#pragma config EBTR1=OFF		// Table Read Protection bit:
									// ON			Block 1 protected from table reads executed in other blocks  
									// OFF			Block 1 not protected from table reads executed in other blocks
	#pragma config EBTRB=OFF		// Boot Block Table Read Protection bit:
									// ON			Boot block protected from table reads executed in other blocks  
									// OFF			Boot block not protected from table reads executed in other blocks
#endif // __PIC18F14K50_CBITS_H

Referencias:

Galería

2 Responses to SE – uC: Organización De Memoria Del PIC18F14K50

  1. atomsoft says:

    Perfect! Thanks for this. I plan on making my own libraries and wanted a nice clean approach. This helps a ton. Im working a lot with the PIC18F27J53 which is also a USB 8bit PIC micro. Ill be sure to post something similar to this, im not sure if i can go into detail as you did but will try. Thanks again!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: