Logica Difusa

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

Transcript of Logica Difusa

Page 1: Logica Difusa

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

Page 2: Logica Difusa

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:

Page 3: Logica Difusa

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.

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

µ

0

a b c d

Función de pertenencia de tipo

trapezoidal

u

a b c

µ

1.0

0 u

Función de pertenencia

de tipo triangular

Page 4: Logica Difusa

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

Page 5: Logica Difusa

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].

Page 6: Logica Difusa

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.

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.

Acción

Condición

Interferencia difusa Base de reglas

Controlador difuso

Figura 1.1: Esquema de un controlador difuso

Proceso controlado

Fusificación

Defusificación

Page 7: Logica Difusa

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:

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

Entrada

Sistema de control Detección de

la distancia

Control de

velocidad Motores

Salida

Control difuso

Page 8: Logica Difusa

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:

Page 9: Logica Difusa

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

Page 10: Logica Difusa

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.

Page 11: Logica Difusa

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

Page 12: Logica Difusa

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.

Page 13: Logica Difusa

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.

Page 14: Logica Difusa

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

Page 15: Logica Difusa

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'

Page 16: Logica Difusa

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?

Page 17: Logica Difusa

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"

;-----------------------------------------------------------------

Page 18: Logica Difusa

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

Page 19: Logica Difusa

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

Page 20: Logica Difusa

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

Page 21: Logica Difusa

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

Page 22: Logica Difusa

;------------------------------------------------------------

; 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

Page 23: Logica Difusa

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'

Page 24: Logica Difusa

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'

Page 25: Logica Difusa

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