Memory Organization
Enhanced Mid-Range PIC® MCUs can contain up to 4096 bytes of addressable data memory. The data memory is partitioned in up to 32 memory banks with 128 bytes in each bank.
PIC16F1xxx data memory contains five data elements:
- Core registers
- Special Function Registers (SFGs)
- General purpose memory
- Common memory
- Shadow registers
Core Registers
The first 12 entries of each PIC16F1xxx data memory bank contain registers referred to as the core registers. These 12 registers are repeated on each bank. The core registers can be accessed from any active bank.
Core registers include information for:
- General processing
- Direct addressing of memory
- Indirect addressing of memory
- Interrupt control
General Processing Registers
STATUS Register
TO - Indicates Watchdog Timer has expired
PD - Sleep instruction status
Z - Indicates if last instruction resulted in a 0
DC - last instruction resulted in a carry-out from the 4th low-order bit
C - last instruction resulted in a carry-out from Most Significant bit
WREG Register
Referred to as the Working Register or W register, WREG serves as an accumulator.
Direct Addressing Registers
BSR (Bank Select Register)
The lower five bits of BSR contains the bank number (0-31) of the active data bank. Information explaining how the BSR is used can be found in the "Direct Addressing" section of the PIC16F1xxx tutorial.
PCL and PCLATH Registers
These registers are used when writing to or reading from the 15-Bit Program Counter. Information on the use of PCL and PCLATH is explained in the "Program Memory" section of the PIC16F1xxx tutorial
Indirect Addressing Registers
INDF0, FSR0L, FSR0H,
INDF1, FSR1L, FSR1H
These six registers control the two indirect addressing channels on the MCU. The details of using these registers are provided in the "Indirect Addressing in the PIC16F1xxx MCU" section of the PIC16F1xxx tutorial
Interrupt Control Register
INTCON
GIE - Global interrupt enable
PEIE - Peripheral interrupt enable
TMR0IE - Timer 0 interrupt enable
INTE - External interrupt enable
IOCIE - Interrupt on change enable
TMR0IF - Timer 0 interrupt flag
INTF - External interrupt flag
IOCIF - Interrupt on change flag
INTCON is the control register for the PIC16F1xxx interrupts. Information on using this control register can be found in the "Interrupts" section of the PIC16F1xxx tutorial.
Special Functions Registers (SFRs)
In each of the PIC16F1xxx's data banks there are up to 20 Special Function Registers (SFRs). The SFRs are located just below the core registers starting at address xxCh. SFRs control the PIC16F1xxx peripherals, digital I/O ports , and oscillator settings.
Unlike the core registers, SFRs are NOT duplicated on each bank. Application programs need to ensure the appropriate bank has been selected before accessing an SFR.
The SFRs for each PIC® MCU will vary. Consult the datasheet for the name and location of the SFRs for the MCU you are using.
General Purpose Memory
The general purpose memory (RAM) is located on each memory bank just below the SFRs. This memory is available for application data.
Common Memory
The last 16 bytes of bank 0 (addresses 70h - 7Fh) are repeated on every data bank. This allows application programs to access variables located in these addresses without having to set BSR.
Shadow Registers
Located in the bottom of bank 31 are the PIC16F1xxx shadow and stack registers. The shadow registers save the program's context by capturing several core registers when an interrupt occurs. The core registers are restored when a Return From Interrupt (RETFIE) instruction is executed. More information on the shadow registers can be found in the "Interrupts" section of the PIC16F1xxx tutorial.
The stack is used to store the Program Counter (PC) in the event of an interrupt or subroutine call. Information on the stack and the associated registers can be found on the "Programmer's Model" section of the PIC16F1xxx tutorial