Bas sam zapeo sa ovom multi ADC...
Naime, problem je sledeci, ocita mi se dobro napon za prva 2 kanala (jer isti napon dovodim), a kada treba da se ocita treci kanal ADC-a, prikazuje mi maksimalni napon, iako je napon na trecem kanalu manji od onoga na prvom... Mislim da je greska u cekanju da se zavrsi konverzija sa predhodnog kanala...
Evo ga kod:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
uint8_t ch[8];
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( ! (*port & (1 << pin)) )
{ _delay_ms(1);
_delay_ms(50);
if ( *port & (1 << pin) )
{ _delay_ms(20);
return 1;
}
}
return 0;
}
void showNumber(uint8_t num)
{
PORTB = ~num;
}
void ADC_init()
{
//Internal Vref of 2.56V
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
//Divisor 64 @ 8Mhz = 125kHz
//Divisor 128 @ 16Mhz = 125kHz
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
}
uint8_t ADC_read(uint8_t ch)
{
//clear chanel bits, and set new chanel
ADMUX = (ADMUX & 0xF8) | ch;
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
return ADCH;
}
int main(void)
{
DDRB = 0xFF; //all OUT
PORTB = 0xFF; //all OFF
DDRD = 0x00; //all IN
int i = 0;
ADC_init();
ch[0] = ADC_read(0);
ch[1] = ADC_read(1);
ch[2] = ADC_read(2);
ch[3] = ADC_read(3);
_delay_ms(20);
while(ADC_read(4) < 10);
ch[4] = ADC_read(4);
ch[5] = ADC_read(5);
ch[6] = ADC_read(6);
ch[7] = ADC_read(7);
while(1)
{
if(debounce(&PIND, PD7)){
//ch0 = ADC_read(0);
showNumber(ch[0]);
}
else if(debounce(&PIND, PD6)){
//ch1 = ADC_read(1);
showNumber(ch[1]);
}
else if(debounce(&PIND, PD5)){
//ch2 = ADC_read(2);
showNumber(ch[2]);
}
else if(debounce(&PIND, PD4)){
//ch3 = ADC_read(3);
showNumber(ch[3]);
}
else if(debounce(&PIND, PD3)){
//ch1 = ADC_read(1);
showNumber(ch[4]);
}
else if(debounce(&PIND, PD2)){
//ch2 = ADC_read(2);
showNumber(ch[5]);
}
else if(debounce(&PIND, PD1)){
//ch3 = ADC_read(3);
showNumber(ch[6]);
}
else if(debounce(&PIND, PD0)){
//ch3 = ADC_read(3);
showNumber(ch[7]);
}
else
asm("nop");
}
}
Da li je potrebno dovoditi neki referentni napon za ADC, ja sam izabrao interni 2.56, predpostavljam da on dolazi preko USB porta? Evo slike za svaki slucaj.
