actuellement je réceptionne les données RF de capteurs sur arduino via la fonction pulseIn. La fonction pulseIn étant bloquante, je souhaite modifier mon programme pour utiliser les interruptions. J'ai donc mis en place l'interruption et le calcul du temps de l'impulsion mais j'ai beaucoup de parasites avec des impulsions d'environ 16 à 20us or je n'ai pas ces parasites avec la fonction pulseIn. Quelqu'un sait-il me dire pourquoi j'ai ces parasites avec les interruptions?
Il faut utiliser la pin ICP1 (pin 8) associée au timer 1. ce sera déjà bien plus précis (tu auras le "temps" exact du passage de la pulse sur 16 bits). Si possible, éviter les attachInterrupt() qui ont le défaut de prendre pas mal de temps dans le traitement des interruptions. Il vaut mieux déclarer une ISR(), mais ça risque de rentrer dans le hard...
Pour les parasites, tout dépend de l'environnement... un peu plus de précision sur l'ensemble du système?
Pour l'instant j'ai un arduino UNO avec ethernet shield et une breadboard pour le récepteur RF (module AUREL 433,9 MHz). Au départ je pensais que les parasites était du au câblage en fil volant mais comme la durée des parasites est toujours identique (16us ou 20us), j'en doute.
Pour l'utilisation de ICP1 et de ISR() je ne connais pas du tout, serait-il possible d'en savoir plus.
Durant mes essais Blyss j'avais aussi remarqué des parasites notamment au démarrage d'une transmission ou en absence de transmission : le contrôle de gain qui doit être un peu à la rue. Problème des solutions en AM.
Je cherche des module RFM12B pour faire des essais en FSK. Si quelqu'un connais d'autres sources (moins chères) que SparkFun ou JeeLabs ?
Sinon, il faut filtrer. Mais des impulsions de 16µs a filtrer en soft, c'est pas facile. Il faudrait mettre un filtre numérique entre le récepteur et l'Arduino.
Je viens de regarder un peu la solution avec l'utilisation de ICP1 mais de ce que j'ai compris du datasheet, l'interruption se passe sur front montant ou descendant donc j'arriverais à n'avoir que la largeur d'un train d'impulsion (impulsion haute + impulsion basse) or je veux le temps de l'impulsion haute uniquement. Je vais continuer à creuser.
il suffit d'inverser le bit 6 de TCCR1B (edge_select) dès l'entrée de l'ISR pour détecter le prochain front inverse (méthode efficace trouvée dans une AN chez atmel). Avec cette inversion en plus, on sait dans l'ISR quel front on vient de détecter, ce qui permet de mettre à jour la bonne variable.