Bonjour tous le monde
Je vais surement devoir décoder un signal dcf77, pour sella il me faut donc une base temps que je fait avec le timer1 de l'atmega328p, mais je me rend compte que ma fonction milis n'est pas très précise, j'ai donc peur que cette mauvaise précision vienne perturbé le décodage de mon signal ...
us est ma variable de débordement du timer1
seconde est une variable incrémenté sur une interruption externe venant d'un signal de 1Hz généré par un DS1307
Time renvois le temps en ms depuis que le µcontrôler est allumé (provenant du timer1 et de ma fonction milis() )
Pensez-vous que cella aura une répercutions sur le décodage de mon signal ? Si oui comme puis-je y remédier ?
Le nono ? C'est quoi ça ?
Je sais déjà comment fonctionne le signal dcf77 et j'aimerais pouvoir faire le code de décodage moi-même car je risque de devoir présenter et expliqué mon code ...
adrien4607:
Le nono ? C'est quoi ça ?
Je sais déjà comment fonctionne le signal dcf77 et j'aimerais pouvoir faire le code de décodage moi-même car je risque de devoir présenter et expliqué mon code ...
Si tu sais comment fonctionne le DCF77, tu dois aussi savoir que tu n'as pas besoin d'une précision énorme pour la décodage du signal puisqu'il faut discriminer une impulsion de 100ms d'une de 200ms.
Tu as une transition toutes les secondes donc cela te donne un top départ pour la mesure de l'impulsion ce qui fait que tu ne cumules pas l'erreur de ton timer au fil du temps.
La plus longue temporisation que tu dois avoir c'est une seconde pour la détection de la seconde 59.
#include <avr/interrupt.h>
#include <avr/io.h>
#include "interuption.h"
volatile unsigned long int us = 0;
volatile unsigned long int secondes = 0;
void timer1_init()
{
TCCR1A = 0x00; //Désactive les comparateur + Mode normal
TCCR1B = 0x00;
/*
Horloge à 16Mhz
1 période = 62.5ns
clk/8 = 0.5µs débordement à 32768 µs
clk/64 = 4µs débordement à 262144 µs
clk/256 = 16µs débordement à 1 048 576µs
clk/1024 = 64µs débordement à 4 194 304µs
Le prescale sera à 8
*/
TCCR1B |= (1<<CS12) | (0<<CS11) | (1<<CS10); //Prescale à 8
TIMSK1 = 1<<TOIE1; // Initialisation de l'interuption de débordement
sei();
}
void interup_1hz_init()
{
EICRA |= 1<<ISC11 | 1<< ISC10; //Configuration pour activer INT1 sur un front montant
EIMSK |= 1<<INT1; // Activation de l'interuption INT1
sei();
}
unsigned long int millis()
{
return (TCNT1 / 2 + us)/10;
}
ISR(TIMER1_OVF_vect)
{
us += 32768; //Lors du débordement le timer est égale à (2^16)*0.5 ms
}
ISR(INT1_vect)
{
secondes++;
}
Pour le décodage du DCF77, je n'y suis pas encore et je ne me presse pas trop car je vais commandé le module demain normalement, donc je ne pourrais tester mon code que d'ici fin de la semaine dans le meilleur des cas. Je vais surement débuter mon code se soir ou demain
@fdufnews : Ce sera une première pour moi de décoder un signal donc je voulais être sur que cette mauvaise précision n'allais pas m'ennuyer
adrien4607: @fdufnews : Ce sera une première pour moi de décoder un signal donc je voulais être sur que cette mauvaise précision n'allais pas m'ennuyer
Dans le pire des cas tu peux toujours faire une calibration dynamique.
Sachant qu'il y a une interruption toute les secondes tu peux t'en servir pour mesurer combien de millisecondes l'arduino a comptées en une seconde. Mais franchement je pense que l'erreur n'est pas pénalisante. Sur le long terme ce serait certainement un problème.
Vus que la précision est négligeable ce n'est pas trop grave que ça ne fonctionne pas, mais ça m’intéresse quand même de savoir comment on pourrais faire cette calibration