Grabki Napisano Wrzesień 24, 2011 Udostępnij Napisano Wrzesień 24, 2011 Witajcie,mam taki problem, że próbuję zapalić diodę jeśli czujnik wykryje czarną linię, a jeśli nie to dioda ma zgasnąć. Niestety wygląda to tak jakby nie działała pętla nieskończona- nie wiem jak to inaczej wytłumaczyć. Po stracie programu dioda się zapala i się świeci neizależnie czy czujnik jest nad linią czy nie. Napięcia sięzmieniają i dlatego nie wiem co tu jest grane. Używam komparatorów lm339. Tak sprawdzam czujniki: for(;;) { if(PINC & 0x01) { LED_ON; } else { LED_OFF; } } A tak mam ustawione fusebity(rezonator 16MHz): Czy ktoś wie co tu jest grane? Bardzo proszę o pomoc. Cytuj Link do komentarza Share on other sites More sharing options...
ownya Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Jeżeli twierdzisz ze od strony elektronicznej wszystko wygląda poprawnie to najprawdopodobniej błąd jest w sofcie, ale w części, której nam nie pokazałeś - przedstaw cały kod programu 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
dondu Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 A ja sugeruję jednak dorzucić jeszcze schemat. Cytuj Link do komentarza Share on other sites More sharing options...
Grabki Wrzesień 24, 2011 Autor tematu Udostępnij Wrzesień 24, 2011 Jestem na 95% pewien że wszystko jest ok bo sprawdzałem napięcia. Oto program: #include <avr/io.h> #include <util/delay.h> //LED #define LED (1<<PD6) #define LED_ON PORTD |= LED #define LED_OFF PORTD &= ~LED int main(void) { /* Linie portu C będą wejściami z podciągnięciem do VCC */ DDRC = 0x00; PORTC = 0xff; /* Ustawienia wyjść portu B */ DDRB |= ((1<<PB0)|(1<<PB1)|(1<<PB2)); /* Port D 01111111 */ DDRD = 0x7f; //Zapal diodę LED_ON; PORTB |= ((1<<PB1)|(1<<PB2)); _delay_ms(1000); LED_OFF; _delay_ms(1000); LED_ON; _delay_ms(1000); LED_OFF; //pętla nieskończona for(;;) { //sprawdzenie czujników if(PINC & 0x01) { LED_ON; } else { LED_OFF; } } } Wygląda to tak, że dioda się zapala, gaśnie i zapala, i wtedy ciągle się świeci, aż do wciśnięcia przycisku od resetu. Jeśli w if'ie dam żeby dioda gasła else zapalała się to wtedy dioda gaśnie i nie świeci aż do zresetowania. Oto schemat: 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
dondu Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Mierzyłeś napięcia z czujników, na wejściach uC w zależności od tego czy są nad ciemną czy jasną powierzchnią? Cytuj Link do komentarza Share on other sites More sharing options...
piotreks-89 Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 dondu z tego co wiem, to autor mierzył napięcia i wszystko było ok. Nie znam się na C (dopiero mam w planach jego naukę) więc od strony programu ci nie pomogę 😕 Cytuj Link do komentarza Share on other sites More sharing options...
Grabki Wrzesień 24, 2011 Autor tematu Udostępnij Wrzesień 24, 2011 Jeśli jest nad linią to między czujnikiem a komparatorem jest około 4,5V, między komparatorem a uc jest 4,8V. Jeśli jest nad białą powierzchnią to między czujnikiem a komparatorem jest około 1-1,5V a między komparatorem a uc jest 0V. Cytuj Link do komentarza Share on other sites More sharing options...
dondu Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Na razie napisał tylko, że się zmieniają: Napięcia sięzmieniają i dlatego nie wiem co tu jest grane. ale nie podał jakie są, a mogą być niezgodne z wymaganiami uC. Cytuj Link do komentarza Share on other sites More sharing options...
Barto Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Pisałeś, że napięcia się zmieniają, ale to nie musi znaczyć, że zmieniają się prawidłowo. Po przeglądnięciu softu nie widze błędu. Sprawdziłeś warunek zatem wiadomo że atmega" widzi" stan wysoki na wejściu czujnika. Ja mimo wszystko obstawiam źle ustawiony próg na potencjometrze. 1. Miernikiem sprawdź napięcie na wejściach i wyjściu komparatora ( dokładnie na komparatorze, aby wykluczyć gdzieś przerwe w płytce) i napisz jaki zakres uzyskujesz z czujnika i jakie napięcie z potencjometru. 2. Zewrzyj sprawdzane wyjście bezpośrednio do masy -jak dioda zmieni stan to odpuść "programiście" i gadaj z "elektronikiem" (80-90% szans). Jak będzie bez zmian to w forze daj jeszcze prostsze przypisane PORTD=PINC. Wtedy sprawdzisz wszystkie naraz. Cytuj Link do komentarza Share on other sites More sharing options...
dondu Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Od strony obsługi portu C i zapalania diody, program masz napisany prawidłowo. [ Dodano: 24-09-2011, 15:45 ] Pytanie dodatkowe, choć nie związane bezpośrednio z Twoim problemem: Jak informujesz kompilator o częstotliwości zegara? I uwaga dodatkowa: Naucz się rysować schematy w taki sposób: http://mikrokontrolery.blogspot.com/2011/04/jak-projektowac-czytelne-schematy.html by nie mieć problemów z większymi projektami w przyszłości. Połączenia prowadzone przez symbole układów, to marny pomysł. [ Dodano: 24-09-2011, 15:49 ] I jeszcze dwa pytania: 1. Nie masz czasem warningów podczas kompilacji? 2. jaki tryb optymalizacji kodu masz włączony? [ Dodano: 24-09-2011, 15:52 ] Ponieważ nie odpowiadasz, a ja idę popatrzeć na F1, to zostawiam Ci link a propos moich ostatnich pytań: http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html Cytuj Link do komentarza Share on other sites More sharing options...
Grabki Wrzesień 24, 2011 Autor tematu Udostępnij Wrzesień 24, 2011 bez komentarza... Miałem przerwaną ścieżkę między komparatorem a uc. Bardzo dziękuję za pomoc.dondu, używam AVR Studio, tam się wpisuje częstotliwość, warningów nie mam wszystko już działa. Teraz już tak projektuję schematy jak w linku który mi podałeś, ale ten schemat był projektowany zanim to przeczytałem. Dobra ja też idę na F1. Jeszcze raz wielkie dzięki. edit: Mam jeszcze jedno pytani. Jak widzicie na schemacie, zrobiłem błąd i przycisk mam podpięty pod VCC zamiast GND. Przez to mam na pinie uc stan nieustalony. Czy mogę to jakoś wyeliminować? Czy można np. poprzez jakiś rezystyor podciągnąć do GND? Bo normalnie podciąga się rezystorem do VCC, ale jestem ciekaw czy można tak do GND. A może jest jakiś inny sposób na to? Cytuj Link do komentarza Share on other sites More sharing options...
dondu Wrzesień 24, 2011 Udostępnij Wrzesień 24, 2011 Mam jeszcze jedno pytani. Jak widzicie na schemacie, zrobiłem błąd i przycisk mam podpięty pod VCC zamiast GND. Przez to mam na pinie uc stan nieustalony. Czy mogę to jakoś wyeliminować? Czy można np. poprzez jakiś rezystyor podciągnąć do GND? Bo normalnie podciąga się rezystorem do VCC, ale jestem ciekaw czy można tak do GND. A może jest jakiś inny sposób na to? Tak, możesz to zrobić rezystorem np. 1k. Możesz także spróbować większy tak do 10k. Powinno działać bez problemu. AVR nie mają wewnętrznych pull-down, a szkoda - niektóre uC mają 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
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!