36
México, D.F., a 5 de julio del 2007 Reporte de Técnico del Proyecto Individual COMPILADOR DE UN CONTROLADOR DIFUSO PARA SISTEMAS EMPOTRADOS Responsable: Dr. Herón Molina Lozano Registro SIP: 20062005 Programa: Diseño y Construcción de un Sistema Inteligente de Lavado de Prendas Registro del Programa: 544 Resumen Este proyecto se realizó con el fin de desarrollar una metodología para la programación automática de controladores lógicos difusos en sistemas soportados por microcontroladores. El problema principal con el que se está enfrentando es que cuando se implanta un sistema de inferencia difuso en plataformas de proceso compactas (sistemas embebidos), reside en que los programas de desarrollo especializados que permiten la descripción del sistema difuso en lenguaje natural, son escasos y difíciles de adquirir con los presupuestos asignados a las entidades educativas. Introducción Se diseño un programa de cómputo que permite implementar un sistema difuso en lenguaje C de nivel intermedio (plantilla) mediante lenguaje natural. El sistema de inferencia difuso se diseño bajo el enfoque de un sistema difuso basado en el concepto de Mamdani, consultar (Jang, 1987) y (Ross, 1995), el cual permite generar automáticamente una plantilla en lenguaje C, se puede consultar (Schildt, 1989a), (Schildt, 1989b), (Aguilar, 2004) y (Langsam, 1997). La plantilla que se obtiene, se compila posteriormente haciendo uso de herramientas de desarrollo genéricas como CodeVision para el microcontrolador AVR, obteniéndose finalmente el código en lenguaje ensamblador que describe totalmente al sistema de inferencia difusa para ejecutarse en el microcontrolador AVR-ATMega8535. El proyecto es parte del desarrollo de un sistema de lógica difusa para el control de un sistema de lavado controlado bajo el concepto de la lógica difusa. Cabe recalcar que el desarrollo de este tipo de sistemas es importante para generar independencia tecnológica de este tipo de sistemas, que solamente se diseñan en el extranjero. El sistema de control difuso se acopló con las etapas de sensado y de control que se desarrollaron en los proyectos participantes, a saber:

Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

México, D.F., a 5 de julio del 2007

Reporte de Técnico del Proyecto Individual

COMPILADOR DE UN CONTROLADOR DIFUSO PARA SISTEMAS EMPOTRADOS

Responsable: Dr. Herón Molina Lozano

Registro SIP: 20062005

Programa: Diseño y Construcción de un Sistema Inteligente de Lavado

de Prendas

Registro del Programa:

544

Resumen

Este proyecto se realizó con el fin de desarrollar una metodología para la programación automática de controladores lógicos difusos en sistemas soportados por microcontroladores. El problema principal con el que se está enfrentando es que cuando se implanta un sistema de inferencia difuso en plataformas de proceso compactas (sistemas embebidos), reside en que los programas de desarrollo especializados que permiten la descripción del sistema difuso en lenguaje natural, son escasos y difíciles de adquirir con los presupuestos asignados a las entidades educativas. Introducción

Se diseño un programa de cómputo que permite implementar un sistema difuso en lenguaje C de nivel intermedio (plantilla) mediante lenguaje natural. El sistema de inferencia difuso se diseño bajo el enfoque de un sistema difuso basado en el concepto de Mamdani, consultar (Jang, 1987) y (Ross, 1995), el cual permite generar automáticamente una plantilla en lenguaje C, se puede consultar (Schildt, 1989a), (Schildt, 1989b), (Aguilar, 2004) y (Langsam, 1997). La plantilla que se obtiene, se compila posteriormente haciendo uso de herramientas de desarrollo genéricas como CodeVision para el microcontrolador AVR, obteniéndose finalmente el código en lenguaje ensamblador que describe totalmente al sistema de inferencia difusa para ejecutarse en el microcontrolador AVR-ATMega8535.

El proyecto es parte del desarrollo de un sistema de lógica difusa para el

control de un sistema de lavado controlado bajo el concepto de la lógica difusa. Cabe recalcar que el desarrollo de este tipo de sistemas es importante para generar independencia tecnológica de este tipo de sistemas, que solamente se diseñan en el extranjero.

El sistema de control difuso se acopló con las etapas de sensado y de control que se desarrollaron en los proyectos participantes, a saber:

Page 2: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

a) Compilador de un Controlador Difuso para Sistemas Empotrados / GGPI: 20062005 / Dr. Herón Molina Lozano.

b) Diseño y Construcción de un Sistema Generador de Ozono para Aplicaciones

de Limpieza y Purificación / GGPI: 20061916 / M. en C. Juan Antonio Jaramillo Gómez.

c) Diseño y Construcción de un Sistema Mecatrónico de Limpieza / GGPI:

20062005 / M. en C. Isaac Guzmán Domínguez.

d) Diseño y Construcción de un Controlador Lógico Difuso, Aplicable a un Sistema de Lavado Inteligente / CGPI: 20062024 / Dr. Victor Hugo Ponce Ponce.

El Sistema de control se encarga de proporcionar como variables de salida, el

tiempo de lavado y la cantidad de detergente hacía la planta, es decir la lavadora. Las variables que se extraen de este proceso son la turbiedad del agua la carga de las prendas y la temperatura del agua. Con estas variables se infieren las variables de salida para lograr la meta de control, con base en un conjunto de reglas y conjuntos difusos Métodos y materiales

Se desarrolló un programa para la descripción de sistemas de la lógica difusa en lenguaje C, al cual se le nombrará como descriptor de sistemas de lógica difusa en lenguaje natural. Este programa entrega como resultado, una plantilla en lenguaje C, con la descripción que se muestra en la fig. 1.

Figura 1. Ensamble del sistema de lavado mediante lógica difusa. Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0 y versión 5.0 de Borland. De igual forma se utilizó el compilador de lenguaje ensamblador del AVR CodeVision. Se realizarón algunas pruebas utilizando el analizador léxico Flex y el analizador sintáctico Bison, sin embargo, no se reportan los resultados obtenidos debido a que se obtuvieron resultados parciales. También se utilizó una tarjeta de desarrollo del microcontrolador del AVR-ATMega8535. Finalmente, fueron consultadas una amplia cantidad de referencias bibliográficas, la cual se muestra al final del reporte.

Page 3: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Diseño del sistema

A continuación se muestran algunos conceptos que soportan la idea del programa que se desarrolló. Conjuntos difusos El concepto de la lógica difusa fue propuesta por Lofti Zadeh en 1965 (Zadeh, 1965). En (Dubois, 1980), (Klir, 1995) y (Jang, 1997) se amplía más sobre la definición de los conjuntos difusos y las operaciones que se pueden realizar con los conjuntos difusos, así como sus propiedades. A continuación, se darán una serie de definiciones que ayudaran a establecer las características que tienen los conjuntos difusos y de igual manera estas características se pueden aplicar y extender a las gramáticas difusas. Un conjunto difuso A en el universo X está expresado como un conjunto de pares ordenados:

A = {(x, µA (x)) | x ∈ X}, (1) donde A es el conjunto difuso, µA (x) es el grado de membresía del elemento x con respecto al conjunto difuso A, y X es el universo de discurso donde está definido A. Un conjunto difuso está totalmente caracterizado por su función de membresía (FM) y µA (x) ∈ [0, 1]. Notación Un conjunto difuso A se denota por:

Para el caso de un universo de discurso discreto ⇒ A x xA i ix Xi

=∈∑µ ( ) /

(2)

Y para el caso de un universo de discurso continuo ⇒ A x xAX

= ∫ µ ( ) / (3)

Hay que hacer notar que el símbolo de la sumatoria Σ y el símbolo de integración ∫ indican únicamente la unión de los grados de membresía en cada caso discreto o continuo; “/” indica únicamente una marca de separación y no implica la división algebraica.

Operaciones teóricas de conjuntos

Subconjunto:

A ⊆ B ⇔ µA ≤ µB (4)

La fig. 2, muestra cómo un conjunto difuso A que está contenido dentro del conjunto difuso B:

Page 4: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Figura 2. Operación de subconjunto.

Complemento:

A X A x xA A= − ⇔ = −µ µ( ) ( )1 (5)

Unión:

C = A ∪ B ⇔ µC (x) = max (µA (x), µB (x)) = µA (x) ∨ µB (x) (6)

Intersección:

C = A ∩ B ⇔ µC (x) = min (µA (x), µB (x)) = µA (x) ∧ µB (x) (7)

La fig. 3 muestra gráficamente cada una de las operaciones: complemento, unión, e intersección.

Figura 3. (a) Conjuntos difusos A y B; (b) Operación de complemento sobre el conjunto difuso A; (c) Operación unión; (d) Operación intersección.

La única ley de la teoría de conjuntos difusos ordinaria que no se cumple con respecto a la lógica de Boole, es la ley del medio excluido:

∅≠∩ AA , XAA ≠∪ . (8) Ya que el conjunto difuso A no tiene fronteras definidas y tampoco lo tiene A , parece ser natural que, tanto A y A estén traslapadas. Sin embrago, este traslape está siempre limitado, ya que:

Page 5: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

( )21)(),(min ≤∀∀ xxxA AA µµ . (9)

Por la misma razón, A ∪ A no cubren exactamente a X:

( )21)(),(max ≥∀∀ xxxA AA µµ . (10)

Complemento difuso Requisitos generales:

Frontera: N(0) = 1 y N(1) = 0 Monotonicidad: N(a) > N(b) sí a < b (11) Involución: N(N(a)) = a

Intersección difusa: T-norma La intersección de dos conjuntos difusos A y B están especificados en general por una función T: [0, 1] x [0, 1] → [0, 1], que contiene dos grados de membresía como se muestra:

µ µ µ µ µA B A B A Bx T x x x x∩ = =( ) ( ( ), ( )) ( ) ~* ( ) , (12) donde ~∗ es un operador binario para la función T. Esta clase de operador de intersección difusa, que son usualmente referidos como un operador T-norma (norma triangular), tiene los siguientes requisitos básicos.

Un operador T-norma es un operador de dos elementos T (⋅,⋅) que satisface las siguientes propiedades:

Frontera: T(0, 0) = 0, T(a,1) = T (1, a) = a Monotonicidad: T(a, b) < T(c, d) si a < c y b < d

(13) Conmutatividad: T(a, b) = T(b, a) Asociatividad: T(a, T (b, c)) = T(T(a, b), c)

Ejemplo: cuatro de los operadores T-norma más frecuentemente utilizados son:

Mínimo: Tmin (a, b) = min (a, b) = a ∧ b

Producto algebraico: Tap (a, b) = ab

Producto acotado: Tbp (a,b) = 0 ∨ (a + b – 1)

(14)

Page 6: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Producto drástico: Tdp (a, b) = a si bb si a

si a b

,,, ,

==<

⎨⎪

⎩⎪

11

0 1

Se puede comprobar que:

Tdp (a, b) ≤ Tbp (a, b) ≤ Tap (a, b) ≤ Tmin (a, b). (15)

Unión difusa: T-conorma o S-norma Al igual que la intersección difusa, el operador de unión difusa está especificado en general por una función S : [0, 1] × [0, 1] → [0, 1]. De forma simbólica,

µ µ µ µ µA B A B A Bx S x x x x∪ = = +( ) ( ( ), ( )) ( ) ~ ( ) , (16) donde ~+ es un operador binario para la función S. Esta clase de operador de unión difusa, que está referida regularmente como operado T-conorma (o S-norma), satisface los siguientes requisitos. Un operador T-norma (o S-norma) es un operador con dos elementos que satisface:

Frontera: S(1, 1) = 1, S(a, 0) = S(0, a) = a

Monotonicidad: S(a, b) < S(c, d) si a < c y b < d (17)

Conmutatividad: S(a, b) = S(b, a) Asociatividad: S(a, S(b, c)) = S ( S(a, b), c).

Ejemplo: cuatro operadores T-conorma que cumplen con las propiedades antes mencionadas son:

Máximo: S (a, b) = max (a, b) = a ∨ b

Suma algebraica: S (a, b) = a + b – ab

Suma acotada: S (a, b) = 1 ∧ (a + b) (18)

Suma drástica: a si bb si a

si a b

,,, ,

==>

⎨⎪

⎩⎪

00

1 0 .

También se puede verificar que:

Smax (a, b) ≤ Sap (a, b) ≤ Sbp (a, b) ≤ Sdp (a, b). (19)

Relación binarias Una relación difusa R es una función de membresía de dos dimensiones:

Page 7: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

R = { ((x, y), µR (x, y)) | (x, y) ∈ X × Y} (20) Composición max-min La composición max-min de dos relaciones difusas R1 (definida en X y Y) y R2 (definida en Y y Z ) es:

µ µ µR R y R Rx z x y y z1 2 1 2o ( , ) [ ( , ) ( , )]= ∨ ∧

(21)

Propiedades: Asociatividad: R ° (S ° T) = (R ° S) ° T Distributividad sobre la unión: R ° (S ∪ T) = (R ° S) ∪ (R ° T) Distributividad débil sobre la intersección: R ° (S ∩ T) ⊆ (R ° S) ∩ (R ° T) Monotonicidad: S ⊆ T ⇒ (R ° S) ⊆ (R ° T) Composición max-estrella Composición max–product:

µ µ µR R y R Rx z x y y z1 2 1 2o ( , ) [ ( , ) ( , )]= ∨

(22)

En general, se tiene la composición max-*:

µ µ µR R y R Rx z x y y z1 2 1 2o ( , ) [ ( , ) * ( , )]= ∨

(23)

donde “*” es un operador T-norma. Sistemas de Inferencia Difusa El sistema de inferencia es un marco popular de cálculo basado en los conceptos de la teoría de lógica difusa, reglas si-entonces, y razonamiento difuso. debido a su naturaleza multidiciplinaria, el sistema de inferencia difusa es conocido por otros nombres, tales sistemas basado en reglas, sistema experto difuso, modelo difuso, memoria asociativa difusa, controlador lógico difuso, o simplemente de manera ambigua sistema difuso. La estructura básica que compone a un sistema difuso consiste de tres componentes conceptuales: una base de reglas, que contiene una selección de reglas difusas; una base de datos (o diccionario), que define las funciones de membresía utilizadas en las reglas difusas; y un mecanismo de razonamiento, que realiza el procedimiento de inferencia bajo las reglas y hechos dados para derivar una salida razonable o conclusión. Hay que hacer notar que un sistema de inferencia difuso puede tomar entradas difusas como si fueran entradas certeras (que pueden ser vistos como singletones difusos), pero la salida que se produce casi siempre son conjuntos difusos. Algunas veces es necesario tener una salida certera, especialmente en la situación donde los sistemas de inferencia difusa son utilizados por un controlador. Por lo tanto se necesita de un método de defusificación para extraer un valor certero que en la medida de lo posible "mejor" represente a un conjunto difuso. Un sistema de inferencia difuso con una salida certera se muestra en la fig 4, donde el bloque de defusificación sirve para el proposito de

Page 8: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

transformar una salida difusa a un valor certero único. Los sistemas de inferencia son también conocidos como sistemas basados en reglas difusas, memorias asociativas difusas MAD (Fuzzy Asociative Memory-FAM), o controladores difusos cuando son usados como controladores. Básicamente un sistema de inferencia difusa esta compuesto de cinco bloques funcionales :

Base deconocimiento

Base de Datos Base de reglas

Unidad para hacer Decisiones

Interfaz deDefusificación

Entrada

(certera)

Salida

(certera)

Interfaz deDefusificación

Figura 4. Sistema de inferencia difuso.

La fig. 5 utiliza un sistema de inferencia con dos reglas de entrada para mostrar diferentes tipos de reglas difusas y el razonamiento difuso antes mencionado.

Figura 5. Reglas difusas sí-entonces usadas comúnmente y mecanismos de razonamiento. En resumen, un sistema de inferencia difuso (fig. 4) contiene los siguientes

elementos:

a) Una base de reglas conteniendo un número de reglas sí-entonces; b) Una base de datos que define funciones de membresía de conjuntos difusos

usados en las reglas difusas; c) Una unidad que hace decisiones que desempeña operaciones de inferencia

sobre las reglas;

x (centroide del área)

x y Y X

Y X

A1

A2

B1

B2

Z

w1

Z

c1

x1

w2

Z

c2

x2

z1 = a x + b y + c

z2 = p x + q y + r

zx x

=++

w ww w

1 1 2 2

1 221

2211

wwww

++

=xxz

max xpromedio ponderado

promedio ponderado

min

c2

w2

Z

c1

w1

Tipo 1 Tipo 2 Tipo 3

Parte de las premisas Parte de consecuentes

Page 9: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

d) Una interfase de fusificación que transforma entradas malas certeras en grados de paridad con valores lingüísticos;

e) Una interfase de defusificación que transforma los resultados difusos de la inferencia en salidas

f) certeras. Modelo Difuso tipo Tsukamoto (modelo difuso tipo 1) En los modelos de Tsukamoto, los consecuentes de cada regla difusa si-entonces esta representado por un conjunto difuso con FM's monotónicas. Como resultado, la salida inferida de cada regla esta definida como un valor certero inducido por medio de fuerzas de disparo. La salida total esta tomada como el promedio ponderado de cada regla de salida. Modelo Difuso tipo Mamdani (modelo difuso tipo 2) El sistema de inferencia Mamdani fue propuesto como un primer intento para controlar una combinación de maquina de vapor y caldera por medio del control de reglas lingüísticas obtenidas a partir de la experiencia de operadores humanos expertos en el manejo de este tipo de maquinas. Para un sistema de modelo Mamdani, cada regla difusa tiene la forma:

Ri: SI ( )Ip

l

lil x

1

)(

=

µ ENTONCES ( ) ( ))()(

)( mmpi

mim yy += µν , ∀ m = 1, …, q (24)

donde x = (x(1), …, x(p) ) es el vector de entrada del sistema, y = (y(1), …, y(q) ) es el correspondiente vector de salida , ∩ : [0,1]2 → [0,1] es una T-norma, y µil, νim : R → [0,1], i = 1, …,c, l = 1, …, p + q, m = 1, …, q son las funciones de membresía, donde c es igual al número de reglas difusas, q es el número de variables de entrada, y q es el número de variables de salida. Comúnmente, se le llama a µil (x(l)), i =1, …, c, l = 1, …, p, lado izquierdo (left-hand side-LHS) o funciones de membresía antecedentes y µi(p+m) (y(m)), i = 1, …, c, m = 1, …, q, lado derecho (right-hand side RHS) o funciones de membresía consecuentes. Cada función de membresía νim (y(m)), i = 1, …, c, m = 1, …, q, representan la salida difusa de Ri para los componentes de salida y(l), calculadas como:

( ) ( ) ( )Ip

l

lil

mmpi

mim xyy

1

)()()(

)(

=+ ∩= µµν , m = 1, …, q. (25)

Los componentes de salida del sistema difuso Mmdani completo son calculados como:

( )⎟⎟⎠

⎞⎜⎜⎝

⎛=

=U

c

i

mim

m ydy1

)()( ν , m = 1, …, q (26)

donde ∪ : [0,1]2 → [0,1] es una T-conorma y d : ({µ : R → [0,1]}) → R es una operación defusificación con el propósito de obtener un valor certero que pueda llegar a ser aplicado a un actuador como puede ser un motor, una válvula, solenoide etc. Para el dominio R, la defusificación del centro de gravedad (center of gravity-COG) esta definida como:

Page 10: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

∫∫

∞−

∞−=dxx

xdxxdCOG

)(

)(

µ

µ (27)

La fig. 6 muestra la ilustración de como un sistema de inferencia difuso tipo Mamdani de dos reglas deriva la salida total z cuando esta sujeta a dos entradas certeras x y y. Representación Gráfica:

Figura 6. El sistema de inferencia difusa Mamdani utilizando min y max para los operadores de T-norma y

T-conorma, respectivamente.

Regla 1: si x es A1 y y es B1, entonces z es C1 Regla 2: si x es A2 y y es B2, entonces z es C2 (28)

Si se adopta los operadores max y producto algebraico como la selección para los operadores T-norma y T-conorma, respectivamente, y se utiliza la composición max-product en vez de la composición original max-min, donde la salida inferida de cada regla es un conjunto difuso escalado por la fuerza de disparo por medio del producto algebraico. Una vez que han sido establecido las características del sistema difuso que se desea implementar se definen las características del programa que se encarga de compilar las reglas difusas del tipo si-entonces (lenguaje natural) a código C intermedio para que posteriormente sea compilado a lenguaje ensamblador del microcontrolador AVR.

A1

B1

A2

B2

T-norm

X

X

Y

Y

W1

C1

C2

C

X Y z

x

W2

y

Page 11: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Compilador

Un compilador esta estructurado por varias secciones, básicamente se necesita de: a) un a analizador léxico; b) un analizador sintáctico; c) un analizador semántico; d) un generador de código intermedio (optativo); e) un programa para optimizar código (optativo) y; f) un generador de código. Existen varias referencias bibliográficas que enseñan la forma de implementar un compilador (Aho, 1998), (Teufel, 1995) y (Louden, 2004). Inclusive existen programas que permiten implementar compiladores a partir de una serie de reglas y cierta programación básica como lo son lex que trabaja bajo el sistema operativo Unix (flex es la versión para linux) y yacc (bison es la versión respectiva para linux), estos programas generan código en C/C++, una buena referencia se encuentra en (Levine, 1995). Se realizaron algunos programas realizados con Flex y Bison, sin embargo, se llegaron a obtener resultados parciales, por lo que no se reportan los resultados obtenidos.

En este proyecto se desarrolló un programa (software) para poder traducir reglas y conjuntos difusos, a partir de un lenguaje natural en una plantilla en lenguaje C, para compilarse mediante herramientas de desarrollo de código para microcontrolador existentes. Esta es una de las aportaciones del proyecto, debido a que el proceso de generación de un algoritmo de control difuso (implementación del algoritmo de Mamdani) y su depuración es una tarea ardua y rigurosa, si ésta se realiza en lenguaje ensamblador directamente.

La secuencia de pasos elementales para el diseño de un algoritmo de control difuso es el siguiente:

1. Diseño de conjuntos difusos de entrada y salida 2. Diseño de reglas de control difusas

El resultado es la generación de una plantilla en lenguaje C, la que se puede

compilar mediante el software comercial CodeVision AVR. Resultados

A continuación se muestra un ejemplo de las reglas difusas del tipo si-entonces que se utilizaron:

Reglas Si x0=f0 y x1=f0 entonces y0=f1 Si x0=f0 y x1=f1 entonces y0=f0 Si x0=f0 y x1=f2 entonces y0=f0 Si x0=f1 y x1=f0 entonces y0=f1 Si x0=f1 y x1=f1 entonces y0=f1 Si x0=f1 y x1=f2 entonces y0=f1 Si x0=f2 y x1=f0 entonces y0=f2 Si x0=f2 y x1=f1 entonces y0=f2 Si x0=f2 y x1=f2 entonces y0=f2

Se muestra, a continuación, el programa que fue programado.

Programa principal:

Page 12: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Programa compilador //generador de un programa en lenguaje C //que posteriormente se compila //a lenguaje AVR-ATMega8535 //Nota: el programa se ejecuta para DOS //Librerias típicas de C #include<graphics.h> #include<stdio.h> #include<conio.h> #include<dos.h> #include<stdlib.h> #include<math.h> //Algunas constantes definidas para condiciones iniciales #define MAXS 5 #define MAXF 5 #define MAXX 3 #define MAXY 2 #define MAXR 250 //pow(MAXF,MAXX)*MAXY #define INIX 300 #define FINX 255+INIX #define INIY 210 #define FINY 10 //Definiciòn de estructuras typedef struct { float ini; float fin; int tipo; }sdif; //segmento de recta typedef struct { int nseg; sdif seg[MAXS]; }fdif; typedef struct { int nfun; fdif fun[MAXF]; }entrs; typedef struct { int nfun; int fun[MAXF]; }sals; typedef struct { int x[MAXX]; int y[MAXY]; }regl; int xn,fn,sn,yn,yfn; //posicion actual int num_entr,num_sals,num_regl; //cantidad definada entrs x[MAXX]; sals y[MAXY]; regl r[MAXR],r_aux[MAXR]; /////////// //Función operación T-norma (operador máximo) void maximos(void) { int i,j; cleardevice(); printf("Unidad Logica Difusa\n\n"); printf("No. de Entradas? "); scanf("%d",&num_entr); for(i=0;i<num_entr;i++) { printf("\n\nNo. de Funciones de la Entrada %d? ",(i+1)); scanf("%d",&x[i].nfun); for(j=0;j<x[i].nfun;j++) { printf("\nNo. de Segmentos de la Funcion %d? ",(j+1)); scanf("%d",&x[i].fun[j].nseg);

Page 13: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

} } cleardevice(); gotoxy(1,1); printf("Unidad Logica Difusa\n\n"); printf("No. de Salidas? "); scanf("%d",&num_sals); for(i=0;i<num_sals;i++) { printf("\n\nNo. de Funciones de la Salida %d? ",(i+1)); scanf("%d",&y[i].nfun); } } /////////// //Función para mostrar en pantalla los conjuntos difusos void pantalla(void) { setfillstyle(1,15); setcolor(15); bar(INIX-1,FINY-1,FINX+1,INIY+1); rectangle(INIX-3,FINY-3,FINX+3,INIY+3); } //Desplegar letreros en universo de discurso void print_x(void) { gotoxy(1,1); printf("Funciones de las Entradas"); gotoxy(1,3); printf("Entrada %d",(xn+1)); gotoxy(1,4); printf("Funcion %d",(fn+1)); gotoxy(1,5); printf("Segmento %d",(sn+1)); } //Desplegar universo de discurso void tabla_seg_x(void) { int i; setfillstyle(1,0); bar(0,95,200,300); gotoxy(1,7); printf("Seg | ini | fin | tipo\n"); printf("======================"); for(i=0;i<x[xn].fun[fn].nseg;i++) { gotoxy(1,9+i); printf("%d",i+1); gotoxy(5,9+i); printf("| %.f",x[xn].fun[fn].seg[i].ini); gotoxy(11,9+i); printf("| %.f",x[xn].fun[fn].seg[i].fin); gotoxy(17,9+i); printf("| %d",x[xn].fun[fn].seg[i].tipo); } } //Función de membresía tipo "S" void put_s(int ini,int fin,int tipo) { int snp; if(sn==0) //condiciones del parametro ini=0; if(ini<(0+2*(sn))) ini=0+2*(sn); if(ini>254) ini=254; if(sn==(x[xn].fun[fn].nseg-1)) fin=255; if(fin<=ini) fin=ini+1; if(fin>(255-2*(x[xn].fun[fn].nseg-sn-1))) fin=255-2*(x[xn].fun[fn].nseg-sn-1); if(tipo<0) tipo=0; if(tipo>3) tipo=3; //modifica los parámetros y sus aledaños x[xn].fun[fn].seg[sn].ini=ini;

Page 14: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

x[xn].fun[fn].seg[sn].fin=fin; x[xn].fun[fn].seg[sn].tipo=tipo; if(sn>0) { x[xn].fun[fn].seg[sn-1].fin=ini-1; if(tipo>=2) { if(x[xn].fun[fn].seg[sn-1].tipo==0) x[xn].fun[fn].seg[sn-1].tipo=1; if(x[xn].fun[fn].seg[sn-1].tipo==2) x[xn].fun[fn].seg[sn-1].tipo=3; } if(tipo<2) { if(x[xn].fun[fn].seg[sn-1].tipo==1) x[xn].fun[fn].seg[sn-1].tipo=0; if(x[xn].fun[fn].seg[sn-1].tipo==3) x[xn].fun[fn].seg[sn-1].tipo=2; } for(snp=(sn-1);snp>0;snp--) { if(x[xn].fun[fn].seg[snp].fin<=x[xn].fun[fn].seg[snp].ini) x[xn].fun[fn].seg[snp].ini=x[xn].fun[fn].seg[snp].fin-1; } } if(sn<(x[xn].fun[fn].nseg-1)) { x[xn].fun[fn].seg[sn+1].ini=fin+1; if(tipo==1||tipo==3) { if(x[xn].fun[fn].seg[sn+1].tipo==0) x[xn].fun[fn].seg[sn+1].tipo=2; if(x[xn].fun[fn].seg[sn+1].tipo==1) x[xn].fun[fn].seg[sn+1].tipo=3; } if(tipo==0||tipo==2) { if(x[xn].fun[fn].seg[sn+1].tipo==2) x[xn].fun[fn].seg[sn+1].tipo=0; if(x[xn].fun[fn].seg[sn+1].tipo==3) x[xn].fun[fn].seg[sn+1].tipo=1; } for(snp=(sn+1);snp<(x[xn].fun[fn].nseg-1);snp++) { if(x[xn].fun[fn].seg[snp].ini>=x[xn].fun[fn].seg[snp].fin) x[xn].fun[fn].seg[snp].fin=x[xn].fun[fn].seg[snp].ini+1; } } } //Solicitar datos void pedir_seg_x(void) { int ini,fin,tipo; setfillstyle(1,0); bar(0,300,639,479); //gotoxy(10,27); //printf("Inicio= "); //scanf("%d",&ini); if((x[xn].fun[fn].nseg-1)!=sn) { gotoxy(10,27); printf("Punto %d= ",sn+1); scanf("%d",&fin); } gotoxy(10,28); printf("Tipo= "); scanf("%d",&tipo); put_s(x[xn].fun[fn].seg[sn].ini,fin,tipo); } //Función para restablecer datos void reset_fun(void) { int i; for(i=0;i<x[xn].fun[fn].nseg;i++) { x[xn].fun[fn].seg[i].ini=255;

Page 15: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

x[xn].fun[fn].seg[i].fin=255; x[xn].fun[fn].seg[i].tipo=0; } } //Función para dibujar las funciones de membresía void draw_fdif_x(void) { int i,j; for(i=0;i<x[xn].nfun;i++) { for(j=0;j<x[xn].fun[i].nseg;j++) { setcolor(1+i); switch(x[xn].fun[i].seg[j].tipo) { case 0: line(INIX+(x[xn].fun[i].seg[j].ini),INIY,INIX+(x[xn].fun[i].seg[j].fin),INIY); break; case 1: line(INIX+(x[xn].fun[i].seg[j].ini),INIY,INIX+(x[xn].fun[i].seg[j].fin),FINY); break; case 2: line(INIX+(x[xn].fun[i].seg[j].ini),FINY,INIX+(x[xn].fun[i].seg[j].fin),INIY); break; case 3: line(INIX+(x[xn].fun[i].seg[j].ini),FINY,INIX+(x[xn].fun[i].seg[j].fin),FINY); break; } } } } //Solicitar datos de entrada void entradas(void) { int i,j,k; cleardevice(); for(i=0;i<num_entr;i++) { xn=i; for(j=0;j<x[i].nfun;j++) { fn=j; reset_fun(); for(k=0;k<x[i].fun[j].nseg;k++) { sn=k; print_x(); pedir_seg_x(); tabla_seg_x(); pantalla(); draw_fdif_x(); getch(); } cleardevice(); } } } /////////// //Restablecer la salida void reset_sals(void) { int i; for(i=0;i<y[yn].nfun;i++) { y[yn].fun[i]=0; } } //Desplegar conjuntos difusos de salida void print_y(void) { gotoxy(1,1); printf("Funciones de las Salidas");

Page 16: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

gotoxy(1,3); printf("Salida %d",(yn+1)); gotoxy(1,4); printf("Funcion %d",(yfn+1)); } //Colocar datos de salida void put_f(int loc) { //condiciones del parametro if(loc>255) loc=255; if(loc<0) loc=0; y[yn].fun[yfn]=loc; } //Tabla de búsqueda void tabla_fun_y(void) { int i; setfillstyle(1,0); bar(0,95,200,300); gotoxy(1,7); printf("Fun | localizacion\n"); printf("=================="); for(i=0;i<y[yn].nfun;i++) { gotoxy(1,9+i); printf("%d",i+1); gotoxy(5,9+i); printf("| %d",y[yn].fun[i]); } } //Solicitar datos conjuntos de salida void pedir_seg_y(void) { int loc; setfillstyle(1,0); bar(0,300,639,479); gotoxy(10,27); printf("Localizacion= "); scanf("%d",&loc); put_f(loc); } //Dibujar conjuntos de salida void draw_y(void) { int i; for(i=0;i<y[yn].nfun;i++) { setcolor(1+i); line(INIX+(y[yn].fun[i]),INIY,INIX+(y[yn].fun[i]),FINY); } } //Ejecutar funciones para la salida void salidas(void) { int i,j; cleardevice(); for(i=0;i<num_sals;i++) { yn=i; reset_sals(); for(j=0;j<y[i].nfun;j++) { yfn=j; print_y(); pedir_seg_y(); tabla_fun_y(); pantalla(); draw_y(); getch(); } cleardevice(); } } //Reglas difusas void reglas(void)

Page 17: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

{ int e[MAXX],fy,s; num_regl=0; gotoxy(1,1); for(e[0]=0;e[0]<x[0].nfun;e[0]++) { if(num_entr>1) { /// for(e[1]=0;e[1]<x[1].nfun;e[1]++) { if(num_entr>2) { /// for(e[2]=0;e[2]<x[2].nfun;e[2]++) { if(num_entr>3) { /// for(e[3]=0;e[3]<x[3].nfun;e[3]++) { if(num_entr>4) { /// for(e[4]=0;e[4]<x[4].nfun;e[4]++) { if(num_entr>5) { //// for(e[5]=0;e[5]<x[5].nfun;e[5]++) { if(num_entr>6) { //// for(e[6]=0;e[6]<x[6].nfun;e[6]++) { if(num_entr>7) { //// for(e[7]=0;e[7]<x[7].nfun;e[7]++) { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d y X3=f%d y X4=f%d y X5=f%d y X6=f%d y X7=f%d entonces Y%d=f",e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; r[num_regl].x[3]=e[3]; r[num_regl].x[4]=e[4]; r[num_regl].x[5]=e[5]; r[num_regl].x[6]=e[6]; r[num_regl].x[7]=e[7]; } num_regl++; } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d y X3=f%d y X4=f%d y X5=f%d y X6=f%d entonces Y%d=f",e[0],e[1],e[2],e[3],e[4],e[5],e[6],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy;

Page 18: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; r[num_regl].x[3]=e[3]; r[num_regl].x[4]=e[4]; r[num_regl].x[5]=e[5]; r[num_regl].x[6]=e[6]; } num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d y X3=f%d y X4=f%d y X5=f%d entonces Y%d=f",e[0],e[1],e[2],e[3],e[4],e[5],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; r[num_regl].x[3]=e[3]; r[num_regl].x[4]=e[4]; r[num_regl].x[5]=e[5]; } num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d y X3=f%d y X4=f%d entonces Y%d=f",e[0],e[1],e[2],e[3],e[4],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; r[num_regl].x[3]=e[3]; r[num_regl].x[4]=e[4]; } num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d y X3=f%d entonces Y%d=f",e[0],e[1],e[2],e[3],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; r[num_regl].x[3]=e[3]; }

Page 19: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d y X2=f%d entonces Y%d=f",e[0],e[1],e[2],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; r[num_regl].x[2]=e[2]; } num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d y X1=f%d entonces Y%d=f",e[0],e[1],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; r[num_regl].x[1]=e[1]; } num_regl++; } } /// } else { for(s=0;s<num_sals;s++) { printf("si X0=f%d entonces Y%d=f",e[0],s); scanf("%d",&fy); if(fy>=y[s].nfun) { fy=y[s].nfun-1; } r[num_regl].y[s]=fy; r[num_regl].x[0]=e[0]; } num_regl++; } } getch(); cleardevice(); gotoxy(1,1); for(int i=0;i<num_regl;i++) { printf("%d\t%d\t%d\t%d\t%d\n",r[i].x[0],r[i].x[1],r[i].x[2],r[i].y[0],r[i].y[1]); } } /////////// //Abrir archivo de entrada y traducir información a C para el microcontrolador void traducir(void) { int i,j,k,m,cont; FILE *trad;

Page 20: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

trad=fopen("traduc.txt","w"); fprintf(trad,"#include <math.h>\n\n"); fprintf(trad,"\ttypedef struct\n\t{\n\t float ini;\n\t float fin;\n\t int tipo;\n\t float m;\n\t}sdif;"); fprintf(trad,"\n\n\tint "); for(i=0;i<num_entr;i++) { fprintf(trad,"nseg_x%d[%d]={",i,x[i].nfun); for(j=0;j<x[i].nfun;j++) { fprintf(trad,"%d",x[i].fun[j].nseg); if(j!=(x[i].nfun-1)) fprintf(trad,","); } fprintf(trad,"}"); if(i!=(num_entr-1)) fprintf(trad,","); } fprintf(trad,";\n\tsdif "); for(i=0;i<num_entr;i++) { for(j=0;j<x[i].nfun;j++) { fprintf(trad,"fun%d_x%d[%d]",j,i,x[i].fun[j].nseg); if((i!=(num_entr-1))||(j!=(x[i].nfun))) fprintf(trad,","); } } fprintf(trad,";\n\tfloat x[%d],y[%d];\n\tint ",num_entr,num_sals); for(i=0;i<num_sals;i++) { fprintf(trad,"fun_y%d[%d]",i,y[i].nfun); if(i!=(num_sals-1)) fprintf(trad,","); } fprintf(trad,";\n\tfloat def[2],aux_min[10];\n\tfloat "); for(i=0;i<num_sals;i++) { fprintf(trad,"aux_y%d[%d]",i,y[i].nfun); if(i!=(num_sals-1)) fprintf(trad,","); } fprintf(trad,";\n\n//////////////////////////////////////////////"); //funcion fucificacio fprintf(trad,"\nfloat ev_dif(float x,sdif *fun,int nsegs) // fusificacion <--\n{\n int i;\n float y;\n for(i=0;i<nsegs;i++)\n {\n if(x<=fun[i].fin)\n {\n switch(fun[i].tipo)\n {\n case 0:\n y=0;\n break;\n case 3:\n y=255;\n break;\n case 1:\n x=x-fun[i].ini;\n y=fun[i].m*x;\n break;\n case 2:\n x=fun[i].fin-x;\n y=fun[i].m*x;\n break;\n }\n return(y);\n }\n }\n}\n"); //funcion de evaluacion de reglas fprintf(trad,"\nvoid ev_reglas(void)\n{\n int i;\n"); for(i=0;i<num_sals;i++) { for(j=0;j<y[i].nfun;j++) { fprintf(trad,"\n //y%d[%d]",i,j); for(k=0,cont=0;k<num_regl;k++) { if(r[k].y[i]==j) { fprintf(trad,"\n\taux_min[%d]=ev_dif(x[0],fun%d_x0,nseg_x0[%d]",cont,r[k].x[0],x[0].fun[r[k].x[0]].nseg); for(m=1;m<num_entr;m++) { fprintf(trad,"\n\t aux_min[%d]=fmin(aux_min[%d],ev_dif(x[%d],fun%d_x%d,nseg_x%d[%d]));",cont,cont,m,r[k].x[m],m,m,x[m].fun[r[k].x[m]].nseg); } cont++; } } fprintf(trad,"\n\n\taux_y%d[%d]=0;\n\tfor(i=0;i<%d;i++)\n\t{\n\t aux_y%d[%d]=fmax(aux_y%d[%d],aux_min[i]);\n\t}",i,j,cont,i,j,i,j); }

Page 21: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

} // Declaracion de las funciones difuzas fprintf(trad,"// Declaracion de las funcines difuzas"); for(i=0;i<num_entr;i++) { fprintf(trad,""); for(j=0;j<x[i].nfun;j++) { fprintf(trad,"\n"); for(k=0;k<x[i].fun[j].nseg;k++) { fprintf(trad,"\nfun%d_x%d[%d].ini=%.f;\n",j,i,k,x[i].fun[j].seg[k].ini); fprintf(trad,"fun%d_x%d[%d].fin=%.f;\n",j,i,k,x[i].fun[j].seg[k].fin); fprintf(trad,"fun%d_x%d[%d].tipo=%d;\n",j,i,k,x[i].fun[j].seg[k].tipo); if(x[i].fun[j].seg[k].tipo==1||x[i].fun[j].seg[k].tipo==2) { //fprintf(trad,"fun%d_x%d[%d].m=255/(fun%d_x%d[%d].fin-fun%d_x%d[%d].ini);\n",j,i,k,j,i,k,x[i].fun[j].seg[k].fin,j,i,k,x[i].fun[j].seg[k].fin); fprintf(trad,"fun%d_x%d[%d].m=%.00000f;\n",j,i,k,(255/(x[i].fun[j].seg[k].fin-x[i].fun[j].seg[k].ini))); } } } } fclose(trad); } /////////// //Función principal ejecutar funciones finales void main(void) { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); maximos(); entradas(); salidas(); reglas(); traducir(); getch(); closegraph(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

A continuación, se muestra el programa compilador en C por generador.cpp: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <math.h> typedef struct { float ini; float fin; int tipo; float m; }sdif; int nseg_x0[3]={3,4,3},nseg_x1[3]={3,4,3},nseg_x2[3]={3,4,3}; sdif fun0_x0[3],fun1_x0[4],fun2_x0[3],fun0_x1[3],fun1_x1[4],fun2_x1[3],fun0_x2[3],fun1_x2[4],fun2_x2[3]; float x[3],y[2]; int fun_y0[3],fun_y1[3]; float def[2],aux_min[12]; float aux_y0[3],aux_y1[3]; ////////////////////////////////////////////// float ev_dif(float x,sdif *fun,int nsegs) // fusificacion <-- { int i; float y; for(i=0;i<nsegs;i++) { if(x<=fun[i].fin) { switch(fun[i].tipo)

Page 22: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

{ case 0: y=0; break; case 3: y=255; break; case 1: x=x-fun[i].ini; y=fun[i].m*x; break; case 2: x=fun[i].fin-x; y=fun[i].m*x; break; } return(y); } } } void ev_reglas(void) { int i; //y0[0] aux_min[0]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[2]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[3]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[4]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[6]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y0[0]=0; for(i=0;i<7;i++) { aux_y0[0]=fmax(aux_y0[0],aux_min[i]); } //y0[1] aux_min[0]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[2]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[3]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[4]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[6]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[7]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[7]=fmin(aux_min[7],ev_dif(x[1],fun1_x1,nseg_x1[4]));

Page 23: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

aux_min[7]=fmin(aux_min[7],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[8]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[8]=fmin(aux_min[8],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[8]=fmin(aux_min[8],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[9]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[9]=fmin(aux_min[9],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[9]=fmin(aux_min[9],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[10]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[10]=fmin(aux_min[10],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[10]=fmin(aux_min[10],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[11]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[11]=fmin(aux_min[11],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[11]=fmin(aux_min[11],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[12]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[12]=fmin(aux_min[12],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[12]=fmin(aux_min[12],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y0[1]=0; for(i=0;i<13;i++) { aux_y0[1]=fmax(aux_y0[1],aux_min[i]); } //y0[2] aux_min[0]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[2]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[3]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[4]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[6]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y0[2]=0; for(i=0;i<7;i++) { aux_y0[2]=fmax(aux_y0[2],aux_min[i]); } //y1[0] aux_min[0]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[2]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[3]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[4]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[6]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y1[0]=0; for(i=0;i<7;i++) { aux_y1[0]=fmax(aux_y1[0],aux_min[i]);

Page 24: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

} //y1[1] aux_min[0]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[2]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[3]=ev_dif(x[0],fun0_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[4]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[6]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[7]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[7]=fmin(aux_min[7],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[7]=fmin(aux_min[7],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[8]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[8]=fmin(aux_min[8],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[8]=fmin(aux_min[8],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[9]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[9]=fmin(aux_min[9],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[9]=fmin(aux_min[9],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[10]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[10]=fmin(aux_min[10],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[10]=fmin(aux_min[10],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[11]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[11]=fmin(aux_min[11],ev_dif(x[1],fun0_x1,nseg_x1[3])); aux_min[11]=fmin(aux_min[11],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_min[12]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[12]=fmin(aux_min[12],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[12]=fmin(aux_min[12],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y1[1]=0; for(i=0;i<13;i++) { aux_y1[1]=fmax(aux_y1[1],aux_min[i]); } //y1[2] aux_min[0]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[0]=fmin(aux_min[0],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[0]=fmin(aux_min[0],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[1]=ev_dif(x[0],fun1_x0,nseg_x0[4] aux_min[1]=fmin(aux_min[1],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[1]=fmin(aux_min[1],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[2]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[2]=fmin(aux_min[2],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[2]=fmin(aux_min[2],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[3]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[3]=fmin(aux_min[3],ev_dif(x[1],fun1_x1,nseg_x1[4])); aux_min[3]=fmin(aux_min[3],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[4]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[4]=fmin(aux_min[4],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[4]=fmin(aux_min[4],ev_dif(x[2],fun0_x2,nseg_x2[3])); aux_min[5]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[5]=fmin(aux_min[5],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[5]=fmin(aux_min[5],ev_dif(x[2],fun1_x2,nseg_x2[4])); aux_min[6]=ev_dif(x[0],fun2_x0,nseg_x0[3] aux_min[6]=fmin(aux_min[6],ev_dif(x[1],fun2_x1,nseg_x1[3])); aux_min[6]=fmin(aux_min[6],ev_dif(x[2],fun2_x2,nseg_x2[3])); aux_y1[2]=0; for(i=0;i<7;i++) { aux_y1[2]=fmax(aux_y1[2],aux_min[i]); }// Declaracion de las funcines difuzas fun0_x0[0].ini=0;

Page 25: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

fun0_x0[0].fin=36; fun0_x0[0].tipo=3; fun0_x0[1].ini=37; fun0_x0[1].fin=91; fun0_x0[1].tipo=2; fun0_x0[1].m=5; fun0_x0[2].ini=92; fun0_x0[2].fin=255; fun0_x0[2].tipo=0; fun1_x0[0].ini=0; fun1_x0[0].fin=36; fun1_x0[0].tipo=0; fun1_x0[1].ini=37; fun1_x0[1].fin=91; fun1_x0[1].tipo=1; fun1_x0[1].m=5; fun1_x0[2].ini=92; fun1_x0[2].fin=146; fun1_x0[2].tipo=2; fun1_x0[2].m=5; fun1_x0[3].ini=147; fun1_x0[3].fin=255; fun1_x0[3].tipo=0; fun2_x0[0].ini=0; fun2_x0[0].fin=91; fun2_x0[0].tipo=0; fun2_x0[1].ini=92; fun2_x0[1].fin=146; fun2_x0[1].tipo=1; fun2_x0[1].m=5; fun2_x0[2].ini=147; fun2_x0[2].fin=255; fun2_x0[2].tipo=3; fun0_x1[0].ini=0; fun0_x1[0].fin=36; fun0_x1[0].tipo=3; fun0_x1[1].ini=37; fun0_x1[1].fin=146; fun0_x1[1].tipo=2; fun0_x1[1].m=2; fun0_x1[2].ini=147; fun0_x1[2].fin=255; fun0_x1[2].tipo=0; fun1_x1[0].ini=0; fun1_x1[0].fin=36; fun1_x1[0].tipo=0; fun1_x1[1].ini=37; fun1_x1[1].fin=146; fun1_x1[1].tipo=1; fun1_x1[1].m=2; fun1_x1[2].ini=147; fun1_x1[2].fin=200; fun1_x1[2].tipo=2; fun1_x1[2].m=5; fun1_x1[3].ini=201; fun1_x1[3].fin=255; fun1_x1[3].tipo=0;

Page 26: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

fun2_x1[0].ini=0; fun2_x1[0].fin=146; fun2_x1[0].tipo=0; fun2_x1[1].ini=147; fun2_x1[1].fin=200; fun2_x1[1].tipo=1; fun2_x1[1].m=5; fun2_x1[2].ini=201; fun2_x1[2].fin=255; fun2_x1[2].tipo=3; fun0_x2[0].ini=0; fun0_x2[0].fin=36; fun0_x2[0].tipo=3; fun0_x2[1].ini=37; fun0_x2[1].fin=109; fun0_x2[1].tipo=2; fun0_x2[1].m=4; fun0_x2[2].ini=110; fun0_x2[2].fin=255; fun0_x2[2].tipo=0; fun1_x2[0].ini=0; fun1_x2[0].fin=36; fun1_x2[0].tipo=0; fun1_x2[1].ini=37; fun1_x2[1].fin=109; fun1_x2[1].tipo=1; fun1_x2[1].m=4; fun1_x2[2].ini=110; fun1_x2[2].fin=146; fun1_x2[2].tipo=2; fun1_x2[2].m=7; fun1_x2[3].ini=147; fun1_x2[3].fin=255; fun1_x2[3].tipo=0; fun2_x2[0].ini=0; fun2_x2[0].fin=109; fun2_x2[0].tipo=0; fun2_x2[1].ini=110; fun2_x2[1].fin=146; fun2_x2[1].tipo=1; fun2_x2[1].m=7; fun2_x2[2].ini=147; fun2_x2[2].fin=255; fun2_x2[2].tipo=3; //Y's fun_y0[0]=62; fun_y0[1]=109; fun_y0[2]=164; fun_y1[0]=57; fun_y1[1]=156; fun_y1[2]=255; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Page 27: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Segmento del programa compilado (no completo) por CODE VisionAVR para ensamblador del microcontrolador del AVR-ATMega8535: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;CodeVisionAVR C Compiler V1.23.8d Professional ;(C) Copyright 1998-2003 HP InfoTech s.r.l. ;http://www.hpinfotech.ro ;e-mail:[email protected] ;Chip type : ATmega8535L ;Program type : Application ;Clock frequency : 8.000000 MHz ;Memory model : Small ;Optimize for : Size ;(s)printf features : int, width ;(s)scanf features : long, width ;External SRAM size : 0 ;Data Stack size : 128 ;Promote char to int : No ;char is unsigned : Yes ;8 bit enums : Yes ;Enhanced core instructions : On ;Automatic register allocation : On ;Use AVR Studio Terminal I/O : No .LISTMAC .EQU UDRE=0x5 .EQU RXC=0x7 .EQU USR=0xB .EQU UDR=0xC .EQU EERE=0x0 .EQU EEWE=0x1 .EQU EEMWE=0x2 .EQU SPSR=0xE .EQU SPDR=0xF .EQU EECR=0x1C .EQU EEDR=0x1D .EQU EEARL=0x1E .EQU EEARH=0x1F .EQU WDTCR=0x21 .EQU MCUCR=0x35 .EQU GICR=0x3B .EQU SPL=0x3D .EQU SPH=0x3E .EQU SREG=0x3F .DEF R0X0=R0 .DEF R0X1=R1 .DEF R0X2=R2 .DEF R0X3=R3 .DEF R0X4=R4 .DEF R0X5=R5 .DEF R0X6=R6 .DEF R0X7=R7 .DEF R0X8=R8 .DEF R0X9=R9 .DEF R0XA=R10 .DEF R0XB=R11 .DEF R0XC=R12 .DEF R0XD=R13 .DEF R0XE=R14 .DEF R0XF=R15 .DEF R0X10=R16 .DEF R0X11=R17 .DEF R0X12=R18 .DEF R0X13=R19 .DEF R0X14=R20 .DEF R0X15=R21 .DEF R0X16=R22 .DEF R0X17=R23 .DEF R0X18=R24 .DEF R0X19=R25 .DEF R0X1A=R26 .DEF R0X1B=R27

.DEF R0X1C=R28 .DEF R0X1D=R29 .DEF R0X1E=R30 .DEF R0X1F=R31 .EQU __se_bit=0x40 .EQU __sm_mask=0xB0 .EQU __sm_adc_noise_red=0x10 .EQU __sm_powerdown=0x20 .EQU __sm_powersave=0x30 .EQU __sm_standby=0xA0 .EQU __sm_ext_standby=0xB0 .MACRO __CPD1N CPI R30,LOW(@0) LDI R26,HIGH(@0) CPC R31,R26 LDI R26,BYTE3(@0) CPC R22,R26 LDI R26,BYTE4(@0) CPC R23,R26 .ENDM .MACRO __CPD2N CPI R26,LOW(@0) LDI R30,HIGH(@0) CPC R27,R30 LDI R30,BYTE3(@0) CPC R24,R30 LDI R30,BYTE4(@0) CPC R25,R30 .ENDM .MACRO __CPWRR CP R@0,R@2 CPC R@1,R@3 .ENDM .MACRO __CPWRN CPI R@0,LOW(@2) LDI R30,HIGH(@2) CPC R@1,R30 .ENDM .MACRO __ADDD1N SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) SBCI R22,BYTE3(-@0) SBCI R23,BYTE4(-@0) .ENDM .MACRO __ADDD2N SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) SBCI R24,BYTE3(-@0) SBCI R25,BYTE4(-@0) .ENDM .MACRO __SUBD1N SUBI R30,LOW(@0) SBCI R31,HIGH(@0) SBCI R22,BYTE3(@0) SBCI R23,BYTE4(@0) .ENDM .MACRO __SUBD2N SUBI R26,LOW(@0) SBCI R27,HIGH(@0) SBCI R24,BYTE3(@0) SBCI R25,BYTE4(@0) .ENDM .MACRO __ANDD1N

Page 28: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

ANDI R30,LOW(@0) ANDI R31,HIGH(@0) ANDI R22,BYTE3(@0) ANDI R23,BYTE4(@0) .ENDM .MACRO __ORD1N ORI R30,LOW(@0) ORI R31,HIGH(@0) ORI R22,BYTE3(@0) ORI R23,BYTE4(@0) .ENDM .MACRO __DELAY_USB LDI R24,LOW(@0) __DELAY_USB_LOOP: DEC R24 BRNE __DELAY_USB_LOOP .ENDM .MACRO __DELAY_USW LDI R24,LOW(@0) LDI R25,HIGH(@0) __DELAY_USW_LOOP: SBIW R24,1 BRNE __DELAY_USW_LOOP .ENDM .MACRO __CLRD1S CLR R30 STD Y+@0,R30 STD Y+@0+1,R30 STD Y+@0+2,R30 STD Y+@0+3,R30 .ENDM .MACRO __GETD1S LDD R30,Y+@0 LDD R31,Y+@0+1 LDD R22,Y+@0+2 LDD R23,Y+@0+3 .ENDM .MACRO __PUTD1S STD Y+@0,R30 STD Y+@0+1,R31 STD Y+@0+2,R22 STD Y+@0+3,R23 .ENDM .MACRO __POINTB1MN LDI R30,LOW(@0+@1) .ENDM .MACRO __POINTW1MN LDI R30,LOW(@0+@1) LDI R31,HIGH(@0+@1) .ENDM .MACRO __POINTW1FN LDI R30,LOW(2*@0+@1) LDI R31,HIGH(2*@0+@1) .ENDM .MACRO __POINTB2MN LDI R26,LOW(@0+@1) .ENDM .MACRO __POINTW2MN LDI R26,LOW(@0+@1) LDI R27,HIGH(@0+@1) .ENDM .MACRO __GETD1N LDI R30,LOW(@0) LDI R31,HIGH(@0) LDI R22,BYTE3(@0)

LDI R23,BYTE4(@0) .ENDM .MACRO __GETD2N LDI R26,LOW(@0) LDI R27,HIGH(@0) LDI R24,BYTE3(@0) LDI R25,BYTE4(@0) .ENDM .MACRO __GETD2S LDD R26,Y+@0 LDD R27,Y+@0+1 LDD R24,Y+@0+2 LDD R25,Y+@0+3 .ENDM .MACRO __GETB1MN LDS R30,@0+@1 .ENDM .MACRO __GETW1MN LDS R30,@0+@1 LDS R31,@0+@1+1 .ENDM .MACRO __GETD1MN LDS R30,@0+@1 LDS R31,@0+@1+1 LDS R22,@0+@1+2 LDS R23,@0+@1+3 .ENDM .MACRO __GETBRMN LDS R@2,@0+@1 .ENDM .MACRO __GETWRMN LDS R@2,@0+@1 LDS R@3,@0+@1+1 .ENDM .MACRO __GETB2MN LDS R26,@0+@1 .ENDM .MACRO __GETW2MN LDS R26,@0+@1 LDS R27,@0+@1+1 .ENDM .MACRO __GETD2MN LDS R26,@0+@1 LDS R27,@0+@1+1 LDS R24,@0+@1+2 LDS R25,@0+@1+3 .ENDM .MACRO __PUTB1MN STS @0+@1,R30 .ENDM .MACRO __PUTW1MN STS @0+@1,R30 STS @0+@1+1,R31 .ENDM .MACRO __PUTD1MN STS @0+@1,R30 STS @0+@1+1,R31 STS @0+@1+2,R22 STS @0+@1+3,R23 .ENDM .MACRO __PUTBMRN STS @0+@1,R@2 .ENDM

Page 29: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

.MACRO __PUTWMRN STS @0+@1,R@2 STS @0+@1+1,R@3 .ENDM .MACRO __GETW1R MOV R30,R@0 MOV R31,R@1 .ENDM .MACRO __GETW2R MOV R26,R@0 MOV R27,R@1 .ENDM .MACRO __GETWRN LDI R@0,LOW(@2) LDI R@1,HIGH(@2) .ENDM .MACRO __PUTW1R MOV R@0,R30 MOV R@1,R31 .ENDM .MACRO __PUTW2R MOV R@0,R26 MOV R@1,R27 .ENDM .MACRO __ADDWRN SUBI R@0,LOW(-@2) SBCI R@1,HIGH(-@2) .ENDM .MACRO __ADDWRR ADD R@0,R@2 ADC R@1,R@3 .ENDM .MACRO __SUBWRN SUBI R@0,LOW(@2) SBCI R@1,HIGH(@2) .ENDM .MACRO __SUBWRR SUB R@0,R@2 SBC R@1,R@3 .ENDM .MACRO __ANDWRN ANDI R@0,LOW(@2) ANDI R@1,HIGH(@2) .ENDM .MACRO __ANDWRR AND R@0,R@2 AND R@1,R@3 .ENDM .MACRO __ORWRN ORI R@0,LOW(@2) ORI R@1,HIGH(@2) .ENDM .MACRO __ORWRR OR R@0,R@2 OR R@1,R@3 .ENDM .MACRO __EORWRR EOR R@0,R@2 EOR R@1,R@3 .ENDM .MACRO __GETWRS

LDD R@0,Y+@2 LDD R@1,Y+@2+1 .ENDM .MACRO __PUTWSR STD Y+@2,R@0 STD Y+@2+1,R@1 .ENDM .MACRO __MOVEWRR MOV R@0,R@2 MOV R@1,R@3 .ENDM .MACRO __INWR IN R@0,@2 IN R@1,@2+1 .ENDM .MACRO __OUTWR OUT @2+1,R@1 OUT @2,R@0 .ENDM .MACRO __CALL1MN LDS R30,@0+@1 LDS R31,@0+@1+1 ICALL .ENDM .MACRO __NBST BST R@0,@1 IN R30,SREG LDI R31,0x40 EOR R30,R31 OUT SREG,R30 .ENDM .MACRO __PUTB1SN LDD R26,Y+@0 LDD R27,Y+@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X,R30 .ENDM .MACRO __PUTW1SN LDD R26,Y+@0 LDD R27,Y+@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X+,R30 ST X,R31 .ENDM .MACRO __PUTD1SN LDD R26,Y+@0 LDD R27,Y+@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) RCALL __PUTDP1 .ENDM .MACRO __PUTB1SNS LDD R26,Y+@0 LDD R27,Y+@0+1 ADIW R26,@1 ST X,R30 .ENDM .MACRO __PUTW1SNS LDD R26,Y+@0 LDD R27,Y+@0+1 ADIW R26,@1 ST X+,R30 ST X,R31 .ENDM

Page 30: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

.MACRO __PUTD1SNS LDD R26,Y+@0 LDD R27,Y+@0+1 ADIW R26,@1 RCALL __PUTDP1 .ENDM .MACRO __PUTB1PMN LDS R26,@0 LDS R27,@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X,R30 .ENDM .MACRO __PUTW1PMN LDS R26,@0 LDS R27,@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X+,R30 ST X,R31 .ENDM .MACRO __PUTD1PMN LDS R26,@0 LDS R27,@0+1 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) RCALL __PUTDP1 .ENDM .MACRO __PUTB1PMNS LDS R26,@0 LDS R27,@0+1 ADIW R26,@1 ST X,R30 .ENDM .MACRO __PUTW1PMNS LDS R26,@0 LDS R27,@0+1 ADIW R26,@1 ST X+,R30 ST X,R31 .ENDM .MACRO __PUTD1PMNS LDS R26,@0 LDS R27,@0+1 ADIW R26,@1 RCALL __PUTDP1 .ENDM .MACRO __GETB1SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) LD R30,Z .ENDM .MACRO __GETW1SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) LD R0,Z+ LD R31,Z MOV R30,R0 .ENDM .MACRO __GETD1SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) LD R0,Z+ LD R1,Z+

LD R22,Z+ LD R23,Z MOVW R30,R0 .ENDM .MACRO __GETB2SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R26,X .ENDM .MACRO __GETW2SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R0,X+ LD R27,X MOV R26,R0 .ENDM .MACRO __GETD2SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R0,X+ LD R1,X+ LD R24,X+ LD R25,X MOVW R26,R0 .ENDM .MACRO __GETBRSX MOVW R30,R28 SUBI R30,LOW(-@1) SBCI R31,HIGH(-@1) LD R@0,Z .ENDM .MACRO __GETWRSX MOVW R30,R28 SUBI R30,LOW(-@2) SBCI R31,HIGH(-@2) LD R@0,Z+ LD R@1,Z .ENDM .MACRO __LSLW8SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) LD R31,Z CLR R30 .ENDM .MACRO __PUTB1SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) ST X,R30 .ENDM .MACRO __PUTW1SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) ST X+,R30 ST X,R31 .ENDM .MACRO __PUTD1SX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) ST X+,R30 ST X+,R31 ST X+,R22

Page 31: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

ST X,R23 .ENDM .MACRO __CLRW1SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) CLR R0 ST Z+,R0 ST Z,R0 .ENDM .MACRO __CLRD1SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) CLR R0 ST Z+,R0 ST Z+,R0 ST Z+,R0 ST Z,R0 .ENDM .MACRO __PUTB2SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) ST Z,R26 .ENDM .MACRO __PUTW2SX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) ST Z+,R26 ST Z,R27 .ENDM .MACRO __PUTBSRX MOVW R30,R28 SUBI R30,LOW(-@0) SBCI R31,HIGH(-@0) ST Z,R@1 .ENDM .MACRO __PUTWSRX MOVW R30,R28 SUBI R30,LOW(-@2) SBCI R31,HIGH(-@2) ST Z+,R@0 ST Z,R@1 .ENDM .MACRO __PUTB1SNX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R0,X+ LD R27,X MOV R26,R0 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X,R30 .ENDM .MACRO __PUTW1SNX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R0,X+ LD R27,X MOV R26,R0 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X+,R30 ST X,R31 .ENDM

.MACRO __PUTD1SNX MOVW R26,R28 SUBI R26,LOW(-@0) SBCI R27,HIGH(-@0) LD R0,X+ LD R27,X MOV R26,R0 SUBI R26,LOW(-@1) SBCI R27,HIGH(-@1) ST X+,R30 ST X+,R31 ST X+,R22 ST X,R23 .ENDM .MACRO __MULBRR MULS R@0,R@1 MOV R30,R0 .ENDM .MACRO __MULBRRU MUL R@0,R@1 MOV R30,R0 .ENDM .CSEG .ORG 0 .INCLUDE "ctrl.vec" .INCLUDE "ctrl.inc" __RESET: CLI CLR R30 OUT EECR,R30 ;INTERRUPT VECTORS ARE PLACED ;AT THE START OF FLASH LDI R31,1 OUT GICR,R31 OUT GICR,R30 OUT MCUCR,R30 ;DISABLE WATCHDOG LDI R31,0x18 OUT WDTCR,R31 LDI R31,0x10 OUT WDTCR,R31 ;CLEAR R2-R14 LDI R24,13 LDI R26,2 CLR R27 __CLEAR_REG: ST X+,R30 DEC R24 BRNE __CLEAR_REG ;CLEAR SRAM LDI R24,LOW(0x200) LDI R25,HIGH(0x200) LDI R26,0x60 __CLEAR_SRAM: ST X+,R30 SBIW R24,1 BRNE __CLEAR_SRAM ;GLOBAL VARIABLES INITIALIZATION LDI R30,LOW(__GLOBAL_INI_TBL*2) LDI R31,HIGH(__GLOBAL_INI_TBL*2) __GLOBAL_INI_NEXT: LPM R0,Z+ LPM R1,Z+ MOVW R22,R30 MOVW R30,R0 SBIW R30,0

Page 32: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

BREQ __GLOBAL_INI_END LPM R26,Z+ LPM R27,Z+ LPM R24,Z+ LPM R25,Z+ __GLOBAL_INI_LOOP: LPM R0,Z+ ST X+,R0 SBIW R24,1 BRNE __GLOBAL_INI_LOOP MOVW R30,R22 RJMP __GLOBAL_INI_NEXT __GLOBAL_INI_END: ;STACK POINTER INITIALIZATION LDI R30,LOW(0x25F) OUT SPL,R30 LDI R30,HIGH(0x25F) OUT SPH,R30 ;DATA STACK POINTER INITIALIZATION LDI R28,LOW(0xE0) LDI R29,HIGH(0xE0) RJMP _main .ESEG .ORG 0 .DB 0 ; FIRST EEPROM LOCATION NOT USED, SEE ATMEL ERRATA SHEET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Page 33: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Compilador de un controlador difuso para sistemas empotrados SIP: 20062005

33/36

En la fig. 7 se muestra la implementación del sistema completo de lavado basado en lógica difusa que fue implementado.

Figura 7. Ensamble del sistema de lavado mediante lógica difusa, en donde se muestra. Impacto Productos generados 1. Software Programa compilador que interpreta reglas difusas del tipo si-entonces (lenguaje natural) a lenguaje C intermedio para el microcontrolador AVR-ATMega8535. 2. Participación en congresos

IEEE 5to. Congreso Internacional en Innovación y Desarrollo Tecnológico (CIINDET 2007).

Page 34: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Compilador de un controlador difuso para sistemas empotrados SIP: 20062005

34/36

Título del artículo: “Sistema Mecatrónico de Limpieza Inteligente con Capacidad de Purificación de Agua”.

Autores: Víctor Hugo Ponce Ponce1, Isaac Guzmán Domínguez1, Herón Molina Lozano1, Juan Antonio Jaramillo Gómez1, Efraín I. Domínguez García2, Mauricio Méndez Martínez2, Ricardo Marín San-Germán2 y Raúl Ramírez Ramírez2 1 Profesor, 2 Alumno.

Editorial: Registro ISBN del CIINDET 2007 está en trámite. El ISBN del CIINDET 2006 es ISBN-968-9152-00-9. 3. Otros artículos en memorias de un congreso internacional

a) Victor H. Ponce-Ponce, Felipe Gómez-Castañeda, José A. Moreno-Cadenas, Ezequiel Molinar-Solis y Herón Molina-Lozano, “Photogate Active Píxel Sensor Modeling Using PSpice”, XII Workshop Iberchip, San José Costarica (2006).

b) Herón Molina-Lozano y Victor Hugo Ponce-Ponce, “Análisis de Distorsión

Armónica Total e Implementación de un Circuito Multiplicador-Divisor CMOS Translineal”, XII Workshop Iberchip, San José Costarica (2006).

4. Participación en Conferencias Título de la conferencia:

Agrupamiento difuso de datos

FECHA: 31 de Agosto de 2006 Tipo de participación: Conferencia Evento: Seminario de investigación y desarrollo tecnológico 5. Una tesis de trabajo terminal Titulo de la tesis: Análisis del ADN por medio de lógica difusa Alumna: Rios Moguel Jannete Fecha: 11 de Diciembre de 2006 Ingeniería Biónica 6. Un libro VHDL guía de estilo y prácticas de laboratorio de circuitos lógicos. Registro en trámite.

Page 35: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Compilador de un controlador difuso para sistemas empotrados SIP: 20062005

35/36

Gastos realizados La tabla I, muestra la relación de gastos realizados para el proyecto.

No. Proveedor Factura Fecha Concepto Cantidad (M.N.)

1. Office Depot de Mèxico

103-H-000187186 22/09/2006 Cartuchos de

Toner $1,377.00

2. Office Depot de Mèxico

103-A-000235637 22/09/2006 Papelería $210.60

3. Office Depot de Mèxico

103-A-000235636 22/09/2006

No break, memoria

USB, CD- R Sony

$2,836.00

4. Centro de Còmputo

LPV 033448 17/11/2006 Disco Duro

IOMEGA $2,300.00

5. Libros Universitarios 4042 22/08/2006 Libros $705.00

6. GlobalBook 16005 22/08/2006 Libros $649.00

7. Editorial Limusa F 9316 23/08/2006 Libros $359.00

8. Casa del libro 49926 D 24/08/2006 Libros $2,116.90

9. Libros Universitarios 4072 27/08/2006 Libros $2,210.00

10. Deupress S.A. de C.V. 3800 27/08/2006 Libros $3,700.00

11. José Ma. Díaz Bimbela 3543 26/08/2006 Libros $585.00

12. Labor Cultural 4812 26/08/2006 Libros $899.00

13. Casasola Estrada María

Guadalupe

0107 20/09/2006 Componentes electrónicos $1,567.45

14. Zeitel S.A. de C.V. 1039 28/08/2006 Servicio a

computadoras $8,998.75

15. Zeitel S.A. de C.V. 1037 28/08/2006 Monitor LCD $2,544.95

Total $31,058.65

Tabla I. Gastos generados.

Page 36: Reporte de Técnico del Proyecto Individualsappi.ipn.mx/cgpi/archivos_anexo/20062005_4379.pdf · Para el desarrollo del proyecto se utilizó los compiladores de C/C++ versión 2.0

Compilador de un controlador difuso para sistemas empotrados SIP: 20062005

36/36

Bibliografía

1. A. V. Aho, R. Sethi, J. D. Ullman, 1998, “Compiladores: Principios, Técnicas y Herramientas”, ed. Addison Wesley Longman, México.

2. D. Dubois, H. Prade, 1980, “Fuzzy Sets and Systems”, ed. Academic Press, U.S.A. 3. J.-S. R. Jang, C.-T. Sun, E. Mizutani, 1997, “Neuro-fuzzy and Soft Computing: a Computational

Approach to Learning and Machine Intelligence”, ed. Prentice Hall, U.S.A. 4. L. Joyanes-Aguilar, I. Zahonero-Martínez, 2004, “Algoritmos y Estructuras de Datos: una

Perspectiva en C”, ed. Mc. Graw Hill, España. 5. G. J. Klir, B. Yuan, 1995, “Fuzzy Sets and Fuzzy Logic: Theory and Applications”, ed. Prentice

Hall, U.S.A. 6. Y. Langsam, M. J. Augenstein, A. M. Tenenbaum, 1997, “Estructuras de Datos con C y C++”, ed.

Prentice Hall, 2ª. ed., México. 7. J. R. Levine, T. Mason, D. Brown, 1995, “Lex & Yacc”, ed. O’reilly, U.S.A. 8. K. C. Louden, 2004, “Construcción de Compiladores: Principios y Prácticas”, ed. Thomson,

México. 9. T. J. Ross, 1997, “Fuzzy Logia with Engineering Applications”, ed. McGraw-Hill International

Editions, U.S.A. 10. T. A. Sudkamp, 1997, “Languages and Machines: an Introduction to the Theory of Computer

Science”, ed. Addison-Wesley, 2nd. ed., U.S.A. 11. B. Teufel, S. Schmidt, T. Teufel, 1995, “Compiladores: Conceptos Fundamentales”, ed. Addison-

Wesley Iberoamericana, U.S.A. 12. L. Zadeh, 1965, Fuzzy Sets, Inform Control, vol. 8, pp. 338-353.