1 pièce(s) jointe(s)
Détection de top synchro sur FI sur 162kh (fréquence étalon).
Bonjour a tous,
Il y a quelques mois de cela , vous m'avez aidé à mettre au point un fréquencemètre avec la soustraction des FI et autres
petites choses qui vont bien, pour lire précisément les fréquences en AM et en FM sur certains de mes récepteurs radios
dont je fais la collection et je m'en suis bien sortie (compréhension des timers 1 et 2).
Il ya peu de temps je me suis fabriqué un récepteur sur 162 khz (FRANCE INTER: heure étalon) pour étalonner
mes deux fréquencemètres,et ils en avaient besoin...
Puis il m'est venu l'idée de récupérer la modulation de phases (photo jointe), pour le fun et mettre au point ma petite horloge a moi...
Mais malheureusement! les quelques connaissances que j'ai acquéri ne me suffisent pas pour résoudre le premier pb sur lequel je bute.
Aprés avoir passé des heures devant mon écran
à tester milli(); delay, les interruptions...et avoir parcouru le net, je demande de l'aide!
Je vous explique;
Pendant la 59 em secondes du code horaire (voir photo), il ya un silence synchro qui dure plus de 1 seconde et le premier front montant
qui suit ce silence est le top du début de la première seconde.
Je n'arrive pas à écrire un petit bout de code qui me permettrait en fait pour débuter mon programme:
1) de détecter un niveau bas égal à environ 800ms ( à partir des fronts montants, pris en charge par l' interrupt sur la pin2. Cela n'arrive
qu'une fois dans la minute).
2) puis quand on a compté 800ms, on active une tempo de 520 ms qui sera suivi d'un niveau haut sur la pin 13 de 50ms. Dans l'idéal, il y aura le top de la 1° seconde encadré par un niveau haut de 50ms, ce qui me permettra avec un ET logique d'éliminer les parasites éventuels.
3) si les tops sont plus rapprochés que 800ms, la pin 13 reste à 0
C'est juste le début , mais j'ai vraiment du mal...j'ai fait pas mal d'essais mais aucun ne fonctionnait correctement...
je vous ai mis un de mes essais...
1) l'interruption reinitialise "tempoDepart"
2) je saute dans un sous programme "programme()" qui attend un niveau bas de plus de 800ms, et met à 1 la pin 13 puis va dans loop.
Il qui passe dans "else" si le temps entre deux interrupts fait moims que 800ms et met
la pin 13 à 0 et va dans loop.
Le pgr que je vous montre fonctionne sur trois pattes. Il continue à tourner même sans interruption, d'ou des niveaux hauts régulièrement .
j' ai testé le programme dans une routine appelée par l' interruption, mais apparemment millis() ne fonctionne pas dans ce genre de routine.
La photo montre les modulation de phase et la logique associée.
Merci de me donner un coup de main.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int led = 13;
unsigned long tempoDepart = 0;
int interval=800;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led,LOW);
attachInterrupt(0, mafonction, RISING);
tempoDepart = millis();
Serial.begin(115200);
}
void loop (){programme();}
void mafonction()
{tempoDepart= millis();}
void programme(){ if ( ( millis()- tempoDepart ) >= interval )
{ //si plus de 800 ms sans interrupt, led allumée 50 ms
digitalWrite(led,HIGH);
delay(50); // calibrage niveau haut
digitalWrite (led,LOW);
tempoDepart=millis();}
else { digitalWrite(led,LOW); }} |
Décodage code hoaraire 162kh
Bonsoir jpbbricole,
En fait le programme prends bien en compte les interruptions (je pourrais éventuellement mettre une photo). A chaque interruption et si le temps entre deux interruptions est plus grand que 800ms comme indiqué dans "interval", j'ai bien le programme qui fait le job , c'est à dire, un niveau haut sur la pin 13 que j'ai calibré à 50ms-----> aprés un niveau bas de 800ms ( je n'ai pas mis pour l'instant la tempo de 520 ms indiquée dans mon précédent poste, pour simplifier ).
Le soucis est que je n'arrive pas à faire patienter le pgr dans une boucle infinie, mais non bloquante, pour qu'il attende la prochaine interruption.
Du coup, le programme m' envoie des niveaux "hauts parasites" sur la pin 13 de 50ms régulièrement en plus des niveaux "hauts normaux"et cela est bien compréhensible puisqu'il continue à appeler la routine (même s'il n'y pas d'interrupt).
Dans l'autre cas, si le temps entre 2 interruptions est plus court que 800ms, le prg fait aussi le job.
J' ai bien un niveau bas sur la pin 13 , avec régulièrement des créneaux "parasites" de 50ms puisque le prg continu a tourner.
Pour être bien bien compris; j'aurais besoin d'une solution pour que le programme attende "dans un coin" l' interruption, qu'il fasse son job et qu' il retourne dans "son coin" en attendant la prochaine interrupt.
j'ai essayé avec divers solution while(1) {}, boucle infini , loop, mais rien ne fonctionne.
Cordialement
Pat
Décodage code horaire 162kh
Jpbbricole,
j'ai oublié , je vais tester le code que vous avez modifié .
en vous remerciant.
Pat
1 pièce(s) jointe(s)
Décodage code hoaraire 162kh
Bonjour Jpbbricole, à Jay M et à tous ceux qui participent à l'avancement de mon projet "mon horloge à moi".
Merci pour ton bout de code qui fonctionne parfaitement.
Un pb de résolu .
Je joins une photo.
Si j'ai bien compris, c'est le premier front montant après 800ms de "silence" qui génère l'interruption.
Je voulais faire un peu plus compliqué en encadrant le top 1°sec. par une impulsion calibrée (50ms), puis appliquer
un "ET" à la porte et au top 1°sec, et ainsi immuniser le système aux parasites qui pourraient déclencher l'interrupt,
avant le top du début 1°sec.
Mais après des tests, l'antenne à côté d'une belle alimentation à découpage, le filtrage tient le coup et pas de souci.
Je vais me pencher sur ton programme pour bien le comprendre et apprendre... (j'aurais éventuellement besoin d'aide pour bien comprendre)
Il faut ensuite que je me penche sur les secondes et la lecture des bits, ouvrir une porte de de 200ms après un temps de 800ms au début de chaque seconde.
j'ai du temps...confinement oblige.
Il est certain que j'aurais encore besoin de vos précieuses aides.
Cordialement
Pat42
Ps: Etant débutant, je ne suis pas rentré dans votre discussion avec Jay M, lol.
J'ai testé le prg que tu as modifié et c'est ok, bien que je n'ai évidemment pas tout compris de ce qu'il apporte en plus...
Peux tu m'expliquer la raison pour laquelle il y a deux bouts de code identique ligne 17 et 19 ?
pinMode(topSyncLedPin, OUTPUT
Cordialement
Pat42
Décodage code horaire 162kh
Merci pour vos réponses, il est 23h37 et je suis encore en train de me casser la tête pour comprendre la routine appelée par l'interruption
void impulsionInterruption().
Il y a quelques mois, j'ai écrit un programme pour un fréquencemètre à installer sur certaines de mes radios ( j'écoute les ondes courtes, cela sert) avec multiplexage de cinq afficheurs 7 segments , utilisé le timer 1 et 2,fait des soustractions, des divisions, des "réglages" joué avec les modulos et avec votre aide sur les timers, je m'en suis bien sorti.
Eh là! j'ai quelques difficultés à comprendre le programme que vous m'avez gentiment écrit.
Je suis perplexe.
Perdrais-je des neurones...?
Pat42
Décodage code hoaraire 162kh
Bonjour Jay M et merci d'avoir pris un moment pour me donner ces explications.
Un petit bonjour aussi à jpbbricole.
Je vais me "mettre dessus".
Bonne soirée et à bientôt...
Pat42