Autor Tema: Guardar en memoria de programa con C18  (Leído 1677 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MARTIN24

  • PIC10
  • *
  • Mensajes: 5
Guardar en memoria de programa con C18
« en: 04 de Mayo de 2009, 12:36:19 »
Hola:
       El tema es el siguiente, quiero guardar unos valores en flash que se modificaran de vez en cuando durante el tiempo de ejeccucón del programa. Estoy utilizando el PIC18F97J60.
Estuve viendo la hoja de datos del PIC y por lo que estuve averiguando la unica forma de programar la flash en tiempo de ejecucion es por medio de un código en assembler que se describe en la hoja de datos.
Tengo dos preguntas:
1) Alguien conoce alguna función en C para guardar en ROM? Si alguien me responde "memmoveram2pgm", me parece que no es la solución. Por lo que estuve viendo esta función pasa una variable de RAM al bus de datos, pero no programa la flash.
2) Como definir una seccion de ROM para que quede libre? Ya que la manera de programar la ROM es por bloques de 64 bytes y no quiero sobreescribir mi programa.

Dejo la función realizada en assembler de la hoja de datos:

                                 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
ERASE_BLOCK            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
                                 MOVLW D'16'
                                 MOVWF WRITE_COUNTER ; Need to write 16 blocks of 64 to write ; one erase block of 1024
                                 RESTART_BUFFER
                                 MOVLW D'64'
                                 MOVWF COUNTER
                                 MOVLW BUFFER_ADDR_HIGH ; point to buffer
                                 MOVWF FSR0H
                                 MOVLW BUFFER_ADDR_LOW
                                 MOVWF FSR0L
FILL_BUFFER
... ; read the new data from I2C, SPI, PSP, USART, etc.
WRITE_BUFFER           MOVLW D’64 ; number of bytes in holding register
                                 MOVWF COUNTER
WRITE_BYTE_TO_HREGS
                                  MOVFF POSTINC0, WREG ; 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_BYTE_TO_HREGS
PROGRAM_MEMORY
                                  BSF EECON1, WREN ; enable write to memory
                                  BCF INTCON, GIE ; disable interrupts
                                  MOVLW 55h
                    Required MOVWF EECON2 ; write 55h
                   Sequence MOVLW 0AAh
                                  MOVWF EECON2 ; write 0AAh
                                  BSF EECON1, WR ; start program (CPU stall)
                                  BSF INTCON, GIE ; re-enable interrupts
                                  BCF EECON1, WREN ; disable write to memory
                                  DECFSZ WRITE_COUNTER ; done with one write cycle
                                  BRA RESTART_BUFFER ; if not done replacing the erase block


 

anything