#include #include #include #include //variables globales //Déclaration des Sorties #define feux_recul PORTD.0 #define feux_arriere PORTD.1 #define feux_avant PORTD.2 #define cligno_g PORTD.3 #define cligno_d PORTD.4 #define feux_stop PORTB.3 #define feux_route PORTD.7 #define croisement PORTD.6 //Déclaration des Entrées #define BP_cligno_d PINC.3 //INVERSE #define BP_cligno_g PINC.2 //INVERSE #define BP_warning PINC.1 //INVERSE #define BP_mode PINC.0 // AUTO/MANU #define BP_feux_route PINC.4 //INVERSE #define BP_feux_crois PINC.5 //INVERSE #define BP_eclairage PINC.6 // ON/OFF #define ADC_VREF_TYPE 0x20 unsigned char Cligno_D; unsigned char Cligno_G; unsigned char Warning; float Moyenne=0; float luminosite=0; int N=0, J=0; int FlagTunnig1; int FlagTunnig2; // ADC interrupt service routine // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // Place your code here if(Cligno_D) { cligno_d=!cligno_d; } if(Cligno_G) { cligno_g=!cligno_g; } if(Warning) { cligno_d=!cligno_d; cligno_g=cligno_d; } if((Warning==0)&&(Cligno_D==0)) { cligno_d=0; } if((Warning==0)&&(Cligno_G==0)) { cligno_g=0; } if(FlagTunnig1==1) { if(OCR2 == 255) { OCR2=0; } if(OCR0 == 255) { OCR0=0; OCR2=255; } if(croisement == 1) { croisement = 0; OCR0=255; } if(feux_avant == 1) { feux_avant = 0; croisement = 1; } if(feux_arriere == 1) { feux_arriere = 0; feux_avant = 1; } if(feux_recul == 1) { feux_recul = 0; feux_arriere = 1; } if((feux_recul == 0)&&(feux_arriere == 0)&&(feux_avant == 0)&&(croisement == 0)&&(OCR0 == 0)&&(OCR0 == 0)) { feux_recul = 1; } } if(FlagTunnig2==1) { if(OCR2 == 0) { OCR2=255; } if(OCR0 == 0) { OCR0=255; OCR2=0; } if(croisement == 0) { croisement = 1; OCR0=0; } if(feux_avant == 0) { feux_avant = 1; croisement = 0; } if(feux_arriere == 0) { feux_arriere = 1; feux_avant = 0; } if(feux_recul == 0) { feux_recul = 1; feux_arriere = 0; } if((feux_recul == 1)&&(feux_arriere == 1)&&(feux_avant == 1)&&(croisement == 1)&&(OCR0 == 255)&&(OCR0 == 255)) { feux_recul = 0; } } } //variables globales //Déclaration des Sorties //Programme principale void main(void) { //Initialisation du port A PORTA=0x00; DDRA=0x00; //Initialisation du port B PORTB=0x00; DDRB=0x08; //Initialisation du port C PORTC=0x00; DDRC=0x00; //Initialisation du port D PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x61; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 3,906 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x0f; OCR1AL=0x3c; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=FFh // OC2 output: Non-Inverted PWM ASSR=0x00; TCCR2=0x61; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x87; SFIOR&=0xEF; // Global enable interrupts #asm("sei") // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; #asm("sei") while (1) { if(BP_eclairage==0) //Mettre ON { if(BP_warning==0) { Cligno_G=0; Cligno_D=0; Warning=1; } else { Warning=0; if(BP_cligno_g==0) { Cligno_G=1; } else { Cligno_G=0; } if(BP_cligno_d==0) { Cligno_D=1; } else { Cligno_D=0; } } if(BP_mode) //MODE MANUEL { if(BP_feux_route==0) { OCR2=255; } else { OCR2=0; } if(BP_feux_crois==0) { croisement =1; } else { croisement =0; } if((BP_feux_route==0)||(BP_feux_crois==0)) { feux_arriere =1; } if((BP_feux_route==1)&&(BP_feux_crois==1)) { feux_arriere =0; } FlagTunnig1=0; FlagTunnig2=0; } else { if(BP_feux_route==0) { FlagTunnig1=1; } if(BP_feux_crois==0) { FlagTunnig2=1; } if((BP_feux_route==1)&&(BP_feux_crois==1)) { FlagTunnig1=0; FlagTunnig2=0; Moyenne=Moyenne+read_adc(3); N++; if(N>=100) { OCR0=(Moyenne/100)/2.15; Moyenne=0; N=0; } feux_recul =0; feux_arriere =0; feux_avant =0; croisement =0; luminosite=luminosite+read_adc(2); J++; if(J>=100) { luminosite=(luminosite/100); OCR2=(((luminosite-70)/2) / (10*exp(-(luminosite-70)/4)+1)); luminosite=0; J=0; } } } } else { feux_recul =0; feux_arriere =0; feux_avant =0; cligno_g =0; cligno_d =0; OCR0=0; OCR2=0; croisement =0; } } }