Tablas indexado de 8 bits.

Hola:

Como pueden ver el código de abajo. Se utiliza 3 bits de entrada para una tabla de la verdad. 8 Configuraciones en total. Está muy bien para hacer un decoder. Viendo que quiero hacer uno de 8 bits, 8 entradas para la tabla de la verdad, obtiene 256 Configuraciones. Tardaría años en configurarlas todas. No quiero usar TTL decoder a parte, sólo con PIC.

¿Existe una manera de hacer esta tabla sin tardar demasiado tiempo en hacer 256 configuraciones?

El ejemplo de abajo son de 8 configuraciones y no me parece mucho, pero 256 es la eternidad.


Código:
; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; -    Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
;    SR, Sonda de Rebose (RA2).
; -    Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
;    Alarma (RB4).
;
; Su funcionamiento: 
; -    Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
;    se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; -    Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
;     depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; -    Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
;    B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; -    Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
;    quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; -    Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
;    ejemplo que se active la sonda de rebose y no active la de vacío) se paran
;    las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ...          ... RB0
; ------------|--------------------------------
;  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
;  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1. Estado "Llenandose").
;  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
;  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
;  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
;  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
;  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
;  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    clrf    PORTB                ; Debe estar a cero cuando el puerto se configure como salida.
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; 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

    END

Un cordial saludo.
 
Usa la instrucción retlw en lugar de los goto´s

solo harías la tabla con los valores que necesitas.

Saludos!
 
tambien se puede utilizar un puntero

El acumulador apunta a la posicion donde hay el dato en la memoria de programa


Main:
MOVF DyT,W ; 3 ;indico la posicion de la tabla donde esta el dato
CALL NumTbl ;13
.......... ;Ya tengo el dato de la tabla en el registro W listo para usarlo
______________________________________
NumTbl ADDWF PCL
RETLW B'1111110'
RETLW B'0110000'
RETLW B'1101101'
RETLW B'1111001'

Aqui tienes un magnifico ejemplo de como trabajar de forma eficiente con tablas en la memoria de programa. Maxima velocidad, minimo programa
http://www.nomad.ee/PIC/clockpic.zip
 
Hola:

Una cosa quiero dejar claro. En cada lectura de la tabla del ejemplo que puse arriba, si detecta ciertas entradas va hacia el goto. La manera como lo has puesto, ¿se puede hacer igual pero más resumido como indicas?

No quiero que se comporte como le de la gana.

Muchísimas gracias por tu tiempo.
 

Y para que quieres toda la tabla.
Segun el analisis que yo he hecho solo son validas las siguentes combinaciones

0000 0000 Vacio
0000 0001 Poco lleno
0000 0011 Un poco mas
0000 0111 Todavia mas
0000 1111 A medio llenar
0001 1111 Un poco mas de medio
0011 1111 Tres cuartos de lo mismo
0111 1111 Lleno
1111 1111 Rebose

Cualquier combinacion donde haya un uno en cualquier bit y haya un cero en un bit de menos peso tendria que indicar error en niveles.
Ahora sólo queda decidir donde arranca la bomba1 y donde la bomba2.
Yo lo veo asi de sencillo, igual estoy equivocado
 
Al final veo que se puede hacer, menos mal, ya me estaba asustando pero no se me ha ido del todo.

Da valores en la configuración, pero dentro de la (Configuración 0) por poner un ejemplo, qiero poner este trozo de código para que el LCD muestre mensajes.




Código:
    call    LCD_LineaEnBlanco
    call    LCD_Linea1
    movlw    Mensaje1_1
    call    LCD_Mensaje
    call    LCD_LineaEnBlanco
    call    LCD_Linea2
    movlw    Mensaje1_2
    call    LCD_Mensaje            
    goto    ActivaSalida


Código:
; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM. Por
; ejemplo, la tabla será de 3 entradas y 6 salidas:
; 
;         C  B  A  | S5  S4  S3  S2  S1  S0
;         -----------|---------------------------
;         0   0   0   |   0    0    1    0    1    0    ; (Configuración 0).
;         0   0   1   |   0    0    1    0    0    1    ; (Configuración 1).
;         0   1   0   |   1    0    0    0    1    1    ; (Configuración 2).
;         0   1   1   |   0    0    1    1    1    1    ; (Configuración 3).
;         1   0   0   |   1    0    0    0    0    0    ; (Configuración 4).
;         1   0   1   |   0    0    0    1    1    1    ; (Configuración 5).
;         1   1   0   |   0    1    0    1    1    1    ; (Configuración 6).
;         1   1   1   |   1    1    1    1    1    1    ; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtendrán del puerto B: RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1)
; y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                        ; El programa comienza en la dirección 0.
Inicio
    bsf        STATUS,RP0                ; Acceso al Banco 1.
    clrf    TRISB                    ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'                ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0                ; Acceso al Banco 0.
Principal
    movf    PORTA,W                    ; Lee el valor de las variables de entrada.
    andlw    b'00000111'                ; Se queda con los tres bits bajos de entrada.
    call    TablaVerdad             ; Obtiene la configuración de salida.
    movwf    PORTB                    ; Se visualiza por el puerto de salida.
    goto     Principal

; Subrutina "TablaVerdad" ---------------------------------------------------------------
;
TablaVerdad
    addwf    PCL,F
    retlw     b'00001010'                ; (Configuración 0).
    retlw     b'00001001'                ; (Configuración 1).
    retlw     b'00100011'                ; (Configuración 2).
    retlw     b'00001111'                ; (Configuración 3).
    retlw     b'00100000'                ; (Configuración 4).
    retlw     b'00000111'                ; (Configuración 5).
    retlw     b'00010111'                ; (Configuración 6).
    retlw     b'00111111'                ; (Configuración 7).

    END
Código:
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; Máscara para quedarse con valor de sensores.
    call    Estado
    movwf    PORTB                ; Resultado se visualiza por el puerto de salida.
    goto     Principal

; Subrutina "Estado" --------------------------------------------------------------------
;
Estado
    addwf    PCL,F
    retlw    b'01100001'            ; Entrada "Vacio".
    retlw    b'01100010'            ; Estado "Llenándose".
    retlw    b'00010000'            ; Estado "Alarma".
    retlw    b'00100100'            ; Estado "Lleno".
    retlw    b'00010000'            ; Estado "Alarma".
    retlw    b'00010000'            ; Estado "Alarma".
    retlw    b'00010000'            ; Estado "Alarma".
    retlw    b'00001000'            ; Estado "Rebose".

    END
Gracias por la ayuda.


Edito:

Por lo que veo, mejor usar btfss anidados con sus gotos a los if else anidados.

Por cada btfss detecta un pin de entrada.

btfss PORTA,0
btfss PORTA,1
btfss PORTA,2
btfss PORTA,3
btfss PORTA,4
btfss PORTA,5
btfss PORTA,6
btfss PORTA,7

Otro ejemplo.


btfss PORTA,
goto Activado
goto Desactivado
...
...
...
Activado
Configuración 0
...
...
Desactivado
Configuración 1
...
...
 
Última edición:
Atrás
Arriba