Skocz do zawartości

Odczyt kilku kanałów ADC


Pomocna odpowiedź

Napisano

Witajcie, mam problem z odczytem wartości z 2 kanałów ADC. Procesor to atmega32. Używam Timer0 żeby przełączać kanały, a na wyświetlaczu wyświeltane są 2 wartości, ale obydwie pokazują to samo- odczytywany jest tylko jeden kanał

Inicjalizacja ADC

void ADC_init()
{				// ADC
ADCSRA =   (1<<ADEN) |(1<<ADPS0) | (1<<ADPS2) | (1<<ADSC);   //preskaler=64
ADMUX  =    (1<<REFS0) | (1<<ADLAR) | (1<<MUX0) | (1<<MUX1) | wejscie;   //Internal 2.56V
DDRA &=~ (1<<ADCIN1);
DDRA &=~ (1<<ADCIN2);               //Wejście ADC
//Timer
TIMSK |= (1<<TOIE0) | (1<<TOIE1); //Przerwanie overflow przepełnienie timera
TCCR0 |= (1<<CS01); // CLK=1
TCNT0 = 155; //Początkowa wartość licznika
}

Pętla główna

int main(void)
{
ADC_init();
for (;;)
{
ADCSRA |= (1<<ADSC);//ADSC: Uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC));//czeka na zakończenie konwersji
wyswietlacz(adc1);
wyswietlacz(adc2);
}
}

Przerwanie Timer'a

ISR(TIMER0_OVF_vect)
{
switch(wejscie)
{
	case 2://gdy PC2
	adc1=ADCH;     //odczytaj tylko starszy bajt pomiaru
	break;

	case 3://gdy PC3
	adc2=ADCH;     //odczytaj tylko starszy bajt pomiaru
	break;
}

if(wejscie<3)
wejscie++;
else
wejscie=2;

ADMUX = 0;  //kasowanie rejestru

ADMUX  =   (1<<ADLAR) |(1<<REFS0)| wejscie; //Ustawianie nowych wartości

TCNT0 = 155;  //Początkowa wartość licznika
}

Oczywiście inicjalizacja pinów na początku jest. Proszę o pomoc

Nie widać u Ciebie funkcji "sei();", która odblokowuje przerwania. Poza tym zmienne używane w przerwaniach powinny mieć deklaracje ze słowem "volatile".

Edit:

I jeszcze jedno:

ADMUX = (1<

Po co te "| (1<

Deklaracje wyglądają tak:

#define ADCIN1 (1<<PA1)
#define ADCIN2 (1<<PA2)
volatile uint8_t adc1;
volatile uint8_t adc2;
volatile uint8_t wejscie=2;

sei(); mam włączone, nie skopiowało się :/ Zmieniłem na "Internal 2.56V", wykasowałem MUX'y, nic to wszystko nie pomogło, nadal wyświetla się tylko jeden kanał :/

Źle używasz definicji "ADCIN1" i "ADCIN2". Zapis:

DDRA &=~ (1<<ADCIN1); 
DDRA &=~ (1<<ADCIN2); 

jest zamieniany na:

DDRA &=~ (1<<(1<<PA1)); 
DDRA &=~ (1<<(1<<PA2)); 

, a powinno być:

DDRA &=~ (1<<PA1); 
DDRA &=~ (1<<PA2);

, czyli powinieneś użyć tych makr następująco:

DDRA &=~ ADCIN1; 
DDRA &=~ ADCIN2;
nadal wyświetla się tylko jeden kanał :/

Może te funkcje "wyswietlacz(adc1);" nadpisują tekst na lcd zamiast dodawać nową linię. Napisz ich postać.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...