Horloge et calendrier par Claude VE2APS

 
 
 
 

Notes explicatives  sur les programmes

 

1.      Horloge Calendrier  - version 1.2 (11 janv 2004) et 

2.      Horloge Calendrier arrêt départ  - version 1.0 (12 janv. 2004)

 Introduction

 Les programmes «horloge calendrier» et «horloge calendrier contrôleur» joints en annexe sont le fruit d'une initiative personnelle du soussigné entreprise dans le cadre d'un cours de programmation en langage PicBasic Pro offert aux membres en règle de l'Union métropolitaine des sansfilistes de Montréal (UMS) à l'automne 2003 dans les locaux du centre Roussin.

 Le cours était dispensé à raison de 3 heures toutes les deux semaines, de septembre à décembre, principalement par Daniel Paquette, VA2DPX, assisté de Jacques Brodeur, VE2EMM. Il s'agissait d'un cours de base en programmation de microcontrôleurs électroniques (PIC) de la famille 16FXXX de la compagnie Microchip. En complément aux cours théoriques des ateliers de travaux pratiques ont eu lieu aux deux semaines grâce à l'initiative de Serge Lavoie, VE2HLS.

 Le projet

 En un premier temps, l'auteur a développé le programme «horloge calendrier» avec un diagramme logique joint au présent dossier. Le programme écrit en langage PicBasic Pro permet d'afficher l'heure (heures, minutes, secondes) et la date  (jour de la semaine, jour du mois, mois et année) en temps réel sur une unité d'affichage intelligente à cristaux liquides (LCD) de deux lignes de 16 caractères chacune. Le lecteur est prié de s'assurer qu'il a en main la dernière version (soit 1.2) de ce programme car la version antérieure comportait une erreur qui entraînait le passage rapide d'un mois à un autre et d'une année à une autre. Cette erreur de programmation a été corrigée dans la version la plus récente citée en titre. Le projet  «Horloge Calendrier arrêt départ» n’est rien d’autre que l’ajout à l’horloge calendrier d’une fonction complémentaire visant à commander le départ et l’arrêt d’un instrument quelconque en fonction du temps. Cette fonction complémentaire a nécessité l’ajout d’un bon nombre de lignes de programmation au programme Horloge - Calendrier.

 Le cœur de l’horloge  est un microcontrôleur électronique (PIC) 16F628 de la compagnie Microchip. Un  cristal externe de précision raccordé au circuit oscillateur du PIC génère une oscillation  à la fréquence de 4,194304 Mhz. Sept (7) boutons d'entrée des paramètres et quelques composantes dont 7 résistances de 10 Kilohms ¼ watt, 2 condensateurs en céramique de 22 pfd dans le circuit de l'oscillateur, un condensateur de découplage sur l'alimentation CC dont la valeur est 0,1 Ufd et une résistance variable de 12 kilohms permettant d'ajuster le contraste de l'unité d'affichage à cristaux liquides complètent l’instrument.

 La commande «départ / arrêt» d’un équipement externe est assignée à la patte RB2 du PIC, attendu qu'il faudra éventuellement raccorder à cette patte des composantes électroniques additionnelles comme un circuit mémoire à bascule (flip flop circuit) et un circuit d'isolation type optocoupleur entre la sortie de l'instrument et les appareils électroniques ou électriques dont on veut commander le départ et l'arrêt à des heures et dates prédéterminées.

 

Les caractéristiques techniques de l'horloge

 ·         Affichage sur la première ligne du LCD des heures, minutes et secondes sous la forme : hh : mm : ss ; les heures variant de 0 à 23 ;

·         Affichage sur la première ligne du LCD, à droite des heures, de l'un des trois modes dans lequel l'instrument est placé à l'aide d'un bouton raccordé à la patte RB1 du PIC soit le mode «horloge», le mode «départ» et le mode «arrêt». Par "mode" on entend la situation dans laquelle le PIC se trouve aux fins d'entrée des paramètres relatifs à l'heure et à la date en temps réel, les heures et dates de départ et d'arrêt  d'un appareil externe raccordé à la sortie du PIC (patte RB2 et circuits connexes appropriés) ;

·         Affichage sur la deuxième ligne du LCD du jour de la semaine sous forme d'un nombre variant de 1 à 7, le nombre 1 correspondant à dimanche, le nombre 7 à samedi et de la date sous la forme : jj : mm : aaaa ; l'année la plus tardive programmée est 2050 mais ce nombre peut être modifié dans le programme seulement si cela est nécessaire ;

·         L'unité d'affichage à cristaux liquides est du type intelligent à deux lignes de 16 caractères chacune et il comporte un processeur compatible à Hitachi HD 44780 ;

·         Les réglages manuels de l'horloge s'effectuent à l'aide de 7 boutons identifiés aux paramètres suivants : heure, minute, jour de la semaine, jour dans le mois, mois de l'année, année et mode ; les secondes sont mises à zéro au moment de l'ajustement des minutes dans le but de simplifier la quincaillerie requise ;

·         Le réglage manuel des paramètres de l'horloge ne s'effectue que de façon séquentielle en augmentant seulement la valeur de ceux-ci ;

·         Le microcontrôleur électronique est un PIC 16F628 de la compagnie Microchip alimenté à 5 volts CC régularisé, le régulateur n'est pas montré dans le schéma ;

·         Pour plus de précision, l'oscillateur est externe au PIC et comporte un cristal dont la fréquence est 4,194304 Mhz ainsi que 2 condensateurs céramiques de 22 pfd chacun ;

·         L'horloge tient compte automatiquement des années bissextiles et elle s'ajuste automatiquement à l'heure normale ou avancée conformément à la Loi sur le temps légal en vigueur au Québec depuis le 1er janvier 2007 laquelle abroge la Loi sur le temps réglementaire (L.R.Q., c. T-6). Cette modification à la Loi a suivi une décision prise à cet effet par les États-Unis. Il existe également une loi au Canada, la Loi d’interprétation (L.R.C., c. I-21) contient des dispositions sur l’heure réglementaire au Canada, mais ces dispositions reprennent les dispositions des différentes lois provinciales ou territoriales applicables.

·         La sortie pour la commande du départ et de l'arrêt d'un appareil électrique ou électronique externe se trouve sur la patte RB2 du PIC, attendu qu'en pratique un circuit mémoire du type «flip flop» et un optocoupleur électronique devront y être raccordés afin de fournir l'isolation électrique nécessaire entre l'instrument et l'appareil électrique externe dont le départ et l'arrêt est commandé par celui-ci ;

·         Au moment d'écrire ces lignes, la stabilité et la précision à long terme de la partie horloge de l'instrument n'est pas connue. Toutefois, la précision semble suffisante pour la plupart des applications courantes.

 

Le programme

LA MESURE DU TEMPS

La mesure du temps dans le programme est essentiellement basée sur une sous-routine appelée ISR laquelle est exécutée suite à un «interrupt» découlant d'un réglage du «prescaler» et d’un «overflow» du Timer0, c'est-à-dire à chaque fois que le Timer0 atteint le compte de 256.

En un premier temps, le PIC est conçu pour diviser par 4 la fréquence de l'oscillateur externe (voir data sheet du PIC 16F628 DS40300C page11 paragraphe 2.1 «Clocking Scheme/Instruction Cycle). Puis le «prescaler» (bits 0, 1 et 2) de «l'OPTION register» du PIC est réglé de manière à effectuer subséquemment une division de la fréquence de l'oscillateur par 256  (voir data sheet DS40300C page 20 paragraphe 3.2.2.2 Option Register) et enfin le TIMER0 a pour effet de diviser de nouveau par 256 la fréquence de l'oscillateur (voir data sheet DS40300C page 43 paragraphe 6.2.1 External Clock Synchronization) de sorte que nous avons ceci :

Fréquence résultante  = Fosc / (4* 256*256) = 4,194304 Mhz / (4*256*256) = 16 hertz

Par conséquent, la sous-routine (ISR pour Inerrupt SubRoutine) n'a qu'à compter 16 fois cette division pour en arriver à compter précisément une seconde. De là, au terme de 60 secondes on obtient une minute et au terme de 60 minutes une heure et au terme de 24 heures une journée et ainsi de suite pour la date du jour, le mois et enfin l'année.

DÉTERMINATION DE LA DATE ; LE CAS DU MOIS DE FÉVRIER

L'affichage de la date, c'est-à-dire le jour, le mois et l'année, exige que l'on conserve en mémoire le nombre de jours compris dans chaque mois de l'année. Il s'agit donc de constantes sauf pour le mois de février dont le nombre de jours passe de 28 à 29 lors d'une année bissextile. Pour savoir s'il s'agit d'une année bissextile, il suffit d'effectuer un test en divisant par 4 le nombre qui représente l'année. Si le reste résultant de cette division est nulle, l'année est une année bissextile et le mois de février comporte alors 29 jours au lieu de 28. L'instruction LOOKUP, disponible dans le langage PicBasic Pro, permet de manipuler des constantes placées dans un tableau à l'aide d'une variable indicée. Comme l'indice de la variable représente le numéro du mois dans l’année (mois #1, mois #2, etc.) et qu'au minimum cet indice est égal à 1 et au maximum 12 (parce qu’il y a 12 mois dans l’année), la variable elle-même représentant le nombre de jours dans le mois est alors réglée sur la deuxième constante placée entre crochets dans l'instruction LOOKUP, obligeant ainsi à placer le chiffre 0 comme première valeur de la variable dans la série de 13 valeurs entre crochets dans cette instruction (voir livre du compilateur PicBasic Pro, page 97). On aurait pu procéder autrement mais puisque la valeur de l’indice de la variable qui représente le nombre de jours dans le mois correspond au numéro du mois de l’année, cette façon de procéder facilite la lecture ultérieure du programme. Le jour de la semaine est représente sur l’affichage par un chiffre variant de 1 à 7 où 1 désigne le dimanche, 2 le lundi et ainsi de suite.   

RÉGLAGE AUTOMATIQUE HEURE NORMALE ET HEURE AVANCÉE

Enfin, une horloge complète comporte un ajustement automatique à l'heure avancée et à l'heure normale. Pour ce faire, il faut considérer les principales dispositions de la Loi sur le temps légal au Québec.

Il est à noter que suite aux décisions prises par le gouvernement des États-Unis, la Loi sur le temps réglementaire a été modifiée par le Projet de Loi n° 2 (2006, chapitre 39) : Loi sur le temps légal

[Présenté le 20 mars 2006

Principe adopté le 5 avril 2006

Adopté le 7 décembre 2006

Sanctionné le 12 décembre 2006] Le texte se lit maintenant comme suit :

 

LOI SUR LE TEMPS LÉGAL

LE PARLEMENT DU QUÉBEC DÉCRÈTE CE QUI SUIT :

1. Dans la partie du Québec à l’ouest du méridien du soixante-troisième

degré de longitude Ouest, le temps légal est l’heure normale de l’Est, à savoir

le temps en retard de cinq heures sur le temps universel coordonné

(UTC - 5 h).

 

Toutefois, entre le deuxième dimanche de mars, à deux heures, et le premier

dimanche de novembre, à la même heure, le temps légal dans cette partie du

Québec est l’heure avancée de l’Est, à savoir le temps en retard de quatre

heures sur le temps universel coordonné (UTC - 4 h).

Les dispositions du présent article s’appliquent également à tout le territoire

de la Municipalité régionale de comté de Minganie.

 

2. Dans la partie du Québec à l’est du méridien du soixante-troisième degré

de longitude Ouest et le territoire de la réserve de Listuguj, le temps légal est

l’heure normale de l’Atlantique, à savoir le temps en retard de quatre heures

sur le temps universel coordonné (UTC - 4 h).

Toutefois, entre le deuxième dimanche de mars, à deux heures, et le premier

dimanche de novembre, à la même heure, le temps légal pour les ÎIes-de-la-

Madeleine et le territoire de la réserve de Listuguj est l’heure avancée de

l’Atlantique, à savoir le temps en retard de trois heures sur le temps universel

coordonné (UTC - 3 h).

3. Le ministre de la Justice est chargé de l’application de la présente loi.

4. La présente loi remplace la Loi sur le temps réglementaire (L.R.Q.,

chapitre T-6).

5. La présente loi entrera en vigueur le 1er janvier 2007.

Référence :

http://www2.publicationsduquebec.gouv.qc.ca/dynamicSearch/telecharge.php?

type=5&file=2006C39F.PDF

Le programme «horloge / calendrier» a donc été modifié en conséquence.

Quelques observations complémentaires

Le retour à l'heure normale comporte une difficulté de programmation car il faut éviter que le PIC ne cesse de reculer l'heure d'une heure en repassant dans la même routine entre 1 heure et 2 heures le premier dimanche de novembre. Pour ce faire, il faut lever un drapeau dès la première fois que le PIC effectue le test de l'heure normale. Cependant, il faut abaisser ce drapeau à un autre endroit dans le programme, mais à quel endroit ? Il s'est avéré que le meilleur endroit dans le programme pour abaisser ce drapeau était dans la routine du test de l'heure avancée car on ne revient pas à l'heure normale avant d'avoir passé par l'heure avancé !

Dans le circuit de l'horloge calendrier, les pattes RB1 et RB2 du PIC ont été laissées libres intentionnellement afin de faciliter l'usage de la fonction «In-circuit debugging» du logiciel PICALL. Toutefois, dans le circuit «horloge calendrier arrêt départ» il a fallu utiliser les pattes RB1 et RB2 ne laissant ainsi aucune patte libre sur le PIC.

Le contrôle du rétroéclairage de l'unité d'affichage est effectué au moyen d'un bouton à action momentané ou à action alternée (Push ON, Push OFF), au choix de l'usager.

L'ajustement du contraste des caractères affichés s'effectue à l'aide d'une résistance variable dont la valeur est comprise entre 12 et 20 kilohms.

 

LES BOUTONS DE COMMANDE

Sept boutons permettent de régler manuellement les sept paramètres de l'horloge présentés sur l’afficheur. Ces paramètres sont les suivants :

Présentés sur la première ligne de l’affichage nous avons :

·         Les heures,

·         Les minutes et

·         Les 3 MODES soit le mode «Horloge calendrier» seulement ou dans le cas de «l’horloge calendrier arrêt départ» les paramètres de temps et date de [DÉPART] ou [d’ARRÊT] d’un équipement externe) ;

 et sur la deuxième ligne de l’affichage nous avons : 

  • jour de la semaine,
  • jour du mois,
  • mois et
  • année.

 La commande des heures et dates de départ et d'arrêt d'un appareil électrique ou électronique externe ajoute beaucoup d'instructions au programme antérieur «horloge calendrier». En effet, il faut pouvoir utiliser les six boutons de réglage manuels déjà en place dans le projet «horloge calendrier», lesquels servaient à régler l'heure et la date en temps réel alors qu'il doivent maintenant permettre d'entrer les heures et les dates de départ et d'arrêt d'un appareil externe. Il a donc fallu ajouter un septième bouton de réglage manuel afin d'informer le PIC dans quel MODE on veut le placer afin qu'il puisse comprendre que l'on veut entrer l'heure et la date en temps réel (mode HORLOGE CALENDRIER), ou l'heure et la date de départ d'un appareil externe (mode DEPART), ou l'heure et la date d'arrêt de l'appareil externe (mode ARRET).

 Une instruction BUTTON, laquelle comporte une fonction intégrée de «debouncing», est associée à chacun des 7 boutons de réglage manuel de l'horloge. Les secondes sont affichées sur la première ligne de l'affichage et leur réglage ne requiert pas de bouton spécifique puisqu'elles sont mises à zéro automatiquement sur réglage manuel des minutes. Cette approche permet de simplifier le programme ainsi que la quincaillerie requise ; elle est utilisée dans les appareils radio réveil matin de SONY.

 AFFICAGE DES DONNÉES

 L'affichage des données s'effectue au moyen de l'instruction LCDOUT. Le langage PicBasic Pro présume que l'unité d'affichage LCD est câblée à des pattes spécifiques du PIC à moins qu'il n'en soit mentionné autrement dans le programme à l'aide d'instructions DEFINE. Or, afin de simplifier le programme, l'unité d'affichage a été câblée de manière à éviter les instructions DEFINE.

 LES VARIABLES REQUISES DANS LE PROGRAMME

 D'autre part, il faut mémoriser tous ces paramètres de fonctionnement et à cette fin il faut ajouter une panoplie de variables de type "byte" en général sauf pour l'année qui est de type "word" en raison de la taille du nombre  impliqué (ex. le nombre 2003 ne peut pas être représenté dans un byte qui vaut seulement 28 = 256 !!! Or un mot ou word dans le PIC 16F628 a une longueur de 14 bits et par conséquent 214 = 16384, donc un mot de 14 bits peut contenir le nombre 2003).

 Il a fallu également introduire une foule d'instructions permettant d'entrer les différents paramètres dans ces variables additionnelles à l'aide des boutons existants et enfin des instructions pour comparer l'heure et la date en temps réel avec l'heure avec la date du départ et de l'arrêt de l'appareil externe ; ces dernières instructions de comparaison utilisant l'opérateur logique "AND" et étant placées dans la boucle principale du programme.

 CONSIDÉRATIONS GÉNÉRALES

 La commande du départ et de l'arrêt d'un appareil externe est disponible sur la patte RB2 du PIC. Le lecteur comprendra certainement que l'ajout sur la patte RB2 du PIC d'un circuit mémoire de type «flip flop» et d'une puce de type optocoupleur entre le «flip flop» et l'appareil externe est nécessaire mais que cela dépasse l'objet du présent exercice.

 L'utilisation du "In-circuit debugging" a été essentielle à la mise au point du programme car elle a permis de voir comment chacune des variables se comporte dans le temps et ainsi de trouver où étaient les «bugs» ça et là dans le programme en cours de développement.    

 Dans sa forme actuelle, le programme «Horloge Calendrier arrêt départ» comporte 316 lignes d'instructions en langage PicBasic Pro et un total de 1578 mots de 14 bits une fois compilé et assemblé. En comparaison le programme «Horloge Calendrier» comporte 171 lignes d'instruction et 897 mots de 14 bits une fois compilé et assemblé.

 Ces deux programmes ne sont pas nécessairement réduits à leur plus simple expression ; toutefois les tests effectués à ce jour portent à croire qu'ils fonctionnent adéquatement.

 Le schéma de «l'horloge calendrier» en format .gif est une gracieuseté de Gilles Auger. Incidemment, M. Auger a effectué une simulation de ce circuit avec succès sur le logiciel Proteus.

 Le schéma du circuit «horloge calendrier contrôleur» a été dessiné à la main par l'auteur.  

 Les programmes «horloge calendrier»  et «horloge calendrier arrêt départ»  ont été révisés récemment pour tenir compte de la Loi sur le temps légal au Québec en vigueur depuis le 1er janvier 2007. Ces deux programmes sont mis à la disposition du public tel quel et sans frais mais l'auteur ne peut être tenu responsable de tout genre de dommage qui pourrait découler de leur utilisation.

 Par : Claude Cossette, VE2APS

14-01-2004

Texte et programme révisés le 2008-10-21 par /rcc

 
 

Ordinogramme du projet

 
 
 
 
 
 
 
 
 
 

‘Programme Horloge – Calendrier commenté

'****************************************************************

'*  Name    : Horloge et calendrier XT OSC 3.BAS *                         

'*  Author  : Claude Cossette, VE2APS                           *

'*  Notice  : Copyright (c) 2003 [select VIEW...EDITOR OPTIONS] *

'*          : All Rights Reserved                               *

'*  Date  de programmation  : 11-01-2004                                        *

'*  Version : 1.2                                               *

'*  Notes   : Oscillateur externe 4.194304 Mhz, division par 256 avec prescaler *

'*  Notes   : et division par 256 avec TIMER0 ; LCD câblé par défaut  * 

'*  Notes   : et PortB pattes 1 et 2 laissées libres pour usage ultérieur  *

'*  Notes   : modifié pour heure avancée et normale selon la Loi sur le temps légal en vigueur au Québec depuis le 2007-01-01 *

'****************************************************************

‘ Fuses

@ device IC16F628,XT_OSC,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_ON,LVP_OFF,
CPD_OFF,PROTECT_OFF

 CCP1CON = 0              'Capture Compare OFF

 CMCON = 7                'Compare module OFF

 Pause 500                'Pause pour donner le temps à l'affichage LCD de démarrer

 

 'Liste des variables

 Y var bit                'Variable auxiliaire pour test de l'heure normale ; c'est un drapeau

 Nodujour var byte        'Variable représentant le numéro du jour de la semaine 1= Dimanche

 Update var byte          'Variable auxiliaire relative au rafraîchissement du LCD

 B0 var byte              'Variable B0 pour debouncing des boutons de réglage de l'horloge

 Sec var byte             'Variable Secondes

 Minut var byte           'Variable Minutes

 Hre var byte             'Variable Heures

 Div_temps Var byte       'Variable Diviseur de temps dans la sous-routine ISR

 Jour var byte            'Variable Jour

 Mois var byte            'Variable Mois

 An var word              'Variable Année (Cette variable a  4 chiffres, il faut  donc  plus que 8 bits pour représenter sa valeur dans le système binaire ; voir manuel du compilateur PicBasic Pro page 21para.4.3 Variables)

 Nbjrmois var byte        'Variable Nombre de jours dans le mois

 W1 var byte              'Variable auxiliaire utilisée dans le test pour l'année bissextile

 'Initialisation des variables et des Ports

 Update = 1               'Force le premier affichage au LCD

 Sec = 0:Minut = 0:Hre = 0:B0 = 0:Div_temps = 0               ‘Notez l’usage du symbole : pour séparer deux énoncés placés sur une même ligne, ce qui ne change pas la quantité de code généré (voir  PBP Compiler manuel page 29 para 4.13. Multistatement lines)

 

 Jour = 1:Mois = 1:An = 2003:W1 = 1:Nbjrmois = 31:Nodujour = 1: Y = 0   ‘où y est un drapeau

 

‘Mise à zéro des ports A et B

 PortA = 0                'PortA mis à zéro pour fins de stabilisation ; très important avant de faire le TrisA ; à noter que aucun signe devant la valeur signifie une valeur exprimée dans le système décimal

 PortB = 0                'PortB mis à zéro pour fins de stabilisation ; très important avant de faire le TrisB

 

‘Définition des pattes sur les ports A et B

 TrisA = %11110000        'Le symbole  %  signifie que la valeur est exprimée  dans le système binaire ; Sur PortA définition des pattes RA0 à RA3 en sortie car raccordées sur affichage LCD et RA4 à RA7 en entrée parce que c’est l’usage physique qu’on en fait (voir le schéma de câblage). Voir également le manuel PicBasic Pro Compiler pages 27 et 28 para 4.11. Pins ; 1 = en entrée et 0 = en sortie  car ce faisant on agit sur le «registre Tris» de fonction spéciale du port

 TrisB = %11111011        'Sur le PortB les pattes RB0, RB1 et RB3 à RB7 sont définies en entrée car elles sont  connectées sur les boutons et RB2 est en sortie car c’est l‘usage physique qu’on en fait (voir le schéma de câblage)

 

 'Réglage de l'interrupt du TIMER0

 'Réglage du prescaler dans l'Option Register pour diviser la fréquence de l'osc par 256. Il est intéressant de regarder la fig.14 dans le data sheet  # DS40400C page 101 du Pic 16F628 où on explique la logique de l’Interrupt dans ce PIC. On y explique également que ce PIC offre 10 sources différentes d’interrupt.

 OPTION_REG = %10000111 ‘voir Microchip data  sheet  DS40300C page 20 ; les bits 0, 1 et2 étant réglés à 1 cela permet au TMR0 de diviser la fréquence de l’oscillateur par 256 ; bit 7 réglé à 1 fait que «PortA pull-ups  are disabled»

 

 'Initialisation du TIMER0 

 TMR0 = 0            ’Timer zéro mis à 0

 

'Réglage de l'interrupt control register (INTCON) pour que Timer0 puisse lever le drapeau au compte de 256                

 Intcon = %10100000      ‘voir Microchip data sheet DSC40300C page 21 ; bit 5 réglé à 1 c’est le TMR0 overflow enable bit et lorsque réglé à 1 «it enables the TMR0 interrupt» ; bit 7 réglé à 1 «it enables all unmasked interrupts». Pour encore mieux comprendre ça il faut regarder la fig. 14 dans le data sheet du Pic 16F628.        

 ON Interrupt Goto ISR    'Si le drapeau de l'Interrupt control register est levé par l'overflow du TIMER0, branchement à la sous-routine ISR

 

 ‘Début de la boucle principale

 Main:                    'Label marquant le début de la boucle principale

 B0 = 0                   ' Variable qui doit être mise à zéro avant le départ de toute instruction «button»

 

 'Vérifier si un des boutons de réglage de l'heure est pressé

 Button PortB.7,0,100,10,B0,1,Hreset   'Bouton de réglage manuel des heures  voir note 1 au bas de la page 8

 Button PortB.6,0,100,10,B0,1,Minutset 'Bouton de réglage manuel des minutes et des secondes simultanément

 

 'Vérifier si un des boutons de réglage du calendrier est pressé (voir les explications sur le fonctionnement de l’instruction BUTTON à la page 9 du présent document ainsi qu’à la page 47 du manuel sur le compilateur PicBasic Pro para. 5.6)

 Button PortB.0,0,100,10,B0,1,Jourset   'Bouton de réglage manuel du jour

 Button PortB.5,0,100,10,B0,1,Moisset   'Bouton de réglage manuel du mois

 Button PortA.5,0,100,10,B0,1,Anset     'Bouton de réglage manuel de l'année

 

 'Vérifier si le bouton de réglage du numéro du jour (lequel représente le nom du jour) est pressé [ici par convention Dimanche est le jour 1.

 Button PortB.4,0,100,10,B0,1,Nodujourset

 IF sec >= 60 Then

 Minut = Minut + 1:Sec = 0    'Si variable Sec >= 60 augmenter variable Minut de 1 et placer variable Sec à 0

 ENDIF

 If Minut >= 60 Then

 Hre = Hre + 1:Minut = 0    'Si variable Minut >= 60 augmenter variable Hre de 1 et placer variable Minut à 0

 ENDIF

 IF Hre >= 24 Then

 Hre = 0:Minut = 0:Sec = 0    'Si variable Hre >= 24 placer variables Sec, Minut et Hre à 0

 Jour = Jour + 1

 Nodujour = Nodujour + 1

 ENDIF

 'Vérifier si le numéro du jour de la semaine est plus grand que 7

 IF Nodujour > 7 THEN

 Nodujour = 1

 ENDIF

 

'Aller lire dans la mémoire du EEPROM le nombre de jours dans le mois

 LOOKUP Mois,[0,31,28,31,30,31,30,31,31,30,31,30,31],Nbjrmois

 

 'Si on est dans le mois de février, vérifier si l'année est bissextile 

 IF Mois = 2 THEN Testbissextile

 

'Vérifier si la variable Jour a dépassé le nombre de jours dans le mois  

 Limitmois:

 IF Jour > Nbjrmois THEN   

 Jour = 1:Mois = Mois + 1

 ENDIF

 IF Mois > 12 THEN

 Mois = 1:An = An + 1

 ENDIF

 

'Vérifier si l'année a dépassée l'année 2050

 IF An > 2050 THEN 

 Jour = 1:Mois = 1:An = 2003

 ENDIF

 

 'Vérifier si on est à l'heure avancé

 IF (Mois = 3) AND (Nodujour = 1) AND (Jour >= 8) AND (Hre = 2) THEN               ‘L’opérateur (>=) signifie [plus grand ou égal à] voit manuel du compilateur Picbasic Pro page 36 para. 4.18 Comparison Operators ; pour les opérateurs logiques comme AND, OR etc., voir le manuel du compilateur PicBasic pro page 36 para. 4.19 Logical Operators

 Hre = Hre + 1

 Y = 0  ‘abaisser le drapeau

 ENDIF

 'Vérifier si on est à l'heure normale

 IF Y = 0 THEN Testhrenorm

 

 'Début de l'affichage du temps sur le LCD (voir manuel de compilateur PicBasic Pro page 90 para. 5.36 LCDOUT)

 Affichage:                    'Label marquant le début de l'affichage du temps              

 IF Update = 1 THEN            'Variable Update utilisée pour forcer l'affichage des données si = 1

 LCDOUT $fe, 1               ' Effacer l'affichage LCD

 LCDOUT dec2 Hre,":",dec2 Minut,":",dec2 Sec                'Afficher la valeur décimale à 2 chiffres pour chacune des variables Hre, Minut et Sec sous la forme HH:MM:SS

 LCDOUT $FE,$C0,dec1 Nodujour,":",dec2 Jour,":",dec2 Mois,":",dec4 An          ‘ où une variable à chaîne comme les deux points ( :)  doivent être placés entre guillemets  voir manuel du compilateur PicBasic Pro page 25 para. 4.8 Numeric Constants

 ENDIF

 Update = 0                'Interdit l'affichage des données au moment inopportun

 Goto Main                 'Branchement inconditionnel à la boucle principale appelée «Main»

 

 'Début de la sous-routine suite à un interrupt donné par l'overflow du TIMER0 ; elle permet de compter les levés du drapeau du TMR0  à tous les 1/16 sec (ou 62,5 millisecondes) dans l'intervalle de temps compris entre chaque seconde

 DISABLE                   'Instruction requise pour éviter des interruptions à un moment inopportun

 ISR:                      'Label ISR (Interrupt sub-routine)

 Div_temps = Div_temps + 1 'Augmenter d'une unité la variable Div_temps

 INTCON.2 = 0              'Reset le bit 2 du Interrupt control register qui correspond au TMR0 overflow interrupt flag bit, lequel doit être remis à 0 par software  (voir PIC data sheet DS40300C page 21)

 IF Div_temps >= 16 Then

 Sec = Sec + 1:Div_temps = 0:Update = 1  'Si Div_temps = 16, augmenter variable Sec d'une unité et placer variable Div_temps à 0 ; rafraîchir l'écran LCD

 endif

 Resume                   'Sortir de la sous-routine et retourner au programme principal

 

 'Début du réglage manuel des heures

 Hreset:                  'Label  marquant le début du réglage manuel des heures

 Hre = Hre + 1

 Pause 300

 IF Hre >= 24 THEN

 Hre = 0

 ENDIF

 Update = 1                 'Autoriser l'affichage des données

 Goto Affichage

 

‘Début du réglage manuel des minutes

 Minutset:                  'Label marquant le début du réglage manuel des minutes

Minut = Minut + 1:sec = 0

 Pause 300                  'Délai pour nous donner le temps d'ajuster manuellement les minutes sur l'affichage

 IF Minut >= 60 THEN

 Minut = 0:sec = 0

 ENDIF

 Update = 1                  'Autoriser l'affichage des données

 Goto Affichage           'Branchement inconditionnel au label «Affichage»

 

‘Sous-routine pour tester si l’année en cours est bissextile

 Testbissextile:

 W1 = An // 4     ‘Les deux barres parallèles  (//) signifient que le PIC  effectue la division de «An» par 4 et il place le reste de la division dans la variable W1, ce reste est appelé «modulus»; voir manuel du compilateur PicBasic Pro page32 para. 4.17.2 Division.

 IF W1 = 0 THEN

 Nbjrmois = 29

 ENDIF

 GOTO Limitmois

 

 'Début de la sous-routine du réglage manuel du calendrier car tous ces Labels sont associés aux boutons de réglage manuel des divers paramètres de l’horloge

 Jourset:

 Jour = Jour + 1

 Pause 300

 IF Jour > Nbjrmois THEN

 Jour = 1

 ENDIF

 Update = 1

 GOTO Affichage

 Moisset:

 Mois = Mois + 1

 Pause 300

 IF Mois > 12 THEN

 Mois = 1

 ENDIF

 Update = 1

 GOTO Affichage

 Anset:

 An = An + 1

 Pause 300

 IF An > 2050 THEN

 An = 2003

 ENDIF

 Update = 1        ‘autorise la mise à jour de l’affichage lorsque la variable Update est égale à 1

 GOTO Affichage

 Nodujourset:

 Nodujour = Nodujour + 1

 PAUSE 300

 IF Nodujour > 7 THEN

 Nodujour = 1

 ENDIF

 Update = 1

 GOTO Affichage

 

‘Sous-routine du test pour  l’heure  normale

 Testhrenorm:

 IF (Mois = 11) AND (Jour < 8) AND (Nodujour = 1) AND (Hre = 2) THEN

 Hre = Hre - 1

 Y = 1 ‘Lever le drapeau

 Update = 1

 PAUSE 300

 ENDIF

 GOTO Affichage  

 End                      'Indique au compilateur la fin du programme  

 

 Notes 

1.    Explication de l’instruction  Button PortB.7,0,100,10,B0,1,Hreset

La syntaxe est la suivante : BUTTON Pin, État, délai, Vitesse, Action, Label

Description : L’instruction BUTTON élimine l’influence des vibrations des contacts lorsqu’on presse le bouton (debouncing), ce qui autrement pourrait être interprété par le programme comme étant des pressions successives du bouton au lieu d’une seule pression. De plus, cette instruction assure une fonction de répétition automatique de l’instruction laquelle permet l’exécution de celle-ci tant et aussi longtemps qu’on presse le bouton. Le temps qui s’écoule entre l’exécution de deux instructions successives est spécifié par l’argument «Vitesse». 

PIN : c’est la patte sur laquelle le bouton est raccordé. 

ÉTAT : C’est l’état de la patte au moment où le bouton est pressé soit 0 ou 1. 

DÉLAI : C’est le décompte du temps qui s’écoule avant de débuter la répétition automatique» (0…255).  À la valeur 0, il n’y aura pas de répétition. À la valeur 255, le «debouncing» sera effectué mais il n’y aura pas de répétition automatique de l’Instruction. 

VITESSE : C’est le temps qui s’écoule avant que la répétition de l’instruction ne se produise soir de 0 à 255. 

VARIABLE : C’est une variable auxiliaire de type «byte» (laquelle doit être définie au tout début du programme) qui est utilisée pour mesurer le délai et pour répéter le décompte. Avant tout démarrage de l’instruction BUTTON cette variable doit être mise à zéro. 

ACTION : C’est l’état auquel le saut au label mentionné  dans l’instruction doit être effectué  (0 si le bouton n’est pas pressé, 1 s’il est pressé). En d’autres termes, si c’est «0», il y aura un saut au label mentionné si le bouton n’est pas pressé  et si c’est 1 il y aura un saut au label mentionné si le bouton est pressé. 

LABEL : L’exécution continue depuis ce label si l’ACTION est correcte. 

L’instruction : Button PortB.7,0,100,10,B0,1,Hreset  s’interprète comme suit : 

Si le bouton sur la patte du PIC est pressé, RB7 saute au Label «Hreset». Le bouton est considéré comme étant pressé s’il y a un « 0 » logique sur la patte RB7 du PIC ; pourquoi ?  C’est parce que lorsque le bouton est pressé la patte RB7 est mise à la masse produisant ainsi un «low» ou 0 logique sur cette patte. 

Par Claude Cossette, VE2APS

2008-11-06