void loop()
{
interrupt = 0; //Remise à zéro de la variable interrupt pour éteindre la LEDCS
////////////////////////////////////
// Détermination de la combinaison des boutons activés, ArrêtUrg ou ValidTrame avec priorité au bouton ArrêtUrg
//Trame Arrêt Urgence
while (digitalRead(ArretUrg) == HIGH && digitalRead(ValidTrame) == LOW) // Tant que ArretUrg est High et ValidTrame est LOW = Trame Urgence Envoyée Centrale Inopérente pour le reste
{
digitalWrite(LedAR,HIGH); //Lampe CS Allumée, centrale bloquée
TrameArretUrg(); //Envoie Trame Arrêt Urgence
}
//Si Arrêt Urgence est HIGH et ValidTrame est HIGH
//Trame Arrêt Urgence
while (digitalRead(ArretUrg) == HIGH && digitalRead(ValidTrame) == HIGH) // Tant que ArretUrg est High et ValidTrame est HIGH = Trame Urgence Envoyée Centrale Inopérente pour le reste
{
digitalWrite(LedAR,HIGH); //Lampe CS Allumée, centrale bloquée
TrameArretUrg(); //Envoie Trame Arrêt Urgence
}
// Trame Validation Trame
while (digitalRead(ValidTrame) == HIGH && digitalRead(ArretUrg) == LOW) // Tant que ValidTrame est High et ArretUrg est LOW = ValidTrame Envoyée Centrale Inopérente pour le reste
{digitalWrite(LedAR,HIGH); //Lampe CS Allumée, centrale bloquée
ArretValidTrame(); //Envoie Trame ValidTrame
}
////////////////////////////////////
//Détermine si le bouton nombre de loc est actif
//valeur bit commande nombre de machine
VarNbreLoc = digitalRead(NbreLoc);
if (VarNbreLoc == HIGH)
{NbreLoc2=1;}// Huit deuxième loc
if (VarNbreLoc == LOW)
{NbreLoc2=0;}// Huit première loc
//////////////////////////////////////////////////////////
//Détermine le sens de marche
//valeur bit commande 5 sens de marche
VarComm5 = digitalRead(SensdeMarche); //valeur bit 5 octet commande : bit sens de marche, un seul bouton pour toutes les locs.
//Choisir le sens en fonction du mouvement de la loc avant d'envoyer la salve
if (VarComm5 == HIGH)
{
comm5=1;
PORTC |= (1<<0); //Equivalent à digitalWrite(LedAvant,HIGH)
PORTC &=~ (1<<1); //Equivalent à digitalWrite(LedArriere,LOW)
}
if (VarComm5 == LOW)
{
comm5=0; //Sens marche arrière
PORTC &=~ (1<<0); //Equivalent à digitalWrite(LedAvant,LOW)
PORTC |= (1<<1); //Equivalent à digitalWrite(LedArriere,HIGH)
}
////////////////////////////////////
//Détermine le numéro de la locomotive sélectionnée avec position du bouton "nombre de loc"
//Première Loc
etat1 = digitalRead(PremiereLoc); //Choix Loc 1 ou 9
if (etat1 == LOW && (NbreLoc2) == 0)
{
AdresseLoc1(); //Appel Adresse loc 1
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat1 == LOW && (NbreLoc2) == 1) //Choix Loc 9
{
AdresseLoc9(); //Appel Adresse loc 9 (66)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Deuxième Loc
etat2 = digitalRead(DeuxiemeLoc); //Choix Loc 2 ou 10
if (etat2 == LOW && (NbreLoc2) == 0)
{
AdresseLoc2(); //Appel Adresse loc 2
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat2 == LOW && (NbreLoc2) == 1) //Choix Loc 1 ou 10
{
AdresseLoc10(); //Appel Adresse loc 10 (67)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Troisième Loc
etat3 = digitalRead(TroisiemeLoc); //Choix Loc 3 ou 11
if (etat3 == LOW && (NbreLoc2) == 0)
{
AdresseLoc3(); //Appel Adresse loc 3
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat3 == LOW && (NbreLoc2) == 1)
{
AdresseLoc11(); //Appel Adresse loc 11 (68)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Quatrième Loc
etat4 = digitalRead(QuatriemeLoc); //Choix Loc 4 ou 12
if (etat4 == LOW && (NbreLoc2) == 0)
{
AdresseLoc4(); //Appel Adresse loc 4
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat4 == LOW && (NbreLoc2) == 1)
{
AdresseLoc12(); //Appel Adresse loc 12 (69)
interrupt=1; //Permet le clignotement de la LED
}
//Cinquième Loc
etat5 = digitalRead(CinquiemeLoc); //Choix Loc 5 ou 13
if (etat5 == LOW && (NbreLoc2) == 0)
{
AdresseLoc5(); //Appel Adresse loc 5
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat5 == LOW && (NbreLoc2) == 1)
{AdresseLoc13(); //Appel Adresse loc 13 (70)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Sixième Loc
etat6 = digitalRead(SixiemeLoc); //Choix Loc 6 ou 14
if (etat6 == LOW && (NbreLoc2) == 0)
{
AdresseLoc6(); //Appel Adresse loc 6
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat6 == LOW && (NbreLoc2) == 1)
{
AdresseLoc14(); //Appel Adresse loc 14 (71)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Septième Loc
etat7 = digitalRead(SeptiemeLoc); //Choix Loc 7 ou 15
if (etat7 == LOW && (NbreLoc2) == 0)
{
AdresseLoc7(); //Appel Adresse loc 7
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat7 == LOW && (NbreLoc2) == 1)
{
AdresseLoc15(); //Appel Adresse loc 15 (72)
interrupt=1; //Permet le clignotement de la LEDCS
}
//Huitième Loc
etat8 = digitalRead(HuitiemeLoc); //Choix Loc 8 ou 16
if (etat8 == LOW && (NbreLoc2) == 0)
{
AdresseLoc8(); //Appel Adresse loc 8
interrupt=1; //Permet le clignotement de la LEDCS
}
if (etat8 == LOW && (NbreLoc2) == 1)
{
AdresseLoc16(); //Appel Adresse loc 16 (73)
interrupt=1; //Permet le clignotement de la LEDCS
}
////////////////////////////////////
//Valeur Lue par le convertisseur analogique/numérique en fonction de la position du potentiomètre de vitesse
ValeurLue = analogRead(A2); //la valeur lue sera comprise entre 0 et 1023 (potentiomètre) sur la broche A2
//La tension est égale à : ((ValeurLue*5)/1024)
//En fonction du résultat du convertisseur analogique/numérique, positionnement des bits pour régler le pas de vitesse dans la trame.
if (ValeurLue < 10)(comm4=0,comm3=0,comm2=0,comm1=0,comm0=0); //0
else if (ValeurLue > 10 && ValeurLue <= 30)(comm4=0,comm3=0,comm2=0,comm1=1,comm0=0); //1
else if (ValeurLue > 30 && ValeurLue <= 65)(comm4=1,comm3=0,comm2=0,comm1=1,comm0=0); //2
else if (ValeurLue > 65 && ValeurLue <= 100)(comm4=0,comm3=0,comm2=0,comm1=1,comm0=1); //3
else if (ValeurLue > 100 && ValeurLue <= 138)(comm4=1,comm3=0,comm2=0,comm1=1,comm0=1); //4
else if (ValeurLue > 138 && ValeurLue <= 175)(comm4=0,comm3=0,comm2=1,comm1=0,comm0=0); //5
else if (ValeurLue > 175 && ValeurLue <= 212)(comm4=1,comm3=0,comm2=1,comm1=0,comm0=0); //6
else if (ValeurLue > 212 && ValeurLue <= 249)(comm4=0,comm3=0,comm2=1,comm1=0,comm0=1); //7
else if (ValeurLue > 249 && ValeurLue <= 285)(comm4=1,comm3=0,comm2=1,comm1=0,comm0=1); //8
else if (ValeurLue > 285 && ValeurLue <= 320)(comm4=0,comm3=0,comm2=1,comm1=1,comm0=0); //9
else if (ValeurLue > 320 && ValeurLue <= 360)(comm4=1,comm3=0,comm2=1,comm1=1,comm0=0); //10
else if (ValeurLue > 360 && ValeurLue <= 395)(comm4=0,comm3=0,comm2=1,comm1=1,comm0=1); //11
else if (ValeurLue > 395 && ValeurLue <= 432)(comm4=1,comm3=0,comm2=1,comm1=1,comm0=1); //12
else if (ValeurLue > 432 && ValeurLue <= 467)(comm4=0,comm3=1,comm2=0,comm1=0,comm0=0); //13
else if (ValeurLue > 467 && ValeurLue <= 504)(comm4=1,comm3=1,comm2=0,comm1=0,comm0=0); //14
else if (ValeurLue > 504 && ValeurLue <= 540)(comm4=0,comm3=1,comm2=0,comm1=0,comm0=1); //15
else if (ValeurLue > 540 && ValeurLue <= 577)(comm4=1,comm3=1,comm2=0,comm1=0,comm0=1); //16
else if (ValeurLue > 577 && ValeurLue <= 603)(comm4=0,comm3=1,comm2=0,comm1=1,comm0=0); //17
else if (ValeurLue > 603 && ValeurLue <= 649)(comm4=1,comm3=1,comm2=0,comm1=1,comm0=0); //18
else if (ValeurLue > 649 && ValeurLue <= 687)(comm4=0,comm3=1,comm2=0,comm1=1,comm0=1); //19
else if (ValeurLue > 687 && ValeurLue <= 723)(comm4=1,comm3=1,comm2=0,comm1=1,comm0=1); //20
else if (ValeurLue > 723 && ValeurLue <= 760)(comm4=0,comm3=1,comm2=1,comm1=0,comm0=0); //21
else if (ValeurLue > 760 && ValeurLue <= 796)(comm4=1,comm3=1,comm2=1,comm1=0,comm0=0); //22
else if (ValeurLue > 796 && ValeurLue <= 833)(comm4=0,comm3=1,comm2=1,comm1=0,comm0=1); //23
else if (ValeurLue > 833 && ValeurLue <= 869)(comm4=1,comm3=1,comm2=1,comm1=0,comm0=1); //24
else if (ValeurLue > 869 && ValeurLue <= 906)(comm4=0,comm3=1,comm2=1,comm1=1,comm0=0); //25
else if (ValeurLue > 906 && ValeurLue <= 941)(comm4=1,comm3=1,comm2=1,comm1=1,comm0=0); //26
else if (ValeurLue > 941 && ValeurLue <= 977)(comm4=0,comm3=1,comm2=1,comm1=1,comm0=1); //27
else if (ValeurLue > 977 && ValeurLue < 1024)(comm4=1,comm3=1,comm2=1,comm1=1,comm0=1); //28
////////////////////////////////////
//Calcul du OU Exclusif
cont0 = adr0 ^ comm0; // ^ Calcul du OU EXCLUSIF bit 0 Octet de contrôle
cont1 = adr1 ^ comm1; // ^ Calcul du OU EXCLUSIF bit 1 Octet de contrôle
cont2 = adr2 ^ comm2; // ^ Calcul du OU EXCLUSIF bit 2 Octet de contrôle
cont3 = adr3 ^ comm3; // ^ Calcul du OU EXCLUSIF bit 3 Octet de contrôle
cont4 = adr4 ^ comm4; // ^ Calcul du OU EXCLUSIF bit 4 Octet de contrôle
cont5 = adr5 ^ comm5; // ^ Calcul du OU EXCLUSIF bit 5 Octet de contrôle
cont6 = adr6 ^ comm6; // ^ Calcul du OU EXCLUSIF bit 6 Octet de contrôle
cont7 = adr7 ^ comm7; // ^ Calcul du OU EXCLUSIF bit 7 Octet de contrôle
////////////////////////////////////
// Génération des paquets DCC
// Octet de synchronisation
for ( i=0; i <= 16; i++)
{
bitun(); // La centrale transmet 16 bits à 1
}
////////////////////////////////////
bitzero(); // Bit à 0 de séparation
////////////////////////////////////
// Octet d'adresse
//La centrale transmet l'octet d'adresse
bitzero(); //adr 7
if (adr6==1) bitun(); // Si bit à 1
if (adr6==0) bitzero(); // Si bit à 0
if (adr5==1) bitun(); // Si bit à 1
if (adr5==0) bitzero(); // Si bit à 0
if (adr4==1) bitun(); // Si bit à 1
if (adr4==0) bitzero(); // Si bit à 0
if (adr3==1) bitun(); // Si bit à 1
if (adr3==0) bitzero(); // Si bit à 0
if (adr2==1) bitun(); // Si bit à 1
if (adr2==0) bitzero(); // Si bit à 0
if (adr1==1) bitun(); // Si bit à 1
if (adr1==0) bitzero(); // Si bit à 0
if (adr0==1) bitun(); // Si bit à 1
if (adr0==0) bitzero(); // Si bit à 0
////////////////////////////////////
// Bit à zéro de séparation
bitzero();
////////////////////////////////////
// Octet de commande
//La centrale transmet l'octet de commande
bitzero(); //comm 7
bitun(); //comm 6
if (comm5==1) bitun(); // Si bit à 1
if (comm5==0) bitzero(); // Si bit à 0
if (comm4==1) bitun(); // Si bit à 1
if (comm4==0) bitzero(); // Si bit à 0
if (comm3==1) bitun(); // Si bit à 1
if (comm3==0) bitzero(); // Si bit à 0
if (comm2==1) bitun(); // Si bit à 1
if (comm2==0) bitzero(); // Si bit à 0
if (comm1==1) bitun(); // Si bit à 1
if (comm1==0) bitzero(); // Si bit à 0
if (comm0==1) bitun(); // Si bit à 1
if (comm0==0) bitzero(); // Si bit à 0
////////////////////////////////////
// Bit à zéro de séparation
bitzero();
////////////////////////////////////
// Envoi de l'octet de contrôle
//La centrale transmet l'octet de contrôle
if (cont7==1) bitun(); // Si bit à 1
if (cont7==0) bitzero(); // Si bit à 0
if (cont6==1) bitun(); // Si bit à 1
if (cont6==0) bitzero(); // Si bit à 0
if (cont5==1) bitun(); // Si bit à 1
if (cont5==0) bitzero(); // Si bit à 0
if (cont4==1) bitun(); // Si bit à 1
if (cont4==0) bitzero(); // Si bit à 0
if (cont3==1) bitun(); // Si bit à 1
if (cont3==0) bitzero(); // Si bit à 0
if (cont2==1) bitun(); // Si bit à 1
if (cont2==0) bitzero(); // Si bit à 0
if (cont1==1) bitun(); // Si bit à 1
if (cont1==0) bitzero(); // Si bit à 0
if (cont0==1) bitun(); // Si bit à 1
if (cont0==0) bitzero(); // Si bit à 0
////////////////////////////////////
// Bit à un de fin de transmission
bitun();
////////////////////////////////////
// Pause émission de 25 zéros (5ms) avant nouvelle transmission
for ( i=0; i<=25; i++)
bitzero();
////////////////////////////////////
}//Fermeture void loop