Autor Tema: No escribe en la FLASH del PIC16F886, (SOLUCIÓN FINAL)  (Leído 2032 veces)

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

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
No escribe en la FLASH del PIC16F886, (SOLUCIÓN FINAL)
« en: 10 de Noviembre de 2011, 06:48:04 »
Hola  a todos,

he echo un programita, para ver las distintas partes controladas que todo va bien, y lo último ha sido incorporar las rutinas partes de escritura y lectura de datos, la lectura , lee 0, la escritura ni caso.
Y escribo exactamente lo mismo que me indica el datasheet del PIC16F886:

    w      EQU      0h
   f      EQU      1h

      LIST      P=16F886
      INCLUDE     <P16F886.INC>

RET1      EQU   20H
RET2      EQU   21H
RET3      EQU   22H
VAR1      EQU   110H
VAR2      EQU   111H
VAR3      EQU   112H
VAR4      EQU   113H
ADRL      EQU   00H
ADRH      EQU   03H
ADRL1      EQU   01H

         ORG      00H
         GOTO    INI
         ORG    05H

         

DEMORA1S   NOP
         BANKSEL   PIR1
         MOVLW   00h      ;  CARGA VARIABLES DEMORA
         MOVWF   RET1
         MOVLW   00h
         MOVWF   RET2                                             
         MOVLW   05h
         MOVWF   RET3
DEC2      DECFSZ   RET2    ;  RETARDO DE 1SEG.
         GOTO   DEC2    
         DECFSZ   RET1       
         GOTO   DEC2
         DECFSZ   RET3       ;  3 BUCLES
         GOTO   DEC2
         BANKSEL   EEDAT
         RETURN


INI         NOP
         BANKSEL   PIR1
         CLRF   PORTB
         BANKSEL ANSELH
         CLRF   ANSELH
         BANKSEL   TRISB
         MOVLW   0XF0
         MOVWF   TRISB
         BANKSEL   EEDAT
         MOVLW   01H
         MOVWF   VAR1
         MOVLW   09H
         MOVWF   VAR2
         MOVLW   06H
         MOVWF   VAR3
         MOVLW   0FH
         MOVWF   VAR4
         
         
WRFLASH      NOP
         BANKSEL   EEADRH      ;;;; PAG. 121 DATASHEET
         MOVF   ADRH,0
         MOVWF   EEADRH
         MOVF   ADRL,0
         MOVWF    EEADR
         MOVLW   110H
         MOVWF   FSR
LOOP      MOVF   INDF,0
         MOVWF    EEDATA          ;
         INCF    FSR,1       ; Next byte
         MOVF    INDF,0       ; Load second data byte into upper
         MOVWF    EEDATH
         INCF    FSR,1
         BANKSEL EECON1
         BSF    EECON1,7    ; Point to program memory
         BSF    EECON1,2
         BCF    INTCON,7 ; Disable interrupts (if using)
         BTFSC    INTCON,7
         GOTO   $-2
         MOVLW   55H
         MOVWF   EECON2
         MOVLW   0AAH
         MOVWF   EECON2
         BSF    EECON1,1
         NOP
         NOP
ESP         BTFSC   EECON1,1
         GOTO   ESP
         BCF    EECON1,2
         BSF    INTCON,7
         BANKSEL EEADR
         MOVF    EEADR,0
         INCF    EEADR,1 ; Increment address
         ANDLW    0FH ; Indicates when sixteen words have been programmed
         SUBLW    0FH ; 0x0F = 16 words  07H SON 8 WORDS
         BTFSS    STATUS,2 ; Exit on a match,
         GOTO    LOOP
         
A0_VAR1_2   NOP
         MOVLW   08H
         MOVWF   VAR1
         MOVLW   08H
         MOVWF   VAR2
         

RDFLASH      NOP
         BANKSEL   EEADR      ;;;; PAG. 116 DATASHEET
         MOVF   ADRH,0
         MOVWF   EEADRH
         MOVF   ADRL,0
         MOVWF   EEADR   
         BANKSEL   EECON1
         BSF      EECON1,7
         BSF      EECON1,0   ;;;  LEE DE LA EEPROM MAX.
         NOP
         NOP         
         BANKSEL   EEDAT
         MOVF   EEDAT,0
         MOVWF   VAR1   
         BANKSEL   EEADR      ;;;; PAG. 116 DATASHEET
         MOVF   ADRH,0
         MOVWF   EEADRH
         MOVF   ADRL1,0
         MOVWF   EEADR   
      
         BANKSEL   EECON1
         BSF      EECON1,7
         BSF      EECON1,0   ;;;  LEE DE LA EEPROM MAX.
         NOP
         NOP         
         BANKSEL   EEDAT
         MOVF   EEDAT,0
         MOVWF   VAR2   

LUZMAS      NOP
         CALL    DEMORA1S
         MOVF   VAR1,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR2,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR3,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR4,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         GOTO    LUZMAS

FIN         NOP
         END

*******************************************************************

Con el rutinita de etiqueta A0_VAR1_2 , es como compruebo que no se escribe nada , porqweu al leer la flash lee 0h, y escribe en var1 y var 2 un 0, VAR1=VAR2=0. Sino encendería el led3.  En el puerto B, los bits 3:0 programados como salida , hay leds . Y iluminan bien siempre, pero sin hacer caso a la escritura de la Flash. 1 vez parpadean los 4 a la vez (portb=F ), y otra los 2 centrales (portb = 6) , los otros 2 tramos de 1 seg que tenía que iluminar leds, nada.

El registro de conf. esta bien, permitiendo escribir a partir de 0800h.

No se que pasa, a ver si alguien me puede dar algo de luz.

Pudiera ser que en el registro de configuracion, el modo de programacion debiera ser el LVP , y no el MCLR/Vpp como tengo seleccionado ? XQ no me grab el programa en ese modo ( el LVP) con el PICKIT3.

Gracias de antemano

un saludo
« Última modificación: 12 de Noviembre de 2011, 15:49:48 por JoseLuis2801 »

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re: Problema, si la lee, pero no escribe en la FLASH del PIC16F886,
« Respuesta #1 en: 10 de Noviembre de 2011, 12:19:01 »
Hola, me respondo a mi mismo, he actualizado algo el programa del post de arriba por el tema del PCLATCH, para que todo el código y datos a escribir estén en la misma pagina 0.

Sigue sin escribir, ahora, se iluminan los 4 en 3 ocasiones, y los 2 centrales en una. :shock: Entre iluminaciones la consabida pausa de 1 seg.

He buscado y he visto que hay algunos mensajes en este foro relacionados con mi tema, más tarde los leeré.

un saludo

El finde doy con ello seguro.
« Última modificación: 10 de Noviembre de 2011, 21:00:54 por JoseLuis2801 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema, si la lee, pero no escribe en la FLASH del PIC16F886,
« Respuesta #2 en: 11 de Noviembre de 2011, 13:38:17 »
Creo que el problema esta aqui:

Código: [Seleccionar]
LOOP      MOVF   INDF,0
         MOVWF    EEDATA          ;
         INCF    FSR,1       ; Next byte
         MOVF    INDF,0       ; Load second data byte into upper
         MOVWF    EEDATH
         INCF    FSR,1
         BANKSEL EECON1
         BSF    EECON1,7    ; Point to program memory
         BSF    EECON1,2
         BCF    INTCON,7 ; Disable interrupts (if using)
         BTFSC    INTCON,7
         GOTO   $-2
         MOVLW   55H
         MOVWF   EECON2
         MOVLW   0AAH
         MOVWF   EECON2
         BSF    EECON1,1
         NOP
         NOP

No te deja activar EECON1,1, lo que no se es el por que.

Citar
bit 1 WR: Write Control bit
1 = Initiates a write cycle (The bit is cleared by hardware once write is complete. The WR bit can only
be set, not cleared, in software.)
0 = Write cycle to the data EEPROM is complete

El data sheet dice que no se puede clarear por soft pero si setear, pero a ti no te deja setearlo.


Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re: Problema, si la lee, pero no escribe en la FLASH del PIC16F886,
« Respuesta #3 en: 11 de Noviembre de 2011, 16:44:26 »
Si efectivamente, podría  ser, voy a poner esto a ver si el PIC se queda tontuco:

lahemoscagao :D         BTFSS    EECON1,1
                                   GOTO    lahemoscagao :D





Luego, o yo no me entero o esta un poco ambiguo el tema de los bloques:

Sixteen words of Flash are erased, then eight buffers are transferred to Flash automatically after this word is written.   Y digo yo, no son 8 words, cada una de 14 bits que ocupa  2 bytes, y no 16 palabras o words, creo. :rolleyes:

 Escribe al buffer todos al final, no durante, el final , cuando los ultimos 3 bits del registro  ADDR son 111  :shock:

MIra:

To transfer data from the buffer registers to the program
memory, the EEADR and EEADRH must point to the last
location in the eight-word block (EEADR<2:0> = 111).


Bueno a ver si me entero bien. He visto tb un link por ahi que dicen que el datasheet el 16F877 relativo al mismo asunto, esta mal.

un saludo



« Última modificación: 11 de Noviembre de 2011, 16:56:31 por JoseLuis2801 »

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
Re: Problema, si la lee, pero no escribe en la FLASH del PIC16F886,
« Respuesta #4 en: 11 de Noviembre de 2011, 18:08:55 »
oK ok ok,  :-/, he visto varios fallos,

1º de conceptos basicos :oops:, que hago yo poniendo esto:

  ADRL      EQU   00H
ADRH      EQU   03H

los voy a cargar directos:

 
MOVLW   03H
MOVWF   EEADRH
MOVLW   00H
MOVWF    EEADR

Claro, no se me cargaban con Los valores adecuados los registros EEADR Y EEADRH, luego que hago yo cargando el registro FSR coin el valor 110h, estoy de la olla o que :rolleyes:, creo que debe ser 10h, porque la posicion 110h, es la 10h de su banco, creo, de todas formas mirare en el datasheet de ese registro, desde luego lo que no puede ser es 110h, aunque en el debug he visto que me carga el FSR con 10h, digo yo que sera  por que como son las dos ultimas cifras, coinciden.

Y ya he visto el hilo, según comprobo un forero hace ya mas de 6 meses:  lo que falta es, 


   MOVLW   00H         ;     AÑADIDO AL
   MOVWF   EEDATH          ; DATASHEET

Hay que poner a 0 esos 6 bits, aunque era relativo al 16F876 o 77, no recuerdo y ya he cerrado el enlace. NO se si ocurrira lo mismo en el mio.


Luego sigo que esta noche me ha de rular OK.
 

Desconectado JoseLuis2801

  • PIC16
  • ***
  • Mensajes: 168
No escribe en la FLASH del PIC16F886, (SOLUCIONADO)
« Respuesta #5 en: 11 de Noviembre de 2011, 19:58:33 »
 :-/ :-/ :-/ :-/    POR FIN         :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

Ha quedado así:

      w      EQU      0h
   f      EQU      1h

      LIST      P=16F886
      INCLUDE     <P16F886.INC>

RET1      EQU   20H
RET2      EQU   21H
RET3      EQU   22H
VAR1      EQU   110H
VAR2      EQU   112H
VAR3      EQU   114H
VAR4      EQU   116H
ADDRHIGH   EQU   120H
ADDRLOW      EQU   121H
ADDRLOWPLUS   EQU   122H

         ORG      00H
         GOTO    INI
         ORG    05H

         

DEMORA1S   NOP
         BANKSEL   PIR1
         MOVLW   00h      ;  CARGA VARIABLES DEMORA
         MOVWF   RET1
         MOVLW   00h
         MOVWF   RET2                                             
         MOVLW   05h
         MOVWF   RET3
DEC2      DECFSZ   RET2    ;  RETARDO DE 1SEG.
         GOTO   DEC2     
         DECFSZ   RET1        
         GOTO   DEC2
         DECFSZ   RET3       ;  3 BUCLES
         GOTO   DEC2
         BANKSEL   EEDAT
         RETURN


INI         NOP
         BANKSEL   PIR1
         CLRF   PORTB
         BANKSEL ANSELH
         CLRF   ANSELH
         BANKSEL   TRISB
         MOVLW   0XF0
         MOVWF   TRISB
         BANKSEL   EEDAT
         MOVLW   01H
         MOVWF   VAR1
         MOVLW   09H
         MOVWF   VAR2
         MOVLW   06H
         MOVWF   VAR3
         MOVLW   0FH
         MOVWF   VAR4
         MOVLW   03H
         MOVWF   ADDRHIGH
         MOVLW   00H
         MOVWF   ADDRLOW
         MOVLW   01H
         MOVWF   ADDRLOWPLUS
         
WRFLASH      NOP
         BANKSEL   EEADRH      ;;;; PAG. 121 DATASHEET
         MOVF   ADDRHIGH,0
         MOVWF   EEADRH
         MOVF   ADDRLOW,0
         MOVWF    EEADR
         BSF      STATUS,7   ; SELECIONAMOS BANCOS 2 Y 3
         MOVLW   10H        ; EN CONCRETO EL 2 DIRECCION 110H
         MOVWF   FSR
LOOP      MOVF   INDF,0
         MOVWF    EEDATA
         INCF   FSR,1
         MOVF    INDF,0   ; Load second data byte into upper
         MOVWF    EEDATH
         INCF    FSR,1
         BANKSEL EECON1
         BCF    INTCON,7 ; Disable interrupts (if using)
         BSF    EECON1,7    ; Point to program memory
         BSF    EECON1,2
         MOVLW   55H
         MOVWF   EECON2
         MOVLW   0XAA
         MOVWF   EECON2
         BSF    EECON1,1
         NOP
         NOP
         BCF    EECON1,2
         BSF    INTCON,7
         BANKSEL EEADR
         MOVF    EEADR,0
         INCF    EEADR,1           ; Increment address
         ANDLW    0FH          ; MODIFICADO A 07, YA QUE
         SUBLW    0FH          ; HE SUPRIMIDO UN INC FSR,1 
         BTFSS    STATUS,2         ; Exit on a match,
         GOTO    LOOP
         
A0_VAR1_2   NOP
         MOVLW   08H
         MOVWF   VAR1
         MOVLW   08H
         MOVWF   VAR2
         

RDFLASH      NOP
         BANKSEL   EEADR      ;;;; PAG. 116 DATASHEET
         MOVF   ADDRHIGH,0
         MOVWF   EEADRH
          MOVF   ADDRLOW,0
         MOVWF    EEADR
         BANKSEL   EECON1
         BSF      EECON1,7
         BSF      EECON1,0   ;;;  LEE DE LA EEPROM MAX.
         NOP
         NOP         
         BANKSEL   EEDAT
         MOVF   EEDAT,0
         MOVWF   VAR1   
         BANKSEL   EEADR      ;;;; PAG. 116 DATASHEET
         MOVF   ADDRHIGH,0
         MOVWF   EEADRH
          MOVF   ADDRLOWPLUS,0
         MOVWF    EEADR
         BANKSEL   EECON1
         BSF      EECON1,7
         BSF      EECON1,0   ;;;  LEE DE LA EEPROM MAX.
         NOP
         NOP         
         BANKSEL   EEDAT
         MOVF   EEDAT,0
         MOVWF   VAR2   

LUZMAS      NOP
         CALL    DEMORA1S
         MOVF   VAR1,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR2,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR3,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         CALL    DEMORA1S
         MOVF   VAR4,0
         MOVWF   PORTB
         CALL    DEMORA1S
         CLRF   PORTB
         GOTO    LUZMAS

FIN         NOP
         END


 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/
« Última modificación: 12 de Noviembre de 2011, 15:46:55 por JoseLuis2801 »