Introducción al modo FTDI Bitbang

Fue una interfaz que lanzó mil hacks. Casi insignificante para la programación, suficientes líneas de E / S para un trabajo útil y lo suficientemente rápido para una multitud de aplicaciones: analizadores lógicos domésticos, programadores de chips, interfaces LCD y espectáculos de luces LED, por nombrar algunos.

Hoy en día, el puerto de impresión paralelo está al borde de la extinción (y algunos dirían que es un buen lanzamiento). La mayoría son obsoletos a través de USB, pocos (si los hay) periféricos nuevos incluso incluyen un conector paralelo, y las computadoras que se encogen hoy en día (netops, libros electrónicos, computadoras de escritorio) todavía no tendrían espacio para ello. Excelente para escritorios prolijos, pero no tan bueno si disfruta de los trucos económicos que posibilita el puerto paralelo heredado.

¡No temas, ya que existe una alternativa USB viable que puede revivir muchos de estos trucos clásicos! Y si ha trabajado mucho con Arduino, muchas oportunidades ya están escondidas en su cajón.

Un elemento recurrente entre muchos hacks recientes es el uso de un Arduino u otro microcontrolador conectado por USB como mediador entre una computadora y un circuito externo. El código que se ejecuta en el microcontrolador probará algún sensor para detectar un cambio (por ejemplo, una cafetera vacía), luego enviará un mensaje a través de USB a una computadora host, donde otro programa actuará sobre él (actualizando una página web para decirle al mundo que existe sin café). Este es un enfoque razonable, las partes son baratas y fáciles de programar, pero para muchos proyectos tenemos éxito con solo la mitad del código, la complejidad y el gasto ... y a algunas personas les encantará escuchar, ¡no Arduino!

Cuando el microcontrolador en una placa Arduino habla con una computadora host a través de USB, todo el apagado pesado de la comunicación USB se realiza mediante un chip separado: la interfaz FTDI FT232R USB a serie UART. Esto permite que el código tanto del host como del microcontrolador utilice una comunicación en serie asíncrona mucho más sencilla. Como medida de reducción de tamaño y costo, algunas variantes de Arduino colocan este chip en una placa separada para ser conectado solo durante la programación del microcontrolador, lo que permite reciclarlo para el próximo proyecto.

Este modo predeterminado de USB a serie del FT232R suele llamar la atención de todas las chicas. Un modo alternativo, menos hablado pero no menos útil, es modo bitbang. Esto nos da un control de programa independiente de hasta ocho líneas de E / S, similar al puerto paralelo clásico o las líneas de E / S digitales de un microcontrolador.

Adquirir el hardware

Si alguien aún no está en su repositorio, es fácil detectar las placas FT232R. Cualquier tienda que tenga Arduino Pro o LilyPad, o algunos de los derivados baratos de Arduino (por ejemplo, Boarduino), también ofrecerá un cable de programación que rompe cuatro de las líneas de E / S FT232R:

Arriba: La placa SparkFun FTDI Basic Breakout (alrededor de $ 14) está rodeada por el cable convertidor FTDI TTL-232R (alrededor de $ 20). Ambos rompen cuatro líneas de datos utilizables para E / S de uso general.

Cuatro líneas de datos pueden parecer restrictivas, pero para muchas tareas esto es suficiente; los proyectos que utilicen comunicaciones SPI, registros de turnos y extensiones de puertos estarán bien atendidos. Si necesita el complemento completo de líneas de E / S, hay disponibles tableros de interrupción más avanzados:

Arriba: solo algunas de las tablas de ruptura completas disponibles. Arriba a la derecha: placa de conexión SparkFun para FT232RL (alrededor de $ 15), dispositivo USB-BUB moderno ($ 12), DLP-Design DLP-USB232R ($ 18) y DLP-USB1232H ($ 25), y el propio módulo FTDI de FT4232HQ ($ 30). Los dos últimos se basan en chips más capaces, FT2232H y FT4232H, compatibles con versiones anteriores pero con características adicionales que superan con creces el alcance de este artículo.

Preparado para el desarrollo

Otro aspecto alentador de la interfaz FTDI es el soporte de software multiplataforma; se pueden crear los mismos hacks ya sea que esté usando Windows, Linux o Mac OS X. Se requieren dos componentes de software para comenzar el desarrollo: a controlador de dispositivo, que trabaja detrás de escena para manejar toda la comunicación USB de gama baja, y un Biblioteca de API, que está vinculado con su propio código y reenvía las solicitudes al conductor. Para complicar un poco las cosas, hay dos API diferentes para elegir y el proceso de instalación es ligeramente diferente para cada sistema operativo.

La propia API de FTDI se llama D2XX. Esta biblioteca es propietaria y de código cerrado, pero no pagan por su uso, incluso en situaciones comerciales. API alternativa, libftdi, es una fuente completamente abierta y desarrollada por la comunidad. Esta biblioteca tiene capacidades similares, pero funciones y sintaxis diferentes. La conversión entre las dos API es muy simple y daremos un ejemplo para cada una.

Usuarios de Windows: si ha utilizado anteriormente Arduino, el controlador necesario ya está instalado. De lo contrario, descargue y extraiga el controlador de Windows más reciente del sitio web de FTDI. Cuando conecte por primera vez un cable o placa FTDI, utilice el Asistente para dispositivos nuevos encontrados para localizar e instalar el controlador. Si desea utilizar la biblioteca D2XX, los archivos de encabezado y objeto se incluyen en la carpeta del controlador. Ésta es la opción más sencilla. Si prefiere la fuente gratuita libftdi, deberá descargar e instalar tanto el controlador libusb-win32 como el código fuente, luego descargar y compilar libftdi.

Usuarios de Linux: la mayoría de las distribuciones de Linux actuales ya tienen el controlador necesario en un módulo del kernel. La biblioteca D2XX para Linux se puede descargar desde la página del controlador FTDI, pero libftdi es más fácil de instalar: simplemente ubique libftdi-dev en su administrador de paquetes favorito y pídale que se encargue de las dependencias durante la instalación. En ambos casos, los programas FTDI para Linux deben ejecutarse como root, p. Ej.

sudo ./hello-ftdi

Usuarios de Mac OS X: descargue la biblioteca D2XX de la página de descarga de FTDI. El archivo Léame incluido explica cómo instalar esta biblioteca. Si prefiere usar libftdi, descargue la fuente de libusb (versión hereditaria 0.1.12) y libftdi de sus respectivos sitios web, luego use los siguientes comandos en la ventana de Terminal para construir e instalar cada una de las dos bibliotecas:

./configure
make
sudo make install

Si ha utilizado anteriormente un Arduino o tiene el controlador FTDI Virtual Com Port (VCP) instalado por cualquier otro motivo, debe deshabilitarlo antes de que el modo bitbang funcione en una Mac; los dos no pueden coexistir. En una ventana de Terminal, escriba:

sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext

Para restablecer el controlador y reanudar el uso de Arduino u otros dispositivos serie FTDI:

sudo kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext

Otros sistemas operativos: Hay controladores disponibles para varias otras plataformas. Consulte la página de controladores FTDI para obtener detalles y enlaces.

La mayor parte del código FTDI de muestra está escrito en C, y eso es lo que usaremos aquí. Los enlaces a otros idiomas están disponibles en el sitio web de FTDI.

Hola mundo: LED de luz

El programa introductorio estándar para casi todos los microcontroladores es el flash LED, así que intentémoslo. Necesitará un cable FTDI o algunas de las placas incluidas, un LED y una resistencia de 220 ohmios.

Conecte la resistencia a ambas patas del LED, pero observe qué pata es el lado positivo (ánodo). Luego inserte el par de resistencias LED en el zócalo al final del cable FTDI como se muestra a continuación, con la pata negativa conectada a la línea GND (el cable negro del cable FTDI) y la pata positiva a la línea CTS (cable marrón) .

Aquí está el código fuente de C, usando la API libftdi. Si planea usar D2XX, eche un vistazo a la segunda lista un poco más adelante; la relación entre funciones debe ser bastante obvia.

/* hello-ftdi.c: flash LED connected between CTS and GND.
   This example uses the libftdi API.
   Minimal error checking; written for brevity, not durability. */

#include <stdio.h>
#include <ftdi.h>

#define LED 0x08  /* CTS (brown wire on FTDI cable) */

int main()
{
    unsigned char c = 0;
    struct ftdi_context ftdic;

    /* Initialize context for subsequent function calls */
    ftdi_init(&ftdic);

    /* Open FTDI device based on FT232R vendor & product IDs */
    if(ftdi_usb_open(&ftdic, 0x0403, 0x6001) < 0) {
        puts("Can't open device");
        return 1;
    }

    /* Enable bitbang mode with a single output line */
    ftdi_enable_bitbang(&ftdic, LED);

    /* Endless loop: invert LED state, write output, pause 1 second */
    for(;;) {
        c ^= LED;
        ftdi_write_data(&ftdic, &c, 1);
        sleep(1);
    }
}

Si el programa se compiló correctamente (todos los encabezados y bibliotecas requeridos en los lugares apropiados y correctamente vinculados con nuestro propio código), el LED debería parpadear lentamente.

El código es en su mayoría autoexplicativo, pero hay algunos puntos que vale la pena mencionar:

  • Tenga en cuenta el segundo parámetro de ftdi_enable_bitbang (). Esta es una máscara de 8 bits que indica qué líneas deben ser salidas (conjunto de bits) frente a entradas (algo claras). Debido a que usamos solo una línea de salida (CTS en este caso), establecemos solo el bit correspondiente a esa línea (0x08). Para obtener resultados adicionales, podemos A O los valores de los bits juntos. Las particiones de los pines de E / S de bitbang no están definidas en el encabezado de ambas API, por lo que puede resultarle útil mantener un encabezado como este:
    #define PIN_TX  0x01  /* Orange wire on FTDI cable */
    #define PIX_RX  0x02  /* Yellow */
    #define PIN_RTS 0x04  /* Green */
    #define PIN_CTS 0x08  /* Brown */
    #define PIN_DTR 0x10
    #define PIN_DSR 0x20
    #define PIN_DCD 0x40
    #define PIN_RI  0x80
  • Tenga en cuenta que el segundo parámetro de ftdi_write_data () es puntero a una variable de 8 bits. La función generalmente espera una matriz (y el segundo ejemplo lo mostrará), pero para este caso simple solo se necesita un valor. Cuando publique un byte como este, recuerde pasar siempre por una referencia (puntero), no una constante numérica. El último parámetro de la función es el número de bytes.
  • Los valores dados a ftdi_write_data () indican el estado deseado de las líneas de salida: arobit indica un estado lógico alto (3.3 o 5 voltios, dependiendo del adaptador FTDI utilizado), y un bit claro indica un nivel lógico bajo (0 voltios ). La asignación de bits a los pines de E / S es exactamente la misma que para ftdi_enable_bitbang (), por lo que las #definiciones anteriores pueden ayudar en este sentido.

    Más campanas y silbidos

    Hay muchas ideas de proyectos que solo ocasionalmente necesitan intercambiar una línea de E / S: sonar cuando sube un contador en línea, encender una luz cuando llega un correo electrónico, enviar un Tweet cuando el gato usa la basura. El código para tales tareas a menudo será tan simple como el ejemplo anterior. Pero cuando se comunica con dispositivos y protocolos más complejos, este enfoque po-po se vuelve muy ineficiente. Cada llamada a ftdi_write_data (), incluso un solo byte, emite una transacción USB que se completará en un múltiplo de 64 bytes, y puede tener latencias de un milisegundo completo o más antes de que esta solicitud se envíe realmente por el cable. Para enviar de manera eficiente flujos de datos complejos, es necesario pasar una matriz completa a la función ftdi_write_data ().

    El modo Bitbang funciona de manera muy diferente al modo UART serial predeterminado del chip. En la configuración serial, simplemente se llama a fwrite () para emitir un bloque de datos al puerto serial, y el chip administra todos los detalles del protocolo de transmisión: longitud de palabra, inicio, parada y bits de paridad, y alternando el estado lógico de la línea TX de acuerdo con la velocidad de transmisión requerida. En el modo Bitbang no hay un protocolo implícito; Este es un enfoque aproximado de las líneas de datos, y tenemos que cuidarnos de construirnos una señal significativa, básicamente creando mapa de imagen de las líneas de datos a lo largo del tiempo:

    Supongamos que queremos comunicarnos con un dispositivo que utiliza el protocolo SPI (Interfaz de periféricos en serie, también llamada a veces Micrófono, serie síncrona o serie de tres o cuatro hilos, según la implementación). La salida requerida sería similar a la forma de onda de la ilustración anterior: una línea de salida proporciona una señal de reloj, otra representa los bits de datos (sincronizados con el reloj) y una tercera emite una señal de captación de datos finales. Si envía 8 bits de datos, nuestra matriz de salida necesitaría ser dos veces más grande (para representar el estado alto y bajo de cada marcador de reloj), más dos bytes adicionales para el perno alto / bajo al final. 8 * 2 + 2 = 18 bytes en la matriz de salida (tal vez algunos bytes adicionales si un dispositivo específico requiere un breve retraso antes de la señal de clic).

    SPI puede ser demasiado esotérico para un artículo introductorio; no todo el mundo tendrá los artículos adecuados. En su lugar, hagamos algo visualmente agradable: alimentaremos un grupo de LED mediante modulación de ancho de pulso. Esta es una utilidad dudosa, pero llama la atención y sugiere la velocidad y el buen control que son posibles con este ese puerto.

    El hardware es similar al primer ejemplo, pero se repite cuatro veces: cuatro LED, cuatro resistencias de 220 Omh (lo limitamos a cuatro para trabajar con el cable FTDI o SparkFun Basic Breakout, pero se expande fácilmente a ocho con las otras placas). Las patas negativas están todas conectadas en común a la línea GND (cable negro en el cable FTDI), mientras que las patas positivas están conectadas a CTS, TX, RX y RTS (cables marrón, naranja, amarillo y verde, respectivamente). SparkFun Basic Breakout tiene DTR en lugar de RTS para el último pin, pero el código de muestra funcionará de la misma manera con ambos ... lo explicaremos lo antes posible.

    Así es como se ven los elementos de un tablero. Tenga en cuenta que se omite la línea + 5V (cable rojo en el cable FTDI):

    Y aquí está el código fuente, usando la API D2XX. Adaptar esto a libftdi es simple; vea el primer ejemplo para las diferentes sintaxis.

/* pwmchase.c: 8-bit PWM on 4 LEDs using FTDI cable or breakout.
   This example uses the D2XX API.
   Minimal error checking; written for brevity, not durability. */

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ftd2xx.h>

#define LED1 0x08  /* CTS (brown wire on FTDI cable) */
#define LED2 0x01  /* TX  (orange) */
#define LED3 0x02  /* RX  (yellow) */
#define LED4 0x14  /* RTS (green on FTDI) + DTR (on SparkFun breakout) */

int main()
{
    int i,n;
    unsigned char data[255 * 256];
    FT_HANDLE handle;
    DWORD bytes;

    /* Generate data for a single PWM 'throb' cycle */
    memset(data, 0, sizeof(data));
    for(i=1; i<128; i++) {
        /* Apply gamma correction to PWM brightness */
        n = (int)(pow((double)i / 127.0, 2.5) * 255.0);
        memset(&data[i * 255], LED1, n);         /* Ramp up */
        memset(&data[(256 - i) * 255], LED1, n); /* Ramp down */
    }   

    /* Copy data from first LED to others, offset as appropriate */
    n = sizeof(data) / 4;
    for(i=0; i<sizeof(data); i++)
    {
        if(data[i] & LED1) {
            data[(i + n    ) % sizeof(data)] |= LED2;
            data[(i + n * 2) % sizeof(data)] |= LED3;
            data[(i + n * 3) % sizeof(data)] |= LED4;
        }
    }   

    /* Initialize, open device, set bitbang mode w/5 outputs */
    if(FT_Open(0, &handle) != FT_OK) {
        puts("Can't open device");
        return 1;
    }
    FT_SetBitMode(handle, LED1 | LED2 | LED3 | LED4, 1);
    FT_SetBaudRate(handle, 9600);  /* Actually 9600 * 16 */

    /* Endless loop: dump precomputed PWM data to the device */
    for(;;) FT_Write(handle, &data, (DWORD)sizeof(data), &bytes);
}

Cuando se compilan y funcionan correctamente, los LED deben pulsar lentamente en un ciclo repetitivo de "cazador". Hay algunas diferencias notables con respecto al primer ejemplo:

  • El LED4 está definido por dos bits, el O lógico tanto de RTS como de DTR, y los dos bits siempre se alternan al unísono. Este no es un requisito obligatorio, simplemente hace coincidir el programa con hardware diferente: el cable FTDI y el SparkFun Basic Breakout usan una señal diferente en el último pin, y la activación de ambos bits funciona igualmente de forma independiente.
  • La velocidad en baudios se establece explícitamente en 9600 bps (el modo bitbang funcionará con 16 veces más que la velocidad en baudios). Por lo tanto, la velocidad de PWM será la misma usando libftdi o D2XX. La biblioteca anterior generalmente establece el puerto por defecto en 9600 baudios, mientras que la segunda API (que se usa aquí) abre el puerto a la velocidad máxima y tenemos que ralentizarlo para que coincida. Prácticamente, con la máxima velocidad, podemos obtener unas 650.000 muestras de 8 bits por segundo en este puerto.
  • En Mac OS X 10.6, puede resultar necesario transferir el indicador -m32 a gcc para compilar y vincular con la biblioteca D2XX. Y los desarrolladores de Windows que usan Cygwin pueden necesitar algunos archivos de encabezado adicionales:
    #include <stdarg.h>
    #include <windef.h>
    #include <winnt.h>
    #include <winbase.h>
  • La modulación de ancho de pulso provoca una buena demostración visual de la velocidad, pero desafortunadamente no se puede usar en serio. Además de la latencia de E / S antes mencionada, otros dispositivos pueden compartir el bus USB, y la suma general es que no podemos confiar en que esta técnica se comporte de manera determinista o en tiempo real. PWM con LED se ve bien ... el tiempo está bastante cerca ... pero probar un servicio de unidad PWM es incuestionable. Para un protocolo serial síncrono como SPI, donde una señal de reloj acompaña a cada bit de datos, este método funciona perfectamente y, con suerte, esto se puede demostrar en un artículo posterior.

    No panacea

    El modo FTDI bitbang es útil para muchos proyectos, pero no es una solución para todos los problemas. Hay muchas situaciones en las que todavía es preferible un microcontrolador:

    • Para un uso independiente prolongado, es incomprensible: una placa de microcontrolador cuesta menos que una comida elegante y funciona durante días con una batería de 9 voltios. Solo cuando un proyecto involucre una computadora completa, en cualquier caso, se debe considerar un modo bitbang.
    • Si una tarea se trata de conversión básica de analógico a digital, es casi seguro que sea mejor que utilice un microcontrolador conectado por USB con un ADC incorporado. Es menos molesto que la alternativa.
    • Para tareas que requieren un sondeo continuo de sensores de alta velocidad, el modo bitbang consumirá innecesariamente el ancho de banda del USB y los ciclos de la CPU. La mayoría de los microcontroladores tienen una función de interrupción al cambiar que evita la votación por completo, utilizando recursos solo cuando ocurre un cambio.
    • Esperamos que esta introducción haya plantado las semillas de nuevos trucos en su mente, o le dé nueva vida a los clásicos y olvidados trucos de puertos paralelos. Para profundizar, el sitio web de FTDI es el mejor recurso. Aquí encontrará hojas de datos, artículos y lo más útil son las notas de aplicación. También hay información para trabajar con otros lenguajes: Java, Perl, Python y Visual Basic, entre otros.

      • matamonos56 dice:

        dulce y sin arduino (aunque insinúa "microcontrolador", sabemos lo que es un la-tecnologia mint :))

      • stunmonkey dice:

        Este es un artículo impresionante y detallado, y las interfaces USB / paralelo tienen un lugar, pero tenga en cuenta que también puede comprar tarjetas de puerto paralelo directo que tienen características más amplias.

        El puerto paralelo se diseñó originalmente para el control directo de la máquina en tiempo real, en el que sobresale, no para la transferencia de datos. Cuando los dispositivos se volvieron "inteligentes", eventualmente fueron pirateados por usar la transferencia de datos, y ese trabajo fue una mierda.

        Todavía se usa ampliamente hoy en día para su propósito originalmente diseñado en automatización y CNC porque no hay otra alternativa. Es lo único que funciona en tiempo real y aún se destaca en esa función donde el tiempo es crítico. Si tuviera que reestructurarlo hoy, haría exactamente lo mismo.

        No puede hacer eso con un adaptador USB o USB / paralelo, por lo que el puerto paralelo todavía tiene algo de vida.

      • Ian dice:

        ¡Gran publicación, Phil!

      • Barry Smith dice:

        Aunque el USB podría ser el clavo del hardware en el ataúd del puerto paralelo, el clavo del software fue la protección de Windows contra los puertos de E / S, lo que dificulta el acceso directo y fácil a los puertos. Para la sincronización determinista y de alta velocidad (como la activación de motores paso a paso CNC), los puertos DOS y paralelos siguen teniendo problemas.

      • Mike Szczys dice:

        ¡Buen Phil, gracias!

      • Barry Smith dice:

        Si tiene un Bus Pirate, hubo un la-tecnologia.com anterior sobre su uso con un extensor de bus I2C PCF8574 que proporcionaría una forma alternativa de obtener algunas piezas de entrada / salida paralelas para experimentar. https://la-tecnologia.com/2008/12/27/parts-8bit-io-expander-pcf8574/

      • Cañada dice:

        Espacio de oficina 🙂

      • Taylor dice:

        Por desgracia, gran artículo Phil, realmente cubriste todos los conceptos básicos. Muy detallado, ¡Gracias!

      • Daniel Hagen dice:

        Publicación impresionante. Estoy trabajando en un proyecto que ahora usa puertos paralelos y tal vez pueda usar esto para.
        Gracias

      • Zmaster dice:

        Buen artículo, me preguntaba sobre el modo de explosión FTDI y esta es una gran introducción.

      • andreo dice:

        Por eso sigo volviendo a Hack-a-day, porque cuando finalmente se aburren de los Arduinos, descansan y escriben un artículo como este;)

      • wdfowty dice:

        LOL @ Espacio de oficina. Deberías haber creado un rap duro para ir con la imagen. : D

      • wdfowty dice:

        * incrustado (en lugar de "poner")

      • jeff-o dice:

        ¡Buen artículo! ¡Gracias!

      • Eric dice:

        ¡Gran trabajo! Este es exactamente el tipo de artículo que me hace volver al Hack Day. No tengo nada en contra de los artículos de Arduino, pero los trucos de lectura casi me alejan para siempre.

      • cero absoluto dice:

        gracias phil, tu hombre!

      • Jones dice:

        ¡¡¡¡NE HAKO !!!!! 1

      • Thomas dice:

        Utilicé el modo de mapa de bits de la placa de desarrollo FTDIs UM245R para obtener información del sistema de visualización LCD. Literalmente me tomó 5 minutos encontrar mis cables de salto y armarlo. Estos pequeños dispositivos son asombrosos y simplifican los proyectos USB.

        • bijo dice:

          Hai Thomas Quiero controlar 4 motores paso a paso a través del puerto USB, el circuito está debajo
          http://archive.electronicdesign.com/files/29/16125/figure_01.gif

          http://electronicdesign.com/article/components/control-multiple-stepper-motors-through-a-pc-s-usb.aspx

          ¿Es posible reemplazar DLP-USB245M CON UM245R SI ESTE ES COMO DARME UN CIRCUITO?

          bijo

      • Eric dice:

        ¡Buen artículo! Gracias

      • pelaca dice:

        ¡Utilizo el modo FTDI bitbang para programar mi ATMEGA168 en mis arduinos!

      • sigtermer dice:

        Phil, gracias.
        feliz de haberme suscrito a la rss

      • escalador dice:

        este es uno de los mejores artículos que he visto aquí en bastante tiempo. trabajo bien hecho phil! Es bueno ver un artículo sobre un programa de hardware que no se centra en el "dúo por el cambio". También gracias por presentar enfoques alternativos utilizando las diferentes bibliotecas. Siempre es bueno ver oportunidades para hacer las cosas de manera diferente.

      • Martinmunk dice:

        Bueno, siempre he pensado (y oído hablar) de las ventanas como sistemas operativos que no son en tiempo real, pero ¿DOS es mejor en ese sentido?

        La distracción de Linux tendría mucho sentido en mi cabeza para el control cnc en tiempo real 🙂

        • Joe2 dice:

          Muchos. Los programas de DOS en modo de protección controlan casi por completo la CPU, la RAM y los puertos de E / S. La excepción son las interrupciones / DMA para cosas como DRAM / actualización de video o disco duro ATA (IDE). Puede desactivarlos de forma segura si su hardware no necesita una actualización del programa y no necesita que el disco duro se ejecute rápidamente. El gran libro de información informática de Ralf Brown enumera los usos más comunes de las IRQ.

          De hecho, DOS es tan simple que es mejor que lea la información del BIOS de la computadora si desea usar DOS para programas en tiempo real. Casi puede ejecutar un programa de DOS como si quemara EPROM y reemplazara el BIOS si lo desea. Pocos han hecho esto porque el BIOS tiene una buena razón para existir: ¡las llamadas al BIOS funcionan sin importar el hardware subyacente> 99% del tiempo! Windows y Linux hacen esto porque han implementado modos protegidos que funcionan mucho mejor. Es posible ejecutar su programa como una "ROM opcional" si lo compila correctamente. Firma '55 AA 'y todo ... Esto deja intacta la implementación de la interrupción del BIOS, pero aún hace que su programa no use DRAM. Puede utilizar aproximadamente 128 KB de SRAM para obtener una versión simple de DOS. Dado que probablemente esté utilizando FPGA y Flash ROM, ¡esto es muy útil! 😉

        • Joe2 dice:

          Alguna información adicional:

          La lista de interrupciones de Ralf Brown en formato HTML se encuentra en http://www.ctyme.com/rbrown.htm

          http://en.wikipedia.org/wiki/List_of_real-time_operating_systems

          http://eo.wikipedia.org/wiki/DOS

          http://eo.wikipedia.org/wiki/Option_ROM

          Algunos mapas de memoria e información relacionada se encuentran en http://www.os2site.com/sw/info/memory/memory.txt

          http://www.andrewmallett.net/tech/hardware/bios_one.htm

          http://en.wikipedia.org/wiki/BIOS#BIOS_boot_specification

        • Joe2 dice:

          Si DEBE tener una latencia más baja que los soportes USB o desea una forma económica de superar 1 MB / segundo, necesitará un adaptador PCMCIA de puerto paralelo (tarjeta PC). Y si lo hace, es realmente tentador producir simplemente un adaptador PC Card / Cardbus nativo que tenga la ventaja de las interrupciones. Puedo ver las ranuras "Express" en las computadoras portátiles más nuevas poniendo la suciedad en el ataúd de los puertos paralelos después de que USB 2.0 insertó los clavos.

          Algunas personas más inteligentes que necesitan sincronización en tiempo real para obtener la máxima velocidad de protocolos como JTAG deben implementar las cosas de bajo nivel con un microcontrolador y luego enviar comandos por lotes en el lado USB utilizando un programa que se ejecuta en la computadora. Para cosas como programar el firmware del enrutador, ¡esto es MUCHO más rápido!

          • Joe2 dice:

            dangit - destinado al final, no en respuesta (Moderador, por favor, mueva esta respuesta al final? Gracias si es posible!)

      • Dan Fekete dice:

        @martinmonk: hay algunos kernels de Linux en tiempo real, aquí está uno de ellos
        http://www.rtlinuxfree.com/

        Creo que hay algo de actividad RT-Linux en el área de grabación de sonido para Linux, por lo que algunas de esas distribuciones también pueden ser adecuadas para tales proyectos.

        Por cierto, excelente artículo Phill. Muy detallado, trae más!

      • ene dice:

        gracias phil! ¡Este fue un artículo muy informativo y me recordó por qué amo este sitio! ¿Dónde más puedes encontrar una publicación de blog de este tipo con regularidad?

        ¡Ahora céntrate más en este estilo y ya no verás comentarios negativos! esto es lo que todos esperábamos, un artículo bien estructurado, largo y detallado.
        gran trabajo

      • las arañas urbanas dice:

        Buen trabajo, ese fue un artículo informativo.
        Me gustaría ver más en la forma de hacks de autobuses paralelos de las viejas escuelas. Solía ​​tener una vieja caja XT IBM que usaba para esas cosas y me trae la nostalgia de DOS.

      • aztraph dice:

        Hola Jones:

        ¡CRECE UNA PAREJA!

      • Jimmy dice:

        Gracias, Phil. Hace unos días había un cartel sobre la instalación de dos reguladores de voltaje en una fuente de alimentación que era bastante patético. Para empeorar las cosas, el mismo sitio web discutió el bitbanging SPI y eso no se consideró digno de mencionar.

        ¡Seguid así!

      • stunmonkey dice:

        XP puede verse obligado a permitir el tiempo real, pero REALMENTE no le gusta y, por lo general, primero tienes que romper algunas cosas. Supongo que Vista no lo permitirá en absoluto.

        DOS y muchos núcleos de Linux pueden funcionar muy bien en tiempo real.

        DOS puede ser antiguo y limitado como sistema operativo de computadora, pero para los controladores es simple, estable y tiene todas las características necesarias para el control en tiempo real y, lo que es más importante, no tiene problemas con funciones más complejas que prevenir.

        El DOS más antiguo en realidad es una plataforma decente para el control de máquinas y fácil de desarrollar. He oído hablar de personas que utilizan DR-DOS, FreeDOS e incluso MS-DOS 2.0 (sí, ese de 1983).
        Todo lo que necesita, nada que no necesite.

        • Joe2 dice:

          Curiosamente, la lista de Wikipedia para sistemas en tiempo real no menciona ningún sabor de DOS tradicional (PC / DR / MS / ...) en ninguna parte.

      • Thirdirdmoose dice:

        Otra forma de hacer algo similar, aunque probablemente más lento, es colocar un firmware V-USB en un AVR. Me encantaría ver un tutorial de V-USB aquí en algún momento; es una excelente biblioteca AVR.

      • terian dice:

        ¡Multa! Información útil, gracias

      • Oxina dice:

        Gracias por la info. Siempre he visto proyectos geniales aquí y acabo de obtener una herramienta de microcontrolador para aprender, pero mi creatividad generalmente no se extiende más allá de las E / S básicas, ¡así que esto es genial!

      • Roca dice:

        Sin embargo, no solo * revive * todos esos trucos hereditarios, solo hace posible recrearlos. Estaba emocionado de poder descartar la vieja caja de Win98 que uso para hablar con algunos equipos LPT heredados ... (¡no, de verdad!)

      • BenJ dice:

        Si solo supiera esto hace unos meses, creé un controlador de puerto paralelo usando el puerto paralelo en mi servidor doméstico y pensé que sería genial usar USB si pudiera, aunque no pude encontrar nada barato.

        Hay una cosa con este método, realmente no puedo programar, aunque solo estaba interesado en Python ... simplemente no puedo encontrar código de muestra para este dispositivo.

        • Ahmed H dice:

          @BenJ
          Para el código de muestra de Python, esto ayudará:
          https://github.com/walac/pyusb

          Sé que es demasiado tarde, pero espero que alguien sea feliz.

      • error 404 dice:

        > Si tuviera que reestructurarlo hoy, haría exactamente lo mismo.

        Probablemente no. Como analizador de G.CODE dedicado y controlador de máquina, la computadora DOS no es mala ... pero tampoco hay un pequeño ARM / MIPS / etc. máquina que ejecuta un RTOS mucho más moderno. Más pequeño, menos potente, más fácil de integrar con la estación CAD, más fácil acceso a más GPIO, más barato y más simple, yadda-yadda.

      • Chris dice:

        esta es una de las mejores publicaciones de la-tecnologia en mucho tiempo. ¡Gracias!

      • JonathanD dice:

        Gran artículo, ¡sigan con el buen trabajo!

      • ron dice:

        Bueno, desenterré mi cable ftdi y decidí intentar jugar con esto. No puedo crear libftdi bajo cygwin. Preferiría no usar el controlador de código cerrado y me gustaría usar gcc para compilar. Actualmente no tengo una caja de Linux para usar, lo cual sería práctico. ¿Cuál es tu diseño? ¿Qué compilador estás usando?

      • Phil Burgess dice:

        @ron: gcc versión 3.4.4. Esto y libusb-win32 se instalaron usando el instalador del menú de la pestaña 'Configuración'. Luego descargue y compile libftdi 0.16 con "configure", "make" y "make install".

      • charliex dice:

        Buen artículo.

        Vista, etc. le permite bitbang puertos de dispositivos fácilmente con un controlador como WinRing0.

      • Fozzy Vis dice:

        ¡Buen artículo! Gracias Phil ...

      • Kaeser dice:

        Maravilloso artículo, Phil. Parece creado con cuidado

      • SIGTERMer dice:

        Supongo que digo esto un poco tarde ... pero no necesitas ser root para ejecutar programas vinculados con libftdi.
        libftdi usa libusb, que a su vez es una biblioteca utilizable.
        no hace falta decir que nunca ejecuto mis programas ftdi como root. bajo nadie más.

        sin embargo, es una de las mejores publicaciones de la-tecnologia.
        Gracias.

      • Instalaciones Audiovisuales dice:

        No lo creerá, pero pasé todo el día buscando información sobre esto. Gracias por esto, fue una gran lectura y me ayudó sin cesar. Gracias de nuevo, X10 Home Automation

      • Priyend dice:

        Hola. Artículo muy útil.

        Para evitar el requisito de que libusb (y a su vez libftdi) se ejecute como root, simplemente agregue la siguiente línea a su archivo /etc/init.d/rc:

        chmod o + w -R / dev / bus / usb

        Esto fue tomado del usuario nickbarnes:
        http://ubuntuforums.org/showthread.php?t=880550&page=2

        Más amigable
        Priyend

      • ekawahyu dice:

        ¡Me salvas el día! ¡Excelente publicación!

      • Simón dice:

        Excelente publicación: el técnico de FTDI con el que hablé el viernes tiene que leerla porque dijo que lo que describiste anteriormente no se podía hacer.
        Dos preguntas si estoy en lo cierto: ¿Cuál es la velocidad máxima posible y cuál es el entorno de programación utilizado, es decir, dónde copiaría los ejemplos de código en una Mac?

        Gracias simon

      • Phil Burgess dice:

        @ Simon: El chip FT232R en el cable FTDI y las placas más destacadas superan los 650.000 bytes / seg (aunque con algunas advertencias como se menciona en el artículo).

        En Mac OS X, las muestras de código se pueden compilar usando gcc desde la línea de comandos de Terminal.

      • Tony Granims dice:

        Sí, el DOS anterior en realidad creó una plataforma decente para el control de la máquina y se desarrolló fácilmente. He oído hablar de personas que utilizan DR-DOS, FreeDOS e incluso MS-DOS 2.0. ¿Podría funcionar?
        Tony Granims

      • KantPredict dice:

        ¡Me encanta el tema de Mario por la analogía del rol musical!

Pedro Molina
Pedro Molina

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *