A modularidade é sua amiga. Escreva seu loop principal para fazer isso chamando funções, que chamam funções, ..., até o nível em que suas funções seriam simples. Comece com o loop principal e o próximo nível abaixo, faça funções de stub; ou vazio:
function foo(){
;
}
ou falso:
function read_temperature(){
return(95);
}
, que não fazem nada além de retornar o que o nível de chamada precisa para que ele possa continuar. Quando esse nível funcionar, desça um nível e comece a preencher um código simples que também chama funções de stub. Remova gradualmente uma função de cada vez até que você tenha um aplicativo em funcionamento.
Para depurar uma função que retorna um valor incorreto ou criar uma sem influência do restante do aplicativo, você pode criar andaimes - um esboço simples que apenas alimenta a função com alguns exemplos de valores e, dentro da função, imprime valores de parâmetros e alguns valores intermediários, até você ter uma ideia de qual parte da função está falhando. Eu até criei funções de falsificação que me pedem no terminal um valor para retornar. (Obviamente, essa técnica só funcionará se o sistema puder tolerar a velocidade relativamente glacial de nós humanos! Outro uso para andaimes.)
O stubbing funciona especialmente bem para substituir as funções que fazem interface com o hardware, permitindo que você inicie o aplicativo antes de mergulhar em folhas de dados, problemas de tempo e outras minúcias (como não ter as peças!) Que, de outra forma, poderiam parar seu progresso.
Falando de problemas de tempo, alternar um pino de saída em um ponto específico do seu programa, como entrada e saída de um ISR, fornece uma onda quadrada no pino do Arduino cuja frequência ou ciclo de trabalho pode fornecer uma visão sobre o tempo interno do seu programa. O formato de porta / E / S direta, por exemplo,
PORTC ^= 0x01;
, distorcerá o tempo menos que a chamada digitalWrite()
. Útil se você tiver um escopo acessível, ou um dos DMMs com a capacidade de medir a frequência e / ou o ciclo de trabalho.
Da mesma forma, você pode usar um pino de saída analógica para emitir um valor numérico para o seu medidor de dentro do programa sem atrapalhar muito o tempo ou inchar o código com as funções de E / S seriais. Use os formulários de E / S diretos aqui também.