Autor Tema: un bit entre los bytes  (Leído 2320 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
un bit entre los bytes
« en: 18 de Mayo de 2009, 06:41:11 »
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
Código: [Seleccionar]
;     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
Código: [Seleccionar]
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
Código: [Seleccionar]
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 :x. 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
 

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: un bit entre los bytes
« Respuesta #1 en: 18 de Mayo de 2009, 18:52:13 »
Hola!

Mira, la rutina estaba bien, solo que la tabla me parece que estaba al reves.

Aca te paso las modificaciones. Si te entendi bien, esto debería funcionar:

Código: ASM
  1. ;ANTES: 0x21= 0xFF
  2. ;ENVIO VALOR: 00001111
  3. ;DESPUES: 0x21=0x7F
  4.          
  5.                 #INCLUDE <P16F877A.inc>
  6.          LIST P=16F877A
  7.  
  8.                 ERRORLEVEL      -302,-306
  9.  
  10. ARRAY_LED_CH1   EQU     0x20
  11. ;...
  12. N_BUTON_CON             EQU     0xF0
  13. N_BUTON_NOTE    EQU     0xF1  
  14.  
  15.                 ORG     0x000
  16.                 movlw   0xFF
  17.                 movwf   0x21                            ;rellenar posicion de la cual poder el bit7 a cero a continuacion
  18.                 movlw   b'00001111'                     ;Afectar(poner a cero) al bit 7 del byte 1 del buffer
  19.                 call    SELECTION_REG
  20.                 movf    0x21,W
  21.                 mowf    PORTB                           ;mostrar resultado en puertoB
  22.                 nop
  23.        
  24.  
  25. SELECTION_REG
  26.                 BANKSEL N_BUTON_CON                     ;GUARDA N_BUTON_CON EN SU REGISTRO DE TRABAJO
  27.                 movwf   N_BUTON_CON
  28.                 ANDLW   B'00111000'                     ;CON ESTO SE ASEGURA QUE SOLO HAYA HASTA 8 REGISTROS A LA SALIDA
  29.                 MOVWF   N_BUTON_NOTE
  30.  
  31.                 BCF             STATUS,C                        ;LO ROTA 1 VEZ A LA IZQ Y SWAPEA NIBBLES PARA CONOCER A QUE REGISTRO PERTENECE
  32.                 RLF             N_BUTON_NOTE,F
  33.                 SWAPF   N_BUTON_NOTE,F
  34.                
  35.                 MOVF    N_BUTON_NOTE,W                  ;N_BUTON A W
  36.                 BANKISEL        ARRAY_LED_CH1
  37.                 ADDLW   ARRAY_LED_CH1           ;LO SUMA CON LA POSICION DE LOS REGISTROS PARA LOS LED
  38.                 BTFSC   STATUS,C                        ;la suma excede la posición 0xFF de memoria?
  39.                 BSF             STATUS,IRP
  40.  
  41.                 MOVWF   FSR                                     ;Y LO GUARDA EN FSR, INDF YA APUNTA AL REGISTRO PARA LOS LED
  42.                 PAGESEL TABLA_LEDS
  43.                 CALL    TABLA_LEDS                      ;DE 0-7 SELECCIONA QUE BOTON DEL REGISTRO FUE PULSADO PARA SACAR LOS DATOS A LOS LED
  44.  
  45.                 xorlw   0xFF
  46.                 ANDWF   INDF,F                          ;Forzar bit de byte seleccionado a 0
  47.  
  48.                
  49.                 PAGESEL $
  50.                 RETURN
  51.  
  52.                 org             0x1000
  53. TABLA_LEDS
  54.                 MOVF    N_BUTON_CON,W
  55.                 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
  56.                 ADDWF   PCL,F
  57.                 DT      B'00000001', B'00000010', B'00000100', B'00001000', B'00010000', B'00100000', B'01000000', B'10000000'
  58.                
  59.                 END

Saludos.
« Última modificación: 18 de Mayo de 2009, 18:55:55 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: un bit entre los bytes
« Respuesta #2 en: 19 de Mayo de 2009, 07:17:07 »
Brunof si te tengo cerca te doy un beso,  :-/ :-/ ya funciona gracias, ahora a seguir trasteando, repasando y comparando a vers en donde andara el salto de pagina, o ande apunta el fsr del mio, u que se yo, que aunque me lo hayas solusionao, no voy a poder dormir pensando que andaba mal.
y

oLE, un saludo
« Última modificación: 19 de Mayo de 2009, 08:02:57 por alogic.on »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: un bit entre los bytes
« Respuesta #3 en: 21 de Mayo de 2009, 00:39:13 »
:D :D :D Me alegro amigo..


Pero al beso mejor lo dejamos para otra vida, eh? :D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: un bit entre los bytes
« Respuesta #4 en: 29 de Mayo de 2009, 03:15:03 »
Y sigo sin entender qué es eso del video...Parecería un sintetizador MIDI o una mezcladora con ecualizador?

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: un bit entre los bytes
« Respuesta #5 en: 29 de Mayo de 2009, 17:04:32 »
 eso es un controlador midi pa trastear. y tu, Brunof. te puedes atribuir mucho merito de ese juguete (y muchos otros de este foro) me habeis explicado unas (muchas) cuantas cosillas :mrgreen: esos profes¡¡¡  :-/ :-/ veis lo cabezota que soy al final funciona  :mrgreen:
no son mas que registros de desp74165 con pulsadores para entradas, mas reg. de desp.74595 para leds y displays y multiplexores 4051 para los potenciometros, y bueno un pic.
 y ya que nombras "sintetizador", ahoramismo estoy buscando info del sid6581 que me ha llegado un commodore64 para destripar  (WUOHAHAHA... :D) mañana empiezo con las placas y esta semana seguro que tengo que recurrir a vosotros. ya haré unas foticos

un saludo


 

anything