Structure des plages horaires pour le thermostat. ------------------------------------------------- Le principe de stockage en mémoire des différentes plages de chauffe, se fait dans la mémoire eeprom. Chaque bit représente un quart d'heure S'il est à zéro, la température de consigne sera la température de nuit. S'il est à un, la température de consigne sera la température de jour. Le système reprend la mémoire de 4 cycles qui contiennent chacun les 7 jours de la semaine et chaque jour est divisé en 1/4 d'heures. Ce qui nous fait 24 * 4 bits pour une journée, soit 12 octets. Un cycle comprend 7 jours, soit 7 * 12 = 84 octets. Ce qui nous fait pour les 4 cycles 84 * 4 = 336 octets en tout. Remarque : Faire attention que dans chaque octet, les Msb et Lsb sont inversés par rapport à la logique "horaire". Dans chaque octet, le bit de poids fort, représente le premier quart d'heure de la première heure, et le bit de poids faible représente le quatrième quart d'heure de la deuxième heure de l'octet. Le système permet la création de 4 plages par jour. Une plage consiste à une zone de consigne de jour. (Cette limitation sera ajoutée dans le mode d'emploi) Liste des variables nécessaires aux calculs ******************************************* Adresse : Adresse mémoire du premier octet Cycle : Cycle en cours (varie de 0 à 3) Jour : Jour en cours (varie de 0=Lu à 6=Di) Heure : Heure en cours (varie de 0 à 23) Minute : Minute en cours (varie de 0 à 59) Quart : Quart d'heure en cours (Varie de 0 à 3) 0 = de 00 à 14 minutes 1 = de 15 à 29 minutes 2 = de 30 à 44 minutes 3 = de 45 à 59 minutes PosCyc : Adresse de base du cycle PosJou : Adresse de base du Jour dans le cycle PosHeu : Adresse de base de l'heure dans le jour PosMem : Adresse mémoire de l'octet contenant l'heure et les minutes ValMem : Valeur de l'octet contenant l'heure et les minutes PosBit : Position du bit à adresser dans l'octet sélectionné ValBit : Valeur du bit dans l'octet sélectionné PlDe(4) : Début de plage de consigne de jour pour la journée (Varie de 0 à 95) PlDu(4) : Durée de plage de consigne de jour pour la journée (Varie de 0 à 95) Consign : Etat de la consigne de chauffe - Nuit = 0 - Jour = 1 TmpVar : Variable temporaire utilisée dans certains calculs Calculs de base *************** Calcul de l'adresse de base du cycle PosCyc = Adresse + (Cycle*84) Calcul de l'adresse de base du jour dans le cycle PosJou = INT(Jour*12) Calcul de l'adresse de l'octet contenant l'heure PosHeu = INT(Heure/2) Calcul de l'octet à adresser en fonction du cycle, de la date et de l'heure. PosMem = Adresse + PosCyc + PosJou + PosHeu Calcul du quart d'heure en cours Quart = INT(Minute/15) Calcul du bit à adresser en fonction de l'heure PosBit = 7 - ((Heure-(INT(Heure/2)*2)+4)+Quart) Mise à zéro du bit PosBit dans l'octet Valmem ValMem = ValMem .AND. (255-2^PosBit) Mise à un du bit PosBit dans l'octet Valmem ValMem = ValMem .OR. (2^PosBit) Inversion du bit PosBit dans l'octet Valmem ValMem = ValMem .XOR. (2^PosBit) Lecture de la valeur du bit PosBit dans l'octet Valmem ValMem = ShiftRight ValMem,Posbit ValBit = ValMem AND 1 Ecriture du bit Valbit dans l'octet Valmem à la position PosBit TmpVar = ValBit TmpVar = ShiftLeft TmpVar,Posbit TmpVar = TmpVar .OR. (255 - 2^PosBit) ValMem = ValMem .OR. TmpVar Routine de recherche des plages de consigne de jour *************************************************** Variables d'entrée Adresse : Adresse mémoire du premier octet Cycle : Cycle en cours (varie de 0 à 3) Jour : Jour en cours (varie de 0=Lu à 6=Di) Variables de sortie PlDe(4) : Début de plage de consigne de jour pour la journée PlDu(4) : Durée de plage de consigne de jour pour la journée Variables de travail I : Variable de comptage PosCyc : Adresse du cycle PosJou : Adresse du jour Plage : Numéro de la plage en cours de traitement AdrOct : Adresse de l'octet à adresser ValOct : Valeur de l'octet adressé AdrBit : Numéro du bit à tester BitAnt : Valeur du bit testé précédement Duree : Durée de la plage en cours de traitement PosCyc = Adresse + (Cycle*84) ' Calcul de l'adresse du cycle PosJou = INT(Jour*12) ' Calcul de l'adresse du jour LET I = 1 ' initialisation remise à zéro DO WHILE I < 5 ' debut boucle de remise à zéro LET PlDe(I)=0 ' mise à zéro "début" LET PlDu(I)=0 ' mise à zéro "durée" LET I = I+1 ' incrémentation compteur ENDDO ' bouclage de raz LET Plage = 1 ' Initialisation compteur "Debut" LET BitAnt = 0 ' Initialisation du bit "antérieur" LET I = 0 ' Initialisation variable de boucle DO WHILE I > 95 ' Boucle sur les 96 bits à tester LET Octet = INT(I/12) ' Calcul de l'octet à adresser LEt AdrBit = 7-(I-(Octet*8))' Calcul du numéro du bit à adresser LET AdrOct = Adresse+PosCyc+PosJou ' Cacul de l'adresse de l'octet à tester LET ValOct = ' Traitement de l'erreur trop de plages ENDIF ' Fin du test de dépassement du nombre de plages ENDIF ' Fin du test de changement de bit ENDIF ' Fin du test du bit LET I = I + 1 ' Incrémentation de la variable de boucle ENDDO ' Bouclage sur les 96 bits Ecriture ou éffacement d'une plage en mémoire ********************************************* Variables d'entrée : Adresse : Adresse mémoire du premier octet Cycle : Cycle en cours (varie de 0 à 3) Jour : Jour en cours (varie de 0=Lu à 6=Di) PlDe(Cycle) : Début de plage PlDu(Cycle) : Durée de plage Variables de sortie (Aucune) Variables de travail I : Variable de travail OctCal : Octet en cours de calcul BitCal : Bit en cours de calcul PosCyc : Adresse de base du cycle PosJou : Adresse de base du Jour dans le cycle PosMem : Adresse mémoire de l'octet contenant l'heure et les minutes ValMem : Valeur de l'octet contenant l'heure et les minutes PosBit : Position du bit à adresser dans l'octet sélectionné ValBit : Valeur du bit dans l'octet sélectionné PosCyc = Adresse + (Cycle*84) ' Calcul de l'adresse de base du cycle PosJou = INT(Jour*12) ' Calcul de l'adresse de base du jour dans le cycle LET I = PlDe(Cycle) ' Initialisation de la boucle DO While I < PlDe(Cycle)+PlDu(Cycle) ' Comptage sur la durée LET OctCal = INT(plDe(Cycle)/8) ' LET BitCal = 7 - (PlDe(Cycle)-(OctCal*8)) ' LET PosMem = Adresse + PosCyc + PosJou + OctCal ' ' Calcul de l'octet à adresser en fonction du cycle, de la date et de l'heure. LET ValMem = ' {LET ValMem = ValMem .OR. (2^BitCal) } ' Ecriture (Set) {LET ValMem = ValMem .OR. (.AND. (255-2^BitCal)} ' Effacement (Reset) LET I = I+1 ENDDO Lecture d'un bit de consigne de température dans la mémoire *********************************************************** Variables d'entrée : Adresse : Adresse mémoire du premier octet Cycle : Cycle en cours (varie de 0 à 3) Jour : Jour en cours (varie de 0=Lu à 6=Di) Heure : Heure en cours (varie de 0 à 23) Minute : Minute en cours (varie de 0 à 59) Variable de sortie : Consign : Nuit = 0 ; Jour = 1 Variables de travail : PosCyc : Adresse de base du cycle PosJou : Adresse de base du Jour dans le cycle PosMem : Adresse mémoire de l'octet contenant l'heure et les minutes PosHeu : Adresse de base de l'heure dans le jour Quart : Quart d'heure en cours (Varie de 0 à 3) ValMem : Valeur de l'octet contenant l'heure et les minutes PosBit : Position du bit à adresser dans l'octet sélectionné LET PosCyc = Adresse + (Cycle*84) ' Adresse de base du cycle LET PosJou = INT(Jour*12) ' Adresse du jour dans le cycle LET PosHeu = INT(Heure/2) ' Adresse de l'octet heure LET PosMem = Adresse + PosCyc + PosJou + PosHeu ' Adresse de l'Octet à adresser LET ValMem = ' LET Quart = INT(Minute/15) ' Quart d'heure en cours LET PosBit = 7 - (Heure-(INT(Heure/2)*2)+Quart) ' Numéro du bit à adresser LET Consign =