Zdzisiek Napisano Grudzień 10, 2013 Udostępnij Napisano Grudzień 10, 2013 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
mi14chal Grudzień 10, 2013 Udostępnij Grudzień 10, 2013 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.
Zdzisiek Grudzień 10, 2013 Autor tematu Udostępnij Grudzień 10, 2013 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.
marek1707 Grudzień 10, 2013 Udostępnij Grudzień 10, 2013 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.
Zdzisiek Grudzień 10, 2013 Autor tematu Udostępnij Grudzień 10, 2013 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
Lukaszm Grudzień 10, 2013 Udostępnij Grudzień 10, 2013 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ć)
marek1707 Grudzień 11, 2013 Udostępnij Grudzień 11, 2013 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.
Zdzisiek Grudzień 11, 2013 Autor tematu Udostępnij Grudzień 11, 2013 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
marek1707 Grudzień 11, 2013 Udostępnij Grudzień 11, 2013 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?
Pomocna odpowiedź
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ę »