Skocz do zawartości

[C] Linefollower adc czujniki


Pomocna odpowiedź

Napisano

Witam

Piszę program do linefollower'a i trochę skończyły mi się pomysły a sprawie obsługi adc. Widziałem, że można zrobić to z przerwaniami lub po kolei w programie. Robię to po kolei jako normalny pomiar ADC na razie z jednego czujnika, żeby sprawdzić, czy działa. Na pinach uc zmienia się napięcie (zmierzone miernikiem), więc transoptory działają.

#define F_CPU 1000000L

#include

#include

#include

int main(void)

{

DDRB |= (1<

DDRB |= (1<

DDRC= 0x00;

//PWM

TCCR1A |= (1<

TCCR1A |= (1<

TCCR1A |= (1<

TCCR1B |= (1<

//kierunek obrotu kol

PORTB |= (1<

PORTB &= ~(1<

PORTB &= ~(1<

//szybkosc obrotu kol

OCR1A = 0;

OCR1B = 0;

//ADC ustawienie

ADCSRA |= (1<

|(1<

|(1<

ADMUX |= (1<

|(1<

|(1<

//z zewnętrznym kondensatorem na pinie AREF

//wynik 8 bitowy

while(1)

{

ADMUX |=(1<

ADCSRA |= (1<

while(ADCSR & ADSC); //czekanie na koniec przetwarzania

if(ADCH > 100){ //jesli pomiar adc wiekszy od 100 wlacz silniki

OCR1A = 100;

OCR1B = 100;

}

else{ // w innym przypadku wylacz

}

OCR1A = 0;

OCR1B = 0;

}

}

Koła stoją bez znaczenia jakie światło pada na czujniki. Jeśli ktoś widzi jakiś błąd to byłbym wdzięczny bardzo . Pozdrawiam

Popatrz na swój kod szczególnie na pętle while nie zależnie jaki wynik będzie Ty i tak na końcu pętli przypisujesz wartości 0 do rejestrów timera.

Chodzi o główny while, czy ten czekający na koniec przetwarzania? Bo jeśli chodzi o else to przy niskim poziomie chce aby silnik były wyłączone czyli zmniejszam wypełnienie PWN do 0.

Chodzi o to, że po else masz pusty blok zawierający jedynie komentarz. W wyniku braku wcięć pogubiłeś się w strukturze instrukcji if. Spróbuj to inaczej sformatować a na przyszłość używaj edytora z podświetlaniem składni instrukcji i wyróżnianiem bloków.

No faktycznie ale to nie jest przyczyną niestety, ten błąd wkradł się później. Tak więc nadal nie działa. Udało się za to w trybie free run i przerwaniami. Która metoda jest "lepsza" w zastosowaniu? Planuje też podpiąć wyświetlacz, żeby zobaczyć wartości na ekranie, bo wciąż zjada mnie ciekawość czemu ten program nie działa

Może spróbuj odczytywać wynik pomiaru poprzez ADCW. Co prawda przy 8-bitowej rozdzielczości wynik jest przesuwany do lewej, więc powinno działać, ale spróbować chyba nie zaszkodzi.

Podpięcie LCD jest bardzo dobrym pomysłem, wyświetlisz co będziesz chciał i od razu będzie widać co jest nie tak.

A jeszcze jedno- w jaki sposób zasilasz robota? Jeśli testy robisz przez USB to nie będzie działało (zależnie od tego, jak masz rozwiązane zasilanie na płytce, ale jeśli masz mostek H i zasilanie silników jest z baterii, a logiki z regulatora/przetwornicy/czegokolwiek to silniki nie będą się kręcić)

Acha, czyli szukamy błędu w programie którego nam nie pokazałeś bo ten co widzimy to nie jest aktualny tylko jakiś inny, stary i w nim no jasne, że są błędy, a nie działa przecież także ten drugi co to pozmieniałeś i teraz to już nic, i tylko LCD pomoże na wszelkie kłopoty.

To dla odmiany spróbuj mi powiedzieć co to jest takie piszczenie w moim samochodzie, wiesz, gdy odpalam to tak trochę w prawej strony, niby pod kokpitem ale tak bardziej to może w nadkolu albo w okolicach drzwi choć znika po kilku sekundach gdy jest ciepło i oczywiście gdy nie pada deszcz bo wtedy to tak stuka, ale jakby trochę bliżej. Dołączam zdjęcie trawnika na parkingu - masz już komplet informacji. Oczekuję pomocy.

marek1707, wybacz ale doprawdy ciężko jest sobie wyobrazić kod bez jednego nawiasu? Gdyby się jeszcze trochę dalej zastanowić, to informacja o tym, że w trybie freerun adc działa służy temu, że ADC działa i czujniki też działają... Wydaje się dość logiczne.

A co do Twojego problemu to nie mogę Ci pomóc bo znalazłem błąd w opisie i nie rozumiem i nie umiem sobie zamienić tego fragmentu

w prawej strony
na: z prawej strony, w tym momencie jest to opis zupełnie innej sytuacji i ja teraz nawet nie zastanowię się co może być problemem w Twoim samochodzie. Chyba, że wkleisz nowy opis problemu. A jak napiszesz to stwierdzę, że i tak nie znam odpowiedzi na Twoje pytanie :O

Przecież ja nie mam szans domyślić się, że zmieniłeś jeden nawias. Gdy siedzisz nad jakimś problemem to próbujesz na różne sposoby. Jeden program testowy zmienia się w zupełnie inny na przestrzeni kilku minut. Skąd mam wiedzieć co aktualnie Ci nie działa?

Cieszę się, że ADC pracuje z przerwaniami i że umie mierzyć czujniki, ale Twoja prośba o pomoc przy szukaniu błędu w programie którego nie podesłałeś wciąż wisi. Nie odwołałeś tego poprzez "Dobra, inny sposób mi działa a z tamtym jakoś sobie poradzę, dzięki". Za to piszesz:

"Tak więc nadal nie działa. Udało się za to w trybie free run i przerwaniami. Która metoda jest "lepsza" w zastosowaniu?"

Moim zdaniem dużo lepsza jest ta, która działa.

Wiesz, widząc program w którym znajduję takie kwiaty jak np. to:

ADCSRA |= (1<

while(ADCSR & ADSC);

gdzie najpierw piszesz do jednego rejestru a potem sprawdzasz jakiś inny (jaki?) to nie wiem, czy to wszystko nie jest jakąś ściemą i program w ogóle się kompiluje. Nie jestem tak skrupulatny jak kompilator ale wiem, że w tekstach programów nie ma uproszczeń i rzeczy nieważnych. Jeden znak czasem załatwia sprawę więc albo wysyłasz prawdziwy kod wprost z ekranu i o nim dyskutujemy na poważnie, albo jakąś atrapę i wtedy dostajesz odpowiedzi o podobnym stopniu zaangażowania. Metoda ctrl/c ctrl/v raczej by się tak nie pomyliła a to oznacza, że wkleiłeś jakąś bzdurę i miałeś jeszcze odwagę prosić nas o pochylenie się nad tym i poświęcenie swojego czasu. To nie jest dobre podejście bo sprawia, że czuję się wykorzystany a bardzo tego nie lubię. Czytam Twój post, czytam program, próbuję go zrozumieć, odkrywam dziwne rzeczy i zaczynam podejrzewać, że wrzuciłeś coś "na odwal się" a za chwilę sam przyznajesz, że "niestety, ten błąd wkradł się później". To co, wiedziałeś o nim wysyłając kod? I tak, kamyczek do kamyczka, zaufanie i chęć dalszego czytania spada... Rozumiesz?

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