Skocz do zawartości

ADC działa tylko dla 2 pomiarów


Pomocna odpowiedź

Napisano

Witajcie, mam problem z odczytem ADC. Jak podepnę 2 czujniki to wszystko działa, jak podłączę trzeci to wszystko przestaje działać. Nie działają zarówno silniki jak i pozostałe elementy. Czujnik jest sprawny, ADC raczej dobrze skonfigurowane bo dla 2 czujników działa. Co może być powodem takich problemów? Procesor to Atmega8, odczyty z ADC realizuje w funkcji która cały czas odczytuje wartości

Pytanie czy tylko chodzi o podpięcie czy zaprogramowanie?

Jak podpięcie to wiadomo - czujnik źle podpięty lub uszkodzony.

Jak zaprogramowanie to też jasne - błąd w kodzie.

No ale nie dałeś schematu, kodu itd. to jak mamy pomóc?

Chodzi o zaprogramowanie 🙂

Oczywiście cała inicjalizacja, kasowanie MUX-ów jest. Problem pojawia się gdy wprowadzę linię

adc3= odczyt(3); 

jak jest zakomentowana wszystko działa. Próbowałem pod inne porty podłączyć, ale za każdym razem taki sam efekt

1. Przecież to nie jest cały kod funkcji odczyt ( gdzie czytanie danych z ADC, return itd.?)

2. Brak reszty programu (chociażby szczątkowego). Z tego co dałeś nie widać co się dzieje w innym miejscu.

PS. Zrób tylko odczyt 1 i 3 - bez odczytu 2 - i zobacz czy wtedy działa...🙂

Nadal nie działa jak wyłącze odczyt z drugiego lub pierwszego kanału to nie działa ten czujnik podłączony do tego wejścia.

I do póki ustawiony mam odczyt z dwóch kanałów (obojętnie które) wszystko działa, jak włącze odczyt z trzeciego kanału nic się nie dzieje, silniki stoją

Trochę masz pogmatwane to ustawianie bitów w ADMUX. Moim zdaniem bardziej naturalne byłoby zdefiniowanie gdzieś na początku stałej odpowiadającej za wybór referencji, np:

#define VREF_VCC _BV(REFS0)

a potem, przed startem przetwornika wpisywanie po prostu numeru kanału:

ADMUX = VREF_VCC + 2;

i masz wybrany kanał nr. 2.

Przecież nie zmieniasz zawartości ADMUX w wielu miejscach w programie, więc operatory |= nie są potrzebne. Panujesz nad zawartością tego rejestru i nie używasz pojedynczych bitów w różnych funkcjach.

Po zrobieniu pomiaru nie musisz też zerować numeru kanału i program trochę się upraszcza.

Mi w "case 1" brakuje instrukcji break co powoduje (w połączeniu z operatorami |=), że wybierając ten przypadek de facto mierzysz kanał 3, wybierając case 2 mierzysz drugi a case 3 - trzeci.

Czy możesz dokładniej opisać objawy? Czy jest to totalny crash programu i nic nie działa (coś jakby problemy ze stosem czy z przepełnieniami jakichś buforów) czy tylko nie załączają się silniki, które jedynie pokazują (jak np. diodki LED) wynik pomiaru ADC?

Nie za bardzo rozumiem gdzie miałbym wywoływać tą instrukcję . W case1 jest break, nie wiem dlaczego się nie przekopiował 🙂 Kanał musi być zerowany, jak to wyłączę silniki cały czas działają. Program uruchamia silniki jak zadziałają czujniki, i jak włączę odczyt z trzeciego czujnika to nic się nie dzieje, żaden silnik się nie załącza 🙁

[ Dodano: 09-11-2014, 21:53 ]

Problem został rozwiązany, można zamknąć, dziękuje wszystkim za pomoc 🙂 błąd był w zmiennej, chyba nie mieściło się w int 🙂

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