La modularidad es tu amiga. Escribe tu bucle principal para que haga lo suyo llamando a funciones, que llaman a funciones, ..., hasta el nivel en el que tus funciones serían simples. Comienza con el bucle principal y el siguiente nivel hacia abajo, haz funciones stub; ya sea vacías:
function foo(){
;
}
o falso:
function read_temperature(){
return(95);
}
que no hacen nada más que devolver lo que el nivel que llama necesita para poder continuar. Cuando ese nivel funcione, descienda un nivel y comience a rellenar código simple que también llame a funciones stub. Poco a poco, vaya quitando una función a la vez hasta que tenga una aplicación que funcione.
Para depurar una función que devuelve un valor erróneo, o para crear una sin ninguna influencia del resto de tu aplicación, puedes construir un andamiaje - un simple sketch que simplemente alimente la función con algunos valores de ejemplo, y dentro de la función, imprimir los valores de los parámetros y algunos valores intermedios, hasta que obtengas alguna idea de qué parte de la función está fallando. Incluso he hecho funciones falsas que me piden en la terminal un valor a devolver. (Obviamente, esta técnica sólo puede funcionar si el sistema puede tolerar la velocidad relativamente glacial de nosotros los humanos). Otro uso para el andamiaje).
El "stubbing" funciona especialmente bien para sustituir a las funciones que interactúan con el hardware, lo que permite empezar a desarrollar la aplicación antes de tener que sumergirse en las hojas de datos, los problemas de sincronización y otras minucias (como, por ejemplo, no tener las piezas) que, de otro modo, podrían paralizar tu progreso.
Hablando de cuestiones de sincronización, alternar un pin de salida en un punto particular de su programa, como la entrada y salida de un ISR, le da una onda cuadrada en el pin de Arduino cuya frecuencia o ciclo de trabajo puede darle una idea de la sincronización interna de su programa. La forma directa de puerto-I/O, por ejemplo
PORTC ^= 0x01;
distorsionará menos la sincronización que si se llama a digitalWrite()
. Es útil si tienes un 'scope' a mano, o uno de los DMMs con la capacidad de medir la frecuencia y/o el ciclo de trabajo.
Del mismo modo, puedes utilizar un pin de salida analógica para dar salida a un valor numérico a tu medidor desde dentro del programa sin perturbar demasiado la sincronización o inflar el código con las funciones de E/S en serie. Usa las formas de E/S directas aquí también.
0 votos
Por favor, eche un vistazo a playground.arduino.cc/Main/DevelopmentTools para las herramientas IDE y de depuración