Date et Horloge

Ce projet a pour objectif de mettre en place une horloge avec datation dans la carte de TP. L'affichage de l'heure et de la date s'effectue sur l'écran LCD.

1. Traitement entièrement logiciel

Dans cette version, l'heure et la date sont calculées en permanence par le uC en utilisant un timer (le 2) comme base de temps de référence pour arriver à facilement comptabiliser les secondes.

Sur la première ligne de l'afficheur, on affichera l'heure au format HH:MM:SS.

Sur la seconde ligne de l'afficheur, on affichera la date au format JJ/MM/AAAA.

1.1. Etude préliminaire

  1. Déterminer les paramètres du Timer 2 pour générer une interruption qui, à l'aide d'un compteur intermédiaire, permettra de créer un indicateur précisant que 500 ms et également qu'une seconde viennent de s'écouler.
  2. Etablir un algorithme permettant de savoir si une année est bissextile ou non.
  3. Ecrire un algorithme permettant de connaître le jour pour une date donnée.

1.2. Programmation

On procède par étapes successives.

  1. Clignotement des secondes :
    1. Faire clignoter la LED1 toutes les secondes (500 ms allumée et 500 ms éteinte).
  2. Horloge simple :
    1. Au début de la fonction main(), déclarer des variables pour comptabiliser les secondes, minutes et heures (fixer des valeurs initiales pertinentes pour un test).
    2. Dans la boucle infinie de la fonction main(), écrire le code permettant la mise à jour de l'heure chaque fois que l'indicateur seconde est à 1.
    3. Afficher l'heure.
    4. Tester.
  3. Date sans gestion des années bissextiles :
    1. Au début de la fonction main(), déclarer des variables pour comptabiliser le jour, le mois et l'année de la date en fixant des valeurs initiales pertinentes pour un test ultérieur.
    2. Dans la continuité du calcul de l'heure, mettre à jour la date lorsque l'heure passe à minuit sans tenir compte des années bissextiles.
    3. Afficher la date.
    4. Tester.
  4. Date avec les années bissextiles :
    1. Reprendre les questions précédentes en tenant compte des années bissextiles.
    2. Tester pour différentes valeurs initiales de date.
  5. Affichage du jour :
    1. Ajouter une section de code permettant de calculer le numéro du jour en fonction de la date (cela peut être réalisé par une fonction écrite avant la fonction main()).
    2. Afficher le jour.
    3. Tester pour différentes dates et vérifier le bon fonctionnement du programme.
  6. Amélioration pour l'affichage de l'heure :
    1. Faire clignoter les : séparant les heures des minutes et les minutes des secondes avec un fonctionnement identique à celui de la LED1.
    2. Tester.

2. Utilisation d'un circuit d'horloge temps réel (RTC = Real Time Clock)

L'option précédente a plusieurs inconvénients :

  • une part des ressources du uC sont utilisées uniquement pour le calcul de l'heure et de la date,
  • en cas de coupure d'alimentation, cette méthode implique de perdre la mise à l'heure et à la date.

Dans les cas où l'un de ces inconvénients est inacceptable, la meilleure option consiste à utiliser un circuit dédié appelé RTC dont l'alimentation pourra être assurée par une pile bouton en cas de perte de l'alimentation générale du reste du système.

La suite repose sur l'utilisation de l'un de ces circuits, le PCF8563, connecté au uC par l'intermédiaire du bus I2C.

2.1. Etude préliminaire

  1. Rechercher la datasheet du PCF8563.
  2. Câbler le circuit sur une plaquette de test et le relier à la carte de TP via le connecteur J2.
  3. Dresser la liste des registres à configurer pour gérer la date et l'heure (pas de réveil).

2.2. Programmation

Pour plus de clarté du code, toutes les fonctions permettant d'accéder au circuit RTC devront être implémentées dans une bibliothèque placée dans le dossier du projet et reposant sur deux fichiers : pcf8563.h à placer dans la section Header Files du projet et pcf8563.c à placer dans la section Source Files du projet.

 Une bibliothèque I2C restreintes (donc à compléter) est disponible en téléchargement sur le site avec un exemple d'utilisation avec un circuit extender de bus.

  1. Lecture de l'heure dans le circuit :
    1. Ecrire une fonction renvoyant l'heure actuelle (uniquement le nombre pour les heures) nommée LitHeures().
    2. Idem pour les minutes avec le nom LitMinutes().
    3. Même chose pour les secondes, fonction nommée LitSecondes.
    4. Utiliser les 3 fonctions précédentes pour afficher l'heure actuelle complète.
  2. Mise à jour de l'heure :
    1. Ecrire une fonction permettant de mettre à jour l'heure prenant trois paramètres en entrée : les heures, les minutes et les secondes.
    2. Tester.
  3. Lecture de la date :
    1. Ecrire une fonction capable de lire le jour actuel (JJ dans le format de date JJ/MM/AAAA) nommée LitJour().
    2. Idem pour connaître le mois avec une fonction nommée LitMois().
    3. Même chose pour l'année (fonction LitAnnee()).
    4. Afficher la date en utilisant les trois fonctions précédentes.
  4. Mise à jour de la date :
    1. Ecrire une fonction permettant de changer la date et prenant le jour (JJ), le mois et l'année en paramètres.
    2. Tester la fonction.