Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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.
; 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.
No hay forma de hacero facilmente, a no ser que escribas un software especial para esa tarea.
He visto que lo quieres usar para hacer una automatización. La forma que estas usando para programar la automatización es puramentecombinacional. Como has podido comprobar, cuando aumenta el número de señales, se complica mucho. Además es dificil controlar y verificar todas las condiciones posibles.
Tienes que programar de forma secuencial, en base a estados. De esa forma, en cada estado, solo tienes en cuenta las variables de entrada que necesitas para pasar al estado siguinte e ignoras las demás. El programa queda mucho mas simple y es muy facil de depurar.
Estoy con heli, si no sabes cómo meterle mano te recomiendo que googlees algunas cosas básicas que vienen a decir lo mismo:
-diagrama de transición de estados (dte).
-automata finito determinista (afd's).
-maquina de mealy.
Por lo que comentas no creo que te salga una máquina de más de 4 o 5 estados como mucho. He programado agentes inteligentes a través de sus afds, pero a más alto nivel, mapeando el "grafo" en matrices y usando punteros a funciones para ejecutar los estados y demas cosas de esas de C C++.
Si te sirve te pongo en "pseudocódigo" la idea de cómo lo haría yo: usando una variable que codifique el estado actual (eactual) y después una subrutina o trozo de código asociado a cada estado.Como de cada estado te saldrá al menos un arco, y cada arco estará asociado a una variable(o una expresión lógica), siemplemente el código de cada estado lo que hace es comprobar si se cumple la condición del arco, de manera que si se cumple se actualiza el estado actual.
Te lo pongo todo juntito para no extender mucho la idea (E1=estado1, E2=estado2, etc). Suponemos que el estado inicial es E1, de éste salen 3 arcos, de E2 salen 2, etc...
INICIO
eatual<-E1;
while(1)
{
// Dormir o hacer cualquier cosa
leerSensores();
switch(eactual)
{
case E1:
// Hacer algo asociado al E1
if(condicionArco-1) then eactual<- E2;
if(condicionArco-2) then eactual<- E3;
if(condicionArco-3) then eactual<- E4;
break;
case E2:
//Hacer algo asociado a E2
if(condicionArco-4) then eactual<- E3;
if(condicionArco-5) then eactual<- E4;
break;
case E3:
........
}
}
FIN
Evidentemente en un estado sólo un arco puede ser "verdadero" a la vez (es DETERMINISTA). Lo que te quedaría es pasar a "ensamblador" el código, que no es más que jartarte de poner etiquetas, condicionales y gotos. Puedes aprovechar el bucle principal para mostrar por pantalla o enviar via serie el estado actual, etc.
Espero te sirva!
Porqué no usas una tabla (ejemplo de un código para iluminar un 7 seg):
movf numero;
call tabla;
movwf PORTD; suponemos que en el puerto D esta el display.
...
tabla:
addwf PCL,F ;PCL<-- PCL + w
retlw b'11000000'; regresa con 0 en 7 seg
retlw b'11111001'; regresa con 1 en 7 seg
retlw b'10100100'; regresa con 2 en 7 seg
retlw b'10110000'; regresa con 3 en 7 seg
retlw b'10011001'; regresa con 4 en 7 seg
retlw b'10010010'; regresa con 5 en 7 seg
retlw b'10000010'; regresa con 6 en 7 seg
retlw b'11111000'; regresa con 7 en 7 seg
retlw b'10000000'; regresa con 8 en 7 seg
retlw b'10010000'; regresa con 9 en 7 se
S2
Ranganok Schahzaman
Hola:
Ese es el problema, no liar la parda cambiando los contadores. En el primer ejemplo que puse, me pareció mucho poner los 256 configuraciones, sólo llegué a 53 y me cansé. A parte que no voy a utilizar las 256 combinaciones que hay usando los 8 pines de un puerto del PIC.
Como muestra el primer ejemplo.
Configuración0 Configuración1 Configuración2 Configuración3 Configuración4 Configuración5 Configuración6 Configuración7 Configuración8 Configuración9 Configuración10 Configuración11 Configuración12 Configuración13 Configuración14 Configuración15 Configuración16 Configuración17 Configuración18 Configuración19 Configuración20 Configuración21 Configuración22 Configuración23 Configuración24 Configuración25 Configuración26 Configuración27 Configuración28 Configuración29 Configuración30 Configuración31 Configuración32 Configuración33 Configuración34 Configuración35 Configuración36 Configuración37 Configuración38 Configuración39 Configuración40 Configuración41 Configuración42 Configuración43 Configuración44 Configuración45 Configuración46 Configuración47 Configuración48 Configuración49 Configuración50 Configuración51 Configuración52 Configuración53
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
No sólo desea activar salidas 1 y 0. También quiero añadirle más códigos.
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
Quiero insertarle más códigos como el ejemplo de abajo.
Configuracion0
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje3_1
call LCD_Mensaje
call LCD_Linea2
movlw Mensaje3_2
call LCD_Mensaje
movlw b'01100001' ; Estado "Vacio" (configuración 0).
goto ActivaSalida
Configuracion1
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje78_1
call LCD_Mensaje
call LCD_Linea2
movlw Mensaje5_msn
call LCD_Mensaje
movlw b'01100010' ; Estado "Llenándose" (configuración 1).
goto ActivaSalida
Configuracion2
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje4_1
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea2
movlw Mensaje4_2
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea3
movlw Mensaje3_1
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea4
movlw Mensaje3_2
call LCD_Mensaje
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
Lo azul es donde inyecté más códigos para ejecutar. Esta es la idea si usas sólo 8 Configuraciones, no es cuestión usar esa técnica si son 256 configuraciones, me da algo si lo hago, aunque estaba a punto de hacerlo, pero me entró depresión.
Por eso quiero buscar la mejor forma de usar un buen decoder solo usando las entradas que reconozca e ignora las que no conozcas y que se pueda poner más códigos en las configuraciones, no sólo una línea de código.
La otra opción que tengo es usar macros. No se usarlo mucho pero no se si se podrá al menos generar código necesario con ello.
Saludo.