Autor Tema: ¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*  (Leído 9571 veces)

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

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #30 en: 18 de Enero de 2017, 09:33:41 »
bueno retomando esto, ya que las funciones de ccs no me han funcionado, me fui al datasheet y ahi tiene unas rutinas en assembler para la lectura y escritura

char leyendo_memoria(int addr_upper,int addr_high,int addr_low){
   char m,n;
   TBLPTRU=ADDR_UPPER;
   TBLPTRH=ADDR_HIGH;
   TBLPTRL=ADDR_LOW;
   #asm
   TBLRD*+ //LEYEDO E INCREMENTANDO
   movf TABLAT,W
   movwf m
   TBLRD*+
   movf TABLAT,W
   movwf n
   #endasm
   return(m);
}

al parecer si me esta leyendo correctamente, falta todavia las funciones de borrar y escribir

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #31 en: 18 de Enero de 2017, 14:45:22 »
saludos
ya tengo las funciones para leer y borrar datos guardados en la memoria de programa, solo me queda la funcion para guardar los datos, esto se me ha complicado un poco y no logro entender correctamente el codigo en assembler que esta en el datasheet del 18f452 y sirve para escribir datos

que es NEW DATA LOW Y NEW DATA HIGH?

es la parte que esta seleccionado a ver si me pueden ayudar




Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #32 en: 18 de Enero de 2017, 15:33:47 »
aqui adjunto la funcion para poder escribir datos en la memoria de programa del pic 18f452, hasta ahora no graba nada, a ver si alguien encuentra el porque


void escribiendo_memoria(char *ptra,int addr_upper,int addr_high,int addr_low){
  char COUNTER;
  char buffer[64];
  char *pt;
  int i,j,dir;
 
  char new_data_low;
  char new_data_high;
  char counter_high;
  pt=&buffer[0];
   TBLPTRU=ADDR_UPPER;
   TBLPTRH=ADDR_HIGH;
   TBLPTRL=ADDR_LOW;
   FSR0H=0;
   FSR0L=pt;
   #asm
   movlw 0x40
   movwf COUNTER
   //LEYENDO EL BOQUE DE 64 BYTE
READ_BLOCK:
   TBLRD*+
   MOVF TABLAT,W
   MOVWF POSTINC0
   DECFSZ COUNTER
   BRA READ_BLOCK
//actualizando buffer
   movlw 0
   movwf FSR0H
   movf  PT,W
   MOVWF FSR0L
   Movlw 0
   movwf POSTINC0
   Movf  PTRA,W
   movwf INDF0
   
ERASE_BLOCK:
   MOVF ADDR_UPPER,W
   MOVWF TBLPTRU
   MOVF  ADDR_HIGH,W
   MOVWF TBLPTRH
   MOVF  ADDR_LOW,W
   MOVWF TBLPTRL
   bsf EECON1,7 //eepgd
   bcf EECON1,6 //cfgs
   bsf EECON1,2 //wren
   bsf EECON1,4 //FREE
   bcf INTCON,7 //GIE
   movlw 0X55
   movwf EECON2
   movlw 0XAA
   movwf EECON2
   bsf EECON1,1
   bsf INTCON,7
   TBLRD*-
   
   //ESCRIBIENDO
WRITE_BUFFER_BACK:
   MOVLW 8
   MOVWF COUNTER_HIGH
   MOVLW 0
   MOVWF FSR0H
   MOVF  PTRA,W
   MOVWF FSR0L
PROGRAM_LOOP:
   MOVLW 8
   MOVWF COUNTER
WRITE_WORD_HREGS:
   MOVF  POSTINC0,W
   MOVWF TABLAT
   TBLWT+*
   DECFSZ COUNTER
   BRA  WRITE_WORD_HREGS
PROGRAM_MEMORY:
   BSF   EECON1,7
   BCF   EECON1,6
   bsf EECON1,2 //WREN
   bcf INTCON,7 //GIE
   
   MOVLW 0X55
   MOVWF EECON2
   MOVLW 0XAA
   MOVWF EECON2
   BSF   EECON1,1
   BSF   INTCON,7
   DECFSZ   COUNTER_HIGH
   BRA   PROGRAM_LOOP
   BCF   EECON1,2
  #endasm

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #33 en: 18 de Enero de 2017, 20:02:14 »
Mmmm... no se que decirte, tocar los accesos indirectos sin generar un backup primero podria causar problemas. Por que el compilador no espera que alguien lo cambie.
Por eso mismo deberias primero tener variables que creen un backup de esos registros ( FSR0x )

El otro tema es que un puntero tiene un tamaño dependiente del hardware, en ese PIC la memoria tiene 12 bits, por lo cual asumo que el puntero debe ser de 16 bits. Como pensas meter 16 bits en 8?

Código: C
  1. FSR0H=0;
  2.    FSR0L=pt;

Deberia ser algo asi:

Código: C
  1. FSR0L = pt & 0xFF;
  2.    FSR0H = (pt>>8) & 0xFF;

Asi que el resto del codigo no seria 0 el valor de FSRH0

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #34 en: 18 de Enero de 2017, 20:59:35 »
Gracias killeric por tu respuesta, pues si, el puntero lo habia declarado de 8 bits  :?
y el codigo me funciona perfectamente hasta la lectura. si lee y muestra los valores que grabe con la directiva #rom
el problema viene desde que se actualiza el buffer

voy a cambiar el puntero a 16 bits
seria: INT16 *PTR;


Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #35 en: 18 de Enero de 2017, 21:03:43 »
estoy siguiendo esta secuencia que esta en el datasheet del pic 18f452
y el codigo en assembler que hay ahi

me has dado una idea killeric, entonces puedo definir mi funcion para para escribir de la siguiente manera?

void escribiendo_memoria(int16 *pt,int32 addr){
   FSR0L = pt & 0xFF;
   FSR0H = (pt>>8 ) & 0xFF;
   
   TBLPTRU=ADDR &0XFF;
   TBLPTRH=(ADDR>>8 ) & 0XFF;
   TBLPTRU=(ADDR>>8 ) & 0XFF;
 
« Última modificación: 18 de Enero de 2017, 21:20:59 por micronet3 »

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #36 en: 19 de Enero de 2017, 07:02:44 »
por fin lo logre y ya puedo cantar victoria  :-/ :-/ :-/
gracias

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #37 en: 19 de Enero de 2017, 07:56:19 »
por fin lo logre y ya puedo cantar victoria  :-/ :-/ :-/
gracias
pucha nada, falsa alarma, la rutina de grabar datos en la memoria no graba nada, parece como que la memoria se bloqueara


Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re:¿¿¿ write_program_memory() mas complejo de lo que parece ??? *SOLUCIONADO*
« Respuesta #38 en: 19 de Enero de 2017, 15:12:43 »
 :-/ :-/
ahora si lo consegui.
ya puedo guardar datos en la memoria de programa de manera ordenada y puedo volver a guardar en la misma direccion

saludos
« Última modificación: 19 de Enero de 2017, 16:12:03 por micronet3 »


 

anything