TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: gsc 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
-
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
-
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
-
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
-
Ok, gracias voy a seguir probando.
Saludos
-
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 :