Arduino: ¿alternativas más rápidas a digitalread () y digitalwrite ()?

13

¿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.

Mark Harrison
fuente
3
Al leer esta y su última pregunta, parece que quiere hacer algo con bastante rapidez. Creo que dar detalles sobre qué es y qué tan rápido puede ser útil.
Oli Glaser
@Oli, buena idea, gracias. El proyecto actual es un sistema de sintonización para transmisores RC. Funciona bien, pero me gustaría hacer que la decodificación de señal RC PWM sea eficiente para que pueda usar el mismo marco para otros proyectos. Aquí hay una reseña sobre lo que tengo hasta ahora: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison el

Respuestas:

18

¡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));

[...]

ingrese la descripción de la imagen aquí

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!

Marty
fuente
2

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

duparq
fuente
1
El "código binario de alta eficiencia" parecería mucho más autorizado junto con las mediciones reales.
Dmitry Grigoryev
2

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().

Dmitry Grigoryev
fuente
0

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.

Leon Heller
fuente
1
No creo que comprar hardware más rápido sea la mejor respuesta aquí, al menos no hasta que haya alcanzado los límites de su hardware actual y haya decidido que necesita algo más rápido.
Jon L
1
¿Por qué los votos negativos? Quería la solución más rápida , no solo una más rápida, que le he proporcionado. ¿Alguien puede sugerir una solución más rápida basada en Arduino?
Leon Heller
12
Porque el ChipKit no es un arduino, sino una plataforma compatible con arduino. Esto significa que, aunque el cambio de puerto es más rápido, existe una gran probabilidad de que se reescriban algunas bibliotecas. Es posible que las bibliotecas de tarjetas Ethernet, XBee y SD no funcionen de manera inmediata. Además, Mark solicita específicamente llamadas a funciones alternativas de digitalRead / Write, no una nueva plataforma (doh).
Hans
2
Cambiar el hardware nunca es una buena solución. Por lo menos, se pierde un buen aprendizaje y nunca aprenderá lo que sería un uso eficiente del hardware.
Rick_2047
1
@ Rick_2047 No diría "nunca": si el requisito es nuevo o ampliado o la cantidad aumenta, puede tener sentido buscar alternativas. Pero estoy de acuerdo en que arrojar ciegamente el hardware a las ineficiencias graves del software no es sofisticado: a veces ni siquiera funciona, ya que los sistemas de mayor rendimiento pueden agregar una carga adicional y a veces terminan más lento que los más simples para algunas tareas. Realmente no hay sustituto para aprender sobre la plataforma que usa o contempla usar.
Chris Stratton el