hola, aqui estoy con una dudilla, quiero poner a uno, un determinado bit de una cadena de bytes, por ej el bit3 del segundo registro de cuatro bytes, para ello utilizo un registro que incrementa cada vez que se llama a la rutina, que le deberia indicar que bit queremos modificar y este lo descompongo en bytes de tres bits; 2-0bit para saber cual de los 8 bits del registro; y de 5-3bit para saber a que registro, y cargar en fsr
; DECIMAL | BINARIO
; 0 | 00 000 000
; 1 | 00 000 001
; 2 | 00 000 010
; 3 | 00 000 011
; 4 | 00 000 100
; 5 | 00 000 101
; 6 | 00 000 110
; 7 | 00 000 111 ;8 BITS 1 REGISTRO
; 8 | 00 001 000
; 9 | 00 001 001
; 10 | 00 001 010
; 11 | 00 001 011
; 12 | 00 001 100
; 13 | 00 001 101
; 14 | 00 001 110
; 15 | 00 001 111 ;16 BITS 2 REGISTROS
; 16 | 00 010 000
; 17 | 00 010 001
; 18 | 00 010 010
; 19 | 00 010 011
; 20 | 00 010 100
; 21 | 00 010 101
; 22 | 00 010 110
; 23 | 00 011 111 ;24 BITS 3 REGISTROS
; 24 | 00 011 000
; 25 | 00 011 001
; 26 | 00 011 010
; 27 | 00 011 011
; 28 | 00 011 100
; 29 | 00 011 101
; 30 | 00 011 110
; 31 | 00 011 111 ;32 BITS 4 REGISTRO
lo descompongo de esta forma para conocer a que registro pertenece
SELECTION_REG
BANKSEL N_BUTON_CON ;GUARDA N_BUTON_CON EN SU REGISTRO DE TRABAJO
MOVF N_BUTON_CON,W
ANDLW B'00111000' ;CON ESTO SE ASEGURA QUE SOLO HAYA HASTA 8 REGISTROS A LA SALIDA
MOVWF N_BUTON_NOTE
BCF STATUS,C ;LO ROTA 3 VECES A LA DERECHA PARA CONOCER A QUE REGISTRO PERTENECE
RRF N_BUTON_NOTE
BCF STATUS,C
RRF N_BUTON_NOTE
BCF STATUS,C
RRF N_BUTON_NOTE
MOVF N_BUTON_NOTE,W ;N_BUTON A W
ADDLW ARRAY_LED_CH1 ;LO SUMA CON LA POSICION DE LOS REGISTROS PARA LOS LED
MOVWF FSR ;Y LO GUARDA EN FSR, INDF YA APUNTA AL REGISTRO PARA LOS LED
BANKISEL ARRAY_LED_CH1
PAGESEL TABLA_LEDS
CALL TABLA_LEDS ;DE 0-7 SELECCIONA QUE BOTON DEL REGISTRO FUE PULSADO PARA SACAR LOS DATOS A LOS LED
PAGESEL TECLA
RETURN
y para conocer el bit y seleccionar el que necesito que se ponga a cero o uno uso esta tabla
TABLA_LEDS
MOVF N_BUTON_CON,W
ANDLW B'00000111' ;CREO QUE DE ESTA FORMA PODEMOS HAYAR DEL 0 A 7 CUAL ES PARA DIVIDIR EL Nº DE BOTONES EN MULTIPLOS DE 8
ADDWF PCL,F
DT B'10000000', B'01000000', B'00100000', B'00010000', B'00001000', B'00000100', B'00000010', B'00000001'
de momento al salir de la tabla estoy moviendo el resultado completo al registro indf, una vez haya consegido poner a uno determinado led, usaré xorwf e iorwf para poner a uno o cero el resultado en el registro, pero de momento no me esta funcionando
. el caso es que si en vez de seleccionar el bit asi, lo hago directamente, cargando un valor sobre los registros, el micro los saca a los led sin problema, pero cuando utilizo esta rutinilla, saca lo que le da la gana de forma aleatoria, he revisado cambios de pagina en los saltos, cuando va, vuelve, bankisel, bancos y la unica forma de poner en el registro ha sido a mano: movlw b'¿?' movwf al_registro_en_cuestion, creo que algo se me escapa al descomponer el numero, como lo hariais para seleccionar un bit de entre bytes, a partir del valor de un registro?? aunque si veis bien esta forma de hacerlo, sigo buscandole los pies al gato y ver en donde se lia
un saludo
PD.no he subido el programa completo, por no liar mas la cosa, pero si lo veis necesario