[TPE]Programation Store Somfy
Affichage des résultats 1 à 2 sur 2

[TPE]Programation Store Somfy



  1. #1
    invited9173d8e

    [TPE]Programation Store Somfy


    ------

    Bonjour
    Je souhaiterai votre aide pour m'aider à comprendre un programme en C .
    Je suis plutôt pressé et je ne connais pas ce language vu qu'il ne fait pas parti du programme.
    Je suis en premiére et je n'est pas les resource pour poursuivre mon Tpe
    M
    /****************************** ***********************
    Project : Store Somfy
    Version : 1.0
    Date : 11-04-2008
    Author : SOUSSI.T.
    Company : Lycée DURZY
    Comments:
    Chip type : ATmega8535
    Clock frequency : 8,000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 128
    ****************************** ***********************/

    #include <mega8535.h> // Registres uC
    #include <delay.h> / / contient la fonction delay_ms
    #include <lcd4bits2cd.h>
    #define Bas ~PINA.4 //Capteur bas
    #define Haut ~PINA.5 //Capteur haut
    #define Monter PORTC&=0xD0 //Active la monter du store
    #define Descendre PORTC&=0xE0 //Active la descente du store
    #define Arreter PORTC|=0x30

    unsigned int VITESSE=0,VitVent=0,Soleil=0;
    char moy=0,touche=0,scan=0;
    eeprom char SeuilVent=50,SeuilSoleil=50,te mpoVent=3,tempoSoleil=3;
    bit PremierFront=1,auto=1,tropdeve nt=0,tropdesoleil=0,menu2actif =0;

    void init(void)
    {
    char a;
    DDRA = 0x80; // PA7 -> S, PA7..0 -> E
    DDRB = 0xFF; // PB7..PB0 -> S
    DDRC = 0xF0; // PC7..PC4 -> S, PC3..0 -> E
    PORTC = 0xF0; //
    DDRD = 0xFA; // PD7..PD3 et PD1 -> S, PD2 et PD0 -> E
    PORTD=0x00;

    ADCSRA = 0x85; // Initialisation du CAN clk=horloge/32
    ACSR=0x80; // Analog Comparator off

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 7,813 kHz
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    TCCR2=0x07;
    TCNT2=0x00;

    // InitUart(); // Appel de la procédure d'initialisation de la communication Série
    #asm("cli");

    #asm("sei");

    Lcd_Init(); // Appel de la procédure d'initialisation de l'écran LCD

    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    GICR|=0x40;
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;

    // Activation interruption timer
    TIMSK=0x41;

    TCNT1L=0;
    TCNT1H=0;

    // Global enable interrupts
    #asm("sei")

    a=tempoVent*32; // initialise les tempos Vent et Soleil stockées en Eeprom
    OCR1AH=a-1;
    OCR1AL=0xFF;
    a=tempoSoleil*32;
    OCR1BH=a-1;
    OCR1BL=0xFF;
    }

    /******** Fonction de Conversion A/N de la voie sélectionnée *****/
    unsigned int AdcRead(unsigned char input)
    {
    ADMUX=input; //N° de la voie
    ADCSRA = ADCSRA | (1<<6); // Mise à 1 du bit ADSC (start conversion)
    while ((ADCSRA & 0x10)==0); // Attente que le bit ADIF soit à 1 (Interrup Flag >> Fin de conversion)
    ADCSRA = ADCSRA | (1<<4); // Mise à 0 du bit ADIF (en écrivant un 1 dessus)
    return ADCW; // renvoie la valeur de conversion
    }


    // Calcul de la vitesse en km/h
    unsigned int CALCUL_VITESSE (unsigned int a)
    {
    a = 1875/a;
    return(a);
    }
    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    while(ASSR!=0);
    TCCR1B=0x00;
    TCNT1L=0;
    TCNT1H=0;
    if(tropdevent) //Montée si encore du vent au bout de la tempo vent
    {
    Monter;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("**** Auto ****");
    Lcd_Home2();
    Lcd_PutS_p(" Montee ");
    while(!Haut);
    };
    Arreter;
    TIMSK=0x41;
    }

    // Timer 1 output compare B interrupt service routine
    interrupt [TIM1_COMPB] void timer1_compb_isr(void)
    {
    TCCR1B=0x00;
    TCNT1L=0;
    TCNT1H=0;
    if ((!tropdesoleil)&&(!Haut)) //Descente/Montée si présence/absence du Soleil au bout de la tempo Soleil
    {
    Monter;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("**** Auto ****");
    Lcd_Home2();
    Lcd_PutS_p(" Montee ");
    while(!Haut);
    };
    if ((tropdesoleil)&&(!Bas))
    {
    Descendre;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("**** Auto ****");
    Lcd_Home2();
    Lcd_PutS_p(" Descente ");
    while(!Bas);
    };
    Arreter;
    TIMSK=0x41;
    }
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    VITESSE =0;
    PremierFront=1;
    moy=0;
    VitVent=0;
    TCCR0=0x00; //Désactive Timer/Counter 0
    TCNT0=0;
    }

    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    if (PremierFront)
    {
    TCNT0=0;
    TCCR0=0x05; // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 7,813 kHz
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    PremierFront=0;
    }
    else
    {
    VITESSE += TCNT0;
    VITESSE/=2; // on moyenne la valeur N sur 10 périodes
    moy++;
    PremierFront=1;
    };
    if (moy==10)
    {
    VitVent=CALCUL_VITESSE(VITESSE ); // Convertir N en Km/h
    if (VitVent>SeuilVent)tropdevent= 1; else tropdevent=0;
    moy=0;
    };
    }


    void acquerirSoleil(void) //Active la scrutation du clavier tous les 30ms
    {
    Soleil = AdcRead(0);
    if (Soleil>SeuilSoleil)tropdesole il=1; else tropdesoleil=0;
    }

    void EcrireSeuilVent(void)
    {
    do
    {
    touche=0;
    Lcd_Clear();
    Lcd_PutS_p("Seuil Vent: ");
    Lcd_PutUInt(SeuilVent);
    Lcd_Home2();
    Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
    delay_ms(100);
    if ((touche==2)&&(SeuilVent < 120)) SeuilVent++;
    if ((touche==1)&&(SeuilVent > 20)) SeuilVent--;
    }
    while (touche!=3);
    touche=0;
    }

    void EcrireSeuilSoleil(void)
    {
    do
    {
    touche=0;
    Lcd_Clear();
    Lcd_PutS_p("Seuil Soleil: ");
    Lcd_PutUInt(SeuilSoleil);
    Lcd_Home2();
    Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
    delay_ms(100);
    if ((touche==2)&&(SeuilSoleil < 120)) SeuilSoleil++ ;
    if ((touche==1)&&(SeuilSoleil > 20)) SeuilSoleil--;
    }
    while (touche!=3);
    touche=0;
    }

    void EcrireTempoVent(void)
    {
    char a;
    do
    {
    touche=0;
    Lcd_Clear();
    Lcd_PutS_p("Tempo Vent: ");
    Lcd_PutUInt(tempoVent);
    Lcd_Home2();
    Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
    delay_ms(100);
    if ((touche==2)&&(tempoVent < 8)) tempoVent++;
    if ((touche==1)&&(tempoVent > 2)) tempoVent--;
    }
    while (touche!=3);
    touche=0;
    a=tempoVent*32;
    OCR1AH=a-1;
    OCR1AL=0xFF;
    }

    void EcrireTempoSoleil(void)
    {
    char a;
    do
    {
    touche=0;
    delay_ms(200);
    Lcd_Clear();
    Lcd_PutS_p("Seuil Soleil: ");
    Lcd_PutUInt(tempoSoleil);
    Lcd_Home2();
    Lcd_PutS_p("+:S2 -:S1 Fin:S3 ");
    delay_ms(100);
    if ((touche==2)&&(tempoSoleil < 8)) tempoSoleil++ ;
    if ((touche==1)&&(tempoSoleil > 2)) tempoSoleil--;
    }
    while (touche!=3);
    touche=0;
    a=tempoSoleil*32;
    OCR1BH=a-1;
    OCR1BL=0xFF;
    }
    void ProgrammePrincipal (void)
    {

    if (tropdevent&&(!Haut)&&(TIMSK!= 0x51)) //Lance la Tempo Vent détecté (prioritaire sur la tempo soleil)
    {
    TCNT1L=0; // Mode: Normal top=FFFFh
    TCNT1H=0; // Clock value: 7,813 kHz
    TIMSK=0x51;
    TCCR1B=0x05;
    };

    if(auto&&(!tropdevent)&&(TIMSK ==0x41)) // Lance la Tempo Soleil détecté en mode Auto uniquement
    // On s'assure ici que l'on n'a pas lancé la tempo du vent
    {
    if ((!tropdesoleil)&&(!Haut))
    {

    TCNT1L=0;
    TCNT1H=0;
    TIMSK=0x49;
    TCCR1B=0x05;
    };
    if((tropdesoleil)&&(!Bas))
    {
    TCNT1L=0;
    TCNT1H=0;
    TIMSK=0x49;
    TCCR1B=0x05;
    };
    };

    if((!auto)&&(!menu2actif)) //Mode manuel désactivé dans le menu 2
    {
    if ((touche==4)&&(!Haut)) // remontée du Store inconditionnelle
    {
    Monter;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("**** Manu ****");
    Lcd_Home2();
    Lcd_PutS_p(" Montee ");
    while(!Haut);
    };
    if ((touche==3)&&(!tropdevent)&&( !Bas)) //Descente du Store si pas de Vent
    {
    Descendre;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("**** Manu ****");
    Lcd_Home2();
    Lcd_PutS_p(" Descente ");
    while(!Bas);
    };
    Arreter;
    };

    }

    // Timer 2 overflow interrupt service routine
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    scan++;
    if(scan==3)
    {
    touche =PINC&0x0F; // scan toutes les 96ms (3*32ms) d'une touche et affectation du n° S1, S2 ..
    if (touche == 4) touche =3; // (les autres combinaisons peuvent être testées avec la valeur de touche)
    if (touche == 8) touche =4;
    scan=0;
    };
    acquerirSoleil(); // mise à jour de la valeur ensoleillement
    ProgrammePrincipal(); // execution du programme du Store par interruption toutes les 32ms
    PORTC.6=~tropdesoleil;
    PORTC.7=~tropdevent;
    }

    void menuTempo(void)
    {
    unsigned int j;
    bit S3=0;
    touche=0;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Vent/Soleil : S3");
    Lcd_Home2();
    Lcd_PutS_p(" Retour : S4 ");
    delay_ms(2000);
    do
    {

    if(!S3)
    {
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Tempo Vent : S1");
    for (j=0;j<15;j++)
    {
    Lcd_Home2();
    Lcd_PutS_p("Tempo = ");
    Lcd_PutUInt(tempoVent);
    Lcd_PutS_p("s");
    };
    };
    if(S3)
    {
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Tempo Soleil: S1");
    for (j=0;j<15;j++)
    {
    Lcd_Home2();
    Lcd_PutS_p("Tempo = ");
    Lcd_PutUInt(tempoSoleil);
    Lcd_PutS_p("s");
    };
    };
    delay_ms(100);
    if (touche==1)
    {
    if (S3) EcrireTempoSoleil();
    else EcrireTempoVent();
    touche=0;
    };
    if (touche==3) {S3=!S3;touche=0;};
    }
    while (touche!=4);
    }


    void menu2(void)
    {
    unsigned int j;
    bit S3=0;
    menu2actif =1;
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Vent/Soleil : S3");
    Lcd_Home2();
    Lcd_PutS_p(" Retour : S4 ");
    delay_ms(2000);
    do
    {

    if(!S3)
    {
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Seuil Vent : S1");
    for (j=0;j<15;j++)
    {
    Lcd_Home2();
    Lcd_PutS_p("Vitesse= ");
    Lcd_PutUInt(VitVent);
    Lcd_PutS_p("km/h ");
    };
    };
    if(S3)
    {
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p("Seuil Soleil: S1");
    for (j=0;j<15;j++)
    {
    Lcd_Home2();
    Lcd_PutS_p("Soleil= ");
    Lcd_PutUInt(Soleil);
    Lcd_PutS_p("kLux ");
    };
    };
    delay_ms(100);
    if (touche==1)
    {
    if (S3) EcrireSeuilSoleil();
    else EcrireSeuilVent();
    };
    if (touche==3) {S3=!S3;};
    }
    while (touche!=4);
    menu2actif=0;
    }


    void menu(void)
    {
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p (" Menu:S1");
    Lcd_Home2();
    if (auto)Lcd_PutS_p("Manu:S2 Tempo:S3"); else Lcd_PutS_p("Auto:S2 Tempo:* ");
    delay_ms(100);
    if (touche==1) menu2();
    if (touche==2) auto=~auto;
    if ((touche==3)&&auto) menuTempo();

    }

    void main(void)
    {
    init();
    Lcd_Clear();
    Lcd_Home();
    Lcd_PutS_p(" LYCEE DURZY ");
    Lcd_Home2();
    Lcd_PutS_p(" Store Somfy ");
    delay_ms(2000);

    while (1)
    {
    menu();
    };
    }
    erci

    -----

  2. #2
    invite73477edd

    Smile Re : [PPE]Programation Store Somfy

    bonjour
    je suis en classe de terminale ssi et j'ai besoin d'aide pour programmer un store somfy à l'aide du picbasic .J'aimerais l'ouvrir et le fermer normalement s'il y a du vent ou pas de vent .
    cordialement

Discussions similaires

  1. [Divers] Volet roulant Somfy bloqué
    Par invite87bcfd49 dans le forum Dépannage
    Réponses: 2
    Dernier message: 09/05/2008, 10h58
  2. [Divers] Telecommande Somfy Inis Rts
    Par adrimal dans le forum Dépannage
    Réponses: 0
    Dernier message: 16/04/2008, 19h04
  3. PPE: Store Somfy
    Par invitec4abec65 dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 25/01/2008, 08h45
  4. [Brun] telecommande somfy keytis 2 RTS
    Par invite4135bab5 dans le forum Dépannage
    Réponses: 0
    Dernier message: 02/08/2007, 08h38
  5. CO2 store
    Par Bentwo dans le forum Environnement, développement durable et écologie
    Réponses: 8
    Dernier message: 09/10/2006, 15h57