¿Cuáles son las alternativas más rápidas para llamar a las funciones de Arduino digitalread()
y digitalwrite()
? Las soluciones específicas de AVR o específicas de chip son aceptables.
¿Cuáles son las alternativas más rápidas para llamar a las funciones de Arduino digitalread()
y digitalwrite()
? Las soluciones específicas de AVR o específicas de chip son aceptables.
Respuestas:
¡Acceda a los puertos digitales directamente!
Los 3 métodos que probé fueron
- digitalWrite (pin, BAJO); digitalWrite (pin, ALTO);
- CLR (PORTB, 0); SET (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[...]
Como puede ver, digitalWrite tarda alrededor de 56 ciclos en completarse, mientras que el direccionamiento directo de puertos tarda 2 ciclos. ¡Esa es una gran diferencia en el tiempo para los programas que tienen muchas operaciones de E / S!
Esta biblioteca es una buena alternativa: http://code.google.com/p/digitalwritefast/
Como se sugirió anteriormente, acceda a los puertos digitales directamente. Pero con estilo!
Al escribir valores codificados directamente en los registros de hardware, pierdes legibilidad y portabilidad.
Publiqué en Github una herramienta que llamé HWA que le permite usar una interfaz orientada a objetos para el hardware que no requiere un compilador de C ++ y produce código binario de alta eficiencia.
HWA está ahí: https://github.com/duparq/hwa
La gente de Arduino.SE ya ha discutido y probado esto. Como resultado, digitalWriteFast()
no mejora mucho más que lo normal digitalWrite()
. Sin embargo, el acceso directo al puerto es aproximadamente 35-40 veces más rápido que digitalWrite()
.
Usa el ChipKit Uno32. Es mucho más rápido que los Arduinos basados en AVR. También se ocupará de sus problemas de tiempo.