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? 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 :
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, 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 |