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
Merci/****************************** ***********************
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();
};
}
-----