Microchip Technology MA240017 Data Sheet

Page of 278
 2008-2011 Microchip Technology Inc.
DS39927C-page 49
PIC24F16KA102 FAMILY
EXAMPLE 5-3:
LOADING THE WRITE BUFFERS – ASSEMBLY LANGUAGE CODE 
EXAMPLE 5-4:
LOADING THE WRITE BUFFERS – ‘C’ LANGUAGE CODE 
; Set up NVMCON for row programming operations
MOV
#0x4004, W0
;
MOV
W0, NVMCON
; Initialize NVMCON
; Set up a pointer to the first program memory location to be written
; program memory selected, and writes enabled
MOV
#0x0000, W0
MOV
W0, TBLPAG
; Initialize PM Page Boundary SFR
MOV
#0x1500, W0
; An example program memory address
; Perform the TBLWT instructions to write the latches
; 0th_program_word
MOV
#LOW_WORD_0, W2
MOV
#HIGH_BYTE_0, W3
TBLWTL
W2, [W0]
; Write PM low word into program latch
TBLWTH
W3, [W0++]
; Write PM high byte into program latch
; 1st_program_word
MOV
#LOW_WORD_1, W2
MOV
#HIGH_BYTE_1, W3 
TBLWTL
W2, [W0]
; Write PM low word into program latch
TBLWTH
W3, [W0++] 
; Write PM high byte into program latch
;  2nd_program_word
MOV
#LOW_WORD_2, W2
MOV
#HIGH_BYTE_2, W3
TBLWTL
W2,
 
[W0] 
; Write PM low word into program latch
TBLWTH
W3,
 
[W0++]
; Write PM high byte into program latch


; 32nd_program_word
MOV
#LOW_WORD_31, W2
MOV
#HIGH_BYTE_31, W3
TBLWTL
W2,
 
[W0] 
; Write PM low word into program latch
TBLWTH
W3,
 
[W0]
; Write PM high byte into program latch
// C example using MPLAB C30
    
#define NUM_INSTRUCTION_PER_ROW 64
int __attribute__ ((space(auto_psv))) progAddr = 0x1234
// Variable located in Pgm Memory
unsigned int offset;
unsigned int i;
unsigned int progData[2*NUM_INSTRUCTION_PER_ROW];
// Buffer of data to write
       
//Set up NVMCON for row programming
NVMCON = 0x4004;
// Initialize NVMCON
    
//Set up pointer to the first memory location to be written
TBLPAG = __builtin_tblpage(&progAddr);
// Initialize PM Page Boundary SFR
offset = __builtin_tbloffset(&progAddr);
// Initialize lower word of address
     
//Perform TBLWT instructions to write necessary number of latches
for(i=0; i < 2*NUM_INSTRUCTION_PER_ROW; i++)
{
  __builtin_tblwtl(offset, progData[i++]);
// Write to address low word
  __builtin_tblwth(offset, progData[i]);
// Write to upper byte
  offset = offset + 2;
// Increment address
   }