/*
Chapter - 3
Project - 7 VU meter
*/
#include<avr/io.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#define F_CPU 8000000UL
#include<util/delay.h>
//This function read the value of ADC from ADC0 channel
unsigned char read_adc(void);
//Global Variables
volatile unsigned char count=0,statusonoff[20],i,adcreading[10],level;
volatile unsigned int adcsum;
//Values of cathode and anode --They represent the pin number of PORTB to which corresponding
//LED has been connected
const unsigned char anode[20]PROGMEM = {0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4};
const unsigned char cathode[20]PROGMEM ={1,2,3,4,0,2,3,4,0,1,3,4,0,1,2,4,0,1,2,3};
int main(void)
{
//Timer Init
TCCR0A = 0x00;
TCCR0B = 0x02;
TIMSK = 0x02;
//ADC init
ADMUX = 0b00100000;//ADC0,VCC reference,Left shift
ADCSRA = 0b10000111;//Prescaled by 128;
//Neglect first reading
ADCSRA |= 1<<ADSC;
while(ADCSRA&(1<<ADSC));//wait
count=ADCH;
count=0;//To be used in timer overflow interrupt
sei();
//Take 10 initial readings to fill the buffer
for(i=0;i<=9;i++)
{
adcreading[i]=read_adc();
}
while(1)
{
//shift the values
for(i=0;i<9;i++)
{
adcreading[i]=adcreading[i+1];
}
//take new reading
adcreading[9] = read_adc();
//Find the sum and perform quantization
adcsum = 0;
for(i=0;i<10;i++)
{
adcsum = adcsum + adcreading[i];
}
//Divide sum of 10 ADC reading from 0 to 2550 into 21 levels(0 to 20)
adcsum = adcsum/122;
if(level>adcsum)
{
for(i=adcsum;i<level;i++)
{
statusonoff[i]=0;
}
}
else if(level<adcsum)
{
for(i=level;i<adcsum;i++)
{
statusonoff[i]=1;
}
}
level=adcsum;
}
}
//Overflow routine for timer0
ISR(TIM0_OVF_vect)
{
DDRB = 0;
PORTB = (statusonoff[count])<<pgm_read_byte(&anode[count])|0<<pgm_read_byte(&cathode[count]);
DDRB = 1<<pgm_read_byte(&anode[count])|1<<pgm_read_byte(&cathode[count]);
count++;
if(count==20)
count=0;
}
//This function read the value of ADC from ADC0 channel
unsigned char read_adc(void)
{
ADCSRA |= 1<<ADSC;
while(ADCSRA&(1<<ADSC));//Wait
//measurement taken
return ADCH;
}
может у кого скомпелируется
желательно скинуть фото результата
Раздел: Школьникам и студентам