Vous êtes sur la page 1sur 25

Benemérita Universidad Autónoma

de Puebla

Facultad de Ciencias de la Electrónica

Ingeniería de Mecatrónica

Diseño de un Controlador Difuso


Alumno:

Luis Oscar Lara Lozano


Objetivo
En este trabajo se presenta el desarrollo de un controlador difuso para un robot móvil, el cual
la implementación de dicho control se llevará acabo mediante un microcontrolador PIC. El
trabajo se desarrolla mediante simulaciones utilizando la herramienta de “fuzzy logic” del
software MATLAB y también MPLAB IDE de Microchip.

Introducción
En los últimos años los sistemas difusos se han convertido en una herramienta útil para tratar y
modelar sistemas de control no lineales. El control difuso se ha transformado en una
alternativa muy útil para la realización de este, dicha alternativa permite, mediante el
conocimiento de una o varias personas, generar un conocimiento previo que podrá dar la
capacidad al sistema de tomar decisiones sobre ciertas circunstancias que se presenten en el
funcionamiento.
En este trabajo se da una breve introducción a los sistemas difusos, para crear posteriormente
un ejemplo básico de un controlador mediante un robot móvil.

Lógica Difusa
Introducción
El concepto de lógica difusa se basa en emular la manera en que el cerebro razona o piensa,
esta permite tratar información imprecisa, en términos de conjuntos difusos. La teoría de
conjuntos difusos parte de la teoría clásica de conjuntos, la lógica difusa esencialmente es una
lógica multievaluada que extiende a la lógica clásica.
En esta última se imponen únicamente dos posibles valores, teniendo así valores de verdadero
o falso, obteniendo un conjunto dado por:

Conjuntos Difusos
A diferencia de un conjunto clásico, a un conjunto difuso se le asocia un determinado valor
lingüístico definido por un adjetivo o palabra. A este conjunto se le define una función que
indica el grado de pertenencia a un conjunto, a estos valores se le denominan función de
pertenencia o de inclusión (membership function).

En términos matemáticos, un conjunto difuso F en U queda caracterizado por una función de


inclusión que toma valores en el rango de [0,1], es decir, ; donde
representa el grado en el que pertenece al conjunto difuso F. De esta forma el valor de
una función de pertenecía puede tomar los distintos valores como:
Para la definición de estas funciones de pertenencia se utilizan convencionalmente ciertas
familias de formas estándar, las mas frecuentes son la función de tipo trapezoidal, singleton,
triangular, S, exponencial y tipo π.

Las funciones que utilizaremos para este control difuso son de tipo trapezoidal y tipo
triangular, de los cuales solo nos enfocaremos a ver estas 2 funciones.

La función de tipo trapezoidal se define por cuatro puntos a, b, c, d. Esta función es cero para
valores menores de a y mayores de d, valen uno entre b y c, y toma valores en [0,1] entre a y
b, y entre c y d. Se utilizan habitualmente en sistemas difusos sencillos, pues permite definir un
conjunto difuso con pocos datos, y calcular su valor de pertenencia con pocos cálculos.
µ

1.0

Función de pertenencia de tipo


trapezoidal

u
0

a b c d
Esta función esta definida por:

La función de tipo triangular es una función adecuada para modelar propiedades con un valor
de pertenencia distinto de cero para un rango de valores estrechos en torno a un punto b.

µ
1.0
Función de pertenencia
de tipo triangular

u
0

a b c
Y esta función esta definida por:

Variable Lingüística
Se denomina variable lingüística a aquella que puede tomar por valor términos del lenguaje
normal, como: mucho, poco, positivo, negativo, etc., estas son las palabras que desempeñan el
papel de etiquetas en un conjunto difuso. En términos más comunes, una variable lingüística
se puede definir por (A, T(A)), donde A es el nombre de la variable y T(A) es el conjunto de
términos que nombran los valores x que puede tomar A.

Para entender un poco mejor este concepto se cita el siguiente ejemplo que permitirá
comprender el sentido de este término. Por ejemplo: Temperatura se puede considerar una
variable lingüística, de modo que A=temperatura. T(Temperatura) es el conjunto de todos los
términos que pueden hacer referencia a la temperatura, como muy fría, fría, normal, caliente y
muy caliente, de esta forma podemos expresar distintos rangos de valores dentro de una
variable.

Operaciones difusas
De la misma forma que los conjuntos clásicos, en los cuales se pueden generar distintos tipos
de operaciones, estas operaciones también se pueden generar en los conjuntos difusos. Para
ello se pueden definir tres operaciones básicas a estos conjuntos: el complemento, la unión y
la intersección. Estas operaciones básicas pueden expresarse de la siguiente manera en
términos de las funciones de pertenencia de los conjuntos difusos.

Sean los subconjuntos difusos dados por las etiquetas A y B, asociados a una variable
lingüística x, se puede obtener:

Complemento

Unión

Intersección
Reglas Difusas
Las reglas difusas combinan uno o más conjuntos difusos de entrada llamados premisas, y las
asocian con conjuntos difusos de salida, llamados consecuencias. Estas reglas permiten
expresar el conocimiento que se tiene sobre una relación y para poder denotar este
conocimiento de forma completa se precisan de varias reglas, que se agrupan formando lo que
se le conoce como una base de reglas.

Para generar una base de reglas se necesita una colección distinta de reglas que asocien las
entradas necesarias con las salidas a utilizar. Cada una de estas reglas se genera utilizando el
típico IF-THEN, en otras palabras tenemos que: “SI sucede una acción ENTONCES tendremos
una consecuencia”, este método se puede representar más claramente de la siguiente
manera:

Más adelante se presentara un ejemplo para que se comprenda de forma mejor estos
términos.

Defusificación
La defusificación es la función que transforma un conjunto o valores difusos en un conjunto o
valores no difusos (reales) [1].
Para generar una defusificación se pueden utilizar distintos métodos como son:

Defusificación por máximo de centros


Defusificación por media de centros
Defusificación por centro de área

Para este caso utilizaremos la defusificación por media de centros, que está definida por:

En donde son las diferentes reglas difusas que se tiene para el sistema y esta definido
como el valor dentro del rango de la variable, para la cual el área dentro de la grafica de la
función de membrecía “C” se divide en dos sub-áreas [1].
Control Difuso
Los sistemas expertos de control difuso basados en reglas, son conocidos como controladores
difusos, estos son sin duda la aplicación más extendida de la lógica difusa [1]. La estructura
típica de un controlador basado en un sistema difuso puede verse e la figura (1.1). Un primer
bloque realiza un preprocesado de las variables de entrada, que proporciona el vector de
entradas al controlador difuso. El controlador difuso aplica la entrada que recibe a la base de
reglas, para obtener la salida. Finalmente, esta salida puede requerir un procesado final, con el
fin de adecuarla al proceso que se tiene que controlar.

Acción Controlador difuso


Defusificación

Proceso controlado Interferencia difusa Base de reglas

Fusificación
Condición

Figura 1.1: Esquema de un controlador difuso

La estructura básica de un controlador difuso, consta de un primer elemento llamado


fusificador, que realiza la conversión de valores clásicos a términos difusos. Su salida es
utilizada por el dispositivo de inferencia difuso para aplicarla a cada una de la base de reglas,
siguiendo el método de inferencia adecuado. La salida de este bloque pueden ser conjuntos
difusos o bien un solo conjunto difuso. Finalmente, el defusificador transformará estos
conjuntos difusos en un valor no difuso o clásico. En general un controlador difuso es un
sistema experto, ya que utiliza información y conocimiento que provee un operador humano.
Desarrollo
Expuesto ya una breve introducción a lo que es la lógica difusa y sus conceptos básicos, ahora
el paso siguiente es desarrollar con cierto detalle un sencillo ejemplo de la aplicación de este
tema dentro de la electrónica.
El problema que nos plantearemos es lograr controlar un robot móvil, este robot tendrá un
sensor y 2 motores, su principal tarea es navegar en línea recta hasta que se encuentre un
objeto frente de él, el robot al detectar un obstáculo procesara la información de la distancia a
la que se encuentra dicho objeto y cambiara la velocidad de los motores dependiendo de la
distancia obtenida y la velocidad que tenia anteriormente el robot. Esta aplicación es sin duda
un control de lazo cerrado que proporcionara una retroalimentación de nuestro sistema y su
función principal es lograr que el robot móvil se aproxime lo más cercano posible al obstáculo
pero sin tocarlo, el sistema que se generará se muestra como en la siguiente figura:

Entrada Control difuso Salida

Detección de Control de
Sistema de control Motores
la distancia velocidad

Antes de que se prosiga, se aclara que este documento se enfoca a crear un controlador difuso
en un microcontrolador PIC, sin embargo, no se da enfoque a la detección de la distancia ni al
control de los motores, puesto que este es un tema diferente a lo que se plantea, no obstante,
se da una breve explicación de lo que se utilizo. Para la distancia se opto por ocupar un sensor
SRF05 [2]. Este sensor es un dispositivo electrónico que es capaz de medir distancias utilizando
ondas ultrasónicas. Para el control de la velocidad de los motores se utilizo un control de
modulación de ancho de pulso o por sus siglas en ingles PWM [3].

Para comenzar primero nombraremos nuestras variables lingüísticas para los conjuntos
difusos, entonces en este caso tenemos 2 que son: la primera es la DISTANCIA y la segunda es
la VELOCIDAD. Ahora nombraremos los diferentes conjuntos difusos para cada una de las
variables lingüísticas:

Distancia:
o Muy Cerca MC
o Cerca C
o Lejos L
o Muy Lejos ML

Velocidad:
o Muy Lenta MUL
o Lenta LE
o Rápida R
o Muy Rápida MR
Ya obtenido los conjuntos difusos necesarios para las 2 variables lingüísticas crearemos las
funciones de pertenencia necesarias en cada caso diferente.
Empezaremos primero con la DISTANCIA:

Para el conjunto difuso Muy Cerca vamos a ocupar


una función de tipo trapezoidal definida por:

Para el conjunto difuso Cerca ocuparemos una función


triangular definida por:

Para el conjunto difuso Lejos ocuparemos una función


triangular definida por:

Para el conjunto difuso Muy Lejos ocuparemos una


función trapezoidal definida por:

De la misma forma, crearemos las funciones de pertenencia para la VELOCIDAD:

Para el conjunto difuso Muy Lento vamos a ocupar


una función de tipo triangular definida por:

Para el conjunto difuso Lento ocuparemos una función


triangular definida por:

Para el conjunto difuso Rápido ocuparemos una


función triangular definida por:

Para el conjunto difuso Muy Rápido ocuparemos una


función trapezoidal definida por:
Los datos necesarios para generar cada uno de los diferentes funciones de pertenencia se creo
a partir de información recabada por distintas personas, he aquí el porque se piensa que la
lógica difusa es la forma en que razona una persona, puesto que lo que se hace, es recopilar
una base de datos generada a través de la experiencia de una persona sobre un tema en
específico.

Ya que se tiene toda esta información básica para el control difuso, lo que prosigue es generar
nuestra base de reglas y operaciones difusas, en este caso utilizaremos la operación de
intersección, y el formato de las reglas serán del tipo Mamdani, en el cual, tenemos lo
siguiente:

Intersección

En donde hace referencia a todos los diferentes valores que puede tomar la función de
pertenencia de la DISTANCIA, y a los valores de la VELOCIDAD.

Y el formato de tipo Mandani es el siguiente:

Entonces las reglas que propondremos serán:

Lo que se tiene aquí es un cuadro que nos representa las 16 reglas posibles que se podrán
generar, ya que contamos con 4 conjuntos de DISTANCIA y 4 conjuntos de VELOCIDAD, en si
4x4=16, por esto tenemos las 16 reglas posibles. A continuación enunciaremos cada una de
estas reglas por separado:

R1 = Si DISTANCIA = MC y VELOCIDAD = MUL VELOCIDAD = MUL


R2 = Si DISTANCIA = C y VELOCIDAD = MUL VELOCIDAD = L
R3 = Si DISTANCIA = L y VELOCIDAD = MUL VELOCIDAD = R
R4 = Si DISTANCIA = ML y VELOCIDAD = MUL VELOCIDAD = MR

R5 = Si DISTANCIA = MC y VELOCIDAD = LE VELOCIDAD = MUL


R6 = Si DISTANCIA = C y VELOCIDAD = LE VELOCIDAD = L
R7 = Si DISTANCIA = L y VELOCIDAD = LE VELOCIDAD = R
R8 = Si DISTANCIA = ML y VELOCIDAD = LE VELOCIDAD = MR

R9 = Si DISTANCIA = MC y VELOCIDAD = R VELOCIDAD = MUL


R10 = Si DISTANCIA = C y VELOCIDAD = R VELOCIDAD = L
R11 = Si DISTANCIA = L y VELOCIDAD = R VELOCIDAD = R
R12 = Si DISTANCIA = ML y VELOCIDAD = R VELOCIDAD = MR
R13 = Si DISTANCIA = MC y VELOCIDAD = MR VELOCIDAD = MUL
R14 = Si DISTANCIA = C y VELOCIDAD = MR VELOCIDAD = L
R15 = Si DISTANCIA = L y VELOCIDAD = MR VELOCIDAD = R
R16 = Si DISTANCIA = ML y VELOCIDAD = MR VELOCIDAD = MR

Una vez que tenemos todos los datos para generar el controlador difuso, lo que siguiente que
haremos es simular estos datos para verificar si las funciones de pertenencia son adecuadas y
si el control difuso será el correcto.

Para esto utilizaremos una herramienta de MATLAB conocida como “Fuzzy Tool”, esta
herramienta nos permite generar una simulación del controlador difuso que queremos crear,
como se puede apreciar en la figura 2.1, se presenta una imagen de la ventana principal de la
herramienta fuzzy tool, en la cual tenemos las reglas en el formato Mamdani, como entrada
tenemos la DISTANCIA y la VELOCIDAD y como salida también tenemos la VELOCIDAD a causa
de que este es un control de lazo cerrado, también se puede observar que en la defusificacion
se tiene el método de la media de centros o centroide.
En la figura 2.2 se presenta una ventana que contiene los distintos valores de pertenencia para
la variable DISTANCIA.

En la figura 2.3 se muestran los distintos valores de pertenencia para la variable VELOCIDAD
En la herramienta de MATLAB existe un apartado donde se selecciona el tipo de reglas a
utilizar, esta ventana se muestra en la figura 2.4, aquí se puede observar las distintas reglas
que creamos anteriormente.

Una forma de simular un controlador difuso en esta herramienta es utilizando el visor de


reglas, este visor nos permite modificar los valores que tengamos a la entrada y observar el
valor de salida correspondiente, en sí, el visor de reglas ya tiene la programación difusa
necesaria para evaluar cada función de pertenencia de las variables lingüísticas, también
evalúa las reglas necesarias para poder procesar la información y después defusificarla, en
pocas palabras con esta herramienta no se tiene que preocupar por programar un control
difuso, solo es necesario introducir la información necesaria que se tenga.
Para conocer si el control difuso esta correcto, podemos analizar la grafica saliente que se
generará, esta gráfica toma los valores necesarios y los representa visualmente, en este
ejemplo se puede observar que la gráfica es casi lineal, esto quiere decir que si la DISTANCIA se
encuentra muy lejos la VELOCIDAD será muy rápida, pero si la DISTANCIA es corta la
VELOCIDAD es menor, esto se puede observar en las siguientes imágenes:

Un punto importante, como se menciono anteriormente, es que la gráfica es casi lineal, esto se
puede observar porque en la gráfica se tienen ciertos puntos que los cuales aumenta o
disminuye, una solución a este problema es generar más funciones de pertenencia, esto
crearía mayor información al controlador difuso para que su resultado pueda ser exacto.

Obtenida la simulación y sabiendo que esta es correcta y funcional, ahora lo que necesitamos
es poder crear nuestro propio controlador para el robot móvil, una ventaja sería crear un
programa en una computadora, este puede ser en lenguaje “C”, Delphi, Basic o C++ etc. Esto
casi no provocaría ningún inconveniente ya que se cuenta con un procesador muy potente
dentro de la computadora, en cambio, una de las mayores desventajas generadas conlleva a
que el robot es móvil y no estático, pero si ocupamos una computadora esta tendría que estar
todo el tiempo en movimiento con el robot, lo que concibe un gran problema para su propio
desplazamiento.

Para resolver este problema se pensó en construir el controlador dentro de un


microcontrolador, los microcontroladores son circuitos integrados programables que incluyen
en su interior las tres unidades funcionales de una computadora: CPU, Memoria y Unidades de
E/S [3].
Haciendo uso de estos pequeños integrados reduciremos costos y generaremos mayor
versatilidad de movimiento para el robot móvil.
El circuito integrado que se escogió para esta tarea es un PIC18F458 de la familia alta de
microcontroladores de MICROCHIP [4]. Una ventaja que contienen estos microcontroladores
es que son capaces de poder programarse utilizando lenguaje C y Basic, pero para manipular al
máximo estos dispositivos se programara utilizando el lenguaje Ensamblador [5]. Este lenguaje
es de bajo nivel y constituye la representación más directa del código maquina, esto nos
posibilita la manipulación completa del hardware y así consumir menores recursos del
dispositivo controlado.

Programa del Controlador Difuso


El programa del controlador difuso en el microcontrolador PIC18F458 se enlista después, como
se puede notar el programa es algo largo pero muy efectivo, un aspecto desfavorable es que
los microcontroladores no manejan números flotantes, entonces lo que se ocupo en lugar de
manejar los números comprendidos en una función de pertenencia por:

Se cambio por los siguientes números:

El cambio manejado aquí no es relativamente importante, ya que al final de la defusificación,


se deberá multiplicar por otro número para generar así el cambio equivalente. También el
programa esta comentado en cada una de sus partes para que no haya problemas de
comprensión de lo que se esta generando, ahora el programa es el siguiente:
;--------------------------------------------------------------------------------------------------------------------------
;--PROGRAMA PARA GENERAR UN CONTROLADOR DIFUSO
;--PARA UN MICROCONTROLADOR
;--LUIS OSCAR LARA LOZANO
;--FECHA: 07/05/09

LIST P=18F458
#INCLUDE "P18F458.INC"
;--CONFIGURACION DE VARIABLES
VAR_DISTANCIA EQU 0X20 ;VARIABLE PARA LA DISTANCIA
VAR_VELOCIDAD EQU 0X21 ;VARIABLE PARA LA VELOCIDAD
VAR_MC EQU 0X22 ;VARIABLE PARA EL CONJUNTO DIFUSO "MUY CERCA"
VAR_C EQU 0X23 ;VARIABLE PARA EL CONJUNTO DIFUSO "CERCA"
VAR_L EQU 0X24 ;VARIABLE PARA EL CONJUNTO DIFUSO "LEJOS"
VAR_ML EQU 0X25 ;VARIABLE PARA EL CONJUNTO DIFUSO "MUY LEJOS"
VAR_MUL EQU 0X26 ;VARIABLE PARA EL CONJUNTO DIFUSO "MUY LENTO"
VAR_LE EQU 0X27 ;VARIABLE PARA EL CONJUNTO DIFUSO "LENTO"
VAR_R EQU 0X28 ;VARIABLE PARA EL CONJUNTO DIFUSO "RAPIDO"
VAR_MR EQU 0X29 ;VARIABLE PARA EL CONJUNTO DIFUSO "MUY RAPIDO"
VAR_R1 EQU 0X2A ;VARIABLE PARA LA REGLA 1
VAR_R2 EQU 0X2B ;VARIABLE PARA LA REGLA 2
VAR_R3 EQU 0X2C ;VARIABLE PARA LA REGLA 3
VAR_R4 EQU 0X2D ;VARIABLE PARA LA REGLA 4
VAR_R5 EQU 0X2E ;VARIABLE PARA LA REGLA 5
VAR_R6 EQU 0X2F ;VARIABLE PARA LA REGLA 6
VAR_R7 EQU 0X30 ;VARIABLE PARA LA REGLA 7
VAR_R8 EQU 0X31 ;VARIABLE PARA LA REGLA 8
VAR_R9 EQU 0X32 ;VARIABLE PARA LA REGLA 9
VAR_R10 EQU 0X33 ;VARIABLE PARA LA REGLA 10
VAR_R11 EQU 0X34 ;VARIABLE PARA LA REGLA 11
VAR_R12 EQU 0X35 ;VARIABLE PARA LA REGLA 12
VAR_R13 EQU 0X36 ;VARIABLE PARA LA REGLA 13
VAR_R14 EQU 0X37 ;VARIABLE PARA LA REGLA 14
VAR_R15 EQU 0X38 ;VARIABLE PARA LA REGLA 15
VAR_R16 EQU 0X39 ;VARIABLE PARA LA REGLA 16
DEN EQU 0X3A ;VARIABLE PARA EL DENOMINADOR
VM_R1 EQU 0X3B ;VARIABLE PARA LA MUL DE LA REGLA 1
VM_R2_0 EQU 0X3C ;VARIABLE PARA LA MUL DE LA REGLA 2
VM_R2_1 EQU 0X3D ;VARIABLE PARA LA MUL DE LA REGLA 2
VM_R3_0 EQU 0X3E ;VARIABLE PARA LA MUL DE LA REGLA 3
VM_R3_1 EQU 0X3F ;VARIABLE PARA LA MUL DE LA REGLA 3
VM_R4_0 EQU 0X40 ;VARIABLE PARA LA MUL DE LA REGLA 4
VM_R4_1 EQU 0X41 ;VARIABLE PARA LA MUL DE LA REGLA 4
VM_R5 EQU 0X42 ;VARIABLE PARA LA MUL DE LA REGLA 5
VM_R6_0 EQU 0X43 ;VARIABLE PARA LA MUL DE LA REGLA 6
VM_R6_1 EQU 0X44 ;VARIABLE PARA LA MUL DE LA REGLA 6
VM_R7_0 EQU 0X45 ;VARIABLE PARA LA MUL DE LA REGLA 7
VM_R7_1 EQU 0X46 ;VARIABLE PARA LA MUL DE LA REGLA 7
VM_R8_0 EQU 0X47 ;VARIABLE PARA LA MUL DE LA REGLA 8
VM_R8_1 EQU 0X48 ;VARIABLE PARA LA MUL DE LA REGLA 8
VM_R9 EQU 0X49 ;VARIABLE PARA LA MUL DE LA REGLA 9
VM_R10_0 EQU 0X4A ;VARIABLE PARA LA MUL DE LA REGLA 10
VM_R10_1 EQU 0X4B ;VARIABLE PARA LA MUL DE LA REGLA 10
VM_R11_0 EQU 0X4C ;VARIABLE PARA LA MUL DE LA REGLA 11
VM_R11_1 EQU 0X4D ;VARIABLE PARA LA MUL DE LA REGLA 11
VM_R12_0 EQU 0X4E ;VARIABLE PARA LA MUL DE LA REGLA 12
VM_R12_1 EQU 0X4F ;VARIABLE PARA LA MUL DE LA REGLA 12
VM_R13 EQU 0X50 ;VARIABLE PARA LA MUL DE LA REGLA 13
VM_R14_0 EQU 0X51 ;VARIABLE PARA LA MUL DE LA REGLA 14
VM_R14_1 EQU 0X52 ;VARIABLE PARA LA MUL DE LA REGLA 14
VM_R15_0 EQU 0X53 ;VARIABLE PARA LA MUL DE LA REGLA 15
VM_R15_1 EQU 0X54 ;VARIABLE PARA LA MUL DE LA REGLA 15
VM_R16_0 EQU 0X55 ;VARIABLE PARA LA MUL DE LA REGLA 16
VM_R16_1 EQU 0X56 ;VARIABLE PARA LA MUL DE LA REGLA 16
SUMA1 EQU 0X57 ;VARIABLE ALTA PARA LA SUMA
SUMA0 EQU 0X58 ;VARIABLE BAJA PARA LA SUMA
DIVIDENDO_0 EQU 0X59 ;VARIABLE BAJA DEL DIVIDENDO
DIVIDENDO_1 EQU 0X5A ;VARIABLE ALTA DEL DIVIDENDO
DIVISOR EQU 0X5B ;VARIABLE DEL DIVISOR
COCIENTE EQU 0X5C ;VARIABLE DEL COCIENTE
FTCOUNT EQU 0X5D ;VARIABLE DE CUENTA
RESIDUO EQU 0X5E ;VARIABLE PARA EL RESIDUO
VAR EQU 0X5F

;--DEFINICIONES
#DEFINE DISTANCIA VAR_DISTANCIA
;-------------------------------------------------------------------------------
ORG 0X00 ;CONFIGURACION INICIAL
GOTO CON_PORTS
;-------------------------------------------------------------------------------
; TABLAS DE VALORES PARA LOS CONJUNTOS DE DISTANCIA
;-------------------------------------------------------------------------------
VAL_TABLA_MC ;TABLA DE VALORES PARA EL CONJUNTO "MUY CERCAR"
ADDWF PCL,1,0 ;MOVEMOS EL VALOR AL PCL
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'
VAL_TABLA_C ;TABLA DE VALORES PARA EL CONJUNTO "CERCAR"
ADDWF PCL,1,0 ;MOVEMOS EL VALOR AL PCL
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'
VAL_TABLA_L ;TABLA DE VALORES PARA EL CONJUNTO "LEJOS"
ADDWF PCL,1,0 ;MOVEMOS EL VALOR AL PCL
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'
VAL_TABLA_ML ;TABLA DE VALORES PARA EL CONJUNTO "MUY LEJOS"
ADDWF PCL,1,0 ;MOVEMOS EL VALOR AL PCL
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'10'
;-------------------------------------------------------------------
;--CONFIGURACION PUERTOS
;-------------------------------------------------------------------
CON_PORTS
CLRF TRISC,0 ;PUERTO C COMO SALIDA
MOVLW 0XFF ;PUERTO B COMO ENTRADA
MOVWF TRISB,0 ;PORTB<7:0>
CLRF TRISC,0 ;PUERTO C COMO SALIDA
CLRF PORTC,0 ;LIMPIAMOS PORTC
CLRF PORTB,0 ;LIMPIAMOS PORTB
CLRF VAR ;LIMPIAMOS LA VARIABLE "VAR"
CLRF VAR_MC ;LIMPIAMOS LA VARIABLE "VAR_MC"
CLRF VAR_C ;LIMPIAMOS LA VARIABLE "VAR_C"
CLRF VAR_L ;LIMPIAMOS LA VARIABLE "VAR_L"
CLRF VAR_ML ;LIMPIAMOS LA VARIABLE "VAR_ML"
CLRF VAR_MUL ;LIMPIAMOS LA VARIABLE "VAR_MUL"
CLRF VAR_LE ;LIMPIAMOS LA VARIABLE "VAR_LE"
CLRF VAR_R ;LIMPIAMOS LA VARIABLE "VAR_R"
CLRF VAR_MR ;LIMPIAMOS LA VARIABLE "VAR_MR"
CLRF VAR_R1 ;LIMPIAMOS LA VARIABLE "VAR_R1"
CLRF VAR_R2 ;LIMPIAMOS LA VARIABLE "VAR_R2"
CLRF VAR_R3 ;LIMPIAMOS LA VARIABLE "VAR_R3"
CLRF VAR_R4 ;LIMPIAMOS LA VARIABLE "VAR_R4"
CLRF VAR_R5 ;LIMPIAMOS LA VARIABLE "VAR_R5"
CLRF VAR_R6 ;LIMPIAMOS LA VARIABLE "VAR_R6"
CLRF VAR_R7 ;LIMPIAMOS LA VARIABLE "VAR_R7"
CLRF VAR_R8 ;LIMPIAMOS LA VARIABLE "VAR_R8"
CLRF VAR_R9 ;LIMPIAMOS LA VARIABLE "VAR_R9"
CLRF VAR_R10 ;LIMPIAMOS LA VARIABLE "VAR_R10"
CLRF VAR_R11 ;LIMPIAMOS LA VARIABLE "VAR_R11"
CLRF VAR_R12 ;LIMPIAMOS LA VARIABLE "VAR_R12"
CLRF VAR_R13 ;LIMPIAMOS LA VARIABLE "VAR_R13"
CLRF VAR_R14 ;LIMPIAMOS LA VARIABLE "VAR_R14"
CLRF VAR_R15 ;LIMPIAMOS LA VARIABLE "VAR_R15"
CLRF VAR_R16 ;LIMPIAMOS LA VARIABLE "VAR_R16"
CLRF DEN ;LIMPIAMOS LA VARIABLE "DENOMINADOR"
CLRF VAR ;LIMPIAMOS LA VARIABLE
CLRF SUMA0 ;LIMPIAMOS LA VARIABLE BAJA DE LA SUMA
CLRF SUMA1 ;LIMPIAMOS LA VARIABLE ALTA DE LA SUMA
CLRF DIVIDENDO_0 ;LIMPIAMOS LA VARIABLE BAJA DE LA DIVISION
CLRF DIVIDENDO_1 ;LIMPIAMOS LA VARIABLE ALTA DE LA DIVISION
CLRF DIVISOR ;LIMPIAMOS LA VARIABLE DEL DIVISOR
CLRF COCIENTE ;LIMPIAMOS LA VARIABLE DEL COCIENTE
CLRF RESIDUO ;LIMPIAMOS LA VARIABLE DEL RESIDUO
CLRF FTCOUNT ;LIMPIAMOS LA VARIABLE DE LA CUENTA
INICIO
MOVLW D'41' ;VALOR LEIDO DE LA DISTANCIA
MOVWF VAR_DISTANCIA,0 ;INICIAMOS EL VALOR DE DISTANCIA
MOVLW D'50' ;VALOR LEIDO DE LA VELOCIDAD
MOVWF VAR_VELOCIDAD,0 ;INICIAMOS EL VALOR DE LA VELOCIDAD
;--------------------------------------------------------------
; FUSIFICACION DEL VALOR DE LA DISTANCIA
;--------------------------------------------------------------
FUSIFICA_DISTANCIA
MOVLW D'5'
CPFSLT VAR_DISTANCIA,0 ;¿DISTANCIA<5?
GOTO D_MAYOR ;DISTANCIA MAYOR
MOVLW D'0' ;DISTANCIA MENOR
MOVWF VAR_VELOCIDAD ;VELOCIDAD IGUAL A CERO
BRA INICIO ;REGRESAMOS A INICIO
D_MAYOR
MOVLW D'60'
CPFSGT VAR_DISTANCIA,0 ;¿DISTANCIA>61?
BRA FUS_MC ;COMIENZA LA FUZIFICACION DE LA DISTANCIA
MOVLW D'100' ;VALOR MAXIMO PARA LA VELOCIDA
MOVWF VAR_VELOCIDAD
BRA INICIO ;SALTA A LA FUSIFICACION DE LA VELOCIDAD
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "MUY CERCA"
;-----------------------------------------------------------------
FUS_MC
MOVLW D'5' ;VALOR A COMPARAR
CPFSEQ VAR_DISTANCIA,0 ;¿DISTANCIA=5?
GOTO D_20 ;DISTANCIA ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 20)
MOVLW D'10' ;MOVEMOS EL VALOR DE 10 A W
MOVWF VAR_MC,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("MUY CERCA")
BRA FUS_C ;NOS VAMOS A FUSIFICAR EL CONJUNTO "CERCA"
D_20
MOVLW D'20' ;VALOR A COMPARAR
CPFSGT VAR_DISTANCIA,0 ;¿DISTANCIA>20?
BRA TABLA_MC ;DISTANCIA ES MENOR
MOVLW D'0'
MOVWF VAR_MC,0 ;VALOR PARA LA VARIABLE "MUY CERCA"
BRA FUS_C ;NOS VAMOS A FUSIFICAR EL CONJUNTO "CERCA"
TABLA_MC
MOVLW D'5' ;RESTAMOS 5 AL VALOR DE LA DISTACIA
SUBWF VAR_DISTANCIA,0,0
MOVWF VAR,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
CALL VAL_TABLA_MC ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "MUY CERCA"
MOVWF VAR_MC ;PASA EL VALOR A LA VARIABLE ("MUY CERCA")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "CERCA"
;-----------------------------------------------------------------
FUS_C
MOVLW D'10' ;VALOR A COMPARAR
CPFSLT VAR_DISTANCIA,0 ;¿DISTANCIA<10?
GOTO D_40 ;DISTANCIA ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 40)
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_C,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("CERCA")
BRA FUS_L ;NOS VAMOS A FUSIFICAR EL CONJUNTO "LEJOS"
D_40
MOVLW D'40' ;VALOR A COMPARAR
CPFSGT VAR_DISTANCIA,0 ;¿DISTANCIA>40?
BRA TABLA_C ;DISTANCIA ES MENOR
MOVLW D'0'
MOVWF VAR_C,0 ;VALOR PARA LA VARIABLE "CERCA"
BRA FUS_L ;NOS VAMOS A FUSIFICAR EL CONJUNTO "LEJOS"
TABLA_C
MOVLW D'10' ;RESTAMOS 5 AL VALOR DE LA DISTACIA
SUBWF VAR_DISTANCIA,0,0
MOVWF VAR,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
CALL VAL_TABLA_C ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "CERCA"
MOVWF VAR_C ;PASA EL VALOR A LA VARIABLE ("CERCA")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "LEJOS"
;-----------------------------------------------------------------
FUS_L
MOVLW D'25' ;VALOR A COMPARAR
CPFSLT VAR_DISTANCIA,0 ;¿DISTANCIA<25?
GOTO D_55 ;DISTANCIA ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 55)
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_L,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("LEJOS")
BRA FUS_ML ;NOS VAMOS A FUSIFICAR EL CONJUNTO "MUY LEJOS"
D_55
MOVLW D'55' ;VALOR A COMPARAR
CPFSGT VAR_DISTANCIA,0 ;¿DISTANCIA>55?
BRA TABLA_L ;DISTANCIA ES MENOR
MOVLW D'0'
MOVWF VAR_L,0 ;VALOR PARA LA VARIABLE "LEJOS"
BRA FUS_ML ;NOS VAMOS A FUSIFICAR EL CONJUNTO "MUY LEJOS"
TABLA_L
MOVLW D'25' ;RESTAMOS 25 AL VALOR DE LA DISTACIA
SUBWF VAR_DISTANCIA,0,0
MOVWF VAR,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
CALL VAL_TABLA_L ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "LEJOS"
MOVWF VAR_L ;PASA EL VALOR A LA VARIABLE ("LEJOS")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "MUY LEJOS"
;-----------------------------------------------------------------
FUS_ML
MOVLW D'40' ;VALOR A COMPARAR
CPFSLT VAR_DISTANCIA,0 ;¿DISTANCIA<40?
GOTO TABLA_ML ;DISTANCIA ES MAYOR VAMOS A CHECAR LA TABLA
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_ML,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("MUY LEJOS")
BRA FUSI_VELOCIDAD ;NOS VAMOS A FUSIFICAR EL CONJUNTO "MUY LEJOS"
TABLA_ML
MOVLW D'40' ;RESTAMOS 40 AL VALOR DE LA DISTACIA
SUBWF VAR_DISTANCIA,0,0
MOVWF VAR,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
CALL VAL_TABLA_ML ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "MUY LEJOS"
MOVWF VAR_ML ;PASA EL VALOR A LA VARIABLE ("MUY LEJOS")
BRA FUSI_VELOCIDAD
;--------------------------------------------------------------
; FUSIFICACION DEL VALOR DE LA VELOCIDAD
;--------------------------------------------------------------
FUSI_VELOCIDAD
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "MUY LENTO"
;-----------------------------------------------------------------
FUS_MUL
MOVLW D'0' ;VALOR A COMPARAR
CPFSEQ VAR_VELOCIDAD,0 ;¿VELOCIDAD=0?
GOTO V_30 ;VELOCIDAD ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 30)
MOVLW D'10' ;MOVEMOS EL VALOR DE 10 A W
MOVWF VAR_MUL,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("MUY LENTO")
BRA FUS_LE ;NOS VAMOS A FUSIFICAR EL CONJUNTO "LENTO"
V_30
MOVLW D'30' ;VALOR A COMPARAR
CPFSGT VAR_VELOCIDAD,0 ;¿VELOCIDAD>30?
BRA TABLA_MUL ;VELOCIDAD ES MENOR
MOVLW D'0'
MOVWF VAR_MUL,0 ;VALOR PARA LA VARIABLE "MUY LENTO"
BRA FUS_LE ;NOS VAMOS A FUSIFICAR EL CONJUNTO "LENTO"
TABLA_MUL
CALL VAL_TABLA_MUL ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "MUY LENTO"
MOVWF VAR_MUL ;PASA EL VALOR A LA VARIABLE ("MUY LENTO")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "LENTO"
;-----------------------------------------------------------------
FUS_LE
MOVLW D'10' ;VALOR A COMPARAR
CPFSLT VAR_VELOCIDAD,0 ;¿VELOCIDAD<10?
GOTO V_50 ;VELOCIDAD ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 40)
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_LE,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("LENTO")
BRA FUS_R ;NOS VAMOS A FUSIFICAR EL CONJUNTO "RAPIDO"
V_50
MOVLW D'50' ;VALOR A COMPARAR
CPFSGT VAR_VELOCIDAD,0 ;¿VELOCIDAD>50?
BRA TABLA_LE ;VELOCIDAD ES MENOR
MOVLW D'0'
MOVWF VAR_LE,0 ;VALOR PARA LA VARIABLE "LENTO"
BRA FUS_R ;NOS VAMOS A FUSIFICAR EL CONJUNTO "RAPIDO"
TABLA_LE
MOVLW D'10' ;RESTAMOS 5 AL VALOR DE LA DISTACIA
SUBWF VAR_VELOCIDAD,0,0
MOVWF VAR,0
CALL VAL_TABLA_LE ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "LENTO"
MOVWF VAR_LE ;PASA EL VALOR A LA VARIABLE ("LENTO")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "RAPIDO"
;-----------------------------------------------------------------
FUS_R
MOVLW D'40' ;VALOR A COMPARAR
CPFSLT VAR_VELOCIDAD,0 ;¿VELOCIDAD<40?
GOTO V_80 ;VELOCIDAD ES MAYOR (ENTONCES NOS VAMOS A COMPARAR SI ES MAYOR A 80)
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_R,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("RAPIDO")
BRA FUS_MR ;NOS VAMOS A FUSIFICAR EL CONJUNTO "MUY RAPIDO"
V_80
MOVLW D'80' ;VALOR A COMPARAR
CPFSGT VAR_VELOCIDAD,0 ;¿VELOCIDAD>80?
BRA TABLA_R ;VELOCIDAD ES MENOR
MOVLW D'0'
MOVWF VAR_R,0 ;VALOR PARA LA VARIABLE "RAPIDO"
BRA FUS_MR ;NOS VAMOS A FUSIFICAR EL CONJUNTO "MUY RAPIDO"
TABLA_R
MOVLW D'40'
SUBWF VAR_VELOCIDAD,0,0
MOVWF VAR,0
CALL VAL_TABLA_R ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "RAPIDO"
MOVWF VAR_R ;PASA EL VALOR A LA VARIABLE ("RAPIDO")
;-----------------------------------------------------------------
; RUTINA PARA EL CONJUNTO "MUY RAPIDO"
;-----------------------------------------------------------------
FUS_MR
MOVLW D'70' ;VALOR A COMPARAR
CPFSLT VAR_VELOCIDAD,0 ;¿VELOCIDAD<70?
BRA TABLA_MR ;VELOCIDAD ES MAYOR VAMOS A CHECAR LA TABLA
MOVLW D'0' ;MOVEMOS EL VALOR DE 0 A W
MOVWF VAR_MR,0 ;VALOR CORRESPONDIENTE A LA VARIABLE ("MUY RAPIDO")
BRA REGLAS ;NOS VAMOS A CHECAR LAS REGLAS
TABLA_MR
MOVLW D'70'
SUBWF VAR_VELOCIDAD,0,0
MOVWF VAR,0
CALL VAL_TABLA_MR ;MANDA A LLAMAR A LA TABLA DE VALORES PARA "MUY RAPIDO"
MOVWF VAR_MR ;PASA EL VALOR A LA VARIABLE ("MUY RAPIDO")
BRA REGLAS
GOTO INICIO
;-----------------------------------------------------------------------
; REGLAS
;-----------------------------------------------------------------------
REGLAS
;-----------------------------------------------------------------------
R1 ;REGLA 1
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
CPFSGT VAR_MUL,0 ;¿VAR_MC<VAR_MUL?
BRA V_R1 ;ES MAYOR
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
MOVWF VAR_R1,0 ;MUEVE EL CONTENIDO A LA REGLA 1
BRA R2
V_R1
MOVF VAR_MUL,0 ;MUEVE EL CONTENIDO DE VAR_MUL A W
MOVWF VAR_R1,0 ;MUEVE EL CONTENIDO A LA REGLA 1
;-----------------------------------------------------------------------
R2 ;REGLA 2
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
CPFSGT VAR_MUL,0 ;¿VAR_C<VAR_MUL?
BRA V_R2 ;ES MAYOR
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R2,0 ;MUEVE EL CONTENIDO A LA REGLA 2
BRA R3
V_R2
MOVF VAR_MUL,0 ;MUEVE EL CONTENIDO DE VAR_MUL A W
MOVWF VAR_R2,0 ;MUEVE EL CONTENIDO A LA REGLA 2
;-----------------------------------------------------------------------
R3 ;REGLA 3
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
CPFSGT VAR_MUL,0 ;¿VAR_L<VAR_MUL?
BRA V_R3 ;ES MAYOR
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
MOVWF VAR_R3,0 ;MUEVE EL CONTENIDO A LA REGLA 3
BRA R4
V_R3
MOVF VAR_MUL,0 ;MUEVE EL CONTENIDO DE VAR_MUL A W
MOVWF VAR_R3,0 ;MUEVE EL CONTENIDO A LA REGLA 3
;-----------------------------------------------------------------------
R4 ;REGLA 4
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
CPFSGT VAR_MUL,0 ;¿VAR_ML<VAR_MUL?
BRA V_R4 ;ES MAYOR
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
MOVWF VAR_R4,0 ;MUEVE EL CONTENIDO A LA REGLA 4
BRA R5
V_R4
MOVF VAR_MUL,0 ;MUEVE EL CONTENIDO DE VAR_MUL A W
MOVWF VAR_R4,0 ;MUEVE EL CONTENIDO A LA REGLA 4
;-----------------------------------------------------------------------
R5 ;REGLA 5
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
CPFSGT VAR_LE,0 ;¿VAR_MC<VAR_LE?
BRA V_R5 ;ES MAYOR
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
MOVWF VAR_R5,0 ;MUEVE EL CONTENIDO A LA REGLA 5
BRA R6
V_R5
MOVF VAR_LE,0 ;MUEVE EL CONTENIDO DE VAR_LE A W
MOVWF VAR_R5,0 ;MUEVE EL CONTENIDO A LA REGLA 5
;-----------------------------------------------------------------------
R6 ;REGLA 6
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
CPFSGT VAR_LE,0 ;¿VAR_C<VAR_LE?
BRA V_R6 ;ES MAYOR
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R6,0 ;MUEVE EL CONTENIDO A LA REGLA 6
BRA R7
V_R6
MOVF VAR_LE,0 ;MUEVE EL CONTENIDO DE VAR_LE A W
MOVWF VAR_R6,0 ;MUEVE EL CONTENIDO A LA REGLA 6
;-----------------------------------------------------------------------
R7 ;REGLA 7
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
CPFSGT VAR_LE,0 ;¿VAR_L<VAR_LE?
BRA V_R7 ;ES MAYOR
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
MOVWF VAR_R7,0 ;MUEVE EL CONTENIDO A LA REGLA 7
BRA R8
V_R7
MOVF VAR_LE,0 ;MUEVE EL CONTENIDO DE VAR_LE A W
MOVWF VAR_R7,0 ;MUEVE EL CONTENIDO A LA REGLA 7
;-----------------------------------------------------------------------
R8 ;REGLA 8
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
CPFSGT VAR_LE,0 ;¿VAR_ML<VAR_LE?
BRA V_R8 ;ES MAYOR
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
MOVWF VAR_R8,0 ;MUEVE EL CONTENIDO A LA REGLA 8
BRA R9
V_R8
MOVF VAR_LE,0 ;MUEVE EL CONTENIDO DE VAR_LE A W
MOVWF VAR_R8,0 ;MUEVE EL CONTENIDO A LA REGLA 8
;-----------------------------------------------------------------------
R9 ;REGLA 9
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
CPFSGT VAR_R,0 ;¿VAR_MC<VAR_R?
BRA V_R9 ;ES MAYOR
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
MOVWF VAR_R9,0 ;MUEVE EL CONTENIDO A LA REGLA 9
BRA R10
V_R9
MOVF VAR_R,0 ;MUEVE EL CONTENIDO DE VAR_R A W
MOVWF VAR_R9,0 ;MUEVE EL CONTENIDO A LA REGLA 9
;-----------------------------------------------------------------------
R10 ;REGLA 10
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
CPFSGT VAR_R,0 ;¿VAR_C<VAR_R?
BRA V_R10 ;ES MAYOR
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R10,0 ;MUEVE EL CONTENIDO A LA REGLA 10
BRA R11
V_R10
MOVF VAR_R,0 ;MUEVE EL CONTENIDO DE VAR_R A W
MOVWF VAR_R10,0 ;MUEVE EL CONTENIDO A LA REGLA 10
;-----------------------------------------------------------------------
R11 ;REGLA 11
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
CPFSGT VAR_R,0 ;¿VAR_L<VAR_R?
BRA V_R11 ;ES MAYOR
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
MOVWF VAR_R11,0 ;MUEVE EL CONTENIDO A LA REGLA 11
BRA R12
V_R11
MOVF VAR_R,0 ;MUEVE EL CONTENIDO DE VAR_R A W
MOVWF VAR_R11,0 ;MUEVE EL CONTENIDO A LA REGLA 11
;-----------------------------------------------------------------------
R12 ;REGLA 12
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
CPFSGT VAR_R,0 ;¿VAR_ML<VAR_R?
BRA V_R12 ;ES MAYOR
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
MOVWF VAR_R12,0 ;MUEVE EL CONTENIDO A LA REGLA 12
BRA R13
V_R12
MOVF VAR_R,0 ;MUEVE EL CONTENIDO DE VAR_R A W
MOVWF VAR_R12,0 ;MUEVE EL CONTENIDO A LA REGLA 12
;-----------------------------------------------------------------------
R13 ;REGLA 13
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
CPFSGT VAR_MR,0 ;¿VAR_MC<VAR_MR?
BRA V_R13 ;ES MAYOR
MOVF VAR_MC,0,0 ;MUEVE EL CONTENIDO DE VAR_MC A W
MOVWF VAR_R13,0 ;MUEVE EL CONTENIDO A LA REGLA 13
BRA R14
V_R13
MOVF VAR_MR,0 ;MUEVE EL CONTENIDO DE VAR_MR A W
MOVWF VAR_R13,0 ;MUEVE EL CONTENIDO A LA REGLA 13
;-----------------------------------------------------------------------
R14 ;REGLA 14
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
CPFSGT VAR_MR,0 ;¿VAR_C<VAR_MR?
BRA V_R14 ;ES MAYOR
MOVF VAR_C,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R14,0 ;MUEVE EL CONTENIDO A LA REGLA 14
BRA R15
V_R14
MOVF VAR_MR,0 ;MUEVE EL CONTENIDO DE VAR_MR A W
MOVWF VAR_R14,0 ;MUEVE EL CONTENIDO A LA REGLA 14
;-----------------------------------------------------------------------
R15 ;REGLA 15
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_L A W
CPFSGT VAR_MR,0 ;¿VAR_L<VAR_MR?
BRA V_R15 ;ES MAYOR
MOVF VAR_L,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R15,0 ;MUEVE EL CONTENIDO A LA REGLA 15
BRA R16
V_R15
MOVF VAR_MR,0 ;MUEVE EL CONTENIDO DE VAR_MR A W
MOVWF VAR_R15,0 ;MUEVE EL CONTENIDO A LA REGLA 15
;-----------------------------------------------------------------------
R16 ;REGLA 4
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_ML A W
CPFSGT VAR_MR,0 ;¿VAR_ML<VAR_MR?
BRA V_R16 ;ES MAYOR
MOVF VAR_ML,0,0 ;MUEVE EL CONTENIDO DE VAR_C A W
MOVWF VAR_R16,0 ;MUEVE EL CONTENIDO A LA REGLA 16
BRA DEFUSIFICACION
V_R16
MOVF VAR_MR,0 ;MUEVE EL CONTENIDO DE VAR_MR A W
MOVWF VAR_R16,0 ;MUEVE EL CONTENIDO A LA REGLA 16
;-------------------------------------------------------------------------------
; DEFUSIFICACION
;-------------------------------------------------------------------------------
DEFUSIFICACION
CLRF DEN,0
DENOMINADOR ;ENCONTRAMOS EL VALOR DEL DENOMINADOR
MOVF VAR_R1,0,0
ADDWF DEN,1,0
MOVF VAR_R2,0,0
ADDWF DEN,1,0
MOVF VAR_R3,0,0
ADDWF DEN,1,0
MOVF VAR_R4,0,0
ADDWF DEN,1,0
MOVF VAR_R5,0,0
ADDWF DEN,1,0
MOVF VAR_R6,0,0
ADDWF DEN,1,0
MOVF VAR_R7,0,0
ADDWF DEN,1,0
MOVF VAR_R8,0,0
ADDWF DEN,1,0
MOVF VAR_R9,0,0
ADDWF DEN,1,0
MOVF VAR_R10,0,0
ADDWF DEN,1,0
MOVF VAR_R11,0,0
ADDWF DEN,1,0
MOVF VAR_R12,0,0
ADDWF DEN,1,0
MOVF VAR_R13,0,0
ADDWF DEN,1,0
MOVF VAR_R14,0,0
ADDWF DEN,1,0
MOVF VAR_R15,0,0
ADDWF DEN,1,0
MOVF VAR_R16,0,0
ADDWF DEN,1,0
NUMERADOR
;----------------------------------------------------
MOVLW D'15' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R1,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R1,0 ;GUARDAMOS EL VALOR
;----------------------------------------------------
MOVLW D'30' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R2,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R2_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R2_1,0 ;GUARDAMOS EL VALOR ALTO
;------------------------------------------------------
MOVLW D'60' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R3,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R3_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R3_1,0 ;GUARDAMOS EL VALOR ALTO
;-------------------------------------------------------
MOVLW D'85' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R4,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R4_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R4_1,0 ;GUARDAMOS EL VALOR ALTO
;----------------------------------------------------
MOVLW D'15' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R5,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R5,0 ;GUARDAMOS EL VALOR
;----------------------------------------------------
MOVLW D'30' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R6,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R6_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R6_1,0 ;GUARDAMOS EL VALOR ALTO
;------------------------------------------------------
MOVLW D'60' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R7,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R7_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R7_1,0 ;GUARDAMOS EL VALOR ALTO
;-------------------------------------------------------
MOVLW D'85' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R8,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R8_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R8_1,0 ;GUARDAMOS EL VALOR ALTO
;----------------------------------------------------
MOVLW D'15' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R9,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R9,0 ;GUARDAMOS EL VALOR
;----------------------------------------------------
MOVLW D'30' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R10,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R10_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R10_1,0 ;GUARDAMOS EL VALOR ALTO
;------------------------------------------------------
MOVLW D'60' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R11,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R11_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R11_1,0 ;GUARDAMOS EL VALOR ALTO
;-------------------------------------------------------
MOVLW D'85' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R12,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R12_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R12_1,0 ;GUARDAMOS EL VALOR ALTO
;----------------------------------------------------
MOVLW D'15' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R13,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R13,0 ;GUARDAMOS EL VALOR
;----------------------------------------------------
MOVLW D'30' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R14,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R14_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R14_1,0 ;GUARDAMOS EL VALOR ALTO
;------------------------------------------------------
MOVLW D'60' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R15,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R15_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R15_1,0 ;GUARDAMOS EL VALOR ALTO
;-------------------------------------------------------
MOVLW D'85' ;MOVEMOS EL VALOR A MULTIPLICAR
MULWF VAR_R16,0 ;MULTIPLICAMOS POR LA REGLA
MOVF PRODL,0,0
MOVWF VM_R16_0,0 ;GUARDAMOS EL VALOR BAJO
MOVF PRODH,0,0
MOVWF VM_R16_1,0 ;GUARDAMOS EL VALOR ALTO
;------------------------------------------------------------
; SUMATORIA
;------------------------------------------------------------
SUMATORIA_BAJA ;PRIMERO SUMAMOS LA PARTE BAJA
CLRF SUMA0,0
CLRF SUMA1,0
S1_B
MOVF VM_R1,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R2_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R2_B
MOVF VM_R2_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R3_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R3_B
MOVF VM_R3_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R4_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R4_B
MOVF VM_R4_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R5_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R5_B
MOVF VM_R5,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R6_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R6_B
MOVF VM_R6_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R7_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R7_B
MOVF VM_R7_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R8_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R8_B
MOVF VM_R8_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R9_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R9_B
MOVF VM_R9,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R10_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R10_B
MOVF VM_R10_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R11_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R11_B
MOVF VM_R11_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R12_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R12_B
MOVF VM_R12_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R13_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R13_B
MOVF VM_R13,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R14_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R14_B
MOVF VM_R14_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R15_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R15_B
MOVF VM_R15_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA R16_B ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
R16_B
MOVF VM_R16_0,0,0
ADDWF SUMA0,1,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE BAJA
BTFSS STATUS,C ;CHECAMOS SI HUBO ACARREO
BRA SUMATORIA_ALTA ;SEGUIMOS SUMANDO
MOVLW D'1' ;SUMAMOS EL ACARREO
ADDWF SUMA1,1,0 ;A LA VARIABLE ALTA DE LA SUMATORIA
SUMATORIA_ALTA
MOVF VM_R2_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R3_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R4_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R6_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R7_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R8_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R10_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R11_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R12_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R14_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R15_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS
MOVF VM_R16_1,0,0 ;SUMAMOS EL RESULTADO DE LA REGLA A LA PARTE ALTA
ADDWF SUMA1,1,0 ;LO GUARDAMOS

;---------------------------------------------
; DIVISION
;---------------------------------------------
MOVF SUMA0,0,0 ;MOVEMOS EL VALOR DE LA SUMA BAJA
MOVWF DIVIDENDO_0,0 ;A LA VARIABLE DIVIDENDO_0
MOVF SUMA1,0,0 ;MOVEMOS EL VALOR DE LA SUMA ALTA
MOVWF DIVIDENDO_1,0 ;A LA VARIABLE DIVIDENDO_1
MOVF DEN,0,0 ;MOVEMOS EL VALOR DEL DENOMINADOR
MOVWF DIVISOR,0 ;A LA VARIABLE DIVISOR
DIVISION ;SUBRUTINA DE DIVISION
CLRF RESIDUO
CLRF FTCOUNT
BSF FTCOUNT,4
DIVLOOP
RLCF DIVIDENDO_0
RLCF DIVIDENDO_1
RLCF RESIDUO
MOVF DIVISOR,W
BTFSS STATUS,C
GOTO NO_CARRY
SUBWF RESIDUO
BSF STATUS,C
GOTO NO_SUB
NO_CARRY
SUBWF RESIDUO,W
BTFSC STATUS,C
MOVWF RESIDUO
NO_SUB
DECFSZ FTCOUNT
GOTO DIVLOOP
RLCF DIVIDENDO_0
RLCF DIVIDENDO_1
MOVF DIVIDENDO_0,W
MOVWF COCIENTE,0
MOVWF VAR,0
MOVWF VAR_VELOCIDAD,0 ;VALOR FINAL DE LA DEFUSIFICACION
GOTO INICIO ;AQUI TERMINA EL PROGRAMA----------------------------------------------------------------
;-------------------------------------------------------------------------------
; TABLAS DE VALORES PARA LOS CONJUNTOS DE DISTANCIA
;-------------------------------------------------------------------------------
ORG 0X800
VAL_TABLA_MUL
MOVLW D'8'
MOVWF PCLATH,0
RLNCF VAR_VELOCIDAD,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
ADDWF PCL,1,0
RETLW D'10'
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'8'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'6'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'4'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'2'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'0'
RETLW D'0'
RETURN
VAL_TABLA_LE
MOVLW D'8'
MOVWF PCLATH,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
ADDWF PCL,1,0
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'10'
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'
VAL_TABLA_R
MOVLW D'8'
MOVWF PCLATH,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
ADDWF PCL,1,0
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'10'
RETLW D'10'
RETLW D'9'
RETLW D'9'
RETLW D'8'
RETLW D'8'
RETLW D'7'
RETLW D'7'
RETLW D'6'
RETLW D'6'
RETLW D'5'
RETLW D'5'
RETLW D'4'
RETLW D'4'
RETLW D'3'
RETLW D'3'
RETLW D'2'
RETLW D'2'
RETLW D'1'
RETLW D'1'
RETLW D'0'

ORG 0X900
VAL_TABLA_MR
MOVLW D'9'
MOVWF PCLATH,0
RLNCF VAR,0,0 ;ROTAMOS EL VALOR A LA IZQUIERDA SIN ACARREO Y LO GUARDAMOS EN W
ADDWF PCL,1,0
RETLW D'0'
RETLW D'0'
RETLW D'1'
RETLW D'1'
RETLW D'1'
RETLW D'2'
RETLW D'2'
RETLW D'2'
RETLW D'3'
RETLW D'3'
RETLW D'3'
RETLW D'4'
RETLW D'4'
RETLW D'4'
RETLW D'5'
RETLW D'5'
RETLW D'5'
RETLW D'6'
RETLW D'6'
RETLW D'6'
RETLW D'7'
RETLW D'7'
RETLW D'7'
RETLW D'8'
RETLW D'8'
RETLW D'8'
RETLW D'9'
RETLW D'9'
RETLW D'9'
RETLW D'10'
RETLW D'10'
RETURN
END
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------

Referencias
Redes Neuronales y Sistemas Difusos, Bonifacio Martín del Brío/Alfredo Sanz Molina

[1]. Apuntes de la materia de inteligencia artificial primavera 2009

[1]. http://api.ning.com/files/AAa5x8q9czwfH4dZtE29d1qaLJgng8WpIEEfhAesnJuwGl0yn0WF-
wzu4RuA6KYPT1vBJhvRZdR3FLKFXSWPSr0BWm2u4cc7/Sensor_Ultrasonido.pdf

[2].http://es.wikipedia.org/wiki/Modulación_por_ancho_de_pulsos

[3]. http://es.wikipedia.org/wiki/Microcontrolador

[4]. www.microchip.com

[5]. http://es.wikipedia.org/wiki/Lenguaje_ensamblador

Vous aimerez peut-être aussi