Elegir algunos bit del puerto con el 16F84A

En el puerto B que lo tengo como entradas, sólo quiero coger los tres bit de mayor peso. Que son el RB7, RB6 y el RB5.

En el puerto B se recoge 01001101, cuando en realidad se desea coger el alguna configuración en los últimos bit de mayor peso como dije arriba.

¿cómo soluciono este problema?



Código:
Principal
	movf	PORTB,W				; Lee los sensores.
	andlw	b'11100000'			; Máscara para quedarse con el valor de los sensores.
	addwf	PCL,F				; Salta a la configuración adecuada.
	goto	Configuracion0
	goto	Configuracion1
	goto	Configuracion2
	goto	Configuracion3
	goto	Configuracion4
	goto	Configuracion5
	goto	Configuracion6
	goto	Configuracion7
Configuracion0
	movlw 	b'01100001'			; Estado "Vacio" (configuración 0).
	goto	ActivaSalida
Configuracion1
	movlw 	b'01100010'			; Estado "Llenándose" (configuración 1).
	goto	ActivaSalida
Configuracion2
	movlw 	b'00010000'			; Estado "Alarma" (configuración 2).
	goto	ActivaSalida
Configuracion3
	movlw 	b'00100100'			; Estado "Lleno" (configuración 3).
	goto	ActivaSalida
Configuracion4
	movlw 	b'00010000'			; Estado "Alarma" (configuración 4).
	goto	ActivaSalida
Configuracion5
	movlw 	b'00010000'			; Estado "Alarma" (configuración 5).
	goto	ActivaSalida
Configuracion6
	movlw 	b'00010000'			; Estado "Alarma" (configuración 6).
	goto	ActivaSalida
Configuracion7
	movlw 	b'00001000'			; Estado "Rebose" (configuración 7).
ActivaSalida
	movwf	PORTB				; Visualiza por el puerto de salida.
	goto 	Principal
 
Al principio del código enmascaras bien el puerto B, sin embargo despues sumas ese valor a PCL y asi saltas a la instruccion correspondiente, el problema es que para que eso funcione bien no solo ocupas enmascarar, ocupas acomodar lo que lees de alguna manera para que el codigo haga lo que tu quieres, yo haría esto:
Código:
swapf	PORTB,w
andlw	b'00001110'
movwf	REGTEMP
rrf	REGTEMP,f
movf	REGTEMP,w
addwf	PCL,f
...
La instruccion swapf intercambia lugar los nibbles del puerto b, luego enmascaras los bits que te importan y al final lo recorres una vez a la izquierda, asi si estas leyendo b'10100000' al final tendras b'00000101' que es lo que a ti te interesa.
 
pic-man dijo:
Al principio del código enmascaras bien el puerto B, sin embargo despues sumas ese valor a PCL y asi saltas a la instruccion correspondiente, el problema es que para que eso funcione bien no solo ocupas enmascarar, ocupas acomodar lo que lees de alguna manera para que el codigo haga lo que tu quieres, yo haría esto:
Código:
swapf	PORTB,w
andlw	b'00001110'
movwf	REGTEMP
rrf	REGTEMP,f
movf	REGTEMP,w
addwf	PCL,f
...
La instruccion swapf intercambia lugar los nibbles del puerto b, luego enmascaras los bits que te importan y al final lo recorres una vez a la izquierda, asi si estas leyendo b'10100000' al final tendras b'00000101' que es lo que a ti te interesa.

Lo que más me interesa que lea estos así enmascarado. b'11100000', los de nible alto. Los bajo que pueden variar de unos y ceros me da igual, que se ignoren.

Con los tres bit seleccionado o enmascarado podría tener 8 combinaciones diferentes, lo hice de otra manera pero con tres.



Código:
btfss	PORTB,5					; ¿Bit 5 del PORTB es igual a 1?, ¿Activado el interruptor RB5?
	goto	RB6						; No, salta a la línea siguiente.
	call	Retardo_5_min			; Tiempo Bombilla encendida 5 minutos.
RB6
	btfss	PORTB,6					; ¿Bit 6 del PORTB es igual a 1?, ¿Activado el interruptor RB6?
	goto	RB7
	call	Retardo_30_min			; Tiempo Bombilla encendida 30 minutos.
RB7
	btfss	PORTB,7					; ¿Bit 7 del PORTB es igual a 1?, ¿Activado el interruptor RB7?
	goto	Opcion_principal
	call	Retardo_1_hora			; Tiempo Bombilla encendida 1 hora.
	goto	Opcion_principal
 
Meta, parece que no entendiste, el código que puse es para que puedas leer los bits que a ti te interesan que son los tres bits mas significativos del nibble alto, pero los ordené en el nibble bajo para que pudieras usarlos en tu código.

La instrucción swapf intercambia los nibbles de lugar, es decir que si lees b'10100000' después de swapf tendrás b'00001010', luego con la instrucción rrf se recorre ese número hacia la derecha de modo que al final tengas b'00000101', exactamente el valor de los bits que te interesan pero ordenados de tal forma que puedas sumarlos al PCL y puedas saltar a una de las configuraciones adecuadas.
 
Lo que pasa es que no lo puedes hacer directamente, verás tu código es:
Código:
   andlw   b'11100000'         ; Máscara para quedarse con el valor de los sensores.
   addwf   PCL,F            ; Salta a la configuración adecuada.
   goto   Configuracion0
   goto   Configuracion1
   goto   Configuracion2
   goto   Configuracion3
   goto   Configuracion4
   goto   Configuracion5
   goto   Configuracion6
   goto   Configuracion7
si el numero que leyeras fuera b'10100000' al sumarlo con el PCL le estarías sumando un 80 así que la siguiente instrucción que se ejecutaría sería una 80 líneas adelante, tu despues de la suma con PCL solo tienes 8 opciones para las distintas configuraciones, es por eso que usando las instrucciones que te digo reacomodarías el número de tal manera que cuando tienes b'10100000' en realidad tendrias b'00000101', al sumarlo con PCL le sumarías 5 y ejecutarías la instrucción "goto Configuracion5".

Por eso te propuse ese código, si no lo quieres usar es cosa tuya.
 
Atrás
Arriba