Init ADC
Init ADC
h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define START_CONV (ADCSRA |= (1<<ADSC))
void initADC(); // initializare ADC
void initTimer2(); // initializare timer
void MAIN();
unsigned
unsigned
unsigned
unsigned
unsigned
int
int
int
int
int
int main() {
MAIN();
return 0;
}
void MAIN() {
sei(); // ISR
DDRA &= 0xC0; // 11000000
DDRD = 0xFF; // 11111111
initADC();
initTimer2();
while(1) {
if(resADC[5] > 2000) {
PORTD |= 255;
} else {
PORTD = 0;
}
}
}
void initADC() {
// setam prescale
ADCSRA |= (1<<ADPS2);
// setam adc enable
ADCSRA |= (1<<ADEN);
// setam intreruperea pe enable
ADCSRA |= (1<<ADIE);
// start conversion
// ADCSRA |= (1<<ADSC);
}
void initTimer2() {
TCNT2 = 5; //counter from 5 to 250
TIMSK2 |= (1<<TOIE2); // Overflow Interrupt Enable
TCCR2B |= (1<<CS20); // no prescaling Fcpu 1Mhz
}
ISR(ADC_vect) {
result = ADCL +( ADCH * 256);
Vin = (unsigned int)((5000.0-0.0) / 1023.0 * (float)(result));
if(poz == 0) { // ADMUX = 0, poz = 0;
resADC[poz] = Vin;
poz++;
ADMUX = 1;
START_CONV;
} else if(poz == 1) { // ADMUX = 1, poz = 1;
resADC[poz] = Vin;
poz++;
ADMUX = 2;
START_CONV;
} else if(poz == 2) { // ADMUX = 2, poz = 2;
resADC[poz] = Vin;
poz++;
ADMUX = 3;
START_CONV;
} else if(poz == 3) { // ADMUX = 3, poz = 3;
resADC[poz] = Vin;
poz++;
ADMUX = 4;
START_CONV;
} else if(poz == 4) { // ADMUX = 4, poz = 4;
resADC[poz] = Vin;
poz++;
ADMUX = 5;
START_CONV;
} else if(poz == 5) { // ADMUX = 5, poz = 5;
resADC[poz] = Vin;
poz++;
ADMUX = 5;
START_CONV;
} else {
ADC = 0;
}
}
ISR(TIMER2_OVF_vect) {
TCNT2 = 5;
counter++;
if(counter == 800) { //1000ms
poz = 0;
ADMUX = 0;
START_CONV;
counter = 0;
}
}