Код: Выделить всё
#define F_CPU 12000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#define T_TIME 3//9765 // Prescaler 1024 ~ 0.1s
#define LED_DDR DDRB
#define LED_PT PORTB
#define LED1 0
#define LED2 1
#define LED3 2
#define LED4 3
#define AM_ADC 10
#define AM_LEDS 4
unsigned char leds[4] = {0,1,2,3};
unsigned int LASTMV_C = 0;
unsigned int LAST_MAX = 0;
unsigned int TICK = 0;
unsigned int SUM = 0;
unsigned int AMPLITUDES[5];
unsigned int TEMP_A[5];
unsigned int LAST_MAX_V[AM_ADC];
ISR(TIM0_OVF_vect){
LASTMV_C++; //int
LAST_MAX_V[LASTMV_C] = LAST_MAX; // nat
LAST_MAX = 0;
if (LASTMV_C == AM_ADC){
LASTMV_C = 0;
SUM = 0;
for(unsigned char i = 1; i<=AM_ADC; i++)
SUM = SUM + LAST_MAX_V[i]; //nat
SUM = SUM/AM_ADC; //nat
for(unsigned char i = 1; i<=AM_LEDS; i++)
TEMP_A[i] = AMPLITUDES[i] - SUM;
unsigned char var = 1;
for(unsigned char i = 2; i<=AM_LEDS; i++)
if(TEMP_A[var]>TEMP_A[i])
var = i;
AMPLITUDES[var] = (AMPLITUDES[var]+SUM)/2;
}
}
ISR(ADC_vect){
char dflgdfgh = ADCL;
LAST_MAX = ADCH;
if(ADCH < AMPLITUDES[1])
PORTB = 1 << LED1 | 0 << LED2 | 0 << LED3 | 0 << LED4;
else
if(ADCH < AMPLITUDES[2])
PORTB = 1 << LED1 | 1 << LED2 | 0 << LED3 | 0 << LED4;
else
if(ADCH < AMPLITUDES[3])
PORTB = 1 << LED1 | 1 << LED2 | 1 << LED3 | 0 << LED4;
else
PORTB = 1 << LED1 | 1 << LED2 | 1 << LED3 | 1 << LED4;
ADCSRA |= 1 << ADSC;
}
int main(void){
LASTMV_C = 1;
LAST_MAX = 0;
for(unsigned char i = 1; i<= AM_LEDS; i++)
LAST_MAX_V[i] = 0;
AMPLITUDES[1] = 1;
AMPLITUDES[2] = 82;
AMPLITUDES[3] = 133;
AMPLITUDES[4] = 184;
TIMSK0 |= 1 << TOIE0; //TOIE0: Timer/Counter0 Overflow Interrupt Enable
TCCR0B = 1 << CS02 | 1<<CS00; // Prescaler 1024
DDRB = 0xFF;
ADMUX = 0 << REFS0 | 1 << ADLAR | 1 << MUX1 | 0 << MUX0;
ADCSRA = 1 <<ADEN | 1<<ADSC | 1<<ADATE | 1<<ADIE | 1<<ADPS0 | 1<<ADPS1;
//ADCSRB = 0x00;
sei();
while(1);
return 0;
}


