// Entrée de synchronisation 1PPS / INT4
pinMode(PinINT4, INPUT);
// Activation de l'interruption globale (registre SREG)
SREG|=0x80;
//SREG|=0x80 // Activation
//SREG&=0x7f // Désactivation
//Ou bien
//sei(): Set interrupt - Activation
//cli(): clear interrup - Désactivation (masquer)
// Validation de l'interruption INT4 (Registre EIMSK)
EIMSK|=0x10; // INT4
// Choix du mode de détection: Front montant dans INT4
EICRB|=0x03;
//EICRB|=0x00; //niveau bas '0' dans INTn
//EICRB|=0x01; //front montant ou descendant dans INTn
//EICRB|=0x02; //Front descendant dans INTn
//EICRB|=0x03; //Front montant dans INTn
La fonction d’initialisation du module RTC
void InitRTC(void)
{
if (! rtc.begin())
{
Serial.println("Le module RTC non disponible");
while (1); // Attente RESET
}
else
{
Serial.println("Le module RTC est OK");
rtc.writeSqwPinMode(DS1307_SquareWave1HZ);
//DS1307_SquareWave1HZ = 0x10, // 1Hz square wave
//DS1307_SquareWave4kHz = 0x11, // 4kHz square wave
//DS1307_SquareWave8kHz = 0x12, // 8kHz square wave
//DS1307_SquareWave32kHz = 0x13 // 32kHz square wave
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
//rtc.adjust(DateTime(2020,1,24,10,10,10)); // Ajustement manuel
// Ex: 10 Janvier 2020 à 10:00:00:
// rtc.adjust(DateTime(2020, 1, 10, 10, 0, 0));
}
}
La fonction de lecture du module RTC
void GetDateHeure(word *DateHeure)
{
// Lecture du module RTC
DateTime now = rtc.now();
// Récupération de la date
DateHeure[5]=now.year(); // Années
DateHeure[4]=now.month(); // Mois
DateHeure[3]=now.day(); // Jours
// Récupérration de l'heure
DateHeure[2]=now.hour();
DateHeure[1]=now.minute();
DateHeure[0]=now.second();
}
La fonction ISR() de l’interruption externe
ISR(INT4_vect) //ISR(_VECTOR(5))
{
// Compteur des échantillons
static word count=0;
// Désactivation de l'interruption globale
cli();
// Lecture du capteur
A0_val=analogRead(A0);
// Conversion en volt [0,1023]=>[0, 5V]
V0=(double)A0_val*V/1023.00;
// Calcul de la résistance en Ohm
R_l=((V/V0)-1.0)*R;
// Stockage local des données
Data[count]=R_l;
// Affichage des données: 1 Affichage / seconde
Serial.print("Count="); Serial.print(count);
Serial.print(", R_l="); Serial.print(Data[count]); Serial.print(", à ");
Serial.print(DateHeure[2]);Serial.print(":");
Serial.print(DateHeure[1]);Serial.print(":");
Serial.println(DateHeure[0]);
// Activation de l'interruption globale
sei();
// Mise à jour du compteur
count++; count=count%N;
}
Le programme complet
/*
* Projet Data logger: Datation des données 2/4
* wwww.Electronique-Mixte.fr
Objectifs
1. Savoir utiliser le module RTC
2. Savoir synchroniser le module RTC avec la carte Arduino
3. Savoir utiliser une interruption externe pour l’acquisition des données
4. Savoir utiliser la mémoire locale de la carte Arduino
5. Les 3 erreurs à éviter pour rendre son program fonctionnel
6. Etc.
*/
#include <Wire.h>
#include "RTClib.h"
#define V 5.00
#define R 10000.0
#define N 1200 // 60*20=1200 - Taille SRAM
#define PinINT4 2 // PE4 - PIN 2
RTC_DS1307 rtc;
word DateHeure[6]={0,0,0,0,0};
word A0_val;
double V0, R_l=0.0;
double Data[N];
void setup()
{
// Entrée de synchronisation 1PPS / INT4
pinMode(PinINT4, INPUT);
// Activation de l'interruption globale (registre SREG)
SREG|=0x80;
//SREG|=0x80 // Activation
//SREG&=0x7f // Désactivation
//Ou bien
//sei(): Set interrupt - Activation
//cli(): clear interrup - Désactivation (masquer)
// Validation de l'interruption INT4 (Registre EIMSK)
EIMSK|=0x10; // INT4
// Choix du mode de détection: Front montant dans INT4
EICRB|=0x03;
//EICRB|=0x00; //niveau bas '0' dans INTn
//EICRB|=0x01; //front montant ou descendant dans INTn
//EICRB|=0x02; //Front descendant dans INTn
//EICRB|=0x03; //Front montant dans INTn
// Initialisation du port série: Affichage locale des données
Serial.begin(9600);
// Initialisation du Module RTC (Heure de l'ordinateur)
InitRTC();
}
void loop()
{
// Lecture du module RTC
GetDateHeure(DateHeure);
}
ISR(INT4_vect) //ISR(_VECTOR(5))
{
// Compteur des échantillons
static word count=0;
// Désactivation de l'interruption globale
cli();
// Lecture du capteur
A0_val=analogRead(A0);
// Conversion en volt [0,1023]=>[0, 5V]
V0=(double)A0_val*V/1023.00;
// Calcul de la résistance en Ohm
R_l=((V/V0)-1.0)*R;
// Stockage local des données
Data[count]=R_l;
// Affichage des données: 1 Affichage / seconde
Serial.print("Count="); Serial.print(count);
Serial.print(", R_l="); Serial.print(Data[count]); Serial.print(", à ");
Serial.print(DateHeure[2]);Serial.print(":");
Serial.print(DateHeure[1]);Serial.print(":");
Serial.println(DateHeure[0]);
// Activation de l'interruption globale
sei();
// Mise à jour du compteur
count++; count=count%N;
}
void GetDateHeure(word *DateHeure)
{
// Lecture du module RTC
DateTime now = rtc.now();
// Récupération de la date
DateHeure[5]=now.year(); // Années
DateHeure[4]=now.month(); // Mois
DateHeure[3]=now.day(); // Jours
// Récupérration de l'heure
DateHeure[2]=now.hour();
DateHeure[1]=now.minute();
DateHeure[0]=now.second();
}
void InitRTC(void)
{
if (! rtc.begin())
{
Serial.println("Le module RTC non disponible");
while (1); // Attente RESET
}
else
{
Serial.println("Le module RTC est OK");
rtc.writeSqwPinMode(DS1307_SquareWave1HZ);
//DS1307_SquareWave1HZ = 0x10, // 1Hz square wave
//DS1307_SquareWave4kHz = 0x11, // 4kHz square wave
//DS1307_SquareWave8kHz = 0x12, // 8kHz square wave
//DS1307_SquareWave32kHz = 0x13 // 32kHz square wave
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
//rtc.adjust(DateTime(2020,1,24,10,10,10)); // Ajustement manuel
// Ex: 10 Janvier 2020 à 10:00:00:
// rtc.adjust(DateTime(2020, 1, 10, 10, 0, 0));
}
}
Découvrez notre Chaîne YouTube "Devenir Ingénieur" Obtenir le fichier PDF Fonctionnement Code Arduino Click to rate this post![Total: 1 Average: 5] Nous Soutenir 💌
Découvrez notre Chaîne YouTube "Devenir Ingénieur" Obtenir le fichier PDF Objectifs Savoir l’importance de l’automatisation de l’analyse technique Saloir les limitations de l’analyse technique Comprendre les notions de prévisions et prédictions Etc. Lire la suite Lire la suite…
Découvrez notre Chaîne YouTube "Devenir Ingénieur" Obtenir le fichier PDF Sommaire0.1 Objectifs du COURS0.2 Introduction0.3 Le BUS I2C0.3.1 Remarque0.4 Protocole0.4.1 Remarque0.5 En-tête0.6 Exemple avec l’esclave DS13070.6.1 Exemple de lecture du DS13070.6.2 Chronogramme complet de l’échange Lire la suite…
You have successfully subscribed to the newsletter
There was an error while trying to send your request. Please try again.
0 commentaire