Autor Tema: eeprom 25lc1024 y el 18F4550  (Leído 3031 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
eeprom 25lc1024 y el 18F4550
« en: 22 de Agosto de 2010, 18:35:34 »
hola.despues de bastantes horas de trabajo para entender el funcionamiento del SPI de la serie 18F.he realizado un programa para la escritura y posterior lectura en una eeprom con ayuda de un programa que realizo pibe para el 16f877.

este programa tambien puede modificarse para usar eeproms de menos memoria de la serie 25lcxx.solo hay que limitar el direccionamiento interno.
es decir,quitar un par de lineas del codigo.

en el archivo adjunto pongo el programa con el VSM integrado.de esta forma tambien explico el funcionamiento de SPI de modo grafico con el osciloscopio.
y el SPI debuger de isis.

Código: [Seleccionar]
LIST   P=PIC18F4550   ;Se indica el modo de procesador
     #INCLUDE   <P18F4550.inc>
      RADIX   HEX      ;Sistema de numeracion hexadecimal



        
      
         CONFIG FOSC = HS       ;Osc por XTAL 20mhz
      CONFIG DEBUG = OFF
      CONFIG PWRT = OFF
      CONFIG BOR  = OFF
      CONFIG WDT = OFF
      CONFIG MCLRE = ON
      CONFIG PBADEN = OFF
      CONFIG LVP = OFF
      CONFIG CP0 = OFF
      CONFIG CP1 = OFF
      CONFIG CP2 = OFF
      CONFIG CP3 = OFF
      CONFIG CPB = OFF
      CONFIG CPD = OFF

ERRORLEVEL      -302
CBLOCK    0x10 ;comienza el bloque de ram
rxdata
AUX0
AUX1
AUX2
ADDRESS0
ADDRESS1
ADDRESS2


ENDC


;***************Bit Definitions****************************************
#define   CS    PORTA,2,ACCESS    ; SPI chip select bit definition

;**********************************************************************


;***************25Cxxx command definitions
#define  wren  6                 ;write enable latch
#define  WRDI  4                 ;reset the write enable latch
#define  RDSR  5                 ;read status register
#define  WRSR  1                 ;write status register
#define  READ  3                 ;read data from memory
#define  WRITE 2                 ;write data to memory

; Bit defines within status register
#define  WIP   0                 ;write in progress
#define  WEL   1                 ;write enable latch
#define  BP0   2                 ;block protection bit
#define  BP1   3                 ;block protection bit
;**********************************************************************


;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
         ORG   0x00       ;Inicio en el Vector de Reset
  goto   INICIO       ;ir a la primera instruccion del programa

ORG 0X001A
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO   MOVLW   b'00001111' ;
       MOVWF ADCON1,ACCESS      ;
       MOVLW b'11111011' ; TRISA

bsf PORTA,2
clrf PORTD

       MOVWF TRISA,ACCESS      ; RA2 output
       MOVLW b'11111101' ;
       movwf   TRISB,ACCESS     ; PortB
       MOVLW b'00110111' ;
       movwf   TRISC,ACCESS     ; PortC
       movlw   b'00000000'
       movwf TRISD,ACCESS     ; PortD
       movlw   0x00
       movwf   TRISE,ACCESS     ; Puerto E
       movlw 0x07
       movwf CMCON,ACCESS      ;



      
       clrf    INTCON,ACCESS   ; deshabilita todas la interrupciones

       movwf SPPCON
       movwf   SSPCON1   ; clear SSP control register
       movwf PIE1       ; deshabilita interrupciones perifericas
       movwf   SSPSTAT   ; borra el registro de estado de SSP
       movwf   SPPCFG ; borra el registro de configuracion SSP
       movwf UCON
       movwf ADCON0  
       movlw 0x31         ; SPI master, clk/16, ckp=1
       movwf SSPCON1     ; SSPEN enabled
       movlw   0x80                ; set up spi port, SPI master,
       movwf   SSPSTAT             ; cke = 0 (mode 1,1)

clrf ADDRESS0,ACCESS ;borra byte de direccion 0
clrf ADDRESS1,ACCESS ;borra byte de direccion 1
clrf ADDRESS2,ACCESS ;borra byte de direccion 2

       call Wren,0
call wrsr,0
call busy_test,0
call Wren,0

;escritura en eeprom 25lcxx

bcf CS ;habilita chip 25lcxx
movlw WRITE ;comando de escritura
call output,0 ;envia comando
movf ADDRESS2,W,ACCESS ;valor del tercer byte de direcciones
call output,0 ;envia direccion byte2
movf ADDRESS1,W,ACCESS ;valor del segundo byte de direcciones
call output,0 ;envia direccion byte1
movf ADDRESS0,W,ACCESS ;valor del primer byte de direcciones
call output,0 ;envia direccion byte0
movlw 0xA5 ;valor a grabar
call output,0 ;envia dato
bcf SSPCON1,CKP,ACCESS ;estado inactivo para ckl a nivel bajo.
bsf CS ;deshabilita chip 25lcxx
bsf SSPCON1,CKP,ACCESS ;estado inactivo para ckl a nivel alto.
call busy_test ;espera a terminacion de escritura.
;call rdsr

;lectura del dato escrito en la 25lcxx

         bcf   CS                 ;habilita chip 25lcxx
         movlw READ               ;comando de lectura
         call   output,0            ;envia comando
         movf ADDRESS2,W,ACCESS ;valor del tercer byte de direcciones
call output,0 ;envia direccion byte2
movf ADDRESS1,W,ACCESS ;valor del segundo byte de direcciones
call output,0 ;envia direccion byte1
movf ADDRESS0,W,ACCESS ;valor del primer byte de direcciones
call output,0 ;envia direccion byte0
         call   output,0            ;lee dato grabado
         bsf   CS                 ;deshabilita chip 25lcxx
                                  

; mostrar dato
movf rxdata,w ;carga valor del registro rxdata en w
movwf PORTD ;visualizalo en PORTD
I goto I


org 0x0100
include "SPI_25xx.inc"



END

y el archivo .inc
Código: [Seleccionar]
;***************Bit Definitions****************************************
;#define   CS    PORTA,2           ; SPI chip select bit definition

;**********************************************************************


;***************25Cxxx command definitions
;#define  wren  6                 ;write enable latch
;#define  WRDI  4                 ;reset the write enable latch
;#define  RDSR  5                 ;read status register
;#define  WRSR  1                 ;write status register
;#define  READ  3                 ;read data from memory
;#define  WRITE 2                 ;write data to memory

; Bit defines within status register
;#define  WIP   0                 ;write in progress
;#define  WEL   1                 ;write enable latch
;#define  BP0   2                 ;block protection bit
;#define  BP1   3                 ;block protection bit
;**********************************************************************




;******Subrutina de Recepcion y Transmision de Datos***************
output   movwf SSPBUF,ACCESS             ; cargar el contenido de w al registro de recepcion/transmisin de datos
loop1    ;bsf   STATUS,RP0         ; seleccion del bank 1
         btfss SSPSTAT,BF,ACCESS         ; espera a que se complete la transmision
         goto  loop1              ; si no ha terminado,espera.
         ;bcf   STATUS,RP0         ; seleccion del bank 0
         movf  SSPBUF,W,ACCESS           ; carga el contenido del registro de recepcion/transmisin de datos en w
         movwf rxdata,ACCESS             ; carga el contenido de w en rxdata
         return 0                 ; retorno de subrutina  

;*******Subrutina de Habilitacion de Escritura****************************************
Wren     bcf   CS                 ; seleccion de chip a nivel bajo(chip habilitado)
         movlw b'00000110'        ; habilitacion de escritura en el byte de control de la eeprom
         call  output,0            ; transmite el dato de habilitacion de escritura
         bcf   SSPCON1,CKP,ACCESS         ; poner a nivel bajo el la polaridad de ckl
         bsf   CS                 ; seleccion de chip a nivel alto(chip deshabilitado)
         bsf   SSPCON1,CKP,ACCESS         ; poner a nivel alto el la polaridad de ckl
         return 0                 ; retorno de subrutina


;*******Subrutina de Inabilitacion de Escritura****************************************
Wrdi     bcf   CS                 ; seleccion de chip a nivel bajo(chip habilitado)
         movlw b'00000100'        ; inhabilitacion de escritura en el byte de control de la eeprom
         call  output,0             ; transmite el dato de inhabilitacion de escritura
         bcf   SSPCON1,CKP,ACCESS         ; poner a nivel bajo el la polaridad de ckl
         bsf   CS                 ; seleccion de chip a nivel alto(chip deshabilitado)
         bsf   SSPCON1,CKP,ACCESS         ; poner a nivel alto el la polaridad de ckl
         return 0                  ; retorno de subrutina


;*******Subrutina de Lectura del Registro de Estado********************************
rdsr     bcf   CS                 ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000101'        ; habilitacion de lectura del registro de estado de la eeprom  
         call  output,0             ; lectura del registro de estado de la eeprom y lo cargas en rxdata
         movlw b'00000101'        ; no tener en cuenta
         call  output,0             ; lectura del registro de estado de la eeprom y lo cargas en rxdata
         bsf   CS                 ; seleccion de chip a nivel alto(chip deshabilitado)
         return 0                   ; retorno de subrutina

;*******Subrutina de Escritura del Registro de Estado*******************************
wrsr     bcf    CS                ; seleccion de chip a nivel bajo(chip habilitado)
         movlw  b'00000001'       ; orden para habilitar la escritura en la eeprom
         call   output,0            ; manda el dato
         movlw  b'00000010'       ; deshabilitacion de la proteccion de lectura
         call   output,0            ; manda el dato
         bcf    SSPCON1,CKP,ACCESS        ; poner a nivel bajo el la polaridad de ckl
         bsf    CS                ; seleccion de chip a nivel alto(chip deshabilitado)
         bsf    SSPCON1,CKP,ACCESS        ; poner a nivel alto el la polaridad de ckl
         return 0                 ; retorno de subrutina

;*******Busy Test - WIP bit in Status Register*************************
busy_test
         bcf    CS                ; seleccion de chip a nivel bajo(chip habilitado)
         movlw b'00000101'        ; habilitacion de lectura del registro de estado de la eeprom
         call   output,0            ; lectura del registro de estado de la eeprom y lo cargas en rxdata
         movlw  b'00000000'       ; send dummy byte
         call   output,0            ; to initiate clock sequence for read
         bsf    CS                ; seleccion de chip a nivel alto(chip deshabilitado)
         btfsc  rxdata,WIP,ACCESS        ; test WIP bit read from status register
         goto   busy_test         ; repeat busy test
         return 0                 ; retorno de subrutina

cuando tengamos abierto el proyecto,le daremos al play y esperaremos unos segundos para que se carge el SPI Debug.
el programa se parara automaticamente.y tendremos las cuatro señales principales para el control de la 25lc1024 visualizadas en el
osciloscopio.

en el osciloscopio se han conectado los pin de la siguiente forma:
pin CS "seleccion de chip" de la eeprom al canal verde.
pin SI "entrada de datos" de la eeprom al canal rojo
pin SCK "sincronismo" de la eeprom al canal azul.
pin SO "salida de datos" de la eeprom al canal amarillo

el pin sck por defecto su estado logico es alto."1 logico" y la señal probeniente del microcontrolador es una rafaga de 8 impulsos
de unos 10uS de duracion en cada estado bajo.es decir cada ciclo dura 20uS.y se usa para determinar que el dato contenido en
SI y SO.

la forma de determinar que dato refleja por ejemplo la señal SI.lo vamos a ver en el osciloscopio.
para ello con la barra de desplazamiento del osciloscopio,buscaremos el final de la trama.y buscando el primer estado a 1logico
de SI "entrada roja" veremos que la subida de la onda ha coincidido con los dos ultimos impulsos de la señal azul(sck)
y como estas rafagas interpretan 8 bits,y la secuencia es b7,b6,b5,b4,b3,b2,b1,b0 de izquierda a derecha,
vemos que el estado a nivel alto coincide con b1 y b0.

asi se determina que es el valor binario 00000011.

si queremos ver mas datos,recorreremos la line roja hacia la izquierda y veremos que la señal no es la misma.
ya que es un valor diferente.
en este caso el estado alto de SI(rojo),coincide con los bit b2 y b0 de la señal sck(azul) que seria el valor en binario 00000101.

como vemos en la señal roja.despues del bit 0.el estado de la señal continua en alto.hasta que empieza la siguente rafaga azul.
a esto no hay que darle importancia.ya que no contiene ningun valor al no tener sincronismo con clk.

en nuestro programa hemos grabado un dato en la eeprom 25lcxx y posteriormente lo hemos leido.
este dato es el A5.

y podemos verlo el la señal del osciloscopio.la señal es SO"amarillo"
esta al final de la trama recibida y como podemos ver coincide con algunos estados de la señal sck.
en este caso los estados altos de SO coinciden con los bits de sincronismo de SCK.y son con los bits:b7,b5,b2,b0 =10100101=A5

ya que conocemos la forma de interpretar los valores de las señales,es hora de conocer como leer o escribir en la eeprom.
pero eso lo dejare para otro dia.que ya se me hizo tarde.
« Última modificación: 22 de Agosto de 2010, 19:35:07 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: eeprom 25lc1024 y el 18F4550
« Respuesta #1 en: 23 de Agosto de 2010, 04:30:15 »
mu bueno¡¡¡ :-/ :-/

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: eeprom 25lc1024 y el 18F4550
« Respuesta #2 en: 23 de Agosto de 2010, 19:19:56 »
me alegro de que pueda ser util.

ahora voy a explicar como se escribe un dato en la memoria 25lc1024 y como actuan las señales aplicadas a esta.visualizadas en el osciloscopio.
solo explicare la lectura del dato.ya que es una de las señales que estan dentro del aspectro del osciloscopio.
comenzare por la ultima ejecucion.en este caso la lectura de un dato pregrabado.

este dato es el A5.y esta hubicado en la direccion 0h de la eeprom.

para leer un dato en la 25lf1024.segun el datasheet de este,hay que poner a nivel bajo el pin CS.
mandar el comando de lectura "valor 03h"  la direccion a leer.00h,00h,00h. y posteriormente poner a nivel alto el pin CS.
antes de poner cs a nivel alto,ya se habra recibido el dato A5.

para entender esto,hay que dirigirse a las señales del osciloscopio.
en este podemos ver que la señal CS "color verde" a sido puesto a nivel bajo.

siguiendo la linea de tiempo,vemos que la señal SI "color rojo" coincide con los dos ultimos bits de la señal de sincronismo CLK.
lo que esta sucediendo.es que estamos enviando a la eeprom el valor 03h.que es el comando de lectura de eeprom.

siguiendo la linea de tiempo vemos 3 trenes de impulsos tambien rojos.que son la direccion a leer.00h,00h,00h.=0h
la direccion 00h,00h,00h. es establecida ya que la señal SO.esta a cero en todo el transcurso de los tres trenes de impulsos.

el siguiente y ultimo tren de impulsos es destinado al sincronismo del dato a leer.en este caso tal y como eplique anteriormente,
el valor es 10100101=A5.

los trenes de impulsos,siempre hay que compararlos con SO u SI.dependiendo si estamos leyendo o escribiedo.y este procedimiento
es determinado segun el comando que hayamos enviado a la eeprom.teniendo en cuenta la activacion/desactivacion de CS.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: eeprom 25lc1024 y el 18F4550
« Respuesta #3 en: 24 de Agosto de 2010, 08:31:53 »
añadido a favoritos   ;-)  Gracias!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: eeprom 25lc1024 y el 18F4550
« Respuesta #4 en: 24 de Agosto de 2010, 10:54:23 »
no hay de que todopic.yo tambien estoy aprendiendo con estas explicaciones.

ahora voy a explicar como interpretar ese monton de valores que se ven en la ventana del SPI debugger.la verdad es que si no fuera por la lectura de las señales en el osciloscopio,nunca habria logrado entender esta herramienta.

empezare por los datos del final.
como vemos.en el SPI debugger hay unas flechas de color azul indicando direccion a la izquierda.datos reflejados en linea de color amarillo.
estos datos serian los presentes en el pin "SO" (Serial Out) que son los que la eeprom envia al microcontrolador.

tambien hay unas flechas de color cyan indicando direccion a la derecha.datos reflejados en linea de color rojo.
estos datos serian los presentes en el pin "SI" (Serial Input) que son los que la eeprom recive  del microcontrolador.

tambien vemos que las flechas tienen un signo +.este solo nos proporciona la opcion de ver cuando se realizo la lectura/escritura del byte.indicandonos el tiempo
exacto.

en la ventana del SPI debugger,vemos que las dos ultimas flechas tienen tiempos identicos.en este caso 12.082ms.
esto quere decir que que a la hora de analizar los datos,hay que hacerlo cojiendo las flechas en parejas.

bamos a analizar las dos ultimas parejas de lineas del SPI debugger.

03 FF  03 FF 00 00 00 00 00 A5   para la linea amarilla
00 05 00 05 00 03 00 00 00 00   para la linea roja

si nos imaginamos la sucesion de datos de las dos lineas de arriva.como indico en las lineas de abajo.y las comparamos con las señales del osciloscopio.
veremos la coincidencia de los datos.

03 FF  03 FF 00 00 00 00 00 A5   para la linea amarilla
ck ck  ck ck ck ck  ck ck ck ck    señal de sincronismo "azul"
00 05 00 05 00 03 00 00 00 00   para la linea roja

creo que lo he explicado bastante claro.pero si hay alguna duda,aqui estoy para aclararla.

saludos.










Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything