TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: JoseLuis2801 en 02 de Noviembre de 2011, 10:26:51
-
Hola, tengo un pequeño programa para el 16F886, me simula bien la lectrua de la EEPROM, pero no así la escritura, no se que ocurre , he puesto lo que indica en el datasheet, pero no hace caso y no escribe, alguien mas ha tenido problemas en la escritura de la EEPROM al simular ?
WRFLASH NOP
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVLW 01h
MOVWF EEADR
BANKSEL PIR1
MOVF CONTMAX,0
BANKSEL EEDAT
MOVWF EEDAT
BANKSEL EECON1
BCF EECON1,7
BSF EECON1,2
MOVLW 55h ; SECUENCIA OBLIGADA
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2 ; HASTA AQUI
BSF EECON1,1
HOP1 BTFSC EECON1,1
GOTO HOP1
BANKSEL PIR1
RETURN
En este caso esta un poco cambiado, ya que no hay interrpciones que deshabilitar, pero anteriormente lo hize idéntico a como indica el datasheet, y nada.
Igual es el registro de configuracion, esta tarde mirare a ver.
Gracias
Un saludo
La de lecutura de la EEPROM, sin problemas.:
RDFLASH NOP
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVLW 01h
MOVWF EEADR
BANKSEL EECON1
BCF EECON1,7
BSF EECON1,0 ;;; LEE DE LA EEPROM MAX.
BANKSEL EEDAT
MOVF EEDAT,0
BANKSEL PIR1
MOVWF CONTMAX
BANKSEL EEADR
MOVLW 02h
MOVWF EEADR
BANKSEL EECON1
BCF EECON1,7
BSF EECON1,0 ;; LEE DE LA EEPROM MIN.
BANKSEL EEDAT
MOVF EEDAT,0
BANKSEL PIR1
MOVWF CONTMIN
RETURN
-
tienes puesto BANKSEL PIR1
pero no veo que estes definiendo el registro.y tambien deberias usar los flags para que el pic espere a que se termine de grabar bien los datos en la eeprom.
-
Gracias, perdona, es que no he puesto todo el programa, registros especiales no tengo ninguno definido, esta al principio el famoso "include"
LIST P=16F886
INCLUDE <P16F886.INC>
Probaré con las interrupciones tb.
un saludo
-
lo que quiero decir es que como ya sabras la directiva BANKSEL es para conmutar los bancos en el cual se encuentra el registro que indicas en dicha directiva.
en tu caso es el registro PIR1 y despues de la directiva no veo que carges ningun valor a PIR1.quizas lo estes cargando despues del return.
pero no es lo mejor.por evitar posibles errores en el futuro.
-
Ah vale, ya te entiendo, es que he puesto ese registro simplemente por conmutar a ese banco, el banco 0, pero no porque utilize el registro PIR1, sino porque en ese banco están los registros generales previamente definidos contmax y contmin.
Gracias de todas formas.
Ahora mismo lo tengo así:
WREEPROM NOP
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVLW 01h
MOVWF EEADR
BANKSEL PIR1
MOVF CONTMAX,0
BANKSEL EEDAT
MOVWF EEDAT
BANKSEL EECON1
BCF EECON1,7
BSF EECON1,2
BCF INTCON,7
MOVLW 55h ; SECUENCIA OBLIGADA
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2 ; HASTA AQUI
BSF EECON1,1
BSF INTCON,7
SLEEP
BCF EECON1,2
BANKSEL EEADR ;;;; PAG. 116 DATASHEET
MOVLW 02h
MOVWF EEADR
BANKSEL PIR1
MOVF CONTMIN,0
BANKSEL EEDAT
MOVWF EEDAT
BANKSEL EECON1
BCF EECON1,7
BSF EECON1,2
BCF INTCON,7
MOVLW 55h ; SECUENCIA OBLIGADA
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2 ; HASTA AQUI
BSF EECON1,1
BSF INTCON,7
SLEEP
BCF EECON1,2
BANKSEL PIR1
RETURN
que es justo como viene en el datasheet del PIC, y ni puñetero caso. Se trata de escribir registros contmax y contmin en la EEPROM, pero simulando con el SIM, que igual hay algún problema al simular escrituras en EEPROM, no lo se, desde luego con la escritura no hay el más mínimo problema.
Mañana seguiré a ver ............... :shock:
-
siento no tener tiempo para analizar a fondo tu codigo.pero no veo que realizes una espera a que se realize una escritura a la eeprom.
mas que nada porque no veo ninguna instruccion de comprobacion de escritura.ni ningun control de errores.esto esta en el registro EECON1.
tienes ejemplos en el datasheet.
y en el foro tambien tienes muchos ejemplos para el uso correcto de la eeprom de datos.
-
Hola, gracias por tus sugerencias, he cambiado a escribir los 2 parametros en la memo Flash, me va mejor ya que hasta con un PIC de 6 u 8 patas me puede valer.
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, igual que con la EEPROM, la lectura perfecta, 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 112H
VAR3 EQU 114H
VAR4 EQU 116H
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
MOVLW 08h
MOVWF EEADRH
MOVLW 00h
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, W
INCF EEADR,F ; 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
MOVLW 08h
MOVWF EEADRH
MOVLW 00h
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
MOVLW 08h
MOVWF EEADRH
MOVLW 01h
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.
Gracias de antemano
un saludo
-
BSF EECON1,7 ; Point to program memory .
busca la linea anterior. hay que poner:
BCF EECON1,7 ; Point to program memory . para seleccionar la eeprom de datos.no de programa.
tambien te recomiendo que revises los registros EEADR Y EEADRH. no ballas a pasarte de direccionamiento y luego no veas los datos modificados.
no se si lo que quieres hacer es grabar en la eeprom de datos o en la eeprom de programa.tampoco he utilizado nunca este pic.asi que puede que no te sea de mucha ayuda. :?
-
No importa , si daré con ello, bueno ya he abierto otro hilo, pero entiendo que es un coñazo ponerse a ver todo el programita.
A ver si pones BSF EECON1,7 , apuntas a la memo de programa, la FLASH, eso no quiere decir que no escribas datos.
Si he visto en un libo, que en la flash hay que vigilar con la pagina de memo utilizada, y cambiar de pagina si es preciso con el registro PCLATCH, pero he modificado las direcciones para estar siempre en la pag.0 y nada, bueno el finde doy con ello seguro.
Y cuando es BCF EECON1,7 a la memo de datos, la EEPROM.
Un saludo