copiador de memorias

23
Copiador de memorias EEPROM Con PICmicro Estudio En muchos proyectos se tiene la necesidad de almacenar información de tal manera que aun cuando el equipo sea desconectado de la fuente de alimentación los datos se mantengan disponibles al reiniciar el equipo. Por ejemplo almacenar números telefónicos, claves de acceso, fechas, precios, información de instrumentos como voltaje o corriente, etc. Todos estos datos no se pueden almacenar en la memoria RAM de los PIC porque al desconectarlo de su fuente se pierden. Las memorias seriales EEPROM son una buena alternativa para este tipo de aplicaciones. Estos circuitos integrados son pequeños, de 8 pines y son especialmente útiles cuando se quiere minimizar el numero de Entradas / Salidas del PICmicro. Generalidades de las memorias seriales EEPROM Las memorias seriales EEPROM pueden ser de tres tipos atendiendo a la manera como nos comunicamos con ellas: Microwire, I2C y SPI . En este articulo estudiaremos solamente los dos primeros tipos. Estas memorias tienen normalmente 8 pines. Alimentación, tierra, uno o dos pines de datos, un pin para el reloj y algunos pines de control. El tamaño físico de la memoria no tiene nada que ver con la capacidad de la misma, que puede ir desde algunas palabras hasta varios cientos de Kilo bytes. El consumo de las memorias seriales EEPROM es mínimo debido a que están construidas con tecnología CMOS. El consumo máximo cuando la memoria esta activa es de mas o menos un miliampere pero en standby puede ser de solamente algunos microamperes. Ejemplos de memorias seriales EEPROM - Memoria Microwire 93C66 La memoria 93C66 es una de las más populares de este tipo. Su capacidad es de 4Kbits. (512 x 8 o 256 x 16 bit ) La velocidad máxima del reloj es de 2MHZ y el tiempo de escritura de 10 milisegundos. Fig. 1

Upload: marvin-miranda

Post on 28-Mar-2016

233 views

Category:

Documents


1 download

DESCRIPTION

pasos para copiar memorias mediante pic.

TRANSCRIPT

Page 1: copiador de memorias

Copiador de memorias EEPROM Con PICmicro Estudio

En muchos proyectos se tiene la necesidad de almacenar información de tal manera

que aun cuando el equipo sea desconectado de la fuente de alimentación los datos se mantengan disponibles al reiniciar el equipo. Por ejemplo almacenar números telefónicos, claves de acceso, fechas, precios, información de instrumentos como voltaje o corriente, etc. Todos estos datos no se pueden almacenar en la memoria RAM de los PIC porque al desconectarlo de su fuente se pierden.

Las memorias seriales EEPROM son una buena alternativa para este tipo de

aplicaciones. Estos circuitos integrados son pequeños, de 8 pines y son especialmente útiles cuando se quiere minimizar el numero de Entradas / Salidas del PICmicro.

Generalidades de las memorias seriales EEPROM Las memorias seriales EEPROM pueden ser de tres tipos atendiendo a la manera

como nos comunicamos con ellas: Microwire, I2C y SPI . En este articulo estudiaremos solamente los dos primeros tipos.

Estas memorias tienen normalmente 8 pines. Alimentación, tierra, uno o dos pines de

datos, un pin para el reloj y algunos pines de control. El tamaño físico de la memoria no tiene nada que ver con la capacidad de la misma, que puede ir desde algunas palabras hasta varios cientos de Kilo bytes.

El consumo de las memorias seriales EEPROM es mínimo debido a que están

construidas con tecnología CMOS. El consumo máximo cuando la memoria esta activa es de mas o menos un miliampere pero en standby puede ser de solamente algunos microamperes.

Ejemplos de memorias seriales EEPROM - Memoria Microwire 93C66 La memoria 93C66 es una de las más populares de este tipo. Su capacidad es

de 4Kbits. (512 x 8 o 256 x 16 bit ) La velocidad máxima del reloj es de 2MHZ y el tiempo de escritura de 10 milisegundos. Fig. 1

Page 2: copiador de memorias

Fig. 1 Los nombres de los pines son: CS Selección del integrado (Chip Select) CLK Reloj (Serial data Clock) DI Entrada serial de datos (Serial Data Input) DO Salida serial de datos (Serial Data Output) Vss Tierra (Ground) NC Sin conexión (No Connect) Vcc Alimentación (Power Suply) Memoria I2C 24C08 La memoria 24C08 es un ejemplo de este tipo de memoria. Su capacidad es

de 8Kbits. (4 X 256 X 8 ) . Velocidad máxima del reloj es de 100 KHZ y el ciclo de escritura es de 2 milisegundos. Fig. 2

Fig. 2

Page 3: copiador de memorias

Los nombres de los pines son: Vss Tierra (Ground) SDA Dirección / Datos Entrada / Salida seriales(Serial Address / Data I/O) SCL Reloj serial (Serial Clock) WP Protección de escritura (Write protetct input) Vcc Alimentación de +4.5V a 5.5V (Power Supply) A0, A1, A2 Sin conexión (No Connect) PICmicro Estudio cuenta con dos tarjetas que están enfocadas a la programación de

memorias seriales: El modulo Clave 708 para copiar memorias 93C66 y el modulo Clave 707 para copiar

memorias 24CXX (24C00 a 24C08). Veamos cada una de estas tarjetas: Copiador de memorias 93C96 (Clave 708) El funcionamiento del modulo es el siguiente: - En el zócalo Base se coloca una memoria programada que se desea copiar. - En el zócalo Clon se coloca una memoria virgen. - Al oprimir el botón el PIC copia el contenido de la memoria Base en la

memoria virgen. - Los Leds OK y BAD comienzan a destellar indicando que la operación de

copiado esta en curso. - Al final uno de los dos Leds se mantiene encendido: OK nos indica que el

copiado se realizó con éxito y el Led BAD indica que la operación tuvo algún problema.

En la Fig. 3 se ilustra el diagrama esquemático de este módulo. Aquí podemos

observar que el PIC16C505 es el corazón de esta tarjeta. El pin RB0 se conecta a la terminal CS (Chip Select) de la memoria BASE y el pin

RC0 se conecta a CS de la memoria CLON. Un nivel ALTO en CS selecciona el CHIP correspondiente y un nivel BAJO lo deselecciona y lo pone en modo de espera (Standby).

El pin RB1 se conecta a la terminal CLK (Serial Clock) de la memoria BASE y el pin

RC1 se conecta a CLK de la memoria CLON. La señal de reloj se utiliza para sincronizar la comunicación entre el PIC y las memorias. Las instrucciones, direcciones y datos se introducen a la memoria mediante la terminal DI y durante el flanco positivo del reloj. También los datos se sacan de la memoria mediante el pin DO durante el flanco positivo del reloj.

Page 4: copiador de memorias
WGB
Fig. 3
Page 5: copiador de memorias

Los pines de las memorias DI (Entrada serial de datos) y DO (Salida serial de datos) están unidos y conectados al PIC. Esto quiere decir que la termina RB2 se configura como salida para transmitir Instrucciones/Datos y se configura como entrada para recibir datos de la memoria BASE. De igual manera se configura el pin RC2 para atender a la memoria CLON.

Son siete las instrucciones que se le pueden dar a esta memoria: Borrar/Escribir Habilitar y Deshabilitar (Erase/Write Enable/ Disable), Enable quiere decir habilitar y Disable deshabilitar, por lo tanto para

entrar en los modos de Borrar/Escribir primero se debe enviar la instrucción de habilitar y para salir de los modos Borrar/Escribir se debe enviar la instrucción deshabilitar. El modo de Lectura (Read) no requiere de esta instrucción.

Escribir (Write) La instrucción Escribir es seguida por los bits que se van a grabar en la

memoria. Leer (Read) La instrucción Leer saca los datos de la memoria. Borrar (Erase) Esta instrucción forza a unos los bits de la dirección especificada. Borra todo (Erase All) Esta instrucción pone en uno todos los bits de la memoria Escribe todo (Write All) Llena toda la memoria con el dato especificado. Estas instrucciones se introducen a la memoria mediante un código de tres bits. Para

todas las instrucciones el primer bit es un UNO que es el bit de arranque. Los otros dos bits definen la instrucción. Por ejemplo para Escribir se envía el código 1 0 1.

Para escribir en la memoria la secuencia de instrucciones sería la siguiente: Todo comienza con CS y DI en CERO. Después se envía una instrucción Erase/Write

Enable después la instrucción Write seguida de Erase/Write Disable y finalmente CS de nuevo a CERO.

Cada instrucción tiene su formato que se puede ver en las hojas de datos

correspondiente. Como ejemplo veamos el formato de la instrucción Write en la Fig. 4

Page 6: copiador de memorias

Fig. 4

Observe como la secuencia da comienzo cuando CS y DI están en UNO y al Flanco

positivo del reloj, mientras tanto DO esta en Alta Impedancia. Después se introduce la dirección y posteriormente el Dato.

Al final de este articulo se presenta el software que se acompaña con este módulo y la Fig. 5 es una fotografía del mismo.

Fig. 5

Código de WRITE 101 Dirección

Dato

Memoria BASE

Memoria CLON START

Page 7: copiador de memorias

Copiador de memorias 24CXX (Clave 709) El funcionamiento del modulo es el siguiente: - En el zócalo Base se coloca una memoria programada que se desea copiar.

- En el zócalo Clon se coloca una memoria virgen. - Con el DIPSWITCH se selecciona el tipo de memoria que se desea copiar: -1 para la memoria 2400 -2 para la memoria 2401 -3 para la memoria 2402 -4 para la memoria 2404 -5 para la memoria 2408 - Al oprimir el botón el PIC copia el contenido de la memoria Base en la

memoria virgen. - Los Leds OK y BAD comienzan a destellar indicando que la operación de

copiado esta en curso. - Al final uno de los dos Leds se mantiene encendido: OK nos indica que el

copiado se realizó con éxito y el Led BAD indica que la operación tuvo algún problema.

En la Fig. 6 se ilustra el diagrama esquemático de este módulo. Aquí podemos

observar que el PIC16C505 es el corazón de esta tarjeta. El pin WP (Write protetct) de la memoria BASE se conecta a POSITIVO, de esta

manera no se podrá escribir en ella. Al contrario la memoria CLON tiene su pin WP conectado a TIERRA para poder escribirla.

RB0 y RB1 se conectan a SDA y SCL de la memoria BASE. Asi como RC1 y RC2 se

conectan a SDA y SCL de la memoria CLON. Con estas conexiones se obtiene el control de la lectura de la memoria BASE y la escritura de la memoria CLON.

SDA y SCL forman un bus bidireccional, en este caso el bus esta controlado por el

PIC que es llamado Maestro y la memoria es el elemento Esclavo. Cualquiera de los dos puede enviar o recibir información. Pero el PIC es el que controla el flujo de información, el reloj SCL, y las condiciones de START y STOP.

Cuando el bus no esta ocupado SDA y SCL están en Alto. El PIC genera una

condicion de START cuando SDA cambia de ALTO a BAJO mientras el reloj SCL esta en ALTO. Cualquier operación comienza con esta condicion.

Para generar una condicion de PARO SDA debe de pasar de BAJO a ALTO mientras

el reloj SCL esta en ALTO. Cualquier operación debe de terminar con esta condicion.

Page 8: copiador de memorias
WGB
Fig. 6
Page 9: copiador de memorias

Una secuencia de Escritura de un Byte se puede observar el la Fig. 7

Fig.7

La secuencia de Lectura se puede observar en la Fig.8

Fig. 8 Al final de este articulo se presenta el software que se acompaña con este módulo y

la Fig. 9 es la fotografía del mismo.

Byte de Control Dirección Dato

SDA

SDA

Byte de Control Dirección Dato

Page 10: copiador de memorias

Fig. 9 Para su comodidad los programas de este articulo programa los puede encontrar en: www.electronicaestudio.com/articulos bajo el nombre de grab.zip

Memoria BASE

Memoria CLON

START

Selector de Tipo de memoria

Page 11: copiador de memorias

;PROGRAMA PARA COPIAR MEMORIAS 93X66X

;PIN PORTB,3 - BOTON ;PIN PORTB.4 - LED ROJO ;PIN PORTB.5 - LED VERDE ;FUSES - INTERNAL NO CLOCK OUT ; - MASTER CLEAR INTERNAL ; - WDT NO

LIST P=16C505, F=INHX8M include "P16C505.INC" ;MPLAB PIC START PLUS

addr equ 0x08data_rec equ 0x09data_H equ 0x0Adata_L equ 0x0Bdata_HH equ 0x0Cdata_LL equ 0x0Ddata_ equ 0x0Edata_env equ 0x0Fcont0 equ 0x10CONT1 EQU 0X11

EWEN equ 152 ;CONSTANTES PARA COMANDOSREAD equ 192WRITE equ 160

cs equ 0 ;EN PTO B - CHIP A COPIARclk equ 1 ;EN PTO C - CHIP COPIAdin equ 2dout equ 2

B0 equ 0 ;BITS 0 Y 7B7 equ 7

MOVWF OSCCAL ;CALIBRACION PARA CLOCK INTERNAL GOTO INICIO L_READ_MM ;RUTINA DE LECTURA PARA CHIP A COPIAR bsf portb,cs ;PON ON EL BIT DE CHIP SELECT movlw READ movwf data_env call L_envia_3 ;ENVIA 3 BITS COMANDO READ movf addr,w movwf data_env call L_envia_8 ;ENVIA 8 BITS DIRECCION DEL DATO A LEER MOVLW B'11001100' ;CAMBIA A ENTRADA EL BIT DE DATOS TRIS PORTB call L_recibe_8 ;RECIBE 1os 8 BITS DEL DATO LEIDO movf data_rec,w movwf data_H call L_recibe_8 ;RECIBE 2os 8 BITS DEL DATO LEIDO movf data_rec,w movwf data_L MOVLW B'11001000' ;CAMBIA A SALIDA EL BIT DE DATOS TRIS PORTB bcf portb,cs ;PON OFF EL CHIP SELECT

Page 12: copiador de memorias

retlw 0

L_hacia_mm ;RUTINA PARA ENVIAR 3, 8 o 11 BITSL_envia_3 movlw 3 goto L_enviaL_envia_8 movlw 8 goto L_envia

L_envia_11 movlw 11L_envia movwf cont0L_env_a ;LOOP PARA ENVIAR DATOS POR EL PIN DE DATOS

bcf portb,din ;CERO btfsc data_env,b7 ;O DEPENDIENDO DEL BIT B7 bsf portb,din ;UNO

bsf portb,clk ;PULSO nop ;DE bcf portb,clk ;CLOCK rlf data_env,f ;CORRIMIENTO DEL UN BIT A LA IZQUIERDA decfsz cont0,f ;CONTROL DEL LOOP goto L_env_a retlw 0 L_desde_mm ;RUTINA PARA RECIBIR DATOS DEL PIN DE DATOSL_recibe_8 movlw 8 movwf cont0 clrf data_rec BCF STATUS,CL_reci_a ;LOOP PARA LEER EL PIN DE DATOS bsf portb,clk ;PULSO nop ;DE bcf portb,clk ;CLOCK rlf data_rec,f ;CORRIMIENTO DE UN BIT A LA IZQUIERDA bcf data_rec,b0 ;ESCRIBE EN UN BYTE EL BIT LEIDO btfsc portb,dout bsf data_rec,b0 bcf status,c decfsz cont0,f goto L_reci_a retlw 0

e_EWEN_MM ;RUTINA ENVIAR COMANDO DE PERMITIR ESCRITURA bsf portc,cs ;EN EL CHIP COPIA movlw EWEN movwf data_env call e_envia_11 bcf portc,cs retlw 0

e_READ_MM ;RUTINA LECTURA CHIP COPIA bsf portc,cs ;PON ON CHIP SELECT movlw READ

Page 13: copiador de memorias

movwf data_env call e_envia_3 ;ENVIA COMANDO DE READ movf addr,w movwf data_env call e_envia_8 ;ENVIA DIRECCION DE LECTURA MOVLW B'11001100' ;HAZ ENTRADA A PIN DE DATOS TRIS PORTC call e_recibe_8 movf data_rec,w movwf data_HH ;RECIBE 1os 8 BITS DEL DATO LEIDO call e_recibe_8 movf data_rec,w movwf data_LL ;RECIBE 2os 8 BITS DEL DATO LEIDO MOVLW B'11001000' ;HAZ SALIDA A PIN DE DATOS TRIS PORTC bcf portc,cs ;PON OFF CHIP SELECT retlw 0

e_WRITE_MM ;RUTINA DE ESCRITURA PARA CHIP COPIA bsf portc,cs ;PON ON CHIP SELECT movlw WRITE movwf data_env call e_envia_3 ;ENVIA COMANDO DE WRITE AL CHIP COPIA movf addr,w movwf data_env call e_envia_8 ;ENVIA DIRECCION DEL DATO A ESCRIBIR movf data_H,w movwf data_env call e_envia_8 ;ENVIA 1os 8 BITS DEL DATO A ESCRIBIR movf data_L,w movwf data_env call e_envia_8 ;ENVIA 2os 8 BITS DEL DATO A ESCRIBIR bcf portc,cs ;PON OFF CHIP SELECT movlw b'11001100' tris portc ;HAZ ENTRADA PIN DE DATOSe_chec_res bcf portc,cs ;PON OFF CHIP SELECT nop ;Y bsf portc,cs ;PON ON CHIP SELECTe_chec_r_1 bsf portc,clk ;PULSO nop ;DE bcf portc,clk ;CLOCK btfss portc,dout ;SI HAY 'UNO' ESCRITURA TERMINADA goto e_chec_r_1 ;SI HAY 'CERO' ESCRITURA EN CURSO - REPETIR bcf portc,cs ;PON OFF CHIP SELECT movlw b'11001000' ;HAZ SALIDA A PIN DE DATOS tris portc retlw 0 e_hacia_mm ;RUTINA P/ENVIAR 3, 8 o 11 BITS A CHIP COPIAe_envia_3 movlw 3 goto e_enviae_envia_8 movlw 8 goto e_envia

Page 14: copiador de memorias

e_envia_11 movlw 11e_envia movwf cont0e_env_a bcf portc,din btfsc data_env,b7 bsf portc,din bsf portc,clk nop bcf portc,clk rlf data_env,f decfsz cont0,f goto e_env_a retlw 0 e_desde_mm ;RUTINA PARA RECIBIR DATOS DEL CHIP COPIAe_recibe_8 movlw 8 movwf cont0 clrf data_rec BCF STATUS,Ce_reci_a bsf portc,clk nop bcf portc,clk rlf data_rec,f bcf data_rec,b0 btfsc portc,dout bsf data_rec,b0 bcf status,c decfsz cont0,f goto e_reci_a retlw 0

INICIO ;AL ENCENDER CALL PAUSA CLRF PORTB ;BORRA PUERTOS B Y C CLRF PORTCINICIO_0 ;AL HACER UNA SEGUNDA COPIA BTFSS PORTB,3 ;CHECA BOTON DE INICIO GOTO $-1 ;NO CLRF PORTB ;BORRA PUERTOS B Y C CLRF PORTCINICIO_1 CALL PAUSA CALL PAUSA CALL PAUSA CALL PAUSA CALL PAUSA CALL PAUSA CALL PAUSA BTFSS PORTB,3 GOTO $-1 CALL PAUSA ;PAUSAS PARA EVITAR REBOTE CALL PAUSA CALL PAUSA CALL PAUSA

Page 15: copiador de memorias

CALL PAUSA CALL PAUSA CALL PAUSA CALL PAUSA movlw b'11001000' ;DEFINE PUERTOS tris portb movlw b'11111000' tris portc call e_EWEN_MM ;LLAMA A RUTINA DE PERMITIR ESCRITURA clrf addr ;PON DIRECCION DE DATO A LEER EN 0repite call L_READ_MM ;LLAMA A RUTINA DE LECTURA CHIP A COPIAR BCF PORTB,4 ;PRENDE Y APAGA LEDS BSF PORTB,5 CALL PAUSA ;HAZ PAUSA PARA QUE PARPADEEN LOS LEDS call e_WRITE_MM ;LLAMA A RUTINA DE ESCRITURA DE CHIP COPIA BSF PORTB,4 ;APAGA Y PRENDE LEDS BCF PORTB,5 CALL PAUSA ;PAUSA PARA QUE PARPADEEN LEDS call e_READ_MM ;LLAMA RUTINA DE LECTURA CHIP COPIA movf data_HH,w ;COMPARA xorwf data_H,w ;DATOS btfss status,z ;A ESCRIBIR goto error_ ;CONTRA DATOS movf data_LL,w ;LEIDOS EN xorwf data_L,w ;CHIP COPIA btfss status,z goto error_ incfsz addr,f ;SI CORRECTO INCREMENTA DIRECCION goto repite ;HASTA 255 BSF PORTB,5 ;PRENDE Y APAGA LEEDS BCF PORTB,4 GOTO INICIO_0error_ BSF PORTB,4 ;SI ERROR PRENDE LED ROJO bcf portb,5 ;Y APAGA LED VERDE goto INICIO_1 PAUSA ;PAUSA DE 18.5 MILISEGUNDOS MOVLW 24 MOVWF CONT1 DECFSZ CONT0,F GOTO $-1 DECFSZ CONT1,F GOTO $-3 RETLW 0

end

Page 16: copiador de memorias

;PROGRAMA PARA COPIAR MEMORIAS 24 - 00 01 02 04 Y 08

;BO - DATA_E ;B1 - CLK_E ;B2 - LED VERDE ;B3 - MEM_1 ;B4 - MEM_0 ;B5 - BOTON ;C0 - LED ROJO ;C1 - DATA_S ;C2 - CLK_S ;C3 - MEM_8 ;C4 - MEM_4 ;C5 - MEM_2

list p=p16C505#include <p16C505.inc>

#define DATA_E 0 ;PTO_B#define CLOK_E 1 ;PTO_B#DEFINE LED_V 2 ;PTO_B#DEFINE PTE_1 3 ;PTO_B#DEFINE PTE_0 4 ;PTO_B#DEFINE BOTON 5 ;PTO_B

#DEFINE LED_R 0 ;PTO_C#define DATA_S 1 ;PTO_C#define CLOK_S 2 ;PTO_C#DEFINE PTE_8 3 ;PTO_C#DEFINE PTE_4 4 ;PTO_C#DEFINE PTE_2 5 ;PTO_C

#DEFINE MASKOUT_E 0XF8 ;B'11111000'#DEFINE MASKOUT_S 0XF8 ;B'11111000#DEFINE MASKIN_E 0XF9 ;B'11111001'#DEFINE MASKIN_S 0XFA ;B'11111010'

CBLOCK 0X0C CHIP_DIR LIMITE BLOQUE DIR_BYTE ;DIRECCION DE BYTES TXBUF ;BUFFER DE TRANSMISION RXBUF DATO_L ;BUFFER DE LECTURA DATO_LL COUNT ;CONTADOR DE BITS DATAOUT LOOP1 LOOP2 REG0 REG1 DIR_BYTE_X NUM_BYTES ENDC

RESET_VECTOR

Page 17: copiador de memorias

MOVWF OSCCAL ;CALIBRACION RELOJ INTERNO CALL MS250 GOTO PROGRAMA

MS250 ;PAUSA 250 MILISEGUNDOS nop decfsz REG0,f goto $-2 decfsz REG1,f goto $-4 reTURN

OPENSW ;INICIALIZACION MOVLW 0XA0 MOVWF CHIP_DIR ;DIRECCION DE CHIP movlw MASKOUT_E TRIS PORTB ;DEFINICION DE PUERTOS B Y C MOVLW MASKOUT_S TRIS PORTC movlw B'11111011' ;INICIALIZACION DE LEDS Y movwf PORTB ;DE DATO Y CLOCK MOVLW B'11111110' MOVWF PORTC retlw 0

BITOUT macro PORT, DATO, CLOCK ;MACRO DE ESCRITURA DE BIT local bitlow ;ETIQUETAS SOLO VALIDAS EN MACRO local clkout btfss DATAOUT,7 ;CHECA ESTADO BIT A TRANSMITIR goto bitlow ;CERO - VE A BITLOW bsf PORT,DATO ;UNO - PIN DATO = 1 goto clkout ;VE A CLKOUTbitlow bcf PORT,DATO ;PIN DATO = 0 goto clkout clkout goto $+1 bsf PORT,CLOCK ;ON CLOCK goto $+1 goto $+1 bcf PORT,CLOCK ;OFF CLOCK endm

BITIN macro PORT, DATO , CLOCK ;MACRO DE LECTURA DE BIT bsf PORT,CLOCK ;ON CLOCK bsf RXBUF,0 ;ASUME BIT ENTRADA = 1 btfss PORT,DATO ;LEE BIT DE ENTRADA bcf RXBUF,0 ;BIT DE ENTRADA = 0 bcf PORT,CLOCK ;OFF CLOCK endm

BSTART_E ;GENERA BIT DE INICIO CHIP ORIG BSF PORTB,DATA_E ;DATO = 1 BSF PORTB,CLOK_E ;CLOCK = 0 bcf PORTB,DATA_E ;DATO = 0 DURANTE 5us goto $+1 goto $+1 bcf PORTB,CLOK_E ;OFF CLOCK retlw 0

Page 18: copiador de memorias

BSTART_S ;GENERA BIT DE INICIO CHIP COPIA BSF PORTC,DATA_S ;VER BSTART_E BSF PORTC,CLOK_S bcf PORTC,DATA_S goto $+1 goto $+1 bcf PORTC,CLOK_S retlw 0 BSTOP_E ;GENERA BIT DE PARADA CHIP ORIG movlw MASKOUT_E TRIS PORTB ;PON PINES DATO/CLOCK COMO SALIDAS bsf PORTB,CLOK_E ;ON CLOCK goto $+1 ;DURANTE 5us nop bsf PORTB,DATA_E ;ON PIN DATO retlw 0

BSTOP_S ;GENERA BIT DE PARADA CHIP COPIA movlw MASKOUT_S ;VER BSTOP_E TRIS PORTC bsf PORTC,CLOK_S goto $+1 nop bsf PORTC,DATA_S retlw 0

TX_E ;TRANSMITE 8 BITS CHIP ORIG movlw .8 movwf COUNT ;NUM BITS = 8 movlw MASKOUT_E ;PON PINES DATO/CLOCK COMO SALIDAS TRIS PORTBTXLP_E BITOUT PORTB, DATA_E, CLOK_E ;VER MACRO BITOUT rlf DATAOUT, F ;CORRIMIENTO DE UN BIT A LA IZQ decfsz COUNT, F ;8 VECES? goto TXLP_E ;NO - OTRA VEZ movlw MASKIN_E ;HAZ PIN DATO ENTRADA TRIS PORTB BITIN PORTB, DATA_E, CLOK_E ;VER MACRO BITIN retlw 0

TX_S ;TRANSMITE 8 BITS CHIP COPIA movlw .8 ;VER TX_E movwf COUNT movlw MASKOUT_S TRIS PORTCTXLP_S BITOUT PORTC, DATA_S, CLOK_S rlf DATAOUT, F decfsz COUNT, F goto TXLP_S movlw MASKIN_S TRIS PORTC BITIN PORTC, DATA_S, CLOK_S retlw 0

RX_E ;RECIBE 8 BITS CHIP ORIG clrf RXBUF ;BORRA BUFFER DE ENTRADA movlw .8 ;NUMERO DE BITS = 8

Page 19: copiador de memorias

movwf COUNT bcf STATUS,C ;CARRY BIT = 0 movlw MASKIN_E ;HAZ PIN DATO ENTRADA TRIS PORTBRXLP_E rlf RXBUF, F ;CORRIMIENTO DE UN BIT A LA IZQ BITIN PORTB, DATA_E, CLOK_E ;LEER UN BIT - VER MACRO BITIN decfsz COUNT, F ;8 VECES? goto RXLP_E ;NO - OTRA VEZ bsf DATAOUT,7 ;ACK BIT = 1 movlw MASKOUT_E ;HAZ PINES DATO/CLOCK SALIDAS TRIS PORTB BITOUT PORTB, DATA_E, CLOK_E ;PARA TERMINAR TRANSMISION retlw 0

RX_S ;LEE 8 BITS CHIP COPIA clrf RXBUF ;VER RX_E movlw .8 movwf COUNT bcf STATUS,C movlw MASKIN_S TRIS PORTCRXLP_S rlf RXBUF, F BITIN PORTC, DATA_S, CLOK_S decfsz COUNT, F goto RXLP_S bsf DATAOUT,7 movlw MASKOUT_S TRIS PORTC BITOUT PORTC, DATA_S, CLOK_S retlw 0

READ_E ;LECTURA DE UN BYTE CHIP ORIG CLRF RXBUF call BSTART_E ;GENERA BIT DE INICIO MOVF CHIP_DIR,W ;DIRECCION CHIP movwf DATAOUT ;EN BUFFER DE SALIDA call TX_E ;Y TRANSMITELO btfsc RXBUF,0 ;CHECA NAK goto abort_E movf DIR_BYTE,w ;DIRECCION BYTE movwf DATAOUT ;EN BUFFER DE SALIDA call TX_E ;Y TRANSMITELO btfsc RXBUF,0 goto abort_E call BSTOP_E ;LEER UN BYTE DEL CHIPSIG_C_E call BSTART_E ;GENERA BIT DE INICIO INCF CHIP_DIR,W ;DIRECCION DE CHIP movwf DATAOUT ;EN BUFFER DE SALIDA call TX_E ;Y TRANSMITELO btfsc RXBUF,0 ;CHECA NAK goto abort_E call RX_E ;LEE UN BYTE DEL CHIP MOVF RXBUF,W MOVWF DATO_L call BSTOP_E ; GENERA BIT STOP Y TERMINA TRANSMI bcf STATUS,C

Page 20: copiador de memorias

retlw 0abort_E call BSTOP_E ;GENERA BIT STOP Y TERMINA TRANSMI bsf STATUS,C retlw 1

READ_S ;LECTURA DE UN BYTE DE CHIP COPIA CLRF RXBUF ;VER READ_E call BSTART_S MOVF CHIP_DIR,W movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S movf DIR_BYTE,w movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S call BSTOP_SSIG_C_S call BSTART_S INCF CHIP_DIR,W movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S call RX_S MOVF RXBUF,W MOVWF DATO_L call BSTOP_S bcf STATUS,C retlw 0abort_S call BSTOP_S bsf STATUS,C retlw 1

WRITE_E ;ESCRIBE UN BYTE EN CHIP ORIG movwf TXBUF ;PON DATO EN W EN BUFFER DE SALIDA call BSTART_E ;GENERA BIT DE INICIO MOVF CHIP_DIR,W ;MUEVE DIR DE CHIP movwf DATAOUT ;EN BUFFER DE TRANSMISION call TX_E ;Y TRANSMITELO btfsc RXBUF,0 ;CHECA NAK goto abort_E movf DIR_BYTE,w ;MUEVE DIRECCION BYTE movwf DATAOUT ;EN BUFFER DE TRANSMISION call TX_E ;Y TRANSMITELO btfsc RXBUF,0 ;CHECA NAK goto abort_E movf TXBUF,w ;MUEVE DATO movwf DATAOUT ;EN BUFFER DE TRANSMISION call TX_E ;Y TRANSMITELO btfsc RXBUF,0 goto abort_E call BSTOP_E ;GENERA BIT DE PARADA

Page 21: copiador de memorias

bcf STATUS,C retlw 0

WRITE_S ;ESCRIBE BYTE EN CHIP COPIA movwf TXBUF ;VER WRITE_E call BSTART_S MOVF CHIP_DIR,W movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S movf DIR_BYTE,w movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S movf TXBUF,w movwf DATAOUT call TX_S btfsc RXBUF,0 goto abort_S call BSTOP_S bcf STATUS,C retlw 0

;PAUSA POR MILISEGUNDOS INDICADOS EN WPAUSE_MLS movwf LOOP1 clrf LOOP2 nop decfsz LOOP2,f goto $-2 decfsz LOOP1,f goto $-4 retlw 0; PROGRAMA CALL OPENSW ;INICIALIZACION

INICIO CLRF BLOQUE BTFSS PORTB,BOTON ;CHECA BOTON DE INICIO GOTO $-1 CALL MS250 BTFSC PORTB,PTE_0 ;DETERMINA TIPO DE MEMORIA GOTO MEM_0 BTFSC PORTB,PTE_1 GOTO MEM_1 BTFSC PORTC,PTE_2 GOTO MEM_2 BTFSC PORTC,PTE_4 GOTO MEM_4 BTFSC PORTC,PTE_8 GOTO MEM_8 GOTO INICIOMEM_0 MOVLW 15

Page 22: copiador de memorias

MOVWF NUM_BYTES CLRF DIR_BYTE_X COMF DIR_BYTE_X,F MOVLW 0XA0 MOVWF LIMITE CALL MS250 GOTO LOOP

MEM_1 MOVLW 127 MOVWF NUM_BYTES CLRF DIR_BYTE_X COMF DIR_BYTE_X,F MOVLW 0XA0 MOVWF LIMITE CALL MS250 GOTO LOOPMEM_2 MOVLW 255 MOVWF NUM_BYTES CLRF DIR_BYTE_X COMF DIR_BYTE_X,F MOVLW 0XA0 MOVWF LIMITE CALL MS250 GOTO LOOPMEM_4 MOVLW 255 MOVWF NUM_BYTES CLRF DIR_BYTE_X COMF DIR_BYTE_X,F MOVLW 0XA2 MOVWF LIMITE CALL MS250 GOTO LOOPMEM_8 MOVLW 255 MOVWF NUM_BYTES CLRF DIR_BYTE_X COMF DIR_BYTE_X,F MOVLW 0XA6 MOVWF LIMITE CALL MS250 GOTO LOOPLOOP INCF DIR_BYTE_X,F ;INCREMENTA DIRECCION BYTE MOVF DIR_BYTE_X,W MOVWF DIR_BYTE CALL READ_E ;LEE BYTE CHIP ORIG

MOVF DIR_BYTE_X,W MOVWF DIR_BYTE ;MISMA DIRECCION MOVF DATO_L,W MOVWF DATO_LL CALL WRITE_S ;ESCRIBE BYTE CHIP COPIA

MOVLW 10 CALL PAUSE_MLS ;PAUSA PARA ESCRITURA BYTE

Page 23: copiador de memorias

CLRF DATO_L

MOVF DIR_BYTE_X,W MOVWF DIR_BYTE CALL READ_S ;LEE DATO RECIEN ESCRITO

MOVF DATO_L,W ;COMPARA DATO ORIGINAL XORWF DATO_LL,W ;CONTRA DATO ESCRITA BTFSS STATUS,Z GOTO ERROR_ ;DIFERENCIA - ERROR

BSF PORTB,LED_V ;HAZ PARPADEAR LEDS BCF PORTC,LED_R MOVLW 24 CALL PAUSE_MLS BCF PORTB,LED_V BSF PORTC,LED_R MOVLW 24 CALL PAUSE_MLS

MOVF NUM_BYTES,W ;CHECA NUMERO DE BYTES XORWF DIR_BYTE_X,W BTFSS STATUS,Z GOTO LOOP

MOVF CHIP_DIR,W ;CHECA BLOQUES DE 256 BYTES XORWF LIMITE,W BTFSC STATUS,Z GOTO TERMINA ;IGUAL AL BLOQUE MAXIMO MOVLW 0XA0 MOVWF CHIP_DIR INCF BLOQUE,F ;INCREMENTA EL NUMERO DE BLOQUE BCF STATUS,C RLF BLOQUE,W ADDWF CHIP_DIR,F MOVLW 255 MOVWF DIR_BYTE_X GOTO LOOP ;PROCESA UN NUEVO BLOQUE

TERMINA BSF PORTB,LED_V ;PRENDE LED VERDE BCF PORTC,LED_R ;APAGA LED ROJO BTFSS PORTB,BOTON ;CHECA BOTON DE INICIO GOTO $-1 BCF PORTB,LED_V CALL MS250 GOTO PROGRAMA ;INICIA OTRA COPIA

ERROR_ BCF PORTB,LED_V ;APAGA LED VERDE BSF PORTC,LED_R ;PRENDE LED ROJO BTFSS PORTB,BOTON ;CHECA BOTON INICIO GOTO $-1 BCF PORTC,LED_R CALL MS250 GOTO PROGRAMA ;INICIA OTRA COPIA

END