' Programmation structurée pour le MENU. - Version: 1.3 du 02/03/2011 ' ------------------------------------------------------------------- BEGIN <Définir les interruptions sur le flanc descendant de INT0 et montant de INT1> GOSUB Initvar GOSUB Initmicro GOSUB Initaffi DO WHILE J = 0 ' Début de la boucle infinie <Lecture de la mémoire (MENU) à partir de> LET MnuAdres = BaseAdres + 38 * (MnuNum - 1) LET Ligne1$ = MnuAdres LET Ligne2$ = MnuAdres + 16 LET MnuPosClig = MnuAdres + 32 LET MnuPosCur = MnuAdres + 33 LET MnuActHorlo = MnuAdres + 34 LET MnuActAntiH = MnuAdres + 35 LET MnuActRet = MnuAdres + 36 LET MnuIndiVar = MnuAdres + 37 LET RetroLcd = 1 ' Allumage du Rétro-éclairage GOSUB Affilcd ' Affichage des 2 lignes IF MnuPosCur > 0 THEN Afficher et positionner le Curseur à MnuPosCur ELSE Faire clignoter le caractère à MnuPosClig ENDIF IF Compteur > CompteurOld THEN ' Molette dans le Sens horlogique LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActHorlo < 128 THEN ' Si MnuActHorlo plus petit que 128 LET MnuNum = MnuActHorlo ' on va à la ligne du Menu suivant la ELSE ' valeur de MnuActHorlo, sinon, LET Valeur = <Valeur correspondante à Menu(MnuIndiVar)> LET Valeur + 1 ' On incrémente Valeur IF Valeur > LimitHaut ' Si on dépasse la limite haute, LET Valeur = LimitBas ' On met à la limite basse ENDIF <Affichage de Valeur sur le LCD> LET Valeur = Valeur/Diviseur ' On divise Valeur par diviseur ENDIF LET CompteurOld = Compteur ' Mise à jour de CompteurOld ELSEIF Compteur < CompteurOld THEN ' Molette Sens anti-horlogique LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActAntiH < 128 THEN ' Si MnuActAntiH plus petit que 128 LET MnuNum = MnuActAntiH ' on va à la ligne du Menu suivant la ELSE ' valeur de MnuActAntiH, sinon, LET Valeur = <Valeur correspondante à Menu(MnuIndiVar)> LET Valeur - 1 ' On décrémente Valeur IF Valeur > LimitBas ' Si on dépasse la limite basse, LET Valeur = LimitHaut ' On met à la limite haute ENDIF LET Valeur = Valeur/Diviseur ' On divise Valeur par diviseur <Affichage de Valeur sur le LCD> ENDIF LET CompteurOld = Compteur ' Mise à jour de CompteurOld ELSEIF Bouton = 1 THEN ' Bouton appuyé (axe de la Molette) LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActRet = 130 THEN ' Si MnuActRet = 130, LET J = 1 ' On quitte le Menu, affichage normal ELSEIF MnuActRet < 128 THEN ' Si MnuActRet plus petit que 128 LET MnuNum = MnuActRet ' on va à la ligne Menu correspondante ELSEIF MnuActRet > OR = 131 AND MnuActRet < OR = 134 THEN LET Cycle = MnuActRet - 130 ' Sélection du "Cycle" correspondant ELSEIF MnuActRet > OR = 135 AND MnuActRet < OR = 141 THEN LET Jour = MnuActRet - 134 ' Sélection du "Jour" correspondant ELSEIF MnuActRet = 142 THEN ' Si MnuActRet = 142, alors GOSUB SupprimePlage ' Suppression de la Plage en cours LET MnuNum = 31 ' On retourne à la ligne 31 du Menu ELSEIF MnuActRet > OR = 143 AND MnuActRet < OR = 144 THEN LET TypeVanne = MnuActRet - 143 ' 0 = Vanne à positionement ou 1 = ENDIF ' Vanne Analogique ELSEIF TempoEnco > 30 ' Dépassement de la valeur prédéfinie LET J = 1 ' On quitte le Menu, affichage normal ENDIF ENDDO ' Fin de la boucle infinie LET RetroLcd = 0 ' Extinction du Rétro-éclairage END ' ****************************************************************************** ' Sous-routines ' ------------- ' Initvar ' ------- ' Description : Définition et initialisation des variables ' Variables d'entrées : Aucune ' Variables de sorties : Toutes les variables du programme ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB Initvar ' Début de la routine DECLARE J AS BIT ' Variable de travail DECLARE RetroLcd AS BIT ' 1=ON, 0=OFF - Cde du rétroéclairage du LCD DECLARE Bouton As BIT ' Lecture du Bouton (0 = repos, 1 = Appuyé) DECLARE MoletteA As BIT ' Sortie A de l'encodeur Int0 et Int1 DECLARE MoletteB As BIT ' Sortie B de l'encodeur DECLARE PompeChau AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led1 DECLARE PompeECS AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led2 DECLARE BruleurVanne AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led3 DECLARE Vanne AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led4 DECLARE TypeVanne AS BIT ' 0= vanne à positionement, 1= vanne analogique DECLARE Plage AS BIT ' Si on est dans une plage programmée, Plage = 1 DECLARE StartCourbe AS BIT ' 0 ou 1, car il faut minimum un cycle avant de ' pouvoir optimiser la courbe de chauffe DECLARE Kb AS BYTE ' Variable de travail DECLARE Annee As BYTE ' de 0 à 99 DECLARE Mois As BYTE ' de 1 à 12 DECLARE Jour As BYTE ' de 1 à 31 suivant les mois DECLARE Heure As BYTE ' de 0 à 23 DECLARE Minute As BYTE ' de 0 à 59 DECLARE TempECS As BYTE ' Température ECS DECLARE TempMiniExt As BYTE ' Température minimim extérieure (fichier XLS) DECLARE TempMaxEau As BYTE ' Température maximum chaudière (Constructeur) DECLARE HysTempHab As BYTE ' Hystérésis température habitation DECLARE HysTempEau As BYTE ' Hystérésis température eau radiateur DECLARE HysTempECS As BYTE ' Hystérésis température eau ECS DECLARE Cycle As BYTE ' Numéro de cycle (1 à 4) DECLARE JourPlage As BYTE ' Jour correspondant à la plage horaire DECLARE NumPlage As BYTE ' Numéro de plage horaire DECLARE HDebutPlage As BYTE ' Heure de début de plage horaire DECLARE DureePlage As BYTE ' Durée de la plage horaire DECLARE Tmpsrebond As BYTE ' Constante pour antirebond DECLARE TempoBtn AS BYTE ' Définis la longueur d'appuis sur Bouton DECLARE TempoEnco AS BYTE ' Détermine la durée d'inactivité de l'Encodeur DECLARE MnuAdres AS BYTE ' Position dans la mémoire du microcontrôleur DECLARE BaseAdres AS BYTE ' 1ère position des Datas "MENU" dans la mémoire DECLARE TempExtMoy AS BYTE ' Température extérieure moyenne sur 24 heures DECLARE TempIntMoy AS BYTE ' Température intérieure moyenne sur 24 heures DECLARE TempEau1 AS BYTE ' Val.maxi donnée par le constructeur du chauff. DECLARE MnuPosClig AS BYTE ' Menu Adresse + 32 DECLARE MnuPosCur AS BYTE ' Menu Adresse + 33 DECLARE MnuActHorlo AS BYTE ' Menu Adresse + 34 DECLARE MnuActAntiH AS BYTE ' Menu Adresse + 35 DECLARE MnuActRet AS BYTE ' Menu Adresse + 36 DECLARE MnuIndiVar AS BYTE ' Menu Adresse + 37 DECLARE Iw AS WORD ' Variable de travail DECLARE TempInt AS WORD ' Température intérieure de l'habitation DECLARE TempExt AS WORD ' Température extérieure DECLARE TempEau AS WORD ' Température d'eau départ circuit de chauffage DECLARE TempECS AS WORD ' Température d'eau chaude sanitaire DECLARE TempCons AS WORD ' Température de consigne suivant le MODE DECLARE Jour$(7) AS ALPHA ' Les 7 jours de la semaine (8 Chars) DECLARE Ligne1$ AS ALPHA ' Première ligne d'affichage du LCD (16 Chars) DECLARE Ligne2$ AS ALPHA ' Deuxième ligne d'affichage du LCD (16 Chars) DECLARE Indice$(16) AS ALPHA ' Matrice contenant les correspondances Indice DECLARE LimitBas$(16) AS ALPHA ' Matrice contenant les limites basses DECLARE LimitHaut$(16)AS ALPHA ' Matrice contenant les limites hautes DECLARE Diviseur$(16) AS ALPHA ' Matrice contenant les Diviseurs DECLARE Compteur AS INTEGER ' Définition du compteur DECLARE CompteurOld AS INTEGER ' Définition du compteur avec ancienne valeur DECLARE TempExt1 AS INTEGER ' Valeur donnée par le tableau des températures ' Initialisation des variables ' ---------------------------- LET J = 0 ' Initiation de la variable bit J LET k = 0 LET Jb = 0 LET Iw = 0 LET MnuNum = 1 ' Premier élément du Menu (11a) LET TempoEnco = 0 ' Test si activité de l'encodeur LET Compteur = 0 ' Détermine le sens de la Molette LET CompteurOld = 0 ' Valeur précédente de Compteur LET TempConsJour = 20 ' Température de consigne Jour LET TempConsNuit = 17,5 ' Température de consigne Nuit LET TempConsECS = 60 ' Température de consigne ECS LET TempExt1 = -9 ' Température Minimum Extérieure LET TempEau1 = 80 ' Température Maximum de la chaudière LET HysTempEau = 5 ' Hystérésis de température d'eau chaudiére LET HysTempHab = 0,5 ' Hystérésis de température de l'habitation LET HysTempECS = 5 ' Hystérésis de température ECS LET Regulation = 0 ' 0= régulation chaudière, 1= vanne à 3 voies LET TypeVanne = 0 ' 0= vanne à positionement, 1= vanne analogique LET CycleChau = 0 LET StartCourbe = 0 LET CyclePompe = 0 LET Compteur = 0 ' Valeur du compteur LET Bouton = 0 ' Valeur de Bouton au repos LET RetroLcd = 0 ' Rétro-éclairage du LCD est éteint LET Tmpsrebond = 2 ' Défintion de la pause antirebond (à ajuster) LET Ligne1$ = " " LET Ligne2$ = " " LET Indice$(1) = Annee, LET Indice$(2) = Mois, LET Indice$(3) = Jour, LET Indice$(4) = Heure, LET Indice$(5) = Minute, LET Indice$(6) = TempECS, LET Indice$(7) = TempMiniExt, LET Indice$(8) = TempMaxEau, LET Indice$(9) = HysTempHab, LET Indice$(10) = HysTempEau, LET Indice$(11) = HysTempECS, LET Indice$(12) = Cycle, LET Indice$(13) = JourPlage, LET Indice$(14) = NumPlage, LET Indice$(15) = HDebutPlage, LET Indice$(16) = DureePlage LET LimitBas$(1) = 0, LET LimitBas$(2) = 1, LET LimitBas$(3) = 1, LET LimitBas$(4) = 0, LET LimitBas$(5) = 0, LET LimitBas$(6) = 60, LET LimitBas$(7) = -30, LET LimitBas$(8) = 50, LET LimitBas$(9) = 1, LET LimitBas$(10) = 1, LET LimitBas$(11) = 1, LET LimitBas$(12) = 1, LET LimitBas$(13) = 1, LET LimitBas$(14) = 1, LET LimitBas$(15) = 1, LET LimitBas$(16) = 1 LET LimitHaut$(1) = 99, LET LimitHaut$(2) = 12, LET LimitHaut$(3) = 31, LET LimitHaut$(4) = 23, LET LimitHaut$(5) = 59, LET LimitHaut$(6) = 85, LET LimitHaut$(7) = 0, LET LimitHaut$(8) = 90, LET LimitHaut$(9) = 10, LET LimitHaut$(10)= 10, LET LimitHaut$(11)= 10, LET LimitHaut$(12)= 4, LET LimitHaut$(13)= 7, LET LimitHaut$(14)= 96, LET LimitHaut$(15)= 96, LET LimitHaut$(16)= 96 LET Diviseur$(1) = 1, LET Diviseur$(2) = 1, LET Diviseur$(3) = 1, LET Diviseur$(4) = 1, LET Diviseur$(5) = 1, LET Diviseur$(6) = 1, LET Diviseur$(7) = 2, LET Diviseur$(8) = 1, LET Diviseur$(9) = 10, LET Diviseur$(10) = 2, LET Diviseur$(11) = 2, LET Diviseur$(12) = 1, LET Diviseur$(13) = 1, LET Diviseur$(14) = 1, LET Diviseur$(15) = 1, LET Diviseur$(16) = 1 LET Jour$(1) = LUNDI, LET Jour$(2) = MARDI, LET Jour$(3) = MERCREDI, LET Jour$(4) = JEUDI, LET Jour$(5) = VENDREDI, LET Jour$(6) = SAMEDI, LET Jour$(7) = DIMANCHE ' ****************************************************************************** ' Initmicro ' --------- ' Description : Initialisation du micro-contrôleur et création des "Alias" ' qui déterminerons les connexions hardwares du système et ' qui seront définies ici comme des simples variables. ' ' Variables d'entrées : Aucune ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune ' SUB Initmicro LET Bouton = PortD.1 ' Liaison du "Bouton" de l'encodeur à l'AtMega LET MoletteA = PortD.2 ' Liaison de "Molette" de l'encodeur à l'AtMega LET MoletteB = PortD.3 ' Liaison de "Molette" de l'encodeur à l'AtMega <Configurer & initialiser l'écran LCD> <Configurer & initialiser les PORTS> ENDSUB ' ****************************************************************************** ' Initaffi '---------- ' Description : Initialisation de l'affichage et affichage du message ' d'accueil. ' ' Variables d'entrées : Aucune ' Variables de sorties : Aucune ' Variables de travail : Ligne1$, Ligne2$ ' Sousroutines appellées : Affilcd ' SUB Initaffi LET Ligne1$ = "Micro-Info asbl " ' Définition de la première ligne LET Ligne2$ = " MENU V 1.2 " ' Définition de la seconde ligne <Efface l'écran> ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes <Attendre 2 secondes> ' Petite pause LET Ligne1$ = " " ' Première ligne à 16 blancs LET Ligne2$ = " " ' Deuxième ligne à 16 blancs <Efface l'écran> ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes ENDSUB ' ****************************************************************************** ' Routines par INTERRUPTIONS ' -------------------------- ' DetectA ' ------- ' Description : Détecte les mouvements de l'encodeur (Molette) par Interruptions ' Variables d'entrées : MoletteA, MoletteB ' Variables de sorties : Compteur ' Variables de travail : Tmpsrebond ' Sousroutines appellées : Aucune SUB DetectA <Arrêter les interruptions> <Pause de Tmpsrebond en ms> IF MoletteB = MoletteA THEN ' Test si B est égal à A LET Compteur = Compteur - 1 ' Alors Sens AntiHorlogique ELSE ' Sinon LET Compteur = Compteur + 1 ' Sens Horlogique ENDIF ' Fin du test de A et de B <Remise à zéro du registre d'interruption> <Redémarrer les interruptions> ENDSUB ' ****************************************************************************** ' Tempo ' ----- ' Description : Timer par Interruptions toutes les secondes ' Variables d'entrées : Timer interne ' Variables de sorties : TempoEnco ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB Tempo <Arrêter les interruptions> LET TempoEnco = TempoEnco + 1 ' Incrémente TempoEnco <Remise à zéro du registre d'interruption> <Redémarrer les interruptions> ENDSUB ' ****************************************************************************** ' AffiLCD ' ------- ' Description : Affichage des chaînes Ligne1$ et Ligne2$ sur l'écran LCD ' ' Variables d'entrées : Ligne1$, Ligne2$ ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune ' SUB Affilcd ' Début de la routine <Positioner curseur au début de la première ligne> <Afficher Ligne1$> ' Affichage de la première ligne <Positioner curseur au début de la deuxième ligne> <Afficher Ligne2$> ' Affichage de la seconde ligne ENDSUB ' ****************************************************************************** ' SupprimePlage ' ------------- ' Description : Supprime la Plage en cours ' Variables d'entrées : Cycle, JourPlage, NumPlage, HDebutPlage, DureePlage ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB SupprimePlage ' Début de la routine ' A compléter ENDSUB ' ****************************************************************************** ' Mémoire MENU ' A placer dans l'EEprom ' ------------ "<MENU >","PROGRAMME DATE H","017","000","002","005","006","000", "<MENU >","DATE HEURE REGLA","017","000","003","001","008","000", "<MENU >","HEURE REGLAGES S","017","000","004","002","009","000", "<MENU >","REGLAGES SORTIE ","017","000","005","003","010","000", "<MENU >","SORTIE PROGRAMME","017","000","001","004","130","000", "<PROGRAMME >","CHOIX_CYCLE SORT","017","000","007","007","014","000", "<PROGRAMME >","SORTIE CHOIX_CYC","017","000","006","006","005","000", "DATE ","jj/mm/aaaa ","026","026","128","129","018","001", "HEURE ","HH:MM ","016","018","128","129","019","004", "<REGLAGES >","TEMPERATURE_ECS ","017","000","011","013","020","000", "<REGLAGES >","HYSTERESIS PARAM","017","000","012","010","021","000", "<REGLAGES >","PARAMETRES SORTI","017","000","013","011","022","000", "<REGLAGES >","SORTIE TEMPERATU","017","000","010","012","005","000", "<CHOIX_CYCLE >","CYCLE1 CYCLE2 CY","017","000","015","017","131","000", "<CHOIX_CYCLE >","CYCLE2 CYCLE3 CY","017","000","016","014","132","000", "<CHOIX_CYCLE >","CYCLE3 CYCLE4 CY","017","000","017","015","133","000", "<CHOIX_CYCLE >","CYCLE4 CYCLE1 CY","017","000","014","016","134","000", "DATE ","jj/mm/aaaa ","021","021","128","129","032","002", "HEURE ","HH:MM ","021","021","128","129","005","005", "TEMPERATURE_ECS ","65°C ","018","018","128","129","011","006", "HYSTERESIS_TEMP_","AMBIANTE = 0,2°C","030","030","128","129","033","009", "<PARAMETRES >","T_MINI_EXTERIEUR","017","000","023","025","034","000", "<PARAMETRES >","T_MAXI_CHAUDIERE","017","000","024","022","035","000", "<PARAMETRES >","TYPE_REGULATION ","017","000","025","023","036","000", "<PARAMETRES >","SORTIE T_MINI_EX","017","000","022","024","013","000", "<CYCLEx >","SELECTION AJOUT_","017","000","027","031","038","000", "<CYCLEx >","AJOUT_PLAGE EDIT","017","000","028","026","040","000", "<CYCLEx >","EDITER_CYCLE TEM","017","000","029","027","048","000", "<CYCLEx >","TEMP_JOUR TEMP_N","017","000","030","028","049","000", "<CYCLEx >","TEMP_NUIT SORTIE","017","000","031","029","050","000", "<CYCLEx >","SORTIE SELECTION","017","000","026","030","007","000", "DATE ","jj/mm/aaaa ","018","018","128","129","003","003", "HYSTERESIS_TEMP_","RADIATEUR= 0,5°C","030","030","128","129","051","010", "TEMPERATURE_MINI","EXTERIEUR= -09°C","030","030","128","129","023","007", "TEMPERATURE_MAXI","CHAUDIERE = 80°C","030","030","128","129","025","008", "TYPE_REGULATION>","CHAUDIERE VANNE_","017","000","037","037","025","000", "TYPE_REGULATION>","VANNE_3_VOIES CH","017","000","036","036","052","000", "SELECTION CYCLEx","OUI NON","017","000","039","039","130","012", "SELECTION CYCLEx","OUI NON","030","000","038","038","007","000", "<AJOUT_DE_PLAGE>","LUNDI MARDI MERC","017","000","041","047","135","013", "<AJOUT_DE_PLAGE>","MARDI MERCREDI J","017","000","042","040","136","013", "<AJOUT_DE_PLAGE>","MERCREDI JEUDI V","017","000","043","041","137","013", "<AJOUT_DE_PLAGE>","JEUDI VENDREDI S","017","000","044","042","138","013", "<AJOUT_DE_PLAGE>","VENDREDI SAMEDI ","017","000","045","043","139","013", "<AJOUT_DE_PLAGE>","SAMEDI DIMANCHE ","017","000","046","044","140","013", "<AJOUT_DE_PLAGE>","DIMANCHE SORTIE ","017","000","047","045","141","013", "<AJOUT_DE_PLAGE>","SORTIE LUNDI MAR","017","000","040","046","031","000", "CYCLEx PLAGExx","JJJ HH:MM hh:mm ","015","016","128","129","056","014", "CYCLEx TEMP_JOUR","20,5°C ","020","020","128","129","031","000", "CYCLEx TEMP_NUIT","17,5°C ","020","020","128","129","031","000", "HYSTERESIS_TEMP_","ECS = 0,5°C ","025","025","128","129","012","011", "<VANNE_3_VOIES >","OUVRIR/FERMER AN","017","000","053","053","143","000", "<VANNE_3_VOIES >","ANALOGIQUE OUVRI","017","000","052","052","144","000", "JJJ ","DEBUT A hh:mm ","029","029","128","129","055","015", "JJJ hh:mm","DE hh:mm A hh:mm","016","016","128","129","058","016", "SUPPRIMER PLAGE ","OUI NON","017","000","057","057","031","000", "SUPPRIMER PLAGE ","OUI NON","030","000","056","056","142","000", "CYCLEx ","CONTINUER SORTIE","017","000","059","059","027","000", "CYCLEx ","CONTINUER SORTIE","027","000","058","058","047","000" ' ***** END ********************************************************************