Autor Tema: Flash Como EEprom HCS08  (Leído 13007 veces)

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

Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: Flash Como EEprom HCS08
« Respuesta #15 en: 11 de Marzo de 2014, 09:17:44 »
Claro, se entiende! muchas gracias. Sospechaba que ese bool era en realidad un unsigned char. Ahora esta rutina la puedo utilizar para cualquier hcs08? o solo es válida para el QG8?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #16 en: 11 de Marzo de 2014, 16:33:29 »
Hola, si podes utilizarla para toda la familia HCs08, lo único que tenes que tener en cuenta es el registro que programa la velocidad de clock del oscilador que maneja la grabación de los datos en Flash, no recuerdo el nombre. Este valor tiene que ver con la velocidad de clock de tu micro.

Saludos !

Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: Flash Como EEprom HCS08
« Respuesta #17 en: 12 de Marzo de 2014, 00:19:11 »
Muchas gracias, pero que gran aporte la verdad. Muy bueno. Estas rutinas siempre son necesarias y útiles pero no son fáciles de hacer ni conseguir.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #18 en: 23 de Abril de 2014, 16:53:40 »
Muchas gracias, pero que gran aporte la verdad. Muy bueno. Estas rutinas siempre son necesarias y útiles pero no son fáciles de hacer ni conseguir.

De nada !

Desconectado alex1961

  • PIC10
  • *
  • Mensajes: 2
Re: Flash Como EEprom HCS08
« Respuesta #19 en: 08 de Septiembre de 2014, 09:50:20 »
hola a todos en especial al RICHI777 que puso el codigo original
hice mi version:


RAM: section ($100)
fshcode:   rmb         64         ; ram, no pagina zero
*
* flash a grabar
*
addeep      equ          $C000         ;
fstab         equ          $1825
fcmd         equ          $1826
srs            equ          $1800 ; depende del micro ya esta definido en el inc

*
*       $87,$C6,$18,$25,$A5,$10,$27,$08,$C6,$18,$25,$AA,$10,$C7,$18,$25   ;
*   
*       $9E,$E6,$01,$F7,$A6,$20,$C7,$18,$26,$45,$18,$25,$F6,$AA,$80,$F7   ;
*
*        $9D,$9D,$9D,$9D,$45,$18,$25,$F6,$F7,$F6,$A5,$30,$27,$04,$A6,$FF   ;
*
*       $20,$07,$A6,$FF,$C7,$18,$00,$C6,$18,$25,$A5,$40,$27,$F4,$8A,$81   ;
*
*
* rutina de grabar un byte en $F000, $5A
*      
wrikm:
       sei                     ; no irq
*   
        ldhx           #$C000            ;
                sthx          fshadd            ;
       lda      #$C3            ;
       sta      fshdat            ;
      lda      #$40            ;
      sta      fshcmd            ;
      jsr      fwrite            ; erase
*
       ldhx           #$C000            ;
       sthx           fshadd            ;   
       lda      #$C3            ;
      sta      fshdat            ;
      lda      #$20            ;
      sta      fshcmd            ;
       jsr      fwrite            ; write
*
       clrh                  ;
       cli                     ;
       rts                     ;   
*
* ingresa hx=dir
*         a=dato
* 21,x en ram es $20 graba $40 borra
*   
* ingresa:
*   fshadd=direccion a grabar/borrar (1bloque)
*   fshdat=dato a grabar
*    fshcmd=comando $20 graba, $40 borra
*   fshcode=lugar en ram donde se ejecuta
*   
fwrite:
                ldhx      #(f_wr_fin - f_wr_com)      ;numero de bytes a copiar, H=0
                                           ;copia funcion de GRABACION a RAM
fwr010:
                lda       (f_wr_com-1),x              ;
                sta       (fshcode-1),x              ;(-1 porque X= ultimo..1)
                dbnzx   fwr010                  ;
*
                sta       srs                        ;resetea COP
*
      lda      fshcmd                  ;
      sta      fshcode+21               ;
                ldhx          fshadd                  ;carga address del bloque a grabar/borrar
      lda      fshdat                  ;
                jmp          fshcode                  ;ejecuta codigo en RAM, sale por RTS
*
* rutina de write/erase
*
f_wr_com:
*      
write:
       psha               ;
      lda      fstat         ;
      bit      #$10         ; 0001 0000 FACCERR
      beq      wri010         ;
      lda      fstat         ;
      ora      #$10         ; IF FACCERR=1, clear it
      sta      fstat         ;
wri010:
      lda      1,sp         ; tomo dato a grabar
      sta      ,x            ; grabo donde quiero
      lda      #$20         ;
      sta      fcmd         ; comando $20
      ldhx          #$1825         ;
      lda      ,x            ;
      ora      #$80         ; FCBEF=1
                sta      ,x            ;
      nop                  ;
      nop                  ;
      nop                  ;
      nop                  ;
      ldhx           #fstat         ;
      lda      ,x            ;
      sta      ,x            ;
      lda      ,x            ;
      bit      #$30         ; FPVIOL y FACCERR
      beq      wri020         ; (04)
      lda      #$FF         ; 2
      bra      wri030         ; 2 (07)
wri020:
      lda      #$FF         ; 2
      sta      srs            ; 3 watchdog
      lda      fstat         ;
      bit      #$40         ;
      beq      wri020         ; $F4
wri030:   
      pulh               ;
      rts                  ;
*
f_wr_fin:
   
wrikm: primero borra un bloque y luego graba un byte en $C000 con $5A
lo que hice fue insertar el codigo propuesto en binario en RAM y ejecutarlo. (fwrite)
lo diferente fue que es codigo ASSEMBLER puro.
pase el binario en una rutina la cual esta en write.

lo unico que encontre que un byte no me coincidio ya que el salto ultimo me da $20 $0C y no $20 $07, lo probe
y me grabo lo mas bien.
saludos a todos, el foro me ayudo muchisimo!!!

utilizo codewarrior, assembler puro, con micro MC9S08AC16CFB

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #20 en: 08 de Septiembre de 2014, 12:00:13 »
Excelente !!!, yo hace unos años que estoy alejado de estos micros. Sugerencia, no copies el código directamente, encerralos en estos tags, queda mas lindo.
"
Código: [Seleccionar]
tu codigo"

Saludos !

Desconectado alex1961

  • PIC10
  • *
  • Mensajes: 2
Re: Flash Como EEprom HCS08
« Respuesta #21 en: 08 de Septiembre de 2014, 12:48:28 »
bueno a pedido, cambie el formato, gracias nuevamente RICHI777
ahora agregue las rutinas de comparacion y grabado de n bytes, super completa. funciona ok.
yo suelo grabar entre 1 y 32 datos de configuracion o cuando se corta la energia.


Excelente !!!, yo hace unos años que estoy alejado de estos micros. Sugerencia, no copies el código directamente, encerralos en estos tags, queda mas lindo.

Código: [Seleccionar]
*
* -------------------------------------------------------
*
* comparo datos entre EEPROM y RAM
*
* flash: addeep
* ram:   cuenta+0,1 ...
* sale   a=$00 OK
*        a=$FF mal
*
* -------------------------------------------------------
*
cmpkm:
        ldx     #ctebre         ; cantidad de datos
cmk010:
        sta     srs             ;
        lda     addeep,x        ;
        cmp     cuenta,x        ;
        bne     cmk080          ;
        decx                    ;
        bpl     cmk010          ;
*
* comparo ok!
*
        clra                    ;
        bra     cmk090          ;
cmk080:
        clra                    ;
        coma                    ;
cmk090:
        rts                     ;
*
* -------------------------------------------------------
*
* rutina de escritura en FLASH de datos en cuenta+0,1 ...
* intento cterei veces grabacion
* sale:
*       a=$00 todo bien
*       a=$FF mal
*
* -------------------------------------------------------
*
wrikm:
        mov     #cterei,ayurei      ;
wkm010:
        jsr     wrieep          ;
        jsr     cmpkm           ;
        tsta                    ;
        beq     wkm100          ;
*
        dbnz    ayurei,wkm010   ;
wkm090:
        lda     #$FF            ;
wkm100:
        clrh                    ;
        bclr    4,flag0         ; ya grabe
*
        rts                     ;
*
* -------------------------------------------------------
*
* rutina de grbacion datos en EEPROM
*
* ingresa:
*       fshadd=direccion a grabar/borrar (1bloque)
*       fshdat=dato a grabar
*       fshcmd=comando $20 graba, $40 borra (21,x)
*       fshcode=lugar en ram donde se ejecuta
*
* anulo irq's
*
* -------------------------------------------------------
*
wrieep:
        clr     ayucnt          ;
        sei                     ; no timer
        bset    1,irqsc         ; no irq ext
*       
        ldhx    #$C000          ;
        sthx    fshadd          ;
        lda     #$FF            ;
        sta     fshdat          ;
        lda     #cmdera         ; cmd erase
        sta     fshcmd          ;
        jsr     fwrite          ; erase
wrp010:
        clrh                    ;
        ldx     ayucnt          ;
        lda     cuenta,x        ;
        sta     fshdat          ; data
        lda     #cmdwri         ;
        sta     fshcmd          ; write
        jsr     fwrite          ;
*
        inc     fshadd+1        ; add=+1
        inc     ayucnt          ;
        lda     ayucnt          ;
        sta     srs             ;
        cmp     #ctebre+1       ;
        bne     wrp010          ;
*
        clrh                    ;
        cli                     ;
        bclr    1,irqsc         ; si irq ext
*
        rts                     ;
*
* db    $87,$C6,$18,$25,$A5,$10,$27,$08,$C6,$18,$25,$AA,$10,$C7,$18,$25 ;
*   
* db    $9E,$E6,$01,$F7,$A6,$20,$C7,$18,$26,$45,$18,$25,$F6,$AA,$80,$F7 ;
*
* db    $9D,$9D,$9D,$9D,$45,$18,$25,$F6,$F7,$F6,$A5,$30,$27,$04,$A6,$FF ;
*
* db    $20,$07,$A6,$FF,$C7,$18,$00,$C6,$18,$25,$A5,$40,$27,$F4,$8A,$81 ;
*
*
* ingresa hx=dir
*         a=dato
* 21,x en ram es $20 graba $40 borra
*
* ingresa:
* fshadd=direccion a grabar/borrar (1bloque)
* fshdat=dato a grabar
* fshcmd=comando $20 graba, $40 borra
* fshcode=lugar en ram donde se ejecuta
*
fwrite:
        ldhx    #(f_wr_fin - f_wr_com) ;numero de bytes a copiar, H=0
                                        ;copia funcion de GRABACION a RAM
fwr010:
        lda     (f_wr_com-1),x          ;
        sta     (fshcode-1),x    ;(-1 porque X= ultimo..1)
        dbnzx   fwr010 ;
*
        sta     srs             ;resetea COP
*
lda fshcmd          ;
sta fshcode+21 ;
        ldhx    fshadd ;carga address del bloque a grabar/borrar
lda fshdat ;
        jmp     fshcode ;ejecuta codigo en RAM, sale por RTS
*
* rutina de write/erase
*
f_wr_com:
*
write:
  psha ;
lda fstat ;
bit #$10 ; 0001 0000 FACCERR
beq wri010 ;
lda fstat ;
ora #$10 ; IF FACCERR=1, clear it
sta fstat ;
wri010:
lda 1,sp ; tomo dato a grabar
sta ,x ; grabo donde quiero
lda #$20 ;
sta fcmd ; comando $20
ldhx #$1825 ;
lda ,x ;
ora #$80 ; FCBEF=1
      sta ,x ;
nop ;
nop ;
nop ;
nop ;
ldhx #fstat ;
lda ,x ;
sta ,x ;
lda ,x ;
bit #$30 ; FPVIOL y FACCERR
beq wri020 ;
lda #$FF ;
bra wri030 ;
wri020:
lda #$FF ;
sta srs ; watchdog
lda fstat ;
bit #$40 ;
beq wri020 ; $F4
wri030:
pulh ;
rts ;
*
f_wr_fin:


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #22 en: 08 de Septiembre de 2014, 13:10:21 »
Excelente !!! Así es mucho mas legible.

bueno a pedido, cambie el formato, gracias nuevamente RICHI777
ahora agregue las rutinas de comparacion y grabado de n bytes, super completa. funciona ok.
yo suelo grabar entre 1 y 32 datos de configuracion o cuando se corta la energia.


Excelente !!!, yo hace unos años que estoy alejado de estos micros. Sugerencia, no copies el código directamente, encerralos en estos tags, queda mas lindo.

Código: [Seleccionar]
*
* -------------------------------------------------------
*
* comparo datos entre EEPROM y RAM
*
* flash: addeep
* ram:   cuenta+0,1 ...
* sale   a=$00 OK
*        a=$FF mal
*
* -------------------------------------------------------
*
cmpkm:
        ldx     #ctebre         ; cantidad de datos
cmk010:
        sta     srs             ;
        lda     addeep,x        ;
        cmp     cuenta,x        ;
        bne     cmk080          ;
        decx                    ;
        bpl     cmk010          ;
*
* comparo ok!
*
        clra                    ;
        bra     cmk090          ;
cmk080:
        clra                    ;
        coma                    ;
cmk090:
        rts                     ;
*
* -------------------------------------------------------
*
* rutina de escritura en FLASH de datos en cuenta+0,1 ...
* intento cterei veces grabacion
* sale:
*       a=$00 todo bien
*       a=$FF mal
*
* -------------------------------------------------------
*
wrikm:
        mov     #cterei,ayurei      ;
wkm010:
        jsr     wrieep          ;
        jsr     cmpkm           ;
        tsta                    ;
        beq     wkm100          ;
*
        dbnz    ayurei,wkm010   ;
wkm090:
        lda     #$FF            ;
wkm100:
        clrh                    ;
        bclr    4,flag0         ; ya grabe
*
        rts                     ;
*
* -------------------------------------------------------
*
* rutina de grbacion datos en EEPROM
*
* ingresa:
*       fshadd=direccion a grabar/borrar (1bloque)
*       fshdat=dato a grabar
*       fshcmd=comando $20 graba, $40 borra (21,x)
*       fshcode=lugar en ram donde se ejecuta
*
* anulo irq's
*
* -------------------------------------------------------
*
wrieep:
        clr     ayucnt          ;
        sei                     ; no timer
        bset    1,irqsc         ; no irq ext
*       
        ldhx    #$C000          ;
        sthx    fshadd          ;
        lda     #$FF            ;
        sta     fshdat          ;
        lda     #cmdera         ; cmd erase
        sta     fshcmd          ;
        jsr     fwrite          ; erase
wrp010:
        clrh                    ;
        ldx     ayucnt          ;
        lda     cuenta,x        ;
        sta     fshdat          ; data
        lda     #cmdwri         ;
        sta     fshcmd          ; write
        jsr     fwrite          ;
*
        inc     fshadd+1        ; add=+1
        inc     ayucnt          ;
        lda     ayucnt          ;
        sta     srs             ;
        cmp     #ctebre+1       ;
        bne     wrp010          ;
*
        clrh                    ;
        cli                     ;
        bclr    1,irqsc         ; si irq ext
*
        rts                     ;
*
* db    $87,$C6,$18,$25,$A5,$10,$27,$08,$C6,$18,$25,$AA,$10,$C7,$18,$25 ;
*   
* db    $9E,$E6,$01,$F7,$A6,$20,$C7,$18,$26,$45,$18,$25,$F6,$AA,$80,$F7 ;
*
* db    $9D,$9D,$9D,$9D,$45,$18,$25,$F6,$F7,$F6,$A5,$30,$27,$04,$A6,$FF ;
*
* db    $20,$07,$A6,$FF,$C7,$18,$00,$C6,$18,$25,$A5,$40,$27,$F4,$8A,$81 ;
*
*
* ingresa hx=dir
*         a=dato
* 21,x en ram es $20 graba $40 borra
*
* ingresa:
* fshadd=direccion a grabar/borrar (1bloque)
* fshdat=dato a grabar
* fshcmd=comando $20 graba, $40 borra
* fshcode=lugar en ram donde se ejecuta
*
fwrite:
        ldhx    #(f_wr_fin - f_wr_com) ;numero de bytes a copiar, H=0
                                        ;copia funcion de GRABACION a RAM
fwr010:
        lda     (f_wr_com-1),x          ;
        sta     (fshcode-1),x    ;(-1 porque X= ultimo..1)
        dbnzx   fwr010 ;
*
        sta     srs             ;resetea COP
*
lda fshcmd          ;
sta fshcode+21 ;
        ldhx    fshadd ;carga address del bloque a grabar/borrar
lda fshdat ;
        jmp     fshcode ;ejecuta codigo en RAM, sale por RTS
*
* rutina de write/erase
*
f_wr_com:
*
write:
  psha ;
lda fstat ;
bit #$10 ; 0001 0000 FACCERR
beq wri010 ;
lda fstat ;
ora #$10 ; IF FACCERR=1, clear it
sta fstat ;
wri010:
lda 1,sp ; tomo dato a grabar
sta ,x ; grabo donde quiero
lda #$20 ;
sta fcmd ; comando $20
ldhx #$1825 ;
lda ,x ;
ora #$80 ; FCBEF=1
      sta ,x ;
nop ;
nop ;
nop ;
nop ;
ldhx #fstat ;
lda ,x ;
sta ,x ;
lda ,x ;
bit #$30 ; FPVIOL y FACCERR
beq wri020 ;
lda #$FF ;
bra wri030 ;
wri020:
lda #$FF ;
sta srs ; watchdog
lda fstat ;
bit #$40 ;
beq wri020 ; $F4
wri030:
pulh ;
rts ;
*
f_wr_fin:


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #23 en: 11 de Septiembre de 2014, 21:44:20 »
Hace mucho tiempo que no toco estas rutinas, pero encontré algunas mejoras. Capaz que sirva de algo ...

Código: C
  1. #define KPGM_ADDRESS            0x1860   /* Flash routine RODATA */
  2.  
  3.  
  4. /* Array of opcode instructions of the Erase/Program function in the HCS08 family */
  5. const byte KPGM[11] @KPGM_ADDRESS =
  6. {  
  7.   0xF7,               // STA ,X  FSTAT  
  8.   0x44,               // LSRA -  Delay and convert to FCCF bit
  9.   0xA6,0xFF,          // LDA FFh   - Watch dog reset
  10.   0xC7,0x18,0x00,     // STA 1800h
  11.   0xF5,               // BIT ,X  FSTAT
  12.   0x27,0xF8,          // BEQ *-1
  13.   0x81                // RTS
  14. };
  15.  
  16. #pragma DATA_SEG _DATA_ZEROPAGE
  17. byte PGM[11];
  18.  
  19. /* Si se produjo un IPL es necesario volver a iniciar las rutinas de RAM para Flash */
  20.   FlashInit();
  21.  
  22.  
  23. void FlashInit( void )
  24. {
  25.   /* Se inicia byte a byte para no crear dependencias con otro funciones */
  26.   PGM[0] = KPGM[0];
  27.   PGM[1] = KPGM[1];
  28.   PGM[2] = KPGM[2];
  29.   PGM[3] = KPGM[3];
  30.   PGM[4] = KPGM[4];
  31.   PGM[5] = KPGM[5];
  32.   PGM[6] = KPGM[6];
  33.   PGM[7] = KPGM[7];
  34.   PGM[8] = KPGM[8];
  35.   PGM[9] = KPGM[9];
  36.   PGM[10] = KPGM[10];
  37. }
  38.  
  39. #pragma CODE_SEG FLASH_ERASE_CODE_SEG
  40. byte FlashErase( word Address )
  41. {
  42.   asm
  43.   {
  44.       TPA                       ; Get status to A      
  45.       PSHA                      ; Save current status        
  46.       SEI                       ; Disable interrupts      
  47.       LDA  #0x30                ;    
  48.       STA  FSTAT                ; Clear FACCERR & FPVIOL flags      
  49.       LDHX Address              ;      
  50.       STA  ,X                   ; Save the data      
  51.       LDA  #$40                 ; Erase command      
  52.       STA  FCMD                 ;
  53.       LDA  #FSTAT_FCBEF_MASK    ;  
  54.       LDHX @FSTAT               ;
  55.       JSR  PGM                  ;
  56.       PULA                      ; Restore previous status      
  57.       TAP                       ;            
  58.   }  
  59.  
  60.   return ( FSTAT & 0x30 );  
  61. }
  62.  
  63. #pragma CODE_SEG FLASH_PRG_BYTE_CODE_SEG
  64. byte FlashProgramByte( word Address, byte Data )
  65. {
  66.   asm
  67.   {
  68.     TPA                         ;
  69.     PSHA                        ; Save current status        
  70.     SEI                         ; Disable interrupts      
  71.     LDA  #0x30                  ;
  72.     STA  FSTAT                  ; Clear FACCERR & FPVIOL flags      
  73.     LDHX Address                ;      
  74.     LDA  Data                   ;
  75.     STA  ,X                     ; Save the data      
  76.     LDA  #$20                   ; Burn command      
  77.     STA  FCMD                   ;
  78.     LDA  #FSTAT_FCBEF_MASK      ;
  79.     LDHX @FSTAT                 ;
  80.     JSR  PGM                    ;
  81.     PULA                        ; Restore previous status      
  82.     TAP    
  83.   }
  84.  
  85.   return ( FSTAT & 0x30 );                                                              
  86. }
  87.  
  88. #pragma CODE_SEG FLASH_WRITE_CODE_SEG
  89. byte FlashWrite( word Address, byte *Source, word Len )
  90. {
  91.   word Index;
  92.  
  93.   for ( Index = 0; Index < Len; Index ++ )
  94.   {
  95.     if ( FlashProgramByte( Address + Index, ( byte ) *( Source + Index )))
  96.     {
  97.       /* Signal Error */
  98.       return( 0xFF );
  99.     }
  100.   }
  101.  
  102.         /* Signal Ok */
  103.         return( 0 );
  104. }


El código esta pegado, pero son las dos funciones que se precisan borrar y escribir. Estas funciones trabajan bien en equipos que hace años que estan funcionando en la calle.

Saludos !

Desconectado turkosale

  • PIC10
  • *
  • Mensajes: 4
Re:Flash Como EEprom HCS08
« Respuesta #24 en: 01 de Febrero de 2016, 10:55:51 »
Buenos días gente, les consulto estas rutinas funcionan ok tanto con oscilador interno como cristal??? ya que las estoy probando y no puedo hacer que graben con un micro MC9S08SH8.

saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Flash Como EEprom HCS08
« Respuesta #25 en: 01 de Febrero de 2016, 12:14:55 »
Buenos días gente, les consulto estas rutinas funcionan ok tanto con oscilador interno como cristal??? ya que las estoy probando y no puedo hacer que graben con un micro MC9S08SH8.

saludos

En el datasheet te dice como hacerlo, y sobre tu pregunta de oscilador interno o cristal

Citar
Before any program or erase command can be accepted, the FLASH clock divider register (FCDIV) must be written to set the internal clock for the FLASH module to a frequency (fFCLK) between 150 kHz and 200 kHz (see Section 4.7.1, “FLASH Clock Divider Register (FCDIV)”)

Debe ser ejecutado en el reset, y limpiar todos los errores antes de hacerlo.