Autor Tema: Leer una flash con 16f628  (Leído 2391 veces)

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

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Leer una flash con 16f628
« en: 24 de Septiembre de 2007, 22:06:25 »
Hola todos,

Tube que cambiar de PIC por necesidad de mas memoria de programacion, usaba el 16f84a y pase al 16f628.
Despues de varias cambios pude hacerlo andar (el puerto A, la interrupcion, etc.). Pero el proyecto es leer un sensor de tarjetas de proximidad y grabar el codigo de la tarjeta en una flash 24lc256, cosa que con el 16f84a anda perfecto (siempre use la misma rutina y no tube problemas) pero ahora puedo escribirla, pero no leerla (lee todos 0).

El clock lo manejo con RA3 y el Dato por RA2.

Ya probe un monton de variantes, con esta rutina pero con el 16F84a anda pero con el f628 no.

La rutina es la siguiente:

( la secuencia para leer un dato es:

        call   read          ;ingreso addrl y addrh
        call   read3        ;me devuelve el dato en la posicion de memoria DATO
        call   rdstop       ;finaliza la lectura  )


   

   ;**********************************************************************************
   ; Rutina para leer secuencialmente x cantidad de datos
   ; de una memoria FLASH
   ;**********************************************************************************
   ;
   ;   CLOCK     Ra3   ---> SCL
   ;   data/addr Ra2   ---> SDA
   ;
   ;   dato a leer       ---> dato
   ;   address high    ---> addrh
   ;   address low     ---> addrl
   ;
   ;**********************************************************************************
   ;Para leer un dato de una memoria FLASH 24C512 se debe tener
   ;en cuenta los soguientes pasos
   ;



read   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo puerto A Ra2 -> SDA  Salida
   movwf   trisa      ;               Ra3 -> CLK  Salida
   bcf   status,5   ;bank 0

   ;-------------------------------
   ;Condicion de NOT BUSY - START

   bsf   ptoa,3      ;Condicion NOT BUSY    (1)
   bsf   ptoa,2      ;          (1)

   bcf   ptoa,2      ;Condicion de START    (1->0)
   bcf   ptoa,3      ;dato 1-0 mientras clk 1 (0)


   ;-------------------------------
   ;BYTE de CONTROL

   bsf   ptoa,2      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptoa,2      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;CONTROL BIT R/W (grabar)(0)   
   call   pclock      ;Pulso de Clock

   bsf   status,5   ;bank 1
   movlw   b'00010111'   ;Seteo Ra2 entrada
   movwf   trisa      ;
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock

read12   movf   ptoa,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'00000100'   ;dejo pasar Ra2
   btfss   status,2   ;
   goto   read12      ;

   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo Ra2 salida
   movwf   trisa      ;
   bcf   status,5   ;bank 0

   
   ;-------------------------------
   ;ENVIO de ADDRH

read1   movlw   8
   movwf   bitt
   
read11   rlf   addrh,1      ;rotar addrh izq por carry
   btfss   status,0   ;carry=1
   bcf   ptoa,2      ;Axx            (0)   
   btfsc   status,0   ;carry=0
   bsf   ptoa,2      ;Axx            (1)   

   call   pclock      ;Pulso de Clock
   
   decfsz   bitt,1
   goto   read11
   rlf   addrh,1      ;rotar addrh para dejarlo como estaba

   bsf   status,5   ;bank 1
   movlw   b'00010111'   ;Seteo Ra2 entrada
   movwf   trisa      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock

read13   movf   ptoa,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'00000100'   ;dejo pasar Ra2
   btfss   status,2
   goto   read13

   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo Ra1 salida
   movwf   trisa      
   bcf   status,5   ;bank 0


   ;-------------------------------
   ;ENVIO de ADDRL

read2   movlw   8
   movwf   bitt
   
read22   rlf   addrl,1      ;rotar addrh izq por carry
   btfss   status,0   ;carry=1
   bcf   ptoa,2      ;Ax            (0)   
   btfsc   status,0   ;carry=0
   bsf   ptoa,2      ;Ax            (1)   

   call   pclock      ;Pulso de Clock
   
   decfsz   bitt,1
   goto   read22
   rlf   addrl,1      ;rotar addrl para dejarlo como estaba

   bsf   status,5   ;bank 1
   movlw   b'00010111'   ;Seteo Ra2 entrada
   movwf   trisa      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock para ACK

read23   movf   ptoa,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'00000100'   ;dejo pasar Ra2
   btfss   status,2
   goto   read23

   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo Ra2 salida
   movwf   trisa      
   bcf   status,5   ;bank 0


   ;-------------------------------
   ;fin de posicion de address
   ;-------------------------------
   ;Condicion de NOT BUSY - START

   bsf   ptoa,3      ;Condicion NOT BUSY    (1)
   bsf   ptoa,2      ;          (1)

   bcf   ptoa,2      ;Condicion de START    (1->0)
   bcf   ptoa,3      ;dato 1-0 mientras clk 1 (0)


   ;-------------------------------
   ;BYTE de CONTROL

   bsf   ptoa,2      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptoa,2      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptoa,2      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptoa,2      ;CONTROL BIT R/W (leer)  (1)   
   call   pclock      ;Pulso de Clock

   bsf   status,5   ;bank 1
   movlw   b'00010111'   ;Seteo Ra2 entrada
   movwf   trisa      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock para ACK

read14   movf   ptoa,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'00000100'   ;dejo pasar Ra2
   btfss   status,2
   goto   read14

   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo Ra2 salida
   movwf   trisa      
   bcf   status,5   ;bank 0


   return

   ;-------------------------------
   ;Recepcion de DATO


read3   bsf   status,5   ;bank 1
   movlw   b'00010111'   ;Seteo Ra2 entrada
   movwf   trisa      
   bcf   status,5   ;bank 0

   movlw   0
   movwf   dato

   ;---------------------------------------
   ;Captura del bit 7 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt
   
   btfss   bitt,2
   bcf   dato,7      ;si el dato recibido es 0 seteo el bit 7 en 0
   btfsc   bitt,2
   bsf   dato,7      ;si el dato recibido es 1 seteo el bit 7 en 1

   bcf   ptoa,3      ;

   ;---------------------------------------
   ;Captura del bit 6 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

    btfss   bitt,2      ;
   bcf   dato,6      ;si el dato recibido es 1 seteo el bit 6 en 1
   btfsc   bitt,2
   bsf   dato,6      ;si el dato recibido es 0 seteo el bit 6 en 0

   bcf   ptoa,3      ;

   ;---------------------------------------
   ;Captura del bit 5 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,5      ;si el dato recibido es 1 seteo el bit 5 en 1
   btfsc   bitt,2
   bsf   dato,5      ;si el dato recibido es 0 seteo el bit 5 en 0

   bcf   ptoa,3      ;


   ;---------------------------------------
   ;Captura del bit 4 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,4      ;si el dato recibido es 1 seteo el bit 4 en 1
   btfsc   bitt,2
   bsf   dato,4      ;si el dato recibido es 0 seteo el bit 4 en 0

   bcf   ptoa,3      ;


   ;---------------------------------------
   ;Captura del bit 3 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,3      ;si el dato recibido es 1 seteo el bit 3 en 1
   btfsc   bitt,2
   bsf   dato,3      ;si el dato recibido es 0 seteo el bit 3 en 0

   bcf   ptoa,3      ;


   ;---------------------------------------
   ;Captura del bit 2 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,2      ;si el dato recibido es 1 seteo el bit 2 en 1
   btfsc   bitt,2
   bsf   dato,2      ;si el dato recibido es 0 seteo el bit 2 en 0

   bcf   ptoa,3      ;


   ;---------------------------------------
   ;Captura del bit 1 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,1      ;si el dato recibido es 1 seteo el bit 1 en 1
   btfsc   bitt,2
   bsf   dato,1      ;si el dato recibido es 0 seteo el bit 1 en 0

   bcf   ptoa,3      ;


   ;---------------------------------------
   ;Captura del bit 0 de dato

   bsf   ptoa,3      ;Pulso de CLOCK

   movf   ptoa,0
   movwf   bitt

   btfss   bitt,2      ;
   bcf   dato,0      ;si el dato recibido es 1 seteo el bit 1 en 1
   btfsc   bitt,2
   bsf   dato,0      ;si el dato recibido es 0 seteo el bit 1 en 0

   bcf   ptoa,3      ;


   ;----------------------------------------

   bsf   status,5   ;bank 1
   movlw   b'00010011'   ;Seteo Ra2 salida
   movwf   trisa      
   bcf   status,5   ;bank 0
   

   return

   ;----------------------------------------
rdstop   ;Condicion de STOP para fin de lectura


   bcf   ptoa,2      ;DATO en Low
   bsf   ptoa,3      ;Condicion de STOP
   bsf   ptoa,2      ;dato 0-1 mientras clk 1

   bcf   ptoa,3      ;clock 0



   return



Bueno, es un poco larga pero funciona.   Lo que no se si es un problema de soft o hard.

Cualquier ayuda se los agradezco.

Saludos

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Leer una flash con 16f628
« Respuesta #1 en: 24 de Septiembre de 2007, 22:27:55 »
Hola el pin 3 del puerto a creo que es uno de los comparadores.
Por lo que tengo leido al pasar de 16f84 a 16f628 este es un problema bastante comun y en ese codigo no tienes desactivado el comparador, tienes que poner cmcon a 7 al principio para desactivarlo.

Yo no tengo mucha idea de asm pero te pongo un trozo de codigo de un porgrama para que veas.
INICIO   bcf   STATUS,RP0   ;banco 0   
bcf   STATUS,RP1   
movlw   .7   
movwf   CMCON   
BSF    STATUS,RP0   ;Banco 1   
BCF    STATUS,RP1

A ver si asi se te soluciona suerte :D

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Re: Leer una flash con 16f628
« Respuesta #2 en: 24 de Septiembre de 2007, 23:47:10 »
Gracias Gorgonas por interesarte, yo al comienzo del programa ya lo habia echo pero no se si se esta desactivando realmente.
El codigo que utilizo es este (que si no me equivoco es similar)

(esto es una parte del comienzo, es donde preparo los puertos)


                bsf            status,5                    ;activa la pagina 1   
                movlw       b'11111111'              ;Puerto A 0 Salidas  1 Entradas (Coloco como entradas)
                movwf       trisa                         ;
                bcf            status,5                    ;volvemos a la pagina 0

                movlw       b'00000111'              ; comparadores desactivados,
                movwf       cmcon                      ; I/O digitales.

                bsf            status,5                    ;   
                movlw       b'11111111'              ;Puerto B
                movwf       trisb                         ;
                bcf            status,5                     ;


Por el tipo de falla, creo que podes tener razon que esta sea la falla, pero no se que probar
Si se te ocurre algo avisame

Gracias


Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Leer una flash con 16f628
« Respuesta #3 en: 25 de Septiembre de 2007, 00:03:48 »
No lo que has puesto tu es lo mismo, si lo has puesto pues no es eso ;) habra que ver otras cosas entonces... Revisa los fuses tb por si acaso, yo con el codigo si que no puedo ayudarte nada, ya que asm estoy aprendiendo :p

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Re: Leer una flash con 16f628
« Respuesta #4 en: 25 de Septiembre de 2007, 00:06:29 »
Ok, gracias voy a seguir probando.

Saludos

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Leer una flash con 16f628
« Respuesta #5 en: 25 de Septiembre de 2007, 00:36:18 »
Estaba viendo el datasheet del 16f628 y a parte de desactivar los comparadores que son los pines 3 y 4 del puerto A el pin 2 del puerto A es el de vref, la referencia del voltaje para la comparacion. Que tambien tienes que desactivarla, pero no se como se hara en asm.
Podrias cambiar los pines de entrada para ver si te sigue pasando lo mismo o no :