Skocz do zawartości

Odczyt kilku kanałów ADC


matt90

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

Link do komentarza
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<

Link do komentarza
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ł :/

Link do komentarza
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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.