Anda di halaman 1dari 7

Gravando um dado na memria de programa: Para se gravar um dado na FLASH, primeiro necessrio conhecer as particularidades do microcontrolador que se est

t usando. Neste exemplo o M.C.U usado o PIC18F4550. Uma caracterstica importante, que este microcontrolador grava blocos de dados 32 bytes(16 words) no mnimo, j o apagamento da flash pode ser feito em blocos de 64 bytes(32 words) no mnimo. Para se iniciar o processo de gravao, necessrio o apagamento da memria antes de se escrever,como o apagamento feito de 64 bytes, recomendado que se faa uma copia de um bloco de 64 bytes que contenha o endereo onde se quer gravar, para depois apagar este bloco. Apaga-se o bloco e inicia-se o processo de gravao. Os registros que mexem diretamente nos processos de apagamento leitura e gravao so o TABLAT, TBLPTR e TBLWT mais as instrues de apagamento, que sero descritos mais adiante. Processo de apagamento: 1 Carregar o ponteiro da FLASH (TBLPTR), com o endereo a ser apagado. 2 Setar o registro EECON1 para o processo de apagamento. EEPGD = 1 CFGS = 0 WREN = 1 FREE = 1 Desabilitar interrupes Escrever 0x55h no EECON2 Escrever 0xAAh no EECON2 Setar o bit WR do EECON1 para iniciar o processo de apagamento A CPU parara para o processo de gravao (aproximadamente 2 ms usando o timer). Habilitar interrupes

3 4 5 6 7 8

*OBS O 4 e 5 procedimentos so exigidos pela Microchip importante ressaltar que durante o processo de apagamento e gravao as interrupes devem estar desabilitadas e que seja feito um processo de proteo obrigatrio citado pela Microchip, este processo se resume em carregar o registro EECON2 com 0x55h e logo em seguida com 0xAAh.

Erase Flas

Carrega o endereo a s gravado no ponteiro (TBLP

Processo de escrita: O processo de escrita merece mais um pouco de ateno, pois ao contrario do processo de apagamento este no permite que se manipule 64 bytes de uma s vez. preciso gravar 32 bytes por vez. O registro responsvel pela transferncia dos dados da RAM para a FLASH o TABLAT. J o ponteiro que manipula a FLASH o TBLPTR que dividido em 3 partes (TBLPTRU, TBLPTRH, TBLPTRL ). Este aponta na FLASH onde os dados esto sendo colocados ou retirados. necessrio dentro da rotina de gravao incrementar o TBLWT. 1 2 3 4 5 6 7 Ler os 64 bytes na RAM. Fazer um Update dos dados necessrios. Carregar o ponteiro da FLASH (TBLPTR), com o endereo a ser apagado. Executar o processo de apagamento. Carregar o registro (TBLPTR) com o primeiro endereo do dado a ser escrito. Escrever 32 bytes com alto incremento. Setar o registro EECON1 para o processo de escrita. EEPGD = 1 CFGS = 0 WREN = 1 8 Desabilitar interrupes 9 Escrever 0x55h no EECON2 10 Escrever 0xAAh no EECON2 11 Setar o bit WR do EECON1 para iniciar o processo de escrita. 12 A CPU parara para o processo de gravao (aproximadamente 2 ms usando o timer). 13 Habilitar interrupes 14 Repetir etapas de 6 a 14 uma vez que, necessrio escrever mais de 64 bytes. *OBS O 9 e 10 procedimentos so exigidos pela Microchip

*OBS importante ressaltar que o ponteiro da FLASH sempre tem que estar apontando para pgina que est sendo gravada independente de qual endereo de memria esta sendo apontado dentro da pgina para que haja uma gravao correta.

T pr s

Exemplos de cdigo em Linguagem C para gravao na FLASH:

void WriteEraseFlash (void){ static int i, j = 0; char aux, var=1, Buffer; char *ptrBack; // *** Copia pgina para RAM pag = (ptrData/8); pgina iMar = (ptrData%8); indice i = (pag*8); voltar ao topo da pg. for(j=0;j<8;j++){ bData[j] = pData[i]; i ++; }

// Divide marcao por 8 e para determinar // Divide marcao por 8 para determinar // Multiplica parte inteira por 8 para

// Incrementa indice de marcao // fim do for

// *** Apaga pgina endPag = (pag * 64) + 28672; // Calcula atravs da pgina qual endereo deve ser apagado TBLPTR = endPag; // Endereo do ponteiro da flash

EECON1bits.EEPGD = 1; //****************************************************************************** EECON1bits.CFGS = 0; //Point to Flash program memory,access Flash program memory,enable write to memory,enable Row Erase operation EECON1bits.FREE = 1; // EECON1bits.WREN = 1; //**************************************************************************** INTCONbits.GIEH = 0; // Desabilita interrupes EECON2 = 0x55; // Required EECON2 = 0xAA; // Required EECON1bits.WR = 1; // Start erase (CPU stall) INTCONbits.GIEH = 1; // Habilita interrupes // *** Inclui a nova marcao na RAM bData[iMar] = cData; // Atualiza dados da struct cData para o indce da pgina selecionada // *** Grava de volta na flash ptrBack = &bData[0].turn; for (aux=2; aux > 0; aux--){ for(Buffer=0; Buffer <32 ; Buffer++){ // Faz copia de 64B TABLAT = *ptrBack; // Copia o end. da Ram e aponta para o prximo _asm TBLWT _endasm // _asm TBLWT+* _endasm // grava na flash TBLPTR ++; // TBLWT+* ptrBack++; } TBLPTR--; // TBLWT+* EECON1bits.EEPGD = 1; //****************************************************************************** EECON1bits.CFGS = 0; //Point to Flash program memory,access Flash program memory,enable //write to memory,enable Row Erase operation EECON1bits.WREN = 1; //*************************************************************** INTCONbits.GIEH = 0; // Desabilita interrupes EECON2 = 0x55; // Required EECON2 = 0xAA; // Required EECON1bits.WR = 1; // Start erase (CPU stall) } INTCONbits.GIEH = 1; EECON1bits.WREN = 0; return; } // Habilita interrupes // Start erase (CPU stall)

Exemplos de cdigo em Linguagem assembly para gravao na FLASH: MOVLW D'64 ; number of bytes in erase block MOVWF COUNTER MOVLW BUFFER_ADDR_HIGH ; point to buffer MOVWF FSR0H MOVLW BUFFER_ADDR_LOW MOVWF FSR0L MOVLW CODE_ADDR_UPPER ; Load TBLPTR with the base MOVWF TBLPTRU ; address of the memory block MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL READ_BLOCK TBLRD*+ ; read into TABLAT, and inc MOVF TABLAT, W ; get data MOVWF POSTINC0 ; store data DECFSZ COUNTER ; done? BRA READ_BLOCK ; repeat MODIFY_WORD MOVLW DATA_ADDR_HIGH ; point to buffer MOVWF FSR0H MOVLW DATA_ADDR_LOW MOVWF FSR0L MOVLW NEW_DATA_LOW ; update buffer word MOVWF POSTINC0 MOVLW NEW_DATA_HIGH MOVWF INDF0 ERASE_BLOCK MOVLW CODE_ADDR_UPPER ; load TBLPTR with the base MOVWF TBLPTRU ; address of the memory block MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH MOVLW CODE_ADDR_LOW MOVWF TBLPTRL BSF EECON1, EEPGD ; point to Flash program memory BCF EECON1, CFGS ; access Flash program memory BSF EECON1, WREN ; enable write to memory BSF EECON1, FREE ; enable Row Erase operation BCF INTCON, GIE ; disable interrupts MOVLW 55h MOVWF EECON2 ; write 55h MOVLW 0AAh MOVWF EECON2 ; write 0AAh BSF EECON1, WR ; start erase (CPU stall) BSF INTCON, GIE ; re-enable interrupts TBLRD*- ; dummy read decrement MOVLW BUFFER_ADDR_HIGH ; point to buffer MOVWF FSR0H MOVLW BUFFER_ADDR_LOW MOVWF FSR0L MOVLW D2 MOVWF COUNTER1 WRITE_BUFFER_BACK MOVLW D32 ; number of bytes in holding register MOVWF COUNTER WRITE_BYTE_TO_HREGS MOVF POSTINC0, W ; get low byte of buffer data MOVWF TABLAT ; present data to table latch TBLWT+* ; write data, perform a short write ; to internal TBLWT holding register. DECFSZ COUNTER ; loop until buffers are full BRA WRITE_WORD_TO_HREGS PROGRAM_MEMORY BSF EECON1, EEPGD ; point to Flash program memory BCF EECON1, CFGS ; access Flash program memory BSF EECON1, WREN ; enable write to memory BCF INTCON, GIE ; disable interrupts MOVLW 55h MOVLW 0AAh MOVWF EECON2 ; write 0AAh BSF EECON1, WR ; start program (CPU stall) DECFSZ COUNTER1 BRA WRITE_BUFFER_BACK BSF INTCON, GIE ; re-enable interrupts BCF EECON1, WREN ; disable write to memory

*Para maiores explicaes consultar o manual do PIC18f4550

Anda mungkin juga menyukai