' 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 ********************************************************************