INTRODUCCION A LDMICRO 32 ========================= Ldmicro 32 se deriva del programa Ldmicro original de Jonathan Westhues. Ldmicro32 genera codigo para microcontroladores de destino PIC16, PIC18, Atmel AVR y ARM32. Por lo general, programas de desarrollo para estos los microcontroladores estan escritos en lenguajes como ensamblador, C o Basic. Un programa que usa uno de estos lenguajes es una caja de pedidos. Estos programas son potentes y estan adaptados a la arquitectura. procesadores, que ejecutan internamente una lista de instrucciones. Uso de API (controladores logicos programables industriales) otro canal y estan programados en Idioma de contacto (o LADDER). Un programa simple se representa asi: || || || Xbutton1 Tdon Rchatter Yred || 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------|| || | || || Xbutton2 Tdof | || ||-------]/[---------[TOF 2.000 s]-+ || || || || || || || || Rchatter Ton Tnew Rchatter || 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------|| || || || || || || ||------[END]---------------------------------------------------------|| || || || || (TON es un retardo de encendido, TOF es un retardo de apagado. Los comandos --] [-- son entradas, que se comportan como los contactos de un rele. Las ordenes --( )-- son salidas, que se comportan algo asi como la bobina de un rele. Existen buenas referencias para la logica de contactos que estan disponibles en Internet y en otros lugares. Los detalles especificos de esta implementacion se dan a continuacion.) Surgen una serie de diferencias entre los programas en lenguajes avanzados (C, Basic, Etc ..) y programas para API: Son evidentes las siguientes diferencias: * El programa esta representado en formato grafico y no como una lista de comandos en formato de texto. Para muchas personas resulta mas facil de entender. * En el nivel basico, el programa aparece como un diagrama. circuito con contactos de rele (entradas) y bobinas (salidas). Esto es intuitivo para programadores que saben la teoria de los circuitos electricos. * El compilador de lenguaje Ladder comprueba todo esto cuando de la compilacion. No tiene que escribir ningun codigo cuando una salida se reemplaza y se devuelve a la entrada o si se produce un retraso de tiempo cambia, tampoco es necesario especificar el orden en el que Deben realizarse calculos. La herramienta API (PLC) se encarga de esto por usted. Usando Ldmicro32, dibuja un diagrama de escalera para su programa. Puede simular la operacion logica en tiempo real en tu computador. Cuando este satisfecho de que la operacion es correcta, puede asignar pines de microcontrolador para entradas y salidas. Luego traduce su programa al lenguaje C. Luego compilar en un archivo .HEX ejecutable que tendra que editar en el microcontrolador usando un programador. Ldmicro32 esta disenado para ser similar a la mayoria de API comerciales. Hay algunas excepciones y muchas cosas no estan estandarizadas. en el nivel de equipos industriales de todos modos. Lea atentamente el descripcion de cada instruccion, incluso si le parece familiar. Este documento asume que tiene un conocimiento basico del idioma para estructura de contacto y software para controladores logicos programables. Ciclo de ejecucion: Lectura de entradas -> Calculos -> Escritura de salidas.ETC. OPCIONES DE LINEA DE COMANDO ============================ Ldmicro32.exe funciona normalmente sin opciones de linea de comando. Puede crear un acceso directo al programa y guardarlo en la pantalla, simplemente haga doble clic para iniciarla y terminas en la interfaz de usuario. Si se pasa un nombre de archivo en la linea de comando Ldmicro32, (por ejemplo: 'Ldmicro32.exe test.ld'), luego Ldmicro32 intentara abrir 'test.ld', si existiera. Se producira un error si 'test.ld' no existe. Teneis la posibilidad de asociar Ldmicro32 con archivos de extension .ld. Esto permite que Ldmicro32 se inicie automaticamente cuando se hace doble clic. en un archivo .ld. LO ESENCIAL =========== Si ejecuta Ldmicro32 sin argumentos de linea de comando, se inicia con un programa vacio. Si comienza con el nombre de un programa idioma de contacto (xxx.ld) en la linea de comando, intentara cargar el programa al inicio. Ldmicro32 usa su formato interno para el programa, y ??no puede importar programas editados por otras herramientas. Si no carga un programa existente, Ldmicro32 comienza insertando una linea vacia. Puede agregar las instrucciones para su programa: por ejemplo, agregue un conjunto de contactos (Instrucciones -> Insertar contacto) que se llamara 'Xnew'. 'X' denota un contacto que se puede vincular a un pin de entrada del microcontrolador, puede asignar el pin a este contacto mas tarde despues de elegir el microcontrolador y cambiar el nombre de contactos. La primera letra indica que tipo de componentes por ejemplo: * Xnom - Pin de entrada del microcontrolador * Ynom - Pin de salida del microcontrolador * Rnom - Rele interno (Marca interna): un bit en memoria * Tnom - Temporizadores * Cnom - contadores * Anom - Entero leído de un ADC convertidor (Analogica) * Pnom - Pin de salida PWM en el microcontrolador * nom - Variable de uso general (Entero) Elija el resto del nombre para describir el uso que se hace de este objeto y que debe ser unico en todo el programa. El mismo nombre debe siempre se refieren al mismo objeto en todo el programa. Mediante ejemplo, obtendra un error si usa un tiempo ascendente (TON) llamado TDelai y un tempo descendente (TOF) tambien llamado TDelai en el mismo programa, el conteo realizado por estos tiempo utilizara la misma ubicacion en la memoria. Pero, por otro lado, es aceptable tener un tiempo guardado (RTO) Tdelai y una instruccion de reinicio (RES) del mismo nombre, porque en este desea que ambos usen la misma variable. Los nombres de las variables pueden ser letras, numeros o caracter _. El nombre de una variable no debe comenzar con un numero. Los nombres de las variables distinguen entre mayusculas y minusculas. Instrucciones para manipular variables (MOV, ADD, EQU, etc.) puede trabajar con variables de cualquier nombre. Pueden tener acceso a las variables de los retrasos de tiempo o contadores. Esto a veces puede resultar muy util, por ejemplo, si quiere comprobar el valor de un contador o un temporizador en un rango particular de valores. Las variables son enteros con signo. Pueden incluir 1, 2, 3 o 4 bytes. Para modificar el tamano de una variable, haga doble clic en ella en la lista de variables en la parte inferior de la ventana. bytes Tipos de Rango de /a 1 int8 -2^7 = -128=0x80 2^7 -1= 127=0x7f 2 int16 -2^15= -32768=0x8000 2^15-1= 32767=0x7fff 3 int24 -2^23= -8388608=0x800000 2^23-1= 8388607=0x7fFFFF 4 int32 -2^31=-2147483648=0x80000000 2^31-1=2147483647=0x7fffFFFF Puede especificar valores literalmente como numeros decimales normales (0, 1234, -56), tambien puede especificarlos en Caracteres ASCII ('A', 'z') poniendo el caracter entre comillas sencillo. Puede utilizar un caracter ASCII en la mayoria de lugares donde puedes usar decimales. El hexadecimal (0xA, 0x04D2, 0xffc8), octal (0o12, 0o2322, 0o177710), o binario (0b1010, 0b10011010010, 0b1111111111001000) son generalmente aceptados. Variables cuyo nombre comienza con el simbolo '#' como #PORTA, #PORTB, #PORTC, ... se tratan como puertos de salida. Variables cuyo nombre comienza con el simbolo '#' como #PINA, #PINB, #PINC, ... se tratan como puertos de entrada. Variables cuyo nombre comienza con el simbolo '#' como #TRISA, #TRISB, #TRISC, ... #DDRA, #DDRB, #DDRC, ... se tratan como registros de gestión del puerto. Nota: PORTn PINn es equivalente en PICs. En la parte inferior de la pantalla puede ver la lista de todos los objetos. utilizado en su programa. La lista se genera automaticamente del programa. La mayoria de los objetos no requieren ninguna configuracion. Solo: los objetos 'Xnom', 'Ynom' y 'Anom' deben ser asignado a un pin del microcontrolador. Lo primero que debes hacer es elegir el microcontrolador utilizado en Parametros -> Microcontrolador; luego asigna los pines haciendo doble clic en la lista. Puede modificar el programa insertando o eliminando instrucciones. El cursor parpadea en el programa para indicar la instruccion actualmente seleccionada y el punto de insercion. Si no lo hace no parpadea presione o haga clic en una instruccion, o puede insertar una nueva instruccion a la derecha o/a la izquierda (en serie con), o por debajo o por encima (en paralelo con) la instruccion seleccionada. Algunas operaciones no estan permitidas, por ejemplo, no se permiten instrucciones a la derecha de una bobina. El programa comienza con una sola linea. Puedes colocar varias lineas seleccionando Insertar -> Línea antes o despues en el menu. Puede hacer un circuito complejo colocando varias ramas en paralelo o en serie con una linea, pero es mas claro para hacer varias lineas. Una vez que su programa esta escrito, puede probarlo mediante simulacion, y compilelo como un archivo C/HEX para el microcontrolador de destino. NOTA SOBRE MATEMATICAS ====================== Recuerde que Ldmicro32 realiza calculos enteros con variables enteras. Esto significa que el resultado final de un calculo y Puede que no sea lo que piensas! Por ejemplo, imagine que queremos calcular y = (3/5) * x; si lo codifica de esta manera, tendra y = 0 porque (3/5) se redondeara a 0. Entonces tienes que codificarlo y = (3 * x) / 5: realiza * primero y / luego. ESTILO DE CODIFICACION ====================== El editor le permite colocar bobinas en paralelo en la misma fila. En otras palabras, esta permitido hacer lo siguiente: || Xa Ya || 1 ||-------] [--------------( )-------|| || || || Xb Yb || ||-------] [------+-------( )-------|| || | || || | Yc || || +-------( )-------|| || || En lugar de asi: || Xa Ya || 1 ||-------] [--------------( )-------|| || || || || || || || || || Xb Yb || 2 ||-------] [--------------( )-------|| || || || || || || || || || Xb Yc || 3 ||-------] [--------------( )-------|| || || RESISTENCIAS DE PULL-UP ======================= Muchos microcontroladores tienen resistencias pull-up, que se puede activar cuando desee establecer una entrada alta por defecto. Este suele ser el caso cuando se conecta un boton pulsador en un pin de entrada. Las resistencias pull-up se pueden activar a traves del menu asociado Parametros -> Resistencias pull-up, pero tenga cuidado porque todos los puertos no se proporcionan en los PIC. Un bit en 1 significa que el pull-up esta activado en el pin de entrada correspondiente. SIMULACION ========== Para ingresar al modo de simulacion, elija Simulacion -> Simular o presione . El programa se muestra de forma diferente en el modo simulacion. Las instrucciones activadas se muestran en rojo brillante, las instrucciones que no se muestran se muestran en gris. presione la barra espaciadora para iniciar la API durante 1 ciclo. Hacer trabajo continuamente en tiempo real elija Simulacion -> Iniciar simulacion en tiempo real o presione . La visualizacion del programa esta configurada dia en tiempo real segun los cambios de estado de las entradas. Puede cambiar el estado de las entradas del programa haciendo un doble clic en la entrada de la lista en la parte inferior de la pantalla, o en el contacto con 'Xnom' de la instruccion en el programa, para tener la reflexion automaticamente a partir de la validacion de una entrada en el programa, el programa debe estar ejecutandose; es automatico si es simulacion en tiempo real, o si presiona la barra espaciadora. COMPILAR EN C/HEX =================== El objetivo final es generar un archivo .HEX que se programara en el microcontrolador que ha elegido en Configuracion -> Microcontrolador. Debe asignar los pines de entrada / salida para cada 'Xnom' y 'Ynom'. Puede hacer esto haciendo doble clic en el nombre del objeto en la lista en la parte inferior de la pantalla. Un cuadro de dialogo que pide elegir uno de los pines no asignados de la lista. Tambien debe elegir el tiempo de ciclo que desea utilizar. su aplicacion, despues de especificar la frecuencia de reloj del microcontrolador. El tiempo de ciclo se puede dejar por defecto (10 ms) que es un buen valor para la mayoria de las aplicaciones. Indique la frecuencia del cuarzo utilizado (o del resonador ceramico, etc.) y haga clic en Aceptar. Para los microcontroladores PIC, recuerde comprobar los bits de configuracion. Se establecen automaticamente en un valor razonable. en el menu Configuracion -> Configuracion. Los otros CHIC no usan no hay bits de configuracion y este campo permanece en 0. Ahora puede crear los archivos C / H correspondientes a su programa y su objetivo. Elija Compilacion -> Compilar en C. Si su programa no contiene un error, Ldmicro32 genera un archivo C es equivalente a tu escalera. Luego elija Compilacion -> Generar solucion C para obtener el archivo ejecutable HEX. Para realizar este paso, debe tener instalado un compilador de C compatible con su objetivo y ha instalado con bibliotecas externas suministradas con Ldmicro32. Ver archivos "Comohacer" sobre esto, para configurar el script de compilacion (buildXXX.bat) ======================================== > CONO HACER STM32, PIC16F, AVRs, PIC18F ======================================== He aqui como hacer colocar librerias para STM32, PIC16F, AVRs, PIC18F Probar LdMicro en ARMs (STM32) : ________________________________ 1) Instale EmIde for ARMs o instale directamente un arm-gcc para Windows 2) Copie el ejecutable LdMicro, buildArm.bat y flashMCU.bat en un mismo directorio, y copie las bibliotecas de C LIBRARIES_FOR en el mismo directorio 3) Edite buildArm.bat (haga clic con el boton derecho + Modificar) y modifique GCCPATH para que apunte a su ruta arm-gcc Si pretende utilizar directamente un programador para flashear el objetivo, debe configurar las lineas de comandos en FlashMCU.bat De todos modos, sera posible flashear el objetivo manualmente a continuacion 4) Cree una escalera con LdMicro en un directorio 5) Compile la escalera con "Compile en ARM-GCC por 32-bit ARM" y genere el archivo C en el mismo directorio que el Archivo fuente (.ld), con el mismo nombre (.c) Tambien genera un archivo (.h) y un encabezado ladder.h Con bibliotecas unidas, realiza un proyecto de C ya confeccionado 6) Inicie "Generar C solucion" desde LdMicro para obtener el archivo hex en el directorio "bin" Mira la ventana de comandos ; no debe haber errores de compilacion Las bibliotecas se copian automaticamente (la primera vez) en el subdirectorio "lib" donde pueden ser adaptadas Los archivos intermedios se generan en el subdirectorio "obj" 7) Flashea el objetivo con "Llamar FlashMcu" o manualmente Prueba de archivo hexadecimal generado en destino ... NB: Las bibliotecas han sido probadas en STM32F07 Es posible (y facil) adaptar el codigo a otros objetivos del La misma familia mediante el uso de directivas de compilacion. El nombre del objetivo se define en ladder.h como LDTARGET_stm32f40X Puede usar varios ADC o PWM, pero solo un Uart, un SPI y un I2C (Pero con varios perifericos con diferentes pines SS de software en SPI o con diferentes direcciones en bus I2C) NB: SPI debe llamarse "SPI1", "SPI2", o "SPI3" en los STM32F4 Las nuevas funciones de SPI son: SPI Enviar / Recibir, que envia y / o recibe un byte SPI Escribir, que envia una cadena alfanumérica a SPI sin recepcion La frecuencia SPI se define como la de UART en la configuracion global SPI funciona solo en modo maestro con la mayoria de las configuraciones estandar NB: I2C debe llamarse "I2C1", I2C2" o I2C3" en los ARM Las nuevas funciones de I2C son: I2C Leer, para leer un byte en un registro de perifericos I2C Escribir, para escribir un byte en un registro de perifericos La frecuencia I2C tambien se define en la configuracion global I2C tambien funciona solo en modo maestro NB: Se utiliza la resolucion maxima ADC disponible. Se utiliza la resolucion maxima de PWM y el parametro es solo% entre 0 y 100 Probar LdMicro en AVRs (ATMEGA): ________________________________ 1) Instale un avr-gcc para Windows 2) Copie el ejecutable LdMicro, buildAvr.bat y flashMCU.bat en un mismo directorio, y copie las bibliotecas de C LIBRARIES_FOR en el mismo directorio 3) Edite buildAvr.bat (haga clic con el boton derecho + Modificar) y modifique GCCPATH para que apunte a su ruta avr-gcc Si pretende utilizar AvrDude para flashear el objetivo, modifique la ruta AVRDUDE_PATH tambien, y adapte la linea de comandos avrdude.exe de acuerdo con su programador De todos modos, sera posible flashear el objetivo manualmente a continuacion 4) Cree una escalera con LdMicro en un directorio 5) Compile la escalera con "Compile en AVR-GCC por Atmel AVR" y genere el archivo C en el mismo directorio que el Archivo fuente (.ld), con el mismo nombre (.c) Tambien genera un archivo (.h) y un encabezado ladder.h Con bibliotecas unidas, realiza un proyecto de C ya confeccionado 6) Inicie "Generar C solucion" desde LdMicro para obtener el archivo hex en el directorio "bin" Mira la ventana de comandos ; no debe haber errores de compilacion Las bibliotecas se copian automaticamente (la primera vez) en lel subdirectorio "lib" donde pueden ser adaptadas Los archivos intermedios se generan en el subdirectorio "obj" 7) Flashea el objetivo con "Llamar FlashMcu" o manualmente Prueba de archivo hexadecimal generado en destino ... NB: Las bibliotecas han sido probadas en AtMega8, 16 y 328 Es posible (y facil) adaptar el codigo a otros objetivos de la misma familia mediante el uso de directivas de compilacion. El nombre del objetivo se define en ladder.h como LDTARGET_atmegaxxx Puede usar varios ADC o PWM, pero solo un Uart, un SPI y un I2C (Pero con varios perifericos con diferentes pines SS de software en SPI o con diferentes direcciones en bus I2C) NB: SPI debe llamarse "SPI" en los AVR Las nuevas funciones de SPI son: SPI Enviar / Recibir, que envia y / o recibe un byte SPI Escribir, que envia una cadena alfanumérica a SPI sin recepcion La frecuencia SPI se define como la de UART en la configuracion global SPI funciona solo en modo maestro con la mayoria de las configuraciones estándar NB: I2C debe llamarse "I2C" en los AVR Las nuevas funciones de I2C son: I2C Leer para leer un byte en un registro de perifericos I2C Escribir para escribir un byte en un registro de perifericos La frecuencia I2C tambien se define en la configuracion global I2C tambien funciona solo en modo maestro NB: Todas las frecuencias utilizadas por ADC, PWM o SPI se obtienen del reloj de la CPU por un factor divisorio. Hay pocas opciones para este factor, por lo que las frecuencias son muy aproximativos. Para tener consejos sobre frecuencias compile en Hex / Asm y mirar la informacion dada o computarla mirando bibliotecas o hoja de datos La frecuencia I2C es mas precisa debido a las posibilidades de configuracion. NB: Se utiliza la resolución maxima ADC disponible. Se utiliza la resolución maxima de PWM y el parametro es solo% entre 0 y 100 Probar LdMicro en PIC16F : __________________________ 1) Instale desde el sitio de Microchip o autro un compilador High-Tech-C (PicC) para PIC16F 2) Copie el ejecutable LdMicro, buildPic16.bat y flashMCU.bat en un mismo directorio, y copie las bibliotecas de C LIBRARIES_FOR en el mismo dirctorio. 3) Edite buildPic16.bat (haga clic con el boton derecho + Modificar) y modifique PCCPATH para que apunte a su ruta High-Tech-C Si pretende utilizar directamente un programador para flashear el objetivo, debe configurar las lineas de comandos en FlashMCU.bat De todos modos, sera posible flashear el objetivo manualmente a continuacion 4) Cree una escalera con LdMicro en un directorio 5) Compile la escalera con "Compilar en HI-TECH C para PIC" y genere el archivo C en el mismo directorio que el Archivo fuente (.ld), con el mismo nombre (.c) Tambien genera un archivo (.h) y un encabezado ladder.h Con bibliotecas unidas, realiza un proyecto de C ya confeccionado 6) Inicie "Generar C solucion" desde LdMicro para obtener el archivo hex en el directorio "bin" Mira la ventana de comandos ; no debe haber errores de compilacion Las bibliotecas se copian automaticamente (la primera vez) en lel subdirectorio "lib" donde pueden ser adaptadas Los archivos intermedios se generan en el subdirectorio "obj" 7) Flashea el objetivo con "Llamar FlashMcu" o manualmente Prueba de archivo hexadecimal generado en destino ... NB: Las bibliotecas han sido probadas en PIC16F876 y PIC16F877 Es posible (y facil) adaptar el codigo a otros objetivos de la misma familia mediante el uso de directivas de compilacion. El nombre del objetivo se define en ladder.h como LDTARGET_pic16fxxx Puede usar varios ADC o PWM, pero solo un Uart, un SPI y un I2C (Pero con varios perifericos con diferentes pines SS de software en SPI o con diferentes direcciones en bus I2C) NB: SPI debe llamarse "SPI" en los PIC Las nuevas funciones de SPI son: SPI Enviar/Recibir, que envia y/o recibe un byte SPI Escribir, que envia una cadena alfanumérica a SPI sin recepcion La frecuencia SPI se define como la de UART en la configuracion global SPI funciona solo en modo maestro con la mayoria de las configuraciones estándar NB: I2C debe llamarse "I2C" en los PIC Las nuevas funciones de I2C son: I2C Leer para leer un byte en un registro de perifericos I2C Escribir para escribir un byte en un registro de perifericos La frecuencia I2C tambien se define en la configuracion global I2C tambien funciona solo en modo maestro NB: Todas las frecuencias utilizadas por ADC, PWM, SPI o I2C se obtienen del reloj de la CPU por un factor divisorio. Hay pocas opciones para este factor, por lo que las frecuencias son muy aproximativas. Para tener consejos sobre frecuencias compile en Hex / Asm y mirar la informacion dada o computarla mirando bibliotecas o hoja de datos NB: Se utiliza la resolución maxima ADC disponible. Se utiliza la resolución maxima de PWM y el parametro es solo% entre 0 y 100 Probar LdMicro en PIC18F : __________________________ 1) Instale desde el sitio de Microchip o autro un compilador High-Tech-C (PicC) para PIC18F 2) Copie el ejecutable LdMicro, buildPic18.bat y flashMCU.bat en un mismo directorio, y copie las bibliotecas de C LIBRARIES_FOR en el mismo dirctorio. 3) Edite buildPic18.bat (haga clic con el boton derecho + Modificar) y modifique PCCPATH para que apunte a su ruta High-Tech-C Si pretende utilizar directamente un programador para flashear el objetivo, debe configurar las lineas de comandos en FlashMCU.bat De todos modos, sera posible flashear el objetivo manualmente a continuacion 4) Cree una escalera con LdMicro en un directorio 5) Compile la escalera con "Compilar en HI-TECH C para PIC" y genere el archivo C en el mismo directorio que el Archivo fuente (.ld), con el mismo nombre (.c) Tambien genera un archivo (.h) y un encabezado ladder.h Con bibliotecas unidas, realiza un proyecto de C ya confeccionado 6) Inicie "Generar C solucion" desde LdMicro para obtener el archivo hex en el directorio "bin" Mira la ventana de comandos ; no debe haber errores de compilacion Las bibliotecas se copian automaticamente (la primera vez) en lel subdirectorio "lib" donde pueden ser adaptadas Los archivos intermedios se generan en el subdirectorio "obj" 7) Flashea el objetivo con "Llamar FlashMcu" o manualmente Prueba de archivo hexadecimal generado en destino ... NB: Las bibliotecas han sido probadas en PIC18F4520. Es posible (y facil) adaptar el codigo a otros objetivos de la misma familia mediante el uso de directivas de compilacion. El nombre del objetivo se define en ladder.h como LDTARGET_pic18Fxxxx Puede usar varios ADC o PWM, pero solo un Uart, un SPI y un I2C (Pero con varios perifericos con diferentes pines SS de software en SPI o con diferentes direcciones en bus I2C) NB: La inicialización del ADC utiliza una funcion de temporización que a su vez utiliza el timer 1. Por lo tanto, es imperativo utilizar el timer 0 con la biblioteca ADC en PIC18 NB: SPI debe llamarse "SPI" en los PIC Las nuevas funciones de SPI son: SPI Enviar / Recibir, que envia y / o recibe un byte SPI Escribir, que envia una cadena alfanumérica a SPI sin recepcion La frecuencia SPI se define como la de UART en la configuracion global SPI funciona solo en modo maestro con la mayoria de las configuraciones estándar NB: I2C debe llamarse "I2C" en los PIC Las nuevas funciones de I2C son: I2C Leer para leer un byte en un registro de perifericos I2C Escribir para escribir un byte en un registro de perifericos La frecuencia I2C tambien se define en la configuracion global I2C tambien funciona solo en modo maestro NB: Todas las frecuencias utilizadas por ADC, PWM, SPI o I2C se obtienen del reloj de la CPU por un factor divisorio. Hay pocas opciones para este factor, por lo que las frecuencias son muy aproximativos. Para tener consejos sobre frecuencias compile en Hex / Asm y mirar la informacion dada o computarla mirando bibliotecas o hoja de datos NB: Se utiliza la resolución maxima ADC disponible. Se utiliza la resolución maxima de PWM y el parametro es solo% entre 0 y 100 Por ultimo, utilice su software y hardware de programacion habituales para que cargue el archivo HEX en el microcontrolador. Es posible realizar la operacion sin salir de Ldmicro32 usando el menu Compilacion -> Flash MCU, pero eso supone haber configurado el archivo flashMcu.bat =============================================== REFERENCIA DE LAS INSTRUCCIONES DE LA ESCALERA =============================================== CONTACTOS RELES Y BOBINAS: ----------------- Terminologia: Un contacto es "sensible al nivel" si su salida depende de la entrada. el contacto se "dispara por flanco" si su salida cambia de acuerdo con bordes ascendentes / descendentes en su entrada, es decir, pasajes de este de 0 a 1 o de 1 a 0. La parte pulgada de los contactos de Ldmicro32 son "sensibles al nivel", pero algunos son del tipo "Activado por borde". > CONTACTO NORMALMENTE ABIERTO Xnom Rnom Ynom ----] [---- ----] [---- ----] [---- Si la senal que llega a este contacto es falsa, la senal de salida siempre esta falso. Si la senal que llega a este contacto es verdadera, la senal de salida sera verdadero solo si el pin o rele de entrada o salida interno asociado es verdadero; de lo contrario, la salida estara falso. Esta instruccion puede probar el estado de un pin de entrada, un pin de salida o rele interno (variable booleana). > CONTACTO, NORMALMENTE CERRADO Xnom Rnom Ynom ----]/[---- ----]/[---- ----]/[---- Si la senal que llega a este contacto es falsa, la senal de salida siempre esta falso. Si la senal que llega a este contacto es verdadera, la senal de salida sera verdadero solo si el pin o rele de entrada o salida interno asociado es falso; de lo contrario, la salida estara falso. Esta instruccion tambien puede probar el estado de un pin de entrada, un pin de salida o un rele interno (variable booleana). > BOBINA, NORMAL Rnom Ynom ----( )---- ----( )---- Si la senal que llega a este contacto es falsa, entonces el rele interno o el pin de salida se establece en 0 para el ciclo actual. Si la senal que llega a este contacto es verdadera, entonces el rele interno o el pin de salida se establece en 1. No es necesario asignar una variable a una bobina. Esta instruccion se coloca mas a la derecha en una secuencia. > BOBINA, REVERSA (CERRADA) Rnom Ynom ----(/)---- ----(/)---- Si la senal que llega a este contacto es verdadera, entonces el rele interno o el pin de salida se establece en 0 para el ciclo actual. Si la senal que llega a este contacto es falsa, entonces el rele interno o el pin de salida se establece en 1. No es necesario asignar una variable a una bobina. Esta instruccion se coloca mas a la derecha en una secuencia. > BOBINA, ACTIVA Rnom Ynom ----(S)---- ----(S)---- Si la senal que llega a este contacto es verdadera, entonces el rele interno o el pin de salida se establece en 1 hasta nuevo aviso. Si la senal que llega a este contacto es falsa, entonces el rele interno o el pin de salida no cambia. Por lo tanto, esta bobina solo puede cambiar la salida de 0 a 1.y de 1 a 0 solo con -(R)- Esta instruccion se coloca mas a la derecha en una secuencia. > BOBINA, RESETEAR Rnom Ynom ----(R)---- ----(R)---- Si la senal que llega a este contacto es verdadera, entonces el rele interno o el pin de salida se establece en 0 hasta nuevo aviso. Si la senal que llega a este contacto es falsa, entonces el rele interno o el pin de salida no cambia. Por lo tanto, esta bobina solo puede cambiar la salida de 1 a 0. Esta instruccion se coloca mas a la derecha en una secuencia. > BOBINA, T-DISPARO Rname Yname ----(T)---- ----(T)---- Una bobina de palanca (T-Trigger) cambia de estado en cada flanco ascendente. Si este contacto recibe un flanco ascendente en la entrada, su salida cambia de del estado 0 al estado 1 o viceversa, hasta nuevo aviso. Esta instruccion se coloca mas a la derecha en una secuencia. Nota: Varias bobinas con el mismo nombre 'Ynom' o 'Rnom' pueden ser representado como un chip con varias entradas y una sola salida. Las bobinas normales e inversas transfieren directamente la entrada en la salida (normal o invertida). Las bobinas R, S o T memorizan el estado de la salida. Las bobinas T se disparan por flanco mientras Las bobinas S y R son sensibles al nivel. Si frente a una bobina R, S inserta un contacto OSR o OSF (Frontal) obtiene un contacto de borde ascendente o descendente. CONTACTOS GENERALES: -------------------- > CORTOCIRCUITO, CIRCUITO ABIERTO ----+----+---- ----+ +---- Una instruccion de derivación o cortocircuito da una salida que es siempre igual a la condicion de entrada. Una instruccion de circuito abierto siempre da una salida que es siempre falsa. Estas instrucciones se utilizan generalmente en la fase de prueba. > RELE DE CONTROL MAESTRO -{MASTER RLY}- De forma predeterminada, la condicion de entrada para una fila siempre es verdadera. Si se ejecuta una instruccion de rele de control maestro con un valor de entrada falso, entonces todas las lineas subsiguientes comenzaran con una entrada incorrecta. Esto continuara hasta la reunion del siguiente instruccion de rele de control maestro que cancelara la anterior, haciendo cumplir las condiciones de entrada para que se cumplan, sea cual fuere ya sea su propia condicion de entrada, verdadera o falsa. Si la primera instruccion del rele de control maestro se ejecuta con una condicion de entrada verdadera, entonces nada cambia. Por lo tanto, estas instrucciones deben usarse en pares: uno para comenzar (que puede ser condicional) y uno para terminar. CONTADORES: ---------- > CONTADORES y DESCUENTADORES Cnom Cnom --[CTU >= value]-- --[CTD > -5]-- Un contador aumenta (contador CTU, cuenta ascendente) o disminuye (Contador regresivo CTD, cuenta regresiva) una variable en cada flanco ascendente de su linea de entrada (cuando la senal pasa del estado 0 al estado 1). La salida del contador es verdadera si el valor del contador CTU es mayor o igual que el valor (o CTD> -5), y falso en caso contrario. Por lo tanto, la salida puede ser verdadera incluso si la condicion de entrada es falsa, solo depende del valor del valor del contador. Puede tener un contador y un descontador con el mismo nombre, que van incrementar o decrementar la misma variable. La instruccion de reinicio (RES) se utiliza para reiniciar un contador (reinicio). Es posible modificar las variables mediante operaciones (MOV ...) Contadores de programa y contadores regresivos. > CONTADOR CICLICO Cnom --{CTC 0:7}-- Un contador ciclico funciona como un contador CTU / CTD normal, excepto que cuando el contador alcanza su límite, regresa a 0. En el ejemplo, el valor del contador cambia de la siguiente manera: 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, ... Esto es muy util en combinacion con instrucciones condicionales. en la variable Cnom. Puedes usar esto como secuenciador. Un CTR es un contador ciclico invertido. Es como un CTC pero que disminuye y vuelve a 0. Nota: Un contador se puede configurar con diferentes condiciones de entrada: '/' significa disparado por flanco positivo '\' significa disparado por flanco negativo '-' significa entrada estática en el nivel 1. 'o' significa entrada estática en el nivel 0. TEMPORIZADORES: --------------- > TEMPORIZADOR RETARDO AL ACTIVAR Tdon -[TON 1.000 s]- Cuando la senal de entrada de esta instruccion cambia de falsa a verdadera (0 a 1), la salida espera 1000 segundos antes de pasar a 1. Cuando la senal de entrada de esta instruccion vuelve al estado 0, la salida pasa inmediatamente a cero. El temporizador se pone a cero cada vez que la entrada vuelve a cero. La entrada debe mantenerse en 1 durante al menos 1000 milisegundos veces consecutivas antes de que la salida se convierta en verdadera. El retraso es configurable. La variable asociada cuenta desde cero en numero de ciclos. La salida de un TON se vuelve verdadera cuando la variable asociada es mayor o igual que el retardo fijo, convertido a si mismo en ciclos. Es posible manipular la variable del contador en el exterior, por ejemplo, con una instruccion MOVE. > TEMPORIZADOR RETARDO AL DESACTIVAR Tdoff -[TOF 1.000 s]- Cuando la senal de entrada de esta instruccion cambia de verdadera a falsa (1 a 0), la salida espera 1000 s antes de pasar a 0. Cuando la senal de entrada de esta instruccion vuelve al estado 1, la salida vuelve inmediatamente a 1. El retardo se restablece a cero cada vez que la entrada vuelve a 0. La entrada debe mantenerse en 0 durante al menos 1000 milisegundos veces consecutivas antes de que la salida se vuelva falsa. El retraso es configurable. La variable asociada cuenta desde cero en numero de ciclos. La salida de un TOF se vuelve falsa cuando la variable asociada es mayor o igual que el retardo fijo, convertido a si mismo en ciclos. Es posible manipular la variable del contador en el exterior, por ejemplo, con una instruccion MOVE. > TEMPORIZADOR RETRASO Thi -[THI 1.000 s]- Cuando la senal de entrada de esta instruccion cambia de falsa a verdadera (0 a 1), la salida se mantiene en el estado 1 durante 1000 s. Este retraso es configurable. La salida se restablece a 0 despues de 1000 s; y la variable asociada es restablecer a 0 si la entrada es falsa. ^ La duracion del pulso de entrada debe ser | mayor que el ciclo THI | _ ________ entrada | ___/ \_________/ \_______ | | | | | 1s | 1s | |<-->| |<-->| | | | | | | v v v v THI | ____ ____ salida | ___/ \______/ \___________ --+------------------------------------> tiempo | > TEMPORIZADOR BAJO Tlo -o[TLO 1.000 s]- Cuando la senal de entrada de esta instruccion cambia de verdadera a falsa (1 a 0), la salida se mantiene en el estado 0 durante 1000 s. Este retraso es configurable. La salida se restablece a 1 0 despues de 1000 s; y la variable asociada es restablecer a 0 si la entrada es verdadera. ^ La duracion del pulso de entrada debe ser | mayor que el ciclo TLO | ___ _________ _______ entrada | \_/ \________/ | | | | | 1s | 1s | |<-->| |<-->| | | | | | | v v v v TLO | ___ ______ ___________ salida | \____/ \____/ --+------------------------------------> tiempo | > TEMPORIZADOR RETROACTIVADO Trto -[RTO 1.000 s]- Esta instruccion tiene en cuenta el tiempo durante el cual la entrada es el estado verdadero (1). Si la entrada ha sido verdadera durante al menos miles de tiempo acumulado, la salida pasa a 1. No es necesario que la entrada sea verdadera durante 1 segundo completo: si la entrada es verdadera durante 0.6 segundos, entonces falsa para 2.0 segundos y luego verdadero durante 0,4 segundos, la salida pasara a 1. Después de pasar al estado 1, la salida permanece alli hasta nuevo aviso. El retardo del totalizador se puede restablecer mediante un restablecer la instruccion (RES). ^ La duracion total es superior a 1 s. | t1+t2+..+tn >= 1s | RTO | __ _ _________ entrada | ___/ \___/ \__/ \________ | | | | | | | |t1| | | |tn Trto | |<>| >|-|< |<>| RESET | t2 | | | v v RTO | __________________ salida | __________________/ \___ --+-------------------------------------------> tiempo | La variable asociada cuenta desde cero en numero de ciclos. La salida se vuelve verdadera cuando la variable se vuelve mayor o igual que dentro del plazo establecido. Es posible manipular la variable del contador en el exterior, por ejemplo, con una instruccion MOVE. > TEMPORISATION RETENCION ATRASADA Trtl -o[RTL 1.000 s]- Esta instruccion tiene en cuenta el tiempo durante el cual la entrada es estado falso (0). Si la entrada ha sido falsa durante al menos miles de tiempo acumulado, la salida pasa a 1. No es necesario que la entrada sea falsa durante 1 segundo completo: si la entrada es falsa durante 0,6 segundos, entonces es verdadera durante 2,0 segundos y luego falso durante 0,4 segundos, la salida pasara a 1. Después de pasar al estado 1, la salida permanece alli hasta nuevo aviso. El retardo del totalizador se puede restablecer mediante un restablecer la instruccion (RES). ^ La duracion total es superior a 1 s. | t1+t2+..+tn >= 1s | RTL | ___ ___ __ ________ entrada | \__/ \_/ \_________/ | | | | | | | |t1| | | |tn Trtl | |<>| >|-|< |<>| RESET | t2 | | | v v RTL | __________________ salida | __________________/ \___ --+-------------------------------------------> tiempo | > TEMPORIZADOR CICLICO Tmeander -[TCY 500 ms]- Si la senal de entrada es verdadera, esta instruccion genera una senal salida con periodo 500ms + 500ms = 1s y frecuencia 1 Hz. Si la senal de entrada es falsa, la salida es 0. Cuando el valor de retardo es igual al tiempo de ciclo, esta instruccion TCY era equivalente a la instruccion OSC. ^ La duracion del pulso de entrada es> = 1 s TCY | ______________________ entrada | ___/ \_______ | | | | | 1s 1s 1s | | |<--->|<--->|<--->| | | | | | v TCY | v __| __| __| _ salida | ______/ \__/ \__/ \__/ \_______ --+----------------------------------------> tiempo | > CONVERSOR TIEMPO a CONTADOR o TEMPORIZADOR Tvalue -[T2CNT 10 ms]- Es posible utilizar una variable como retraso en el temporizadores. En este caso, el valor debe calcularse de acuerdo con Tiempo del ciclo: Tiempo (ms) = Tiempos de Cycle (ms) * valor La instruccion 'Conversor de TIEMPO a CONTADOR' obtiene el tiempo en ms, y lo convierte en un retardo específico de temporizadores (TON, TOF, ...) segun al tiempo de ciclo del PLC y lo guarda en la variable Tvalue para su uso en contadores o temporizadores mas tarde: Valor = Tiempo (ms) / Tiempos de Cycle (ms) > RESET Trto Citems ----{RES}---- ----{RES}---- Si la condicion de entrada es verdadera, esta instruccion hace un descuento a cero de un temporizador o un contador. Tiempos de TON y TOF se restablecen automaticamente cuando sus entradas se vuelven respectivamente falso o verdadero; Por lo tanto, RES no es necesario para estos tiempos. Temporizadores RTO y contadores regresivos CTU / CTD no se restablecen automaticamente, por lo que debe utilizar este instruccion. Si la condicion de entrada es falsa, no se realiza ninguna accion. Esta instruccion se coloca mas a la derecha en una secuencia. Tenga en cuenta que esta instruccion solo restablece el valor del contador o demora, ¡pero no su salida! PWM ----{RES}---- Esta instruccion tambien se puede utilizar para detener un PWM y colocar su salida baja. Es posible reiniciar un PWM detenido creando un nuevo SET PWM. > PAUSA (RETRASO) 1 µs ---[DELAY]--- La instruccion DELAY provoca una pausa del programa medida en µs. > CONVERTIDOR TIEMPO de RETRASO (DELAY) Tvalue -[T2DELAY 10 µs]- Esta instruccion convierte un tiempo en µs en un valor para la instruccion DELAY y lo almacena en la variable asociada. Actualmente, esta instruccion ya no es compatible. > LOCK (TRABAR) --{LOCK}-- Si la condicion de entrada de esta instruccion es verdadera, el microcontrolador se coloca en un bucle infinito. Solo un reinicio de hardware podrá sacarlo y reiniciarlo. CONTACTO DE FLANCO: ------------------- > DETECTOR FLANCO SUBIDA _ _ --[_/ OSR/ \_]-- El resultado de esta instruccion es normalmente falso. Si la condicion de entrada cambia de falsa a verdadera (flanco ascendente) entonces la salida se vuelve verdadera. Esta instruccion es util para detectar flancos ascendentes de la senal de entrada. > DETECTOR FLANCO BAJADA _ _ --[ \_OSF/ \_]-- El resultado de esta instruccion es normalmente falso. Si la condicion de entrada cambia de verdadera a falsa (flanco descendente) entonces la salida se vuelve verdadera. Esta instruccion es util para detectar bordes descendentes de la senal de entrada. > FLANCO T-Disparo BAJO _ _ _ --[ \_OSL \_/ ]-- El resultado de esta instruccion normalmente es verdadero. Si la condicion de entrada cambia de verdadera a falsa (flanco descendente) entonces la salida se vuelve falsa. Esta instruccion es util para detectar bordes descendentes de la senal de entrada. > OSCILADOR _ _ _ --[ _/ OSC_/ \_/ \_]-- Si la condicion de entrada es verdadera, esta instruccion genera una onda cuadrada de periodo (2 * tiempo de ciclo). Si la condicion de entrada es falsa, la salida esta en el estado 0. F=1/(2*Tcycle) ^ La duracion del pulso de entrada es de 7 ciclos. OSC | ____________ entrada | ___/ \_______ | OSC | _ _ _ salida | ___/ \_/ \_/ \_____________ | --+---------------------------> tiempo | PLC cycles N+ 0 1 2 3 4 5 6 7 8 OPERACIONES SOBRE VARIABLES: ----------------------------- > MOVER {destvar := } {Tret := } -{ 123 MOV}- -{ srcvar MOV}- Cuando la entrada de esta instruccion es verdadera, pondra el variable de destino a un valor igual a la variable de origen o la fuente constante. Cuando la entrada de esta instruccion es falsa no pasa nada. Puedes asignar cualquier variable a una instruccion de movimiento, esto incluye las variables del contadores o temporizadores que se distinguen por el prefijo T o C. Esta instruccion debe estar completamente a la derecha en una secuencia. > OPERACIONES ARITMETICAS {ADD kay :=} {SUB Ccnt :=} -{ 'a' + 10 }- -{ Ccnt - 10 }- > {MUL dest :=} {DIV dv := } -{ var * -990 }- -{ dv / -10000}- Cuando la entrada de tal instruccion es verdadera, coloca en la variable de destino el valor de calculado. Los operandos pueden ser variables (incluidas las variables de recuento y tempos) o constantes. Debe recordarse que el resultado se evalua en cada ciclo siempre que que la condicion de entrada es verdadera. Por lo tanto, se suele utilizar un flanco ascendente o descendente en el condicion de entrada para realizar la operacion una sola vez. El resultado de una division se trunca al valor entero. Esta instruccion debe estar completamente a la derecha en una secuencia. > MODULO {MOD dest:=} -{src % 2}- Cuando la entrada de esta instruccion es verdadera, se coloca en la variable de destino el resto de la division entera de src por 2. Los operandos pueden ser variables o constantes. > OPUESTO Cuando la entrada de esta instruccion es verdadera, se coloca en la variable de destino es lo opuesto a la variable src. -{NEG a: = -a}- es equivalente a -{SUB a: = 0 - a}- OPERACIONES EN BITS: ------------------------ > OPERACIONES BINARIAS {AND var1 :=} {OR Ccnt :=} -{var2 & var3 }- -{ Ccnt | 0o07}- > {XOR dest :=} {NOT dv := } -{ var ^ 0xAA }- -{ ~0b11001100}- Cuando la condicion de entrada de dicha instruccion es verdadera, coloca el resultado de la operacion en la variable de destino binario solicitado (Y, Ot, OR exclusivo, Negacion). Los operandos pueden ser variables o constantes. Debe recordarse que el resultado se evalua en cada ciclo siempre que que la condicion de entrada es verdadera. Por lo tanto, se suele utilizar un flanco ascendente o descendente en el condicion de entrada para realizar la operacion una sola vez. > INTERCAMBIO DE BITS { dest:=} -{SWAP src}- Cuando la condicion de entrada de dicha instruccion es verdadera, intercambia los nibbles / bytes de la variable de origen y coloca el resultado en la variable de destino. Dependiendo del tamano de la variable, el resultado es diferente: 1 byte => intercambio de cuartetos bajos / altos: 0x73 -> 0x37 MSB bits LSB 7 6 5 4 3 2 1 0 \________/ \________/ ^ ^ | | +------+ Bits carga: 7 <-> 3 6 <-> 2 5 <-> 1 4 <-> 0 2 bytes => intercambio de bytes bajos / altos: 0x7733 -> 0x3377 MSB bits LSB 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 \___________________/ \____________________/ ^ ^ | | +-----------+ Bits carga: 15 <-> 7 14 <-> 6 ... 9 <-> 1 8 <-> 0 3 bytes => intercambio de bytes y nibbles de orden bajo / alto: 0x775A33 -> 0x33A577 MSB bits LSB 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 \_____________________/ \_________/ \_________/ \_____________/ ^ ^ ^ ^ | | | | | +-----------+ | +------------------------------------------+ Bits carga: 23 <-> 7 ... 16 <-> 0 15 <-> 11 ... 12 <-> 8 4 bytes => intercambio de bytes bajos / altos: 0x7755AA33 -> 0x33AA5577 MSB bits LSB 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 \_____________________/ \_____________________/ \___________________/ \_____________/ ^ ^ ^ ^ | | | | | +-----------+ | +--------------------------------------------------------------+ Bits carga: 31 <-> 7 ... 24 <-> 0 23 <-> 15 ... 16 <-> 8 > BIT OPUESTO { dest:=} -{OPPOSITE src}- Cuando la condicion de entrada de dicha instruccion es verdadera, intercambia los bits bajo / alto de la variable fuente y coloque el resultado en la variable de destino. MSB bits LSB n n-1 n-2 ... 2 1 0 ^ ^ ^ ^ ^ ^ | | | | | | | | +------+ | | | +-------------+ | +-------------------+ > CAMBIOS ARITMETICOS: {SHL var :=} {SHR cnt :=} -{ var2 << 2 }- -{ cnt >> 1 }- SHL - bit que se desplaza hacia la izquierda y se completa con 0 MSB LSB MSB-1 1 0 C <- x <- x <- .... <- x <- x <- 0 SHR - desplazamiento de bits a la derecha y finalización con MSB MSB LSB MSB-1 1 0 /--> x -> x -> .... -> x -> x -> C \ / <-- Nota: MSB = bit mas significativo, LSB = bit menos significativo > DESPLAZAMIENTO LOGICO SR0 {SR0 dest :=} -{var sr0 3 }- SR0 - bit que se desplaza hacia la derecha y se completa con 0 MSB LSB MSB-1 1 0 0 -> x -> x -> .... -> x -> x -> C Nota: El desplazamiento logico hacia la izquierda es equivalente al desplazamiento aritmetico SHL hacia la izquierda. > DESPLAZAMIENTO CIRCULARES: ROL, ROR {ROL dest :=} {ROR dv :=} -{ var rol 4 }- -{var ror 4 }- ROL - Permutacion circular a la izquierda y reinyeccion de bits MSB LSB MSB-1 1 0 C <- x <- x <- .... <- x <- x v ^ \_________>____________/ ROR - permutacion circular a la derecha y reinyeccion de bits MSB LSB MSB-1 1 0 x -> x -> .... -> x -> x -> C ^ v \_________<____________/ > CAMBIOS BIT { var} { var} -{SET Bit 4}- -{CLR Bit bit}- -{SET Bit var, bit}- en la variable 'var' fuerza el bit 4 a 1. -{CLR Bit var, bit}- en la variable 'var' fuerza el bit 'bit' a 0. El operando 'bit' puede ser una variable o una constante. { var} es equivalente a {OR var :=} -{SET Bit 4}- -{ val | 0x10}- { var} es equivalente a {AND var :=} -{CLR Bit 4}- -{ val & 0xEF}- COMPARACIONES DE VARIABLES Y PRUEBAS BIT: ------------------------------------------- > COMPARACIONES. [var ==] [var >] [1 >=] -[ var2 ]- -[ 1 ]- -[ Ton]- > [var !=] [-4 < ] [1 <=] -[ var2 ]- -[ vartwo]- -[ Cup]- Si la condicion de entrada de dicha instruccion es falsa, entonces la la salida es 0. Si la condicion de entrada es verdadera y la prueba tambien es verdadera, luego la salida pasa a 1. Los operandos pueden ser variables o constantes. > PRUEBAS DE BIT [ var] [ var] -[if Bit SET bit]- -[if Bit CLR bit]- Si la condicion de entrada de dicha instruccion es falsa, entonces la la salida es 0. Si la condicion de entrada es verdadera y la prueba tambien es verdadera, luego la salida pasa a 1. -{if Bit SET var, 0}- es equivalente a 'Si var es impar'. -{if Bit CLR var, 0}- es equivalente a 'Si var es par'. Los operandos pueden ser variables o constantes. TABLAS y CADENAS: ------------------- > CADENAS FORMATEADAS dest -{"string", var}- Esta instruccion se utiliza para manipular una cadena de caracteres. formateado como en C (printf), con un parametro% para ser reemplazado por el valor de una variable. Solo admite un parametro, como % D. La cadena se procesa caracter a caracter, se envia cada ciclo. en la variable de destino. Cuando la condicion de entrada de esta instruccion cambia de falso a verdadero (0 a 1), comienza a procesar la cadena y escribe el siguiente caracter en la variable de destino. La salida de esta instruccion es 1 hasta que se procesa la cadena completamente, y luego pasa a 0. > REGISTRO DE DESPLAZAMIENTO {SHIFT REG } -{ reg0..3 }- Un registro de desplazamiento esta asociado con un conjunto de variables. De este modo el registro de desplazamiento del ejemplo dado esta asociado con las variables 'reg0', 'reg1', 'reg2' y 'reg3'. La entrada del registro de desplazamiento es 'reg0'. En cada flanco ascendente de la condicion de entrada, el registro shift cambiara una posición a la derecha. Lo que da 'reg3: = reg2', 'reg2: = reg1'. y 'reg1: = reg0'. la primera variable 'reg0' no se modifica. Un registro de desplazamiento con muchos elementos puede consumir mucho de memoria. Esta instruccion debe estar completamente a la derecha en una secuencia. > TABLA INDICE {dest := } -{ LUT[i] }- Una matriz indexada es una secuencia ordenada de n valores. Cuando la condicion de entrada es verdadera, la variable de destino recibe el elemento de indice i de la matriz. El indice i es normalmente una variable entre 0 y (n-1). Si el indice esta fuera de este rango, La variable de destino recibe el valor 0. Ahora es posible manejar los elementos de la matriz como variables generales en una instruccion MOVE, con un indice de tipo variable o constante. Esta instruccion debe estar completamente a la derecha en una secuencia. > TABLA DE INTERPOLACION {yvar := } -{ PWL[xvar] }- Esta instruccion hace posible aproximar una funcion o una curva por segmentos lineales. Por ejemplo, para aplicar una curva de calibración. en la tension de salida de un sensor. Suponga que esta intentando hacer una funcion para convertir un variable de entrada entera, x, a variable de salida entera, y, conoce la funcion en varios puntos, por ejemplo, usted saber: f(0) = 2 f(5) = 10 f(10) = 50 f(100) = 100 Esto da los puntos (x0, y0) = ( 0, 2) (x1, y1) = ( 5, 10) (x2, y2) = ( 10, 50) (x3, y3) = (100, 100) estan en esta curva. Puede introducir estos 4 puntos en una matriz asociada con la instruccion de matriz de interpolacion lineal Esta la instruccion mira el valor de xvar y establece el valor de yvar correspondiente. Por ejemplo, si pones xvar = 10, la instruccion validara yvar = 50. Si pones una instruccion con un valor xvar entre dos valores de x de la matriz (y por lo tanto tambien de yvar). Una media proporcional entre los dos valores, anterior y siguiente Se realiza xvar y el valor ligado yvar. Por ejemplo xvar = 55 da en la salida yvar = 75 Los dos puntos xvar (10.50) y yvar (50,75), 55 es la media entre 10 y 100 y 75 es la media entre 50 y 100, por lo que (55,75) estan unidos por una linea de conexión que conecta estos dos puntos. Tenga cuidado porque algunos calculos pueden exceder la capacidad de las variables 16 bits. Los puntos deben especificarse absolutamente en orden ascendente coordenadas X. Casi nunca es necesario utilizar mas de 5 o 6 puntos. Agregar puntos aumenta el tamano del codigo y disminuye su velocidad de ejecucion. Si pasa un valor xvar menor que el valor menor, o mayor que el valor mas grande en la matriz de coordenadas x, obtendra respectivamente el primer o el ultimo valor de la matriz coordenadas y. Esta instruccion debe estar completamente a la derecha en una secuencia. GUARDADAR EN EEPROM: --------------------- > VARIABLE PERSISTENTE saved_var --{PERSIST}-- Cuando la condicion de entrada de esta instruccion es verdadera, la la variable entera especificada se guardará automaticamente como EEPROM, por lo que este valor persiste incluso despues de un corte de energia de la fuente de alimentacion del microcontrolador. No es necesario especificar o debe ser guardado en EEPROM, esto se hace automaticamente, hasta lo que cambia de nuevo. La variable se carga automaticamente desde EEPROM despues de un reinicio de encendido. Cuando la condicion de entrada es falsa, no sucede nada. Tenga cuidado porque si una variable persistente cambia con demasiada frecuencia, La EEPROM del microcontrolador se puede destruir muy rápidamente. El numero de ciclos de escritura en una EEPROM es de hecho limitado (alrededor de 100.000 operaciones). Esta instruccion debe estar completamente a la derecha en una secuencia. NOMBRES ALEATOIRES: ------------------- > RAND Rand --{ RAND }-- El generador de numeros pseudoaleatorios genera numeros enteros aparentemente al azar. El generador esta definido por una relacion de recurrencia como: X[n + 1] = (a * X[n] + b) mod 2 ^ 32 El valor inicial X[0] lo establece la instruccion SRAND. Si la condicion de entrada de esta instruccion es verdadera, la variable el destino 'Rand' recibe el siguiente numero pseudoaleatorio obtenido por una relacion de recurrencia usando una congruencia. Si la condicion de entrada es falsa, no sucede nada. > SRAND {SRAND Rand} --{$seed:=newSeed}-- El generador de numeros pseudoaleatorios debe inicializarse con un primer valor X [0]. Dos inicializaciones con el mismo valor produciran la misma secuencia de valores durante sucesivas llamadas a RAND. Se puede obtener un valor inicial aleatorio a traves de un ADC, un temporizador, un valor previamente guardado en EEPROM, etc. Si la condicion de entrada de esta instruccion es verdadera, el generador se reinicializa con el valor inicial 'newSeed'. Podría ser de una variable o una constante. Si la condicion de entrada es falsa, no sucede nada. PERIFERICO ADC (Conversor): --------------------------------- > CONVERTIDOR DE LECTURA A/D Anom --{READ ADC}-- Ldmicro32 puede generar codigo para usar convertidores ADC existente en algunos microcontroladores. Si la condicion de entrada de la instruccion es verdadera, una adquisicion se realiza en el ADC y se almacena en la variable Anom. Esta variable luego puede ser tratado como las otras variables por diferentes operaciones aritmeticas u otras. Debes asignar una entrada ADC disponible para la variable Anom de la misma manera que para las entradas y salidas digitales haciendo doble clic en la lista que se muestra en la parte inferior de la pantalla. Si la condicion de entrada de la secuencia es falsa, la variable Anom permanece sin cambios. Los ADC actualmente funcionan con 10 bits. Una entrada de 0 voltios corresponde a una lectura de ADC de 0 y un valor igual a Vdd (la tension de alimentacion) corresponde a una lectura de ADC desde 1023. Si esta utilizando un circuito AVR, debe conectar Aref a Vdd. Puede utilizar operaciones aritmeticas para establecer lecturas de escala tomadas en la unidad mas relevante para usted apropiado. Pero recuerde que todos los calculos se realizan en usando enteros. En general, no todos los pines se pueden utilizar para Lectura del convertidor A/D. El software no le permite Asigne un pin que no sea A/D para una entrada de convertidor. El parametro 'Refs' solo es significativo para PIC, para indicar los pines ADC utilizados. Se recomienda utilizar ADC0 primero, luego ADC1 etc., y adapte el valor de 'Refs' en consecuencia. el valor 0 siempre funciona pero puede interferir con los pines utilizado como entrada / salida digital y no analogica. (Ver hoja de datos) Para otros objetivos, este campo se puede establecer en 0. Esta instruccion debe estar completamente a la derecha en una secuencia. PERIFERICO PWM (MLI): ----------------------- > Salida PWM duty_cycle -{PWM 32.8 kHz}- Ldmicro32 puede generar codigo para usar dispositivos PWM (MLI) contenido en ciertos microcontroladores. Si la condicion de entrada de esta instruccion es verdadera, el informe la frecuencia y el ciclo de trabajo del dispositivo PWM serán fijos a los valores indicados. La relacion de ciclo es un numero entre 0 (siempre en nivel bajo) y 100 (siempre en el nivel alto). Puede especificar la frecuencia de salida PWM, en hercios. Es posible que la frecuencia que especifique no se obtenga exactamente, segun las divisiones de la frecuencia de reloj del microcontrolador, Ldmicro32 elegira una frecuencia aproximada. Si el error es demasiado importante, te advierte. Es posible detener un PWM con una instruccion RESET PWM (Ver mas alto). Esta instruccion debe estar completamente a la derecha en una secuencia. PERIFERICO UART (SERIE): -------------------------- Ldmicro32 puede generar codigo para usar el UART, existente en algunos microcontroladores, para comunicarse con perifericos compatible, en modo de 8 bits, 1 bit de parada y sin paridad. Configure la velocidad usando Configuracion -> Configuracion de MCU. No todas las velocidades de comunicacion se pueden utilizar con todos cuarzo. Ldmicro32 le advierte en este caso. > RECEPCION (SERIE) UART var --{UART RECV}-- Si la condicion de entrada de esta instruccion es verdadera, intenta para recibir un personaje de la UART. Si no hay personaje se recibe, la salida es 0. Si se recibe un caracter, su valor ASCII se almacena en 'var' y la salida se establece en 1 para el ciclo actual. Si la condicion de entrada de esta instruccion es falsa, no sucede nada. pasado. > EMISION (SERIE) UART var --{UART SEND}-- Si la condicion de entrada de esta instruccion es verdadera, intenta envie el caracter contenido en 'var' (1 byte) a la UART. El valor ASCII del caracter a transmitir debe estar almacenado en 'var' de antemano. La salida es verdadera si el caracter NO se pudo transmitir (UART ocupado, por ejemplo), y falso en caso contrario. Si la condicion de entrada de esta instruccion es falsa, nada pasa. Recuerda que los personajes tardan mucho en ser transmitido, que puede exceder el tiempo del ciclo. Compruebe el estado de salida de esta declaracion para asegurarse de que cada caracter ha sido transmitido. Tambien es posible utilizar las funciones siguientes antes de transmitir / recibir en el UART. > ¿UART LISTO PARA EMITIR? Is ready? --[UART SEND]-- Si la condicion de entrada de esta instruccion es verdadera, la salida indica si el UART esta listo para enviar o no: 1 si esta listo, 0 si esta ocupado. Si la condicion de entrada de esta instruccion es falsa, nada pasa. > RECEPCION UART? Is avail? --[UART RECV]-- Si la condicion de entrada de esta instruccion es verdadera, la salida indica si la UART ha recibido caracteres o no: 1 si se recibio, 0 en caso contrario. Si la condicion de entrada de esta instruccion es falsa, nada pasa. > CADENA FORMATEADO EN UART var -{"Pression: \3\r\n"}- Cuando la condicion de entrada de esta instruccion cambia de falso a verdadero, comienza a enviar una cadena completa a la UART. Si esto La cadena contiene secuencias especiales introducidas por el caracter \, estas secuencias se interpretarán de acuerdo con la tabla siguiente. En el ejemplo, la secuencia especial '\3' sera reemplazada por el valor la variable 'var', que se convertira automaticamente a 3 digitos; por lo tanto, si var = 35, la cadena enviada sera "Presión: 35\r\n" (con un espacio adicional). Si en cambio var = 1432, el valor sera truncado porque 1432 tiene mas de 3 digitos. En este caso debes utilice necesariamente '\4' en su lugar. Si la variable puede ser negativa, utilice '\ -3d' (o '\ -4d' etc.) en su lugar. Esto obliga a Ldmicro32 a insertar un espacio de encabezado para numeros positivos y un signo menos para numeros negativos. Si se habilitan varias instrucciones de cadena con formato en el mismo tiempo (o si uno se activa antes de finalizar el anterior) o si estas instrucciones estan anidadas con instrucciones TX (transmision), el comportamiento no esta definido. Tambien es posible utilizar esta instruccion para enviar un cadena fija. En este caso, no incluya una secuencia de escape especial. Utilice '\\' para la barra invertida. además de una secuencia de escape para intervenir en una variable entera, los caracteres Se pueden utilizar los siguientes controles: Sequencia Valor Caracter Escape representado \a 0x07 BEL, (Bip) \b 0x08 BS, borrar atras \e 0x1B ESC \f 0x0C FF, alimentacion de forma \n 0x0A NL, Nueva linea \r 0x0D CR, Retorno de carro \t 0x09 HT, TAB, tabulacion horizontal \v 0x0B VT, tabulacion vertical \' 0x27 Comilla simple \" 0x22 Comillas dobles \? 0x3F Punto de interrogacion \\ 0x5C Barra invertida \xhh any El byte cuyo valor se da en por hh hexadecimal entre 0x00 y 0xFF por ejemplo \x1B es el caracter de codigo ASCII 0x1B (hex) La condicion de salida de esta instruccion es verdadera cuando transmite datos, de lo contrario es falso. SPI PERIFERICO: ----------------- Un SPI es una interfaz de comunicacion que se puede utilizar con sensores o pantallas, por ejemplo. Se puede usar un solo bus SPI en la misma escalera, que se llama SPI, o SPI1, SPI2, SPI3 ... cuando hay varios en el microcontrolador. El SPI funciona solo en modo maestro, en 8 bits, con MSB en la cabeza, a una frecuencia determinada en el panel de control por Ldmicro32. Puede activar / desactivar los distintos perifericos conectados al SPI usando salidas de microcontrolador externo y / o SS. En un SPI, la transmision y la recepcion son simultaneas, por lo que que las dos operaciones se combinan en una sola funcion. > SPI DE EMISION/RECEPCION {SPI SPI} -{->recv send->}- Si la condicion de entrada de esta instruccion es verdadera, envia en el SPI el byte contenido en la variable 'enviar' e intenta recibir uno que se almacenará en la variable 'recv'. Si la condicion de entrada es falsa, no sucede nada. La salida es la misma que la condicion de entrada. > ESCRITURA SPI {SPI_WR SPI} -{ "Message"->}- La funcion de escritura al SPI permite que se envie una cadena al SPI, independientemente de la recepcion. La cadena puede contener tabulaciones con \\. No debe abusarse porque el SPI puede ralentizar drasticamente el tiempo de ejecucion y causar problemas sincronizacion en el ciclo! Si la condicion de entrada de esta instruccion es verdadera, envia en el SPI todos los canales indicados, independientemente de la recepcion. Si la condicion de entrada es falsa, no sucede nada. La salida es la misma que la condicion de entrada. PERIFERICO I2C: ----------------- El I2C es una interfaz de comunicacion que se puede utilizar con sensores o pantallas, por ejemplo. Se puede usar un solo bus I2C en la misma escalera, que se llama I2C, o I2C1, I2C2, I2C3 ... cuando hay varios en el microcontrolador. El I2C opera en modo maestro y puede acceder a cualquier registro (desde 0 a 255) en cualquier direccion (1 a 127) en el bus I2C. La frecuencia I2C se define en el panel de configuracion de Ldmicro32. > LECTURA I2C {I2C_RD I2C} -{->recv 0x20 0}- La instruccion I2C READ lee un byte en un registro dado en el dispositivo de direccion dada. El numero de registro y la direccion estan codificados en 8 bits. En este ejemplo, leemos el byte del registro 0 en la direccion I2C 0x20. Si la condicion de entrada de esta instruccion es verdadera, intenta leer el byte solicitado. Si ningun dispositivo responde, esta instruccion es bloqueo y el programa no podrá continuar! Si la condicion de entrada es falsa, no sucede nada. La salida es la misma que la condicion de entrada. > ESCRITURA I2C {I2C_WR I2C} -{0x20 0 send->}- I2C WRITE escribe un byte en un registro dado en el dispositivo de direccion. dado. El numero de registro y la direccion estan codificados en 8 bits. En este ejemplo, escribimos el byte 'enviar' en el registro 0 en la direccion I2C 0x20. Si la condicion de entrada de esta instruccion es verdadera, intenta escribir el byte solicitado. Si ningun dispositivo responde, esta instruccion es bloqueo y el programa no podrá continuar! Si la condicion de entrada es falsa, no sucede nada. La salida es la misma que la condicion de entrada. PANTALLAS DE SEGMENTO: ---------------------- > CONVERTIDOR BINARIO A BCD {BIN2BCD dest:=} --{ src}- El parametro 'src' es un valor binario. Si la condicion de entrada de esta instruccion es verdadera, es convertido en variable 'dest' a un valor BCD. Si la condicion de entrada de esta instruccion es falsa, no sucede nada. pasado. El valor decimal 99 (0x63) se convertira a 0x99 en formato BCD. El valor 1234 (0x04D2) se convertira a 0x1234 en formato BCD. Esto es util para algunos dispositivos que utilizan el formato BCD. > CONVERTIDOR BCD A BINARIO {BCD2BIN dest:=} --{ src}- El parametro 'src' es un valor BCD (decimal codificado en binario). Si la condicion de entrada de esta instruccion es verdadera, es convertido en la variable 'dest' a un valor binario. Si la condicion de entrada de esta instruccion es falsa, no sucede nada. pasado. El valor BCD 0x99 se convertira a 99 (0x63) en formato binario. El valor BCD 0x1234 se convertira a 1234 (0x04D2) en formato binario. Esto es util para algunos dispositivos que utilizan el formato BCD. Esto es lo opuesto a la instruccion anterior. > CONVERTIDOR DE N-SEGMENTOS {7SEG dest:=} --{C src}-- Se puede utilizar un convertidor de 7 segmentos para mostrar numeros (o caracteres) en una pantalla de 7 segmentos, compuesta por 7 segmentos y de un punto. La variable 'dest' recibe el valor binario (pgfedcba) permitiendo controlar los segmentos para mostrar el numero (o caracter) contenido en el parametro 'src'. Con una pantalla de catodo comun, envie el valor obtenido directamente. Con una pantalla de anodo comun, agregue una negacion binaria. Pantalla/monitor de 7 segmentos: a -- SEGMENTO p g f e d c b a f| |b BIT de 'dest' 7 6 5 4 3 2 1 0 | g | -- e| |c | | -- .p d la variable 'src' debe estar entre 0 y 128 Se implementan los primeros 128 caracteres de la tabla ASCII. Los primeros 32 caracteres se reemplazan por los códigos que permiten mostrar numeros en hexadecimal: 0 a 15 para numeros de 0 a F, 16 a 31 para los mismos digitos con un punto. El simbolo numero 129 es el simbolo de grado 'o' para las temperaturas. Existen convertidores en el mismo principio para pantallas a 9, 14 o 16 segmentos, que son mas adecuados para mostrar caracteres. alfanumerico. ENCODERS: ---------- > CODIFICADORES DE CUADRATURA ~~[XqA0 XqB0 YqDir0]- -\[XqZ0 QUAD ENCOD qCount0]^- Un codificador de cuadratura recibe dos senales de cuadratura como entrada desde un codificador rotatorio o lineal (A y B). Permiten determinar si se esta produciendo un movimiento y en que direccion. sentido -> | <- sentido ^ | ___ _______ ___________ _______ ___ EntradaA| |_______| |_______| |________| |_______| | | _______ _______ ___ ________ _______ EntradaB| |_______| |_______| |_______| |_______| | | contador| 0 | | 1 | | 2 | | 3 | | 4 | | 3 | | 2 | | 1 | | 0 | Salida| ___________________________________ hacia detras Direcci| hacia adelante |________________________________ | Salida| Pulso| _______^_______^_______^_______^_______^_______^_______^_______^____ | --+----------------------------------------------------------------> tiempo | '^' - corresponde a un ciclo Advertencia: use la salida 'Pulso' para determinar si el contador ha cambiado y no contar. Dicha instruccion puede utilizar 2 o 3 entradas y 0 o 1 salidas. La entrada Z es opcional y puede estar vacía. La salida Dir es opcional; puede ser de tipo Y (pin) o R (Rele interno). || || || R0 ~~[XqA0 XqB0 YqDir0]- R1 || ||-------] [--------\[XqZ0 QUAD ENCOD qCount0]^---------( )-------|| || || Si la condicion de entrada de esta instruccion es falsa, no sucede nada. Si la condicion de entrada de esta instruccion es verdadera, las entradas Se analizan A, B y Z y se actualizan las salidas y el contador. La salida de Dir esta en 1 cuando el contador disminuye y en 0 cuando el contador aumenta. En cada cambio, la salida de pulso recibe un pulso. La frecuencia de las entradas A y B debe ser menor que la frecuencia de ciclo /4, de lo contrario se puede perder informacion. Es preferible no superar la frecuencia de ciclo /8. La entrada Z puede ser dinámica (activada por flanco) o estática. Si el parametro 'Conteo por revolucion' esta en 0 y la entrada Z esta en el estado alto, entonces el contador se restablece a 0. Si 'Conteo por revolucion' es> 0 y la entrada Z es alta, entonces el contador se redondea al multiplo mas cercano de 'Recuento por revolucion'. Esto significa que ha habido perdida de senal en las entradas A / B. Si 'Conteo por revolucion' es <0, la entrada Z se ignora. sentido -> ^ | ___ _______ _______ _______ ________ EntradaA| |_______| |_______| |_______| |_______| | | _______ _______ _______ _______ ____ entradaB| |_______| |_______| |_______| |_______| | | EntradaZ| _______________________________________________________/\___________ | | | 'Cuenta por revolucion' = 0 => puesta a cero del contador | Contador| 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 0 | | 1 | | | (perdida de senales A, B) 'Contador por revolucion' = 10 => puesta a cero del contador | Contador| 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | |10 | | 11 | --+----------------------------------------------------------------> tiempo | Para simular las entradas A, B, Z haga doble clic en sus valores en la ventana de variables. SUBPROGRAMAS y SALTOS: ------------------------ > GOTO, LABEL, SUBPROG, RETURN, ENDSUB, GOSUB La instruccion GOTO le permite saltar al programa, es decir, para ir directamente a otra linea del mismo. El salto no se realiza sólo si la condicion de entrada de la instruccion es verdadera; de lo contrario, el programa continúa su curso normal. Si el numero de linea no existe en el programa, el salto pasara en la linea 1. Un salto a la linea 0 da como resultado un reinicio suave del microcontrolador, es decir, un regreso al punto de partida, pero sin restablecimiento de la memoria. Un salto de linea unico <0 da como resultado un restablecimiento completo del microcontrolador (Reset). > SUBPROG, RETURN, ENDSUB, GOSUB Es posible en Ldmicro32 definir subrutinas y llamar desde el programa principal. Esto es util cuando es mismo La secuencia de instrucciones se utiliza repetidamente. Una subrutina comienza con la instruccion SUBPROG, que debe estar sola en su linea, y termina con la instruccion ENSUB, que tambien debe ser sola en su linea. Entre los dos, es posible escribir cualquier subrutina siguiendo las instrucciones habituales. Sin embargo, no inserte un subrutina dentro de otra, y no saltes (GOTO) fuera de la subrutina misma. Cuando una llamada de subrutina debe terminar antes de llegar la instruccion final ENDSUB, se utiliza la instruccion RETURN. Una subrutina no se ejecuta donde esta en el codigo, pero solo cuando lo llama la instruccion GOSUB, si no obstante la condicion de entrada de esta instruccion es verdadera. COPIAR Y DESCARGAR ================== NO USE EL CODIGO GENERADO POR Ldmicro32 EN UNA APLICACION O EL SOFTWARE ERROR PUEDE CAUSAR PELIGROS HUMANOS O DE HARDWARE. EL AUTOR NO ASUME NINGUNA RESPONSABILIDAD POR CUALQUIER DAÑO QUE PUEDA RESULTADO DEL USO DE Ldmicro32. Este software no tiene derechos de autor: puede redistribuirlo y/o modificar bajo las condiciones de la Licencia Publica General GNU publicado por la Free Software Foundation, es decir, la versión 3 de esta Licencia, o cualquier versión posterior. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA, ni siquiera una garantia comercial o idoneidad para cualquier proposito. Consulte la Licencia publica general de GNU para obtener mas detalles. Deberia haber recibido una copia de esta Licencia Publica General GNU con el software. De lo contrario, vea . Jonathan Westhues & Jose Gilles & Paulino Cano