TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Goodfrey en 16 de Julio de 2010, 10:35:42
-
Buenos dias amigos saludos desde venezuela, les escribo para ver si me pueden ayudar con el problema que tengo, la EEPROM no escribe, o no lee no se cual es el problema, aqui les muestro la rutina para ver si me ayudan con el problema....
Lo que mas o menos deberia hacer es guardar los datos secuencialmente de 0 a 8 en la posicion de la memoria 0 hasta la 8, para luego ser leida de la misma manera de la posicion de la memoria 0 hasta la 8, para ser mostrada en un display 7 segmentos, el problema es que hace la rutina pero siempre sale este error en proteus...
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X09 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X08 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X07 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X06 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X05 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X04 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X03 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X02 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X01 ignored
[PIC16 MEMORY]PC=0x0034. Attempt to write unimplemented memory location 0X001B with 0X09 ignored
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ENCABEZADO \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
LIST P=16F628 ; Microcontrolador utilizado.-
#INCLUDE <P16F628.INC> ; Definicion de registros SFR.-
__CONFIG 0x3F61
;0x3F18
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DEF. DE VARIABLES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CBLOCK 0x20
DATO
DIR
FACTOR
FACTOR1
CONT
CONT1
CONT2
REG
REG1
REG2
ENDC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RESET \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
RESET
ORG 00H
GOTO INICIO ; Salto a inicio del programa.-
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ CONFIG. DE PUERTOS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ORG 05H
INICIO
MOVLW 0x07
MOVWF CMCON
BSF STATUS,RP0
MOVLW B'11111'
MOVWF PORTA
MOVLW B'00000000'
MOVWF PORTB
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
CLRF DIR
CLRF CONT
MOVLW .9
MOVWF FACTOR
CLRF FACTOR1
MOVLW .9
MOVWF CONT2
GOTO WRITE_EEPROM
INCR INCF CONT,F
INCF DIR,F
WRITE_EEPROM
MOVF CONT,W
XORWF FACTOR,0
BTFSC STATUS,Z
GOTO READ_EEPROM
BSF STATUS,RP0
BCF STATUS,RP1
MOVF DIR,0
MOVWF EEADR
MOVF CONT1,W
MOVWF EEDATA
BCF INTCON,GIE
BSF EECON1,WREN
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
BTFSC EECON1,WR
GOTO $-1
BCF EECON1,WREN
BSF INTCON,GIE
BSF STATUS,RP0
BCF STATUS,RP0
GOTO INCR
DECRE
DECF CONT2,F
;INCF DIR,F
READ_EEPROM
MOVF CONT2,W
MOVWF EEADR
BSF STATUS,RP0
BCF STATUS,RP1
BSF EECON1,RD
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
MOVF EEDATA,0
MOVWF DATO
CALL MULTIPLEXA
MOVF CONT2,W
XORWF FACTOR1,0
BTFSS STATUS,Z
GOTO DECRE
GOTO FIN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ TABLA DE DISPLAY \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLA
ADDWF PCL,1
RETLW B'10000000'
RETLW B'11110010'
RETLW B'01001000'
RETLW B'01100000'
RETLW B'00110010'
RETLW B'00100100'
RETLW B'00000100'
RETLW B'11110000'
RETLW B'00000000'
RETLW B'00110000'
RETLW B'10000000'
MULTIPLEXA
MOVF DATO,W
CALL TABLA
MOVWF PORTB
CALL RET8MS
RETURN
RET8MS
MOVLW .26
MOVWF REG2
LAZO3
MOVLW .94
MOVWF REG1
LAZO2
MOVLW .109
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LAZO2
DECFSZ REG2,1
GOTO LAZO3
RETURN
FIN
END
-
hola Goodfrey.segun he visto en tu codigo,parece que en la linea de incremento no has puesto ningun condicional para que cuando se pase de la direccion 0x07.
no siga contando.
ya que si direccionas la eeprom mas alla de las direccionas que posee el chip,se produce un herror por desbordamiento.
saludos.
-
hola Goodfrey.segun he visto en tu codigo,parece que en la linea de incremento no has puesto ningun condicional para que cuando se pase de la direccion 0x07.
no siga contando.
ya que si direccionas la eeprom mas alla de las direccionas que posee el chip,se produce un herror por desbordamiento.
saludos.
amigo no entendi mucho lo que me dijiste xq sinceramente estoy aprendiendo a escribir en la eeprom, aqui te mando el codigo arrelge para ver que opinas de este...
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ENCABEZADO \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
LIST P=16F628 ; Microcontrolador utilizado.-
#INCLUDE <P16F628.INC> ; Definicion de registros SFR.-
__CONFIG 0x3F61
;0x3F18
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DEF. DE VARIABLES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CBLOCK 0x20
DATO
DIR
FACTOR
FACTOR1
CONT
CONT1
CONT2
REG
REG1
REG2
ENDC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RESET \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
RESET
ORG 00H
GOTO INICIO ; Salto a inicio del programa.-
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ CONFIG. DE PUERTOS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ORG 05H
INICIO
MOVLW 0x07
MOVWF CMCON
BSF STATUS,RP0
MOVLW B'11111'
MOVWF PORTA
MOVLW B'00000000'
MOVWF PORTB
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
CLRF DIR
CLRF CONT
CLRF CONT1
MOVLW .9
MOVWF FACTOR
CLRF CONT2
GOTO WRITE_EEPROM
INCR INCF CONT,F
INCF DIR,F
WRITE_EEPROM
MOVF CONT,W
XORWF FACTOR,0
BTFSC STATUS,Z
GOTO READ_EEPROM
BSF STATUS,RP0 ;cambiar a Banco 1
BSF EECON1,WREN ;habilitar grabación de EEPROM
MOVF CONT,W ;aquí va el dato a escribir en EEPROM
MOVWF EEDATA ;poner dato en en EEDATA
MOVF DIR,W ;dirección de EEPROM
MOVWF EEADR ;ponerla en EEADR
MOVLW 55H
MOVWF EECON2 ;comando
MOVLW 0AAH
MOVWF EECON2 ;comando
BSF EECON1,WR ;agregar el dato en la EEPROM
BTFSC EECON1,WR ;esperar a que termine (10 ms)
GOTO $-1
BCF STATUS,RP0 ;cambiar a Banco 0
GOTO INCR
DECRE
INCF CONT1,F
;INCF DIR,F
READ_EEPROM
BSF STATUS,RP0 ;cambiar a Banco 1
MOVF CONT1,W ;dirección de EEPROM
MOVWF EEADR ;ponerla en EEADR
BSF EECON1,RD ;operación de lectura
MOVF EEDATA,w ;leer dato desde EEPROM
BCF STATUS,RP0 ;cambiar a Banco 0
MOVWF DATO ;guardar el dato
CALL MULTIPLEXA
MOVF CONT2,W
XORWF FACTOR,0
BTFSS STATUS,Z
GOTO DECRE
GOTO FIN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ TABLA DE DISPLAY \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLA
ADDWF PCL,1
RETLW B'10000000'
RETLW B'11110010'
RETLW B'01001000'
RETLW B'01100000'
RETLW B'00110010'
RETLW B'00100100'
RETLW B'00000100'
RETLW B'11110000'
RETLW B'00000000'
RETLW B'00110000'
RETLW B'10000000'
MULTIPLEXA
MOVF DATO,W
CALL TABLA
MOVWF PORTB
CALL RET8MS
RETURN
RET8MS
MOVLW .26
MOVWF REG2
LAZO3 MOVLW .94
MOVWF REG1
LAZO2 MOVLW .109
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LAZO2
DECFSZ REG2,1
GOTO LAZO3
RETURN
FIN
END
ahora el error que da este es que me guarda supuestamente los datos sin problema y lo lee pero siempre almacena el mismo dato... puro 0 en todas las direcciones espero me ayudes con el codigo gracias.
-
A ver.
Estoy en casa y no tengo instalado siquiera el MPLAB.
Espera lo baje, lo instale y te lo debugee.
Stand by :mrgreen:
-
Hmm.... cosa rara.... :shock:
Cuando simulo esta rutina y veo los registros pues ... hace lo que no debería
MOVF CONT,W ;aquí va el dato a escribir en EEPROM
MOVWF EEDATA ;poner dato en en EEDATA
MOVF DIR,W ;dirección de EEPROM
MOVWF EEADR ;ponerla en EEADR
O sea que si el dato de CONT es 0 y lo muevo a W ... entonces no mueve 0, sino 1 o visceversa... Lo mismo con el DIR.
Dame unos minutitos, que las brujas no existen pero que las hay, las hay ! XD
-
Bueno, solucionado. No había brujas pero me llama la atención en donde estaba el fallo:
Al parecer no deja actuar sobre el acumulador si estás en otro banco que no sea el banco 0. Cosa rara porque en otros micros he podido cargar el acumulador desde cualquier banco. No lo sé...
Lo he probado, funciona y graba del 00 al 08 con datos 00 a 08.
También funciona la lectura, tuve que cambiar la linea de carga de acumulador que estaba en banco 1 al banco 0.
El resto es cosa tuya :mrgreen: :D
LIST P=16F628 ; Microcontrolador utilizado.-
#INCLUDE <P16F628.INC> ; Definicion de registros SFR.-
__CONFIG 0x3F61
;0x3F18
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DEF. DE VARIABLES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CBLOCK 0x20
DATO
direccion
FACTOR
FACTOR1
dato
CONT1
CONT2
REG
REG1
REG2
ENDC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RESET \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
RESET
ORG 00H
GOTO INICIO ; Salto a inicio del programa.-
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ CONFIG. DE PUERTOS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ORG 05H
INICIO
MOVLW 0x07
MOVWF CMCON
BSF STATUS,RP0
MOVLW B'11111'
MOVWF PORTA
MOVLW B'00000000'
MOVWF PORTB
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
CLRF direccion
CLRF dato
CLRF CONT1
MOVLW .9
MOVWF FACTOR
CLRF CONT2
GOTO WRITE_EEPROM
INCR INCF dato,1
INCF direccion,1
WRITE_EEPROM
MOVF dato,W
XORWF FACTOR,0
BTFSC STATUS,Z
GOTO READ_EEPROM
MOVF dato,W ;aquí va el dato a escribir en EEPROM
BSF STATUS,RP0 ;cambiar a Banco 1
MOVWF EEDATA ;poner dato en en EEDATA
BCF STATUS,RP0 ;cambiar a Banco 0
MOVF direccion,W ;dirección de EEPROM
BSF STATUS,RP0 ;cambiar a Banco 1
MOVWF EEADR ;ponerla en EEADR
BSF EECON1,WREN ;habilitar grabación de EEPROM
MOVLW 0x55
MOVWF EECON2 ;comando
MOVLW 0xAA
MOVWF EECON2 ;comando
BSF EECON1,WR ;agregar el dato en la EEPROM
BTFSC EECON1,WR ;esperar a que termine (10 ms)
GOTO $-1
BCF STATUS,RP0 ;cambiar a Banco 0
GOTO INCR
DECRE
INCF CONT1,F
;INCF DIR,F
READ_EEPROM
MOVF CONT1,W ;dirección de EEPROM
BSF STATUS,RP0 ;cambiar a Banco 1
MOVWF EEADR ;ponerla en EEADR
BSF EECON1,RD ;operación de lectura
MOVF EEDATA,w ;leer dato desde EEPROM
BCF STATUS,RP0 ;cambiar a Banco 0
MOVWF DATO ;guardar el dato
CALL MULTIPLEXA
MOVF CONT2,W
XORWF FACTOR,0
BTFSS STATUS,Z
GOTO DECRE
GOTO FIN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ TABLA DE DISPLAY \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLA
ADDWF PCL,1
RETLW B'10000000'
RETLW B'11110010'
RETLW B'01001000'
RETLW B'01100000'
RETLW B'00110010'
RETLW B'00100100'
RETLW B'00000100'
RETLW B'11110000'
RETLW B'00000000'
RETLW B'00110000'
RETLW B'10000000'
MULTIPLEXA
MOVF DATO,W
CALL TABLA
MOVWF PORTB
CALL RET8MS
RETURN
RET8MS
MOVLW .26
MOVWF REG2
LAZO3 MOVLW .94
MOVWF REG1
LAZO2 MOVLW .109
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LAZO2
DECFSZ REG2,1
GOTO LAZO3
RETURN
FIN
END
-
Exacto este es el problema, mueves CONT a W pero estas en el BANCO1, y CONT se incremanta pero a W siempre le llega 0 porque esta en el BANCO 0 no en el 1.
BSF STATUS,RP0 ;cambiar a Banco 1
BSF EECON1,WREN ;habilitar grabación de EEPROM
MOVF CONT,W ;aquí va el dato a escribir en EEPROM
MOVWF EEDATA ;poner dato en en EEDATA
-
Bueno, solucionado. No había brujas pero me llama la atención en donde estaba el fallo:
Al parecer no deja actuar sobre el acumulador si estás en otro banco que no sea el banco 0. Cosa rara porque en otros micros he podido cargar el acumulador desde cualquier banco. No lo sé...
Lo he probado, funciona y graba del 00 al 08 con datos 00 a 08.
También funciona la lectura, tuve que cambiar la linea de carga de acumulador que estaba en banco 1 al banco 0.
El resto es cosa tuya :mrgreen: :D
MUCHISIMAS GRACIAS MI PANA, ME SALVASTE LA VIDA, AHORA PODRE SEGUIR CON EL CODIGO.... NO ENTIENDO MUCHO TODAVIA LO DEL BANCO0 Y BANCO 1 PERO LO AVERIGUARE... GRACIAS POR LA RESPUESTA
-
NO ENTIENDO MUCHO TODAVIA LO DEL BANCO0 Y BANCO 1 PERO LO AVERIGUARE... GRACIAS POR LA RESPUESTA
Mira la hoja de datos del micro. En la sección memory organization encontrarás una tabla (data memory map). Está dividida en 4 columnas , cada columna es una banco. Tenemos banco 0, banco 1, banco 2, banco 3. En cada banco hay ditintos registros. Por ejemplo: Si queremos utilizar el registro EEDATA pues tendremos que movernos al banco 1. Y como lo hacemos? :
Para ir a banco 0 :
bcf STATUS,RP0
bcf STATUS, RP1
Para ir al banco 1:
bsf STATUS,RP0
bcf STATUS,RP1
Para ir al banco 2
bcf STATUS,RP0
bsf STATUS,RP1
Para ir al banco 3
bsf STATUS,RP0
bsf STATUS,RP1
Por supuesto, si le dices al micro desde banco 0 : "Oye, lee el dato de EEDATA" , entonces el micro leerá el registro RCREG.
Lo entiendes?
El problema que tenía tu código era precisamente un error al cargar W desde el banco 1, por eso tuve que agregar instrucciones para que volviese al banco 0 para cargar W.
Hay otras opciones para moverse entre bancos, pero mejor aprendes las bases para que te quede claro que debes tener a mano una memory map del micro que uses para saber en que banco está ubicado cada registro.
-
vaya.no me habia dado cuenta de ese dato.es cierto que para leer o escribir en un registro de la ram,hay que seleccionar el banco donde esta situado susodicho registro.
estos errores se suelen cometer cuando nos acostumbramos a usar un solo banco de memoria.claro que es mas sencillo y ademas ganaremos velocidad al no tener que estar continuamente conmutando los bancos.aunque es imprescindible usar otros bancos cuando nos quedamos sin memoria.
en el caso de que quisieramos usar registros sin tener que estar conmutando los bancos.y que se pudieran leer y escribir sin este error,podriamos usar
los ultimos 16bytes de los bancos 1,2,3. eso si estoy ablando del pic 16F876 y otros de estas caracteristicas.ya que estas direcciones de registros estan mapedadas en los registros mencionados.
esto nos seria util en algun tipo de programa que necesitaramos usar un registro sin tener que hechar mano a la conmutacion de estos.
-
Así es groundman.
Los últimos 16Bytes de la RAM son muy útiles para salvar temporalmente el contenido de W, STATUS, PCL, etc a la hora de entrar en una interrupción.
Me parece que tu me lo has enseñado (sobre estos 16 Bytes) y desde entonces los uso así. Reservo 4, como mínimo, para trabajar a la hora de las interrupciones.
Es hora de que Microchip, en la familia de los 16F, 12F, etc, elimine los bancos. Cuando agregue un nuevo PIC en la familia, debería hacer todo en un solo banco. Sin duda aumentaría la potencia de los PICs.
-
Es hora de que Microchip, en la familia de los 16F, 12F, etc, elimine los bancos.
Como la gama 18f.... que delicia... no tener que pensar en los malditos bancos :D
-
Esto es lo que me esta pasando con mi contador de 6 digitos con memoria, voy a realizar los cambios y espero que me funcione.