Como usar la EEPROM de los PICs

Estado
Cerrado para nuevas respuestas.
hola pues puedes hacerlo mediande un contador, tu le asignas el valor y cuando llege al avlor deseado termina el lazo, podira ser algo asi

PRINCIPAL MOVLW .10 ; CARGO EL PALOR PARA EL CONTADOR 10 DECIMAL EN TU CASO
MOVWF 0X20 ; LO MUEVO AL CONTADOR (REGISTRO DE LA MEMORIA RAM)
.
.
. AQUI IRIA EL RESTO DE TU CODIGO
.
.
DECFSZ 0X20 ;INCREMENTO EL CONTADOR EN UNO Y HASTA QUE SEA CERO TERMINA
GOTO PRINCIPAL ; EL LAZO ES DECIR SOLO LO HARA LAS 10 VECES QEU DESEAS
END
ESPERO TE SIRVA DE ALGO, YO TAMMBIN ESTOY EMPEZANDO JAJAJ UN SALUDO A TODO EL FORO:apreton:
 
Hola!

Yo tengo un problema no se si sea cosa de electrónica o del software, resulta que utilizo un pic16f84a, lo utilizo para controlar posiciones de motores y guardo datos en la EEPROM, en la protoboard arme el circuito y funciona de maravilla, pero una vez que hice el circuito impreso, el motor reacciona adecuadamente y el PIC manda los mensajes correctamente pero al momento de guardar los datos en la EEPROM esta se pasma, pense que era cosa de los pulsadores al dar la orden de guardado pero no fue asi, los pulsadores envian la señal correctamente y sin rebotes, pienso que tal vez sea cosa de la alimentacion del PIC, pues utilizo pilas de 9v en conjunto con un lm7805.

Agradesco cualquier comentario, critica, propuesta, maña, etc.

Saludos!
 
hola , ponle un capacitor de 100nf entre la alimentaciona y la tierra del pic lo mas cercano que puedas , o pues prueba con al 16f628a es "guerrero" jaja de hecho es el sucesor del 84a
 
Ok biopic, voy a seguir tu consejo y publico lo que sucedio, por el momento gracias!

Puse el capacitor y siguió igual, pero esta vez se me ocurrió sustituir la pila temporalmente por una fuente de voltaje, y para mi sorpresa el circuito logro borrar la EEPROM, puse los mismos 9V para que el 7805 lo redujera a 5v(mas o menos) y pude utilizar la EEPROM de manera correcta, ¿sera que la pila de 9v no me da la corriente necesaria para que se logre la interrupcion de la EEPROM? voy a mejorar la fuente de alimentacion posiblemente sea por eso.

Hay luego les platico como me fue.
 
Última edición:
pues de hecho el pic no consume mucha corriente , estamos hablando de µAmperes lo que consume el pic estando activo por lo que deberia funcionar correctamente con la pila pero pues ahora si que la excepcion hace la regla o la rompe ???? jajaj pero pue si ya te vas a ventar la fuente de alimentacion escoge una de 5v ya para que conectes el pic directamente sin necesidad de regular la corriente en tu circuito de la aplicacion yo las que he usado han sido desde 750mA hasta 2 amperes , pues ai nos cuentas como te fue y si encontraste alguna otra solicion , saludos
 
Hola, perdón la tardanza, encontré la posible causa de que la EEPROM no funcionara adecuadamente, y es un viejo enemigo de todos los que entramos al mundo de la electrónica: la electricidad estática, aun no estoy muy convencido de lo que suceda al 100% pero note que en mi escritorio donde realizo los proyectos, si el circuito lo alimento con la fuente regulada, el circuito funciona, pero cuando usa la pila, comienza a fallar. Ahora, si ese mismo circuito lo llevo a otro lugar y lo vuelvo a activar con la pila de 9v, el sistema funciona correctamente, lo que me hace pensar que es la estática, y afecta al funcionamiento de la EEPROM, solo es una teoría, hasta ahorita ha funcionado, al menos que alguien la contradiga(y me gustaría para saber mas del tema). Para aislar la cara del circuito donde tengo las pistas de cobre pienso ponerle una base de caucho o de madera para evitar lo mas que se pueda la estática.

Creo que hablar mas del tema se saldría de la sección de EEPROM, así que hasta aquí le dejo, voy a intentarlo y luego posteo un tema acerca de los resultados.
 
hola a todos soy nuevo en ese foro.... y quisiera aprender a programar la eeprom de un pic en PIC BASIC


por ejemplo
cont var BYTE

:ini
if porta.0 = 1 then up
if porta.1 = 1 then down
goto ini


:up
pause 200
cont=cont+1
if cont=10 then accion
goto ini


:down
pause 200
cont=cont-1
goto ini


:accion
high portb.0
goto ini


quiero almasenar el ultimo estado del pic...

aunque lo desconecte de la alimentacion........

otra pregunta.... como puedo independisar una rutina del resto del programa.......

gracias
 
Hola estoy utilizando el 16f886 y como puedo saber las direccion para guardar datos en la eeprom en c, estaba programando en ccs c y utilice esto

#rom 0x2100 = { '2', '3', '4' } //Posicion 0,1,2 de la eeprom con los datos 2,3,4.

pero cuando quise guardar otros numeros en otra posicion como en 4,5,6 no reconoce los datos guardados,no se si las direcciones siguientes son estas, espero que me puedan ayudar gracias.

#rom 0x2101 = {}
#rom 0x2109 = {}
#rom 0x210A = {}
#rom 0x2112 = {}
#rom 0x211A = {}
#rom 0x2122 = {}
#rom 0x212A = {}
#rom 0x2132 = {}
 
Me rindo:oops: . Estre unas cosas y otras estoy a punto de rendirme con esto de los pics. Os cuento:

OBJETIVO: Estoy intentado hacer pruebas con la EEPROM de un 16F877A. Para ello he escrito un programa en assembler (ni idea de c) que incrementa un registro (CONTADOR) cada vez que un pulsador (PORTC ,0) es accionado. El resultado de este registro se visualiza por un LCD (PORTD). Cada vez que el pulsador se acciona y se incrementa el registro, este deberia guardarse en la posicion 0x00 de la eeprom para que cuando el PIC se encienda otra vez despues de un reset o un apagado no se pierda el numero de veces.

PROBLEMA: EL pulsador funciona, y cada vez que se pulsa se ve el incremento en la pantalla... el caso es que el resultado no se guarda en la eeprom asi que cuando reseteo, el contador esta a cero :eek: Probando en el simulador del MPLAB parece que la cosa no va mal (a lo mejor me equivoco en la forma de probar) pero probado con proteus y en un protoboard no funciona.....

He probado con las rutinas que vienen en el datasheet de microchip, con las del libro de pic16f84 (desarrollo de proyectos) intentando adaptarlas, con otras que encontre en internet y hasta me anime a escribir las mias propias..... nada, que no lo consigo. Cada vez que reseteo se pone a cero

Se que es Julio y la gente ya esta de vacaciones pero si hay alguien por aqui le agradecere cualquier ayuda o consejo.
Adjunto el programa:



Código:
LIST      P=16F877A
   INCLUDE      <P16F877A.INC>
   
   __CONFIG    _CP_ALL & _DEBUG_OFF & _WRT_OFF & _CPD_ON & _LVP_OFF & _BODEN_ON & _HS_OSC & _WDT_OFF & _PWRTE_ON

CONTADOR         equ      0x049      
EEPROM_GuardaINTCON   equ      0x04A

#DEFINE   Pulsador   PORTC, 0         

V_RESET      org          0x000
         nop
         nop
             goto         main

main   bcf      STATUS,   RP0
      clrf   PORTC
      clrf   PORTD
      bsf      STATUS,   RP0
      clrf   PORTD
      movlw   b'11111111'
      movwf   PORTC
      bcf      STATUS, RP0

;****************************** INICIO *********************************

Inicio   
      call      LCD_Inicializa
      movlw      0x00            ;carga la posicion de memoria donde esta el dato
      call      EEPROM_LeeDato      ;lee el dato y lo trae a w 
      movwf      CONTADOR         ;mueve el dato al registro contador
      call       LCD_Linea1   
      movfw      CONTADOR
      clrf      NumH
      movwf      NumL
      call       LCD_Dec      
      movfw      Tenk
      call      LCD_Caracter
      movfw      Thou   
      call       LCD_Caracter   
      movfw      Hund
      call       LCD_Caracter
      movfw      Tens
      call       LCD_Caracter
      movfw      Ones
      call       LCD_Caracter

Principal
      btfss   Pulsador            ; Lee el pulsador.
      call   IncrementaVisualiza      ; Salta a incrementar y visualizar el contador.
      goto   Principal

IncrementaVisualiza
      call   Retardo_20ms
      btfsc   Pulsador
      goto   Fin_Visualiza
      call       LCD_Linea1   
      incf   CONTADOR,F   
      movfw      CONTADOR
      clrf      NumH
      movwf      NumL
      call       LCD_Dec      
      movfw      Tenk
      call      LCD_Caracter
      movfw      Thou   
      call       LCD_Caracter   
      movfw      Hund
      call       LCD_Caracter
      movfw      Tens
      call       LCD_Caracter
      movfw      Ones
      call       LCD_Caracter         ; Incrementa el contador y lo visualiza.
Visualiza
      movlw   b'00000000'
      movwf   EEADR               ; datos donde se guarda el turno. En este caso en 
      movfw   CONTADOR            ; la posici 00h de la EEPROM.
      call   EEPROM_EscribeDato
EsperaDejePulsar
      btfss   Pulsador
      goto   EsperaDejePulsar
Fin_Visualiza
      return

;***********************************RUTINAS PARA LA MEMORIA EEPROM**************************************
;************************************RUTINA DE LECTURA**************************************************
; Entrada: En (W) la direcci de la memoria EEPROM a leer.
; Salida :  En (W) el byte le冝o.
EEPROM_LeeDato
   bsf      STATUS, RP1
   bcf      STATUS, RP0         ; Asegura que trabaja con el Banco 0.
   movwf   EEADR            ; Direcci a leer.
   bsf      STATUS,RP0         ; Banco 1.
   bcf      EECON1,EEPGD
   bsf      EECON1,RD         ; Orden de lectura.
EEPROM_SigueLeyendo
   btfsc   EECON1,RD         ; El PIC indica que ha terminado la lectura
   goto   EEPROM_SigueLeyendo   ; poniendo en bajo este bit.
   bcf      STATUS,RP0         ; Banco 0.
   movf   EEDATA,W         ; El byte le冝o al registro W.
   bcf      STATUS,RP1
   return

;*************************************RUTINA DE ESCRITURA**********************************************
; Entradas:   En el registro EEADR la direcci de la memoria EEPROM a escribir.
;      En el registro W el byte a escribir.
;
EEPROM_EscribeDato
   bsf      STATUS,RP1
   bcf      STATUS,RP0         ; Asegura que trabaja con el Banco 0.
   movwf   EEDATA            ; El byte a escribir.
   bcf      STATUS,RP1
   movlw   b'00000100'
   bsf      STATUS,RP1
   movwf   EEADR
   bsf      STATUS,RP0
   bcf      EECON1, EEPGD
   bsf      EECON1,WREN         ; Habilita escritura.
   movlw   0x55
   movwf   EECON2
   movlw   0xAA
   movwf   EECON2
   bsf      EECON1,WR         ; Inicia la escritura.
;   movf   INTCON,W         ; Reserva el valor anterior de INTCON
;   movwf   EEPROM_GuardaINTCON
DES   btfsc   EECON1,WR         ; Comprueba que termina de escribir en la EEPROM.
   goto   DES
   goto   EEPROM_TerminaEscribir

;   bsf      STATUS,RP0         ; Acceso al Banco 1.
;   bcf      INTCON,GIE         ; Deshabilita todas las interrupciones.

EEPROM_TerminaEscribir
   bcf      EECON1,WREN         ; Desautoriza la escritura en EEPROM.
;   bcf      EECON1,EEIF         ; Limpia este flag.
   bcf      STATUS,RP0         ; Acceso al Banco 0.
   bcf      STATUS,RP1
;   movf   EEPROM_GuardaINTCON,W ; Restaura el valor anterior de INTCON.
;   movwf   INTCON
   return

   #INCLUDE  <LCD_4BIT.INC>         
   #INCLUDE  <RETARDOS.INC>
   #INCLUDE  <BIN_DEC.INC>

   END


Si es necesario os puedo enviar las rutinas <LCD_4BIT>, <BIN_DEC> y <RETARDOS>, pero siempre utilizo las mismas y hasta ahora ningun problema asi que de momento no las pongo.

Gracias por adelantado.
Saludos.
 
Última edición por un moderador:
Usando la EEPROM de los PICs (ejemplo PIC 16x84)

Hemos visto que en muchos de los post y discusiones de este foro, hablamos de guardar los datos en la memoria EEPROM de los microcontroladores.

En realidad no sabemos hasta donde llega el conocimiento de todos los que leemos esos escritos, por lo tanto trataremos de hacer una pequeña introducción de cómo proceder para usar la memoria EEPROM.

Entonces, este mini tutorial está orientado a aquellos que no conocen o nuncan han intentado usar esta memoria.

Muchas veces (si no la mayoría de ellas) subutilizamos el MP (microprocesadores) basándonos en el software de control desarrollado en nuestras PC para guardar y leer los datos necesarios para el correcto funcionamiento de nuestras interfaces y circuitos de control, en lugar de emplear a fondo las facilidades que nos prestan.

Existen muchas ventajas en guardar los datos en la memoria no volátil del MP. La más inmediata y evidente es disponer en forma instantánea de las condiciones iniciales o de arranque para el funcionamiento de la electrónica de control.

Por ejemplo, imagínense que hemos diseñado un circuito que utiliza un motor paso a paso para colocar en determinado lugar una banda transportadora. Sabemos que el motor deberá moverse desde 0 (inicio de la banda) hasta X pasos (final de la banda). Dentro de la memoria EEPROM podríamos almacenar el valor de X (numero de pasos totales para recorrer la banda) y el valor de Y (lugar o número de pasos en donde se detuvo por última vez el motor). De esta forma, el circuito podría usar su “memoria” para conocer estos datos al encenderlo en lugar de esperar que algún otro proceso externo se lo informe. Otros datos que pudiéramos guardar serían por ejemplo, el valor de corrección de “backslash” o de movimiento inercial de la banda para corregir ese error acumulativo.

Para explicar como usar la EEPROM, vamos a basarnos en nuestro PIC de pruebas que es el ya famoso 16x84. Para utilizar cualquier otro, haremos uso de las datasheets para conocer la equivalencia de los comandos, el tamaño de la EEPROM y sus direcciones de inicio y final. En el caso de 16x84 tenemos los siguientes datos:

Tamaño de la EEPROM: 64 bytes - 8 Bits por byte
Dirección de Inicio: 0h
Dirección Final: 3Fh


Para acceder a esos 64 bytes usamos un direccionamiento indirecto. Esto quiere decir que la DIRECCIÓN específica de la memoria EEPROM que nos interesa (de los 64 disponibles) estará almacenada en un registro determinado y por consiguiente, para que el programa del MP sepa donde leer o grabar tendremos que buscarlo en ese registro específico.

Este registro junto con otros cuatro que sirven para controlar todo el proceso de lectura y escritura, son los siguientes:

EEADR
EEDATA
EECON1
EECON2


1) EEADR contiene la dirección o posición de la memoria EEPROM que queremos acceder bien sea para leerla o escribirla. Como este registro es un BYTE de 8 Bits, pudiéramos entonces representar 256 distintos valores sin embargo solo necesitamos 64 de ellos para acceder a toda la memoria por lo que, los bit 6 y 7 no se usan y deberán ser siempre cero (recuerden que los 8 bits los numeramos desde el 0 al 7).

2) EEDATA va a contener como su nombre lo indica, el dato leido o el que deseamos guardar.

3) La misión de EECON1 es controlar los procesos de escritura/lectura de la memoria. De sus 8 bits disponibles solo se usan los 5 de menos peso. Estos bits son:
a. Bit0: RD de “Read Data”, se pone a 1 cuando se va a realizar un ciclo de LECTURA desde la EEPROM, y vuelve automáticamente a 0 cuando se temina ese proceso.

b. Bit 1: WR de “Write Data”, se pone a 1 cuando se va a realizar un ciclo de ESCRITURA hacia la EEPROM, y vuelve automáticamente a 0 cuando se temina ese proceso.

c. Bit 2: WREN de “Write Register ENable”. Si está a 1 PERMITE el proceso de escritura hacia la EEPROM y si está a 0, no lo permite.

d. Bit 3: WRERR de “Write Register ERRor”. Se va a 1 cuando un proceso de ESCRITURA no se realizó correctamente y a 0 en caso contrario.

e. Bit 4: EEIF de “EEprom Interrupt Finalization”. Al colocarse a 1, indica que la operación de ESCRITURA a finalizado con éxito. Si se quiere colocarla a 0, deberá hacerse por programa.
4) EECON2 no está físicamente implementado y es empleado como un dspositivo de seguridad durante el proceso de escritura de la EEPROM. Si se lee, todos sus bits estarán a 0.

Un ciclo de escritura de una localidad de memoria de la EEPROM tarda aproximadamente para estos MP con cristales de 4 MHz, unos 10 ms. Este tiempo es muy largo comparado con la velocidad del MP y por esta razón se hacen tantos esfuerzos en controlar su escritura y lectura.

Leer los datos de la EEPROM:

Según lo que vimos anteriormente, para leer los datos de la EEPROM deberemos hacer lo siguiente:

1) Cargar la dirección que deseamos leer en EEADR
2) Poner a 1 el Bit RD del registro EECON1 indicándole al MP que lea la dirección
3) Y por último transferir al acumulador o al literal deseado el dato leído desde EEDATA

El código típico sería así (Recuerden que debemos de haber incluido el archivo 16F84A.INC donde se definen los registros del PIC). La variable DIRE debimos haberla declarado al comienzo del programa.

Código:
bcf          ESTADO,RP0	;Seleccionamos el Banco 0
movlw	     DIRE			;Ponemos en W la dirección que vamos a leer
movwf	     EEADR		;y pasamos W al registro EEADR, definiendo la dirección a leer
bsf		ESTADO,rp0		; Seleccionamos el Banco 1
bsf		EECON1,RD		;Hacemos la lectura colocando RD a 1 
bcf		ESTADO,RP0	;y regresamos al Banco 0
movf	      EEDATA,W		;para finalmente rescatar el dato desde EEDATA hacia W

Esta es una codificación básica que puede servir de modelo de arranque para sus diseños.

Escribir los datos en la EEPROM:

Anteriormente dijimos que EECON2 no estaba implementado en forma física y que si lo leíamos obtendríamos 0 pero, cumple funciones de control sobre la escritura que si deberemos considerar.

Para esto, usaremos dos valores específicos, el 55h y el AAh.

Dado el tiempo que tarda el proceso de escritura comparado con el tiempo de ejecución del MP, estos dos valores permitirán al MP realizar acciones de sincronismo y control en el proceso de escritura de la EEPROM, así es que el código deberá tener un par de instrucciones de escrituras en EECON2 que parecieran no tener sentido pero que siempre deberemos usar, al menos en esta gama de PICs.

El código sería el siguiente:
Las variables DIRE y ESCR la debimos de haber declarado al comienzo del programa.


Código:
bcf		STATUS,RP0		;Seleccionamos Banco 0
movlw		DIRE			;Ponemos en W la dirección que vamos a escribir
movwf		EEADR		;y la guardamos en EEADR
movlw		ESCR			onemos ahora el dato a escribir en W
movwf		EEDATA		;y lo guardamos en EEDATA

bsf		STATUS,RP0		;Seleccionamos Banco 1
bsf 		EECON1,WREN 	;Colocamos el permiso de escritura (WREN) en EECON1 a 1
					;Aquí da inicio la secuencia de escritura

movlw		0x55 h			;Inicio de las intrucciones para EECON2
movwf		EECON2
movlw		0xAA h		
movwf		EECON2		;Fin de las intrucciones para EECON2

bsf		EECON1,WR		;Comienza la escritura propiamente dicha.

Cuando se complete todo el proceso de escritura, el Bit WR se pondrá a 0 automáticamente y el señalizador de interrupciones EEIF pasará a valer 1 (y allí se quedará hasta que lo coloquemos a 0 por programa).

Si se quiere realizar un proceso simple de verificación de escritura adicional, podemos restar el dato que hemos escrito al valor actual del registro EEDATA. Si no hubo errores entonces esta resta debe dar 0 y por lo tanto el bit Z (cero) del registro de ESTADO se colocará a uno indicando esta condición, lo que nos servirá de bandera de comprobación.

Seguramente habrán diferencias notables en el manejo de lectura/escritura de otros modelos de PIC y de otra marca de microcontroladores pero su base de funcionamiento es prácticamente la misma.

Deberán tener en cuenta que el proceso de escritura de un byte, borra automáticamente la posición de memoria y luego escribe el dato es decir, borra antes de escribir, así es que tendrán que rescatar el dato anterior antes de su escritura si lo quieren utilizar para algo.

Las memorias EEPROM resisten hasta un millón de ciclos de Lectura/Escritura y además pueden almacenar sus datos en forma contínua sin degradación por alrededor de 40 años.

Para los que no lo saben, EEPROM significa: Electrically Erasable Programmable Read Only Memory, que en castellano podría ser algo como: Memoria Programable de Solo Lectura Borrable Eléctricamente (MPSLBE ?????:rolleyes:).

Espero les sea de utilidad esta explicación y comiencen a sacarle más provecho a sus MC.

Saludos,
Marcelo.

cordial saludo..
te cuento mi hermano que tenia unas notas para escribir en la eeprom y por alguna razon no las encuentro, pero con tu explicacion apenas fue.
soy mas bien novato en esto de los pic´s y nunca tuve la necesidad de usarla hasta ahora. voy a tratar de implementarla, mi idea es almacenar varios numeros /claves y despues validarlas.
me gustaria hacerlo con este pic 16f1827, que problemas crees que tendria ..
un abrazo desde Medallo.
gracias por todo.
 
que tal, les comento que estuve viendo que siempre guardan o leen enteros, pero se puede guardar en la memoria EEPROM un valor decimal ( float ) ?? por ejemplo si queremos guardar un valor entre 0 y 1 ,,, el 0,3 como tendriamos que hacer ? si no se puede guardar decimales la verdad que la EEPROM es de muy poca utilidad en la practica real ya que casi nunca un resultado nos va a dar un numero entero, espero sus comentarios, saludos !
 
Pues hay varias técnicas, pero lo fundamental es saber el rango de esos números flotantes.

Un ejemplo. Supongamos que queremos guardar una temperatura, en un rango que va desde el 0.0 al 25.5. Entonces podemos guardar ese dato en un solo byte: sólo tenemos que multiplicar la temperatura por diez :)

Y lo mismo si el rango es entre 20.0 y 45.5 (sólo tenemos que restar 20.0 antes de multiplicar por diez).

Si el rango es distinto, necesitaremos más bytes.

Si, por ejemplo, queremos guardar un dato entre 0.00 y 655.35, podemos guardarlo en dos bytes, con tan solo multiplicar el valor por cien.

O si es entre 0.000 y 65.535, multiplicando por mil.
O entre 0.0000 y 6.5535, multiplicando por diez mil.
O entre 0.00000 y 0.65536, multiplicando por cien mil.

Finalmente, si queremos más precisión (más decimales significativos) necesitaremos más bytes. Según la biblioteca que estés usando, los valores en punto flotante pueden estar en formato parecido al IEEE 754.

O hacerlo de forma manual.

Por otra parte, en los micros que almacenan más de 8 bits por palabra, ya hay bibliotecas que permiten guardar números en punto flotante de forma directa (como era el caso de los DSP).
 
Última edición por un moderador:
He leído en Internet que PIC18F puede multiplicar y dividir directmente en asm. Los 16F solo restar y sumar. ¿Es cierto?
 
Para Loudness

Mira Creo que te falta una expresion al final del programa .
Copio el final de tu programa

EEPROM_TerminaEscribir
bcf EECON1,WREN ; Desautoriza la escritura en EEPROM.
; bcf EECON1,EEIF ; Limpia este flag.
bcf STATUS,RP0 ; Acceso al Banco 0.
bcf STATUS,RP1
; movf EEPROM_GuardaINTCON,W ; Restaura el valor anterior de INTCON.
; movwf INTCON
return

ORG 0x2100

DE H'0'

#INCLUDE <LCD_4BIT.INC>
#INCLUDE <RETARDOS.INC>
#INCLUDE <BIN_DEC.INC>

END

De todas maneras manana en el dia revisare tu programa , pero prueba esto para ver.
OK ?
 
He leído en Internet que PIC18F puede multiplicar y dividir directmente en asm. Los 16F solo restar y sumar. ¿Es cierto?

Sólo multiplicar :cry:

Ando con un problema ahora que ando trabajando con la EEPROM interna de los PIC18; quiero definir unos bytes de inicio desde el MPLAB para lo cual hago uso de la directiva DE:

Código:
ORG			0XF00000			;Vector de inicio de la EEPROM
	
	DE	0x00					;Contador de segundos almacenado en EEPROM
	DE	0x30					;Contador de minutos almacenado en EEPROM
	DE	0x05					;Contador de horas almacenado en EEPROM
	DE	0x12					;Día de mes de inicialización
	DE	0x10					;Mes de inicialización
	DE	0x14					;Año de inicialización

Pero al momento de compilar y ver los datos en la EEPROM, los valores que quiero me los define como palabras de 16 bits:

eeprom.png

¿Cómo puedo hacer para que estos datos se definan como bytes?

Saludos
 
Según la documentación, de en los PIC18 empaqueta palabras, mientras que en los PIC16 empaqueta bytes.

Prueba con esto:

de 0x0030
de 0x0512
 
Justo eso ando leyendo ahora Joaquín, parece que hallé una solución más "elegante"... en el manual de MPASM página 85 comenta el uso de una directiva: "code_pack" pero parece que tengo que guardar los datos en otro archivo, no lo entiendo del todo :oops:

http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf

Puedo zafarme del problema definiendo la palabra entera pero, por comodidad, me gustaría definir byte por byte
 
Tienes que usar code_pack como inicio de región, y luego poner las directivas de:

PHP:
datos_eeprom	code_pack	0xF00000	; Puntero a la EEPROM

		de	0x00	;Contador de segundos almacenado en EEPROM
		de	0x30	;Contador de minutos almacenado en EEPROM
		de	0x05	;Contador de horas almacenado en EEPROM
		de	0x12	;Día de mes de inicialización
		de	0x10	;Mes de inicialización
		de	0x14	;Año de inicialización
 
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba