La modularité est votre amie. Écrivez votre boucle principale pour faire son travail en appelant des fonctions, qui appellent des fonctions, ..., jusqu'au niveau auquel vos fonctions seraient simples. Commencez avec la boucle principale et le niveau suivant, créez des fonctions de stub; soit vide:
function foo(){
;
}
ou faux:
function read_temperature(){
return(95);
}
, qui ne font que renvoyer tout ce dont le niveau d'appel a besoin pour qu'il puisse continuer. Lorsque ce niveau fonctionne, descendez d'un niveau et commencez à remplir du code simple qui appelle également les fonctions de stub. Décompressez progressivement une fonction à la fois jusqu'à ce que vous ayez une application fonctionnelle.
Pour déboguer une fonction qui renvoie une mauvaise valeur, ou pour en créer une sans aucune influence du reste de votre application, vous pouvez créer un échafaudage - une simple esquisse qui alimente simplement la fonction quelques exemples de valeurs, et dans la fonction, imprimer les valeurs des paramètres et quelques valeurs intermédiaires, jusqu'à ce que vous ayez un aperçu de la partie de la fonction qui échoue. J'ai même créé des fonctions de simulation qui m'invitent sur le terminal à renvoyer une valeur. (Évidemment, cette technique ne peut fonctionner que si le système peut tolérer la vitesse relativement glaciaire de nous les humains! Une autre utilisation pour les échafaudages.)
Le stubbing fonctionne particulièrement bien pour remplacer les fonctions qui s'interfacent avec le matériel, ce qui vous permet de lancer l'application avant de plonger dans les fiches techniques, les problèmes de synchronisation et d'autres minuties (comme, ne pas avoir les pièces!) Qui pourraient autrement bloquer. vos progrès.
En parlant de problèmes de synchronisation, le basculement d'une broche de sortie à un point particulier de votre programme, comme l'entrée et la sortie d'un ISR, vous donne une onde carrée à la broche Arduino dont la fréquence ou le rapport cyclique peut vous donner un aperçu du calendrier interne de votre programme. La forme d'E / S de port direct, par exemple,
PORTC ^= 0x01;
, faussera moins le timing que l'appel digitalWrite()
. Utile si vous avez un oscilloscope à portée de main ou l'un des multimètres numériques avec la capacité de mesurer la fréquence et / ou le rapport cyclique.
De même, vous pouvez utiliser une broche de sortie analogique pour émettre une valeur numérique vers votre compteur depuis l'intérieur du programme sans trop perturber le timing ou gonfler le code avec les fonctions d'E / S série. Utilisez également les formulaires d'E / S directes ici.