Bonsoir.
Petite mise à jour de ce topic.
En fait, il n'y a rien de bien visible, sauf que j'ai modifié sérieusement dans mon logiciel la manière donc le processeur de la carte de contrôle décode les trames infra-rouge émises par la télécommande.
Avant, c'était fait au marteau et au burin, à la hache et au lance-flamme.
Du coup, la fiabilité n'était pas là, et il arrivait régulièrement que le décodage de la trame (la trame est basée sur des
durées de pulse) était perturbé par le rafraîchissement de l'écran, bien plus prioritaire.
Si j'augmentais la priorité du décodage de trame IR, c'est l'affichage qui déconnait.
Je me suis donc lancé - sur les conseils de spectroman - sur l'étude approfondie de composants hardware intégrés au processeur : les timers.
Ces trucs, ça permet de compter à une certaine fréquence, et de faire un peu ce qu'on veut.
Or, il existe une possibilité avancée (parmi d'autre) : la capture d'un événement.
Le timer compte tranquillement dans son coin, et dès qu'un événement survient, sa valeur est recopiée dans un tampon hardware et on peut la relire tranquillement un peu plus tard sans grosse contrainte temps réel.
Et dans mon cas, l'événement, c'est le début du pulse IR (et donc aussi la fin du pulse précédent).
En faisant une simple soustraction de 2 échantillons consécutifs, j'ai l'info qu'il me faut : la durée d'un pulse IR. Le décodage est donc quasi-cadeau !
J'ai divisé par 10 la complexité de décodage, et la fiabilité est maintenant au rendez-vous !
Du coup, vu que j'ai maintenant compris comment fonctionnent de manière détaillée ces timers, je vais pouvoir m'attaquer à la 2e modification du logiciel : le bus
1-wire.
C'est via ce bus que je vais lire la température mesurée par un capteur spécifique.
Et le problème de ce bus, c'est que les timings sont ultra-serrés (à quelques micro-secondes près).
Du coup, pour que ce soit fiable, je n'avais pas eu le choix : je coupe tout dans le processeur et il ne fait que de s'occuper du bus.
Résultat : lors de la lecture de la température, on voit un léger glitch d'image (elle se coupe et revient immédiatement).
Ce n'était pas vraiment gênant, mais pour autant ça ne me satisfaisait pas.
Vu l'énorme puissance fonctionnelle des timers hardware du processeur, je me suis dit qu'il devait bien être possible de remplacer mon algo de lecture / écriture sur le bus 1-wire par une utilisation judicieuse d'un timer...
Et c'est prometteur :
En bleu clair, c'est mon signal "témoin". Il change d'état à chaque début de cycle.
En jaune, c'est le futur bus 1-wire. Il faut faire des pulses à la masse d'une certaine durée, et ensuite le laisser à l'état haut une autre certaine durée.
Ce qui est cool, c'est que maintenant le signal jaune est généré par un timer sans aucune intervention logicielle.
Je peux donc à la micro-seconde près avoir le pulse à la masse de mon choix et une durée totale de mon choix aussi.
J'utilise là une fonction proche de la génération d'un signal
PWM.
La cerise sur le gâteau, c'est le signal mauve.
Il change d'état exactement un certain temps
après le début du cycle.
Ca correspond à l'instant où il faut échantillonner le bus 1-wire pour lire le bit écrit par le périphérique.
Pour le moment, je fais changer d'état le signal mauve.
Très bientôt, je vais pouvoir automatiquement lire le bus 1-wire sans interruption ni intervention logicielle : transfert DMA !
À suivre...