¿Cómo cambiar a entrada el PORT B?

Hola:

Utilizando un PIC16F88 con XT a 4 MHz quiero cambiar PORTA como salida y los PORTB como entradas.

No me deja cambiar el PORTB como entrada y no se que hago mal.

Código:
    BANKSEL    ANSEL
    movlw    b'00000000'
    movwf    ANSEL
    movlw    b'00100000'
    movwf    TRISA
    bcf        STATUS,RP1
    bcf        STATUS,RP0    
    movlw    b'11111111'     
    movwf    PORTB       ; Aquí ya debería usar el PORTB como entrada y se queda como salida.
Tampoco así:

Código:
    BANKSEL    ANSEL
    movlw    b'00000000'
    movwf    ANSEL
    movlw    b'00100000'
    movwf    TRISA
    movlw    b'11111111'
    movwf    TRISB
    bcf        STATUS,RP1
    bcf        STATUS,RP0    
    movlw    b'11111111'
    movwf    PORTB

Ni siquiera de esta manera:
Código:
BANKSEL    ANSEL
    movlw    b'00000000'
    movwf    ANSEL
    BANKSEL    TRISA
    movlw    b'00100000'
    movwf    TRISA
    BANKSEL    TRISA
    movlw    b'11111111'
    movwf    TRISB
    BANKSEL    PORTB    
    movlw    b'11111111'
    movwf    PORTB



Saludo.
 
Última edición:
Todo parece estar bien. Tanto PORTA como PORTB están muliplexados con el ADC y para poder usar los puertos como digitales se debe poner a 0 el bit correspondiente al canal de cada puerto en el registro ANSEL. Eso es lo que estás haciendo. Luego al poner a 0 algun bit de los TRISx se configura el puerto como salida y a 1 como entrada. Eso también es lo que haces.

Prueba de esta manera:

Código:
	bcf	STATUS,RP1
	bsf	STATUS,RP0	; cambio al banco 1
	clrf	ANSEL		; pines digitales
	clrf	TRISA		; PORTA como salida
	movlw	0xFF
	movwf	TRISB		; PORTB como entrada
	bcf	STATUS,RP0	; cambio al banco 0
	bsf	PORTB,0		; En este punto NO se debe encender el bit 0
				; del puerto B porque ya debe ser entrada
 
Última edición:
Te me adelantaste, intenté hacerlo así:

Código:
; __CONFIG ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬
;
; _CP_OFF:            Protección de código DESACTIVADO.
; _DEBUG_OFF:         Debug en circuito DESACTIVADO.
; _WRT_PROTECT_OFF:   Protección a escritura en memoria de programa DESACTIVADO.
; _CPD_OFF:           Protección de código de datos DESACTIVADO.
; _LVP_OFF:           Programación en baja tensión DESACTIVADO.
; _BODEN_OFF:         Reset por Brown-out DESACTIVADO.
; _MCLRE_ON:          Reset por pin externo ACTIVADO.
; _PWRTE_ON:          Retraso al reset ACTIVADO.
; _WDT_OFF:           Watchdog DESACTIVADO.
; _XT_OSC:            Oscilador externo del tipo XT.
;---------------------------------------------------------------------------------------
; _IESO_OFF:          Modo de intercambio de externo a interno DESACTIVADO.
; _FCMEN_OFF:         Monitor de CLK DESACTIVADO.

    BANKSEL    CMCON
    movlw    b'00000111' ; .7
    movwf    CMCON
    BANKSEL    ANSEL
    movlw    b'00000000' ; Configura todos los pines
    movwf    ANSEL        ; en entradas digitales.
    movlw    b'00000000' ; Todas las salidas
    movwf    TRISA        ; son digitales.
    movlw    b'11111111' ;
    movwf    TRISB        ; Son entradas digitales.
    BANKSEL    PORTB        ; Vuelve al banco 0.
    movlw    b'11111111'
    movwf    PORTB
    clrf    PORTA        ; Se asegura que el puerto A esté en cero.
¿No te faltó esto?

Código:
    BANKSEL    CMCON
    movlw    b'00000111' ; .7
    movwf    CMCON
Con tu código sería:
Código:
        bcf     STATUS,RP1
    bsf     STATUS,RP0    ; Cambio al banco 1.
        BANKSEL  CMCON
        movlw    b'00000111'    ; .7
        movwf    CMCON          ; Comparadores apagados.
    clrf     ANSEL        ; Pines digitales.
    clrf     TRISA        ; PORTA como salida.
    movlw     0xFF
    movwf     TRISB        ; PORTB como entrada.
    bcf     STATUS,RP0    ; Cambio al banco 0.

Eso espero...
 
Si BANKSEL no es lo que pienso: cambiar de banco 0 a banco 1 automáticamente, entonces resulta que nada de esto podría funcionar (según yo), porque antes de hablarles a los TRIS, es necesaroio cambiarse al banco 1, porque allí están esos registros.

Supongo que tienes seteados correctamente todos los bits necesarios para que actúen como entradas análogas o digitales, según como quieras.

Saludos!
 
Tienes razón Meta, no había tomado en cuenta los comparadores, que se desactivan cargando 7 a CMCON. Pero eso solo puede afectar al puerto A. El funcionamiento del puerto B solo se puede ver afectado por el ADC y poniendo a cero los bits del registro ANSEL todos los pines deben ser digitales.

Dime, ya funciona tu programa? Tu puerto A ya es salida y el B entrada?

Mi código entonces quedaría asi:

Código:
	bcf	STATUS,RP1
	bsf	STATUS,RP0	; Cambio al banco 1.
	movlw	0x07
	movwf	CMCON		; Comparadores apagados.
	clrf	ANSEL		; Pines digitales.
	clrf	TRISA		; PORTA como salida.
	movlw	0xFF
	movwf	TRISB		; PORTB como entrada.
	bcf	STATUS,RP0	; Cambio al banco 0.

Te puedes dar cuenta también que no uso la directiva BANKSEL, me parece más sencillo manejar directamente los bits RP0 y RP1 :LOL:
 
Última edición:
Si si funciona y muchas gracias a tod@s.

Lo del BANKSEL lo aconseja hasta los data sheet, lo usé para probarlo, estoy acostumbrado a tu método que lo he probado y si funciona. Por lo que he visto, recomiendan el BANKSEL para ir directamente.

ANSEL de 16F88 está en el BANK 1 y el 16F886 en el BANK 4. Si pongo BANKSEL lo buscará directamente. Está bien por si quieres portar código o librerías completas a otro PIC y sea más cómodo posible.

PD:
Hicieste un Blog http://programarpics.blogspot.com/ también empecé así y ahí ando poco a poco, si quieres actualizar el Blog poco a poco me avisas que nos afiliamos nuestros enlaces. Ya lo hice, así nos visitarán más unos a otros.
 
Última edición:
Tienes razón, casi todos los ejemplos (si no es que todos) del data sheet usan BANKSEL pero me gusta mas manejar directamente el registro STATUS. Lo prefiero asi porque el código resulta un poco más compacto, y digo un poco porque tal vez no se note mucho, pero cuando quieres hacer una aplicación más o menos grande en un pic16 con poca memoria cada instrucción que te ahorres cambiando de registro es una instrucción que puedes usar para algo más. Tal vez estoy equivocado pero creo que BANKSEL genera dos líneas de código siempre para modificar los bits RP0 y RP1, cuando si quieres cambiar del banco 0 al 1 solo hace falta modificar el bit RP0.

Pero bueno, esto ya se está saliendo de tema. Que bueno que lo solucionaste. ¿Podrías decir al final que crees que era lo que no funcionaba?

Sobre intercambiar enlaces me parece buena idea, pero más adelante porque ese blog en blogspot no lo he actualizado desde que lo empecé :p
 
No me funcionaba por los comparadores que no lo había configurado. BANKSEL es una directiva y si generea códigos del RP0 y RP1. Sólo está bien si tienes intención de portar en otro PIC, tema muy recomendable, aunque no creas que lo vayas hacer, nunca se sabe.

PD: No te olvide aportar informacón códigos y esquemas para lograr señales aquí, y gracias.
 
Atrás
Arriba