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