Logica Difusa
-
Upload
luiz-oskar-llara -
Category
Documents
-
view
51 -
download
5
Transcript of 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
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.
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
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.
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
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
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