Skocz do zawartości
matt90

Odczyt kilku kanałów ADC

Pomocna odpowiedź

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

Udostępnij ten post


Link to post
Share on other sites

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<

Udostępnij ten post


Link to post
Share on other sites

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ł :/

Udostępnij ten post


Link to post
Share on other sites

Ź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ć.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...