matt90 Napisano Kwiecień 5, 2014 Udostępnij Napisano Kwiecień 5, 2014 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 Cytuj Link do komentarza Share on other sites More sharing options...
Wojciech Kwiecień 5, 2014 Udostępnij Kwiecień 5, 2014 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< Cytuj Link do komentarza Share on other sites More sharing options...
matt90 Kwiecień 5, 2014 Autor tematu Udostępnij Kwiecień 5, 2014 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ł :/ Cytuj Link do komentarza Share on other sites More sharing options...
Wojciech Kwiecień 5, 2014 Udostępnij Kwiecień 5, 2014 Ź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ć. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
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!