kobustm Napisano Listopad 4, 2015 Udostępnij Napisano Listopad 4, 2015 Witam Wszystkich Napisałem program wyświetlający na LCD odległość od przeszkody, lecz na wyświetlaczu widnieje jedynie 0. Jako, że jestem początkujący to program jest napisany w jak najprostszy sposób. Atmega 328p połączona z czujnikiem HC-SR04 ma być częścią większego projektu. Atmega posiada zewnętrzny rezonator 20 mHz lecz przy takiej deklaracji w ogolę nie wyświetla wartość. #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "LCD/HD44780.h" void signal(void); void external_interrupt(void); void init_timer1(void); unsigned char work; unsigned char edge; int distance; uint16_t timer_value; uint8_t error; ISR (PCINT2_vect) { if(work == 1) { if(edge==0) { edge=1; TCNT1 = 0; timer_value = 0; } else { edge = 0; distance = (timer_value*256 + TCNT1)/58; work = 0; } } } ISR (TIMER1_OVF_vect) { if(edge==1) //Check if there was echo { timer_value++; if(timer_value > 91) { work = 0; edge = 0; error = 1; } } } int main(void) { external_interrupt(); init_timer1(); DDRD |= (1 << PIND6); DDRD &= ~(1 << PIND7); LCD_Initalize(); //inicjalizacja LCD LCD_GoTo(1, 0); LCD_WriteText(" TEST "); sei(); while(1) { _delay_ms(500); signal(); LCD_GoTo(1, 1); LCD_WriteText(" "); char value[2]; itoa(distance,value,10); LCD_GoTo(1, 1); LCD_WriteText(value); if(error == 1) { LCD_GoTo(1, 1); LCD_WriteText("-------"); } } } void signal() { if(work==0) { _delay_ms(50); //Restart HC-SR04 PORTD &=~ (1 << PIND6); _delay_us(1); PORTD |= (1 << PIND6); //Send 10us second pulse _delay_us(10); PORTD &=~ (1 << PIND6); work=1; error = 0; } } void external_interrupt() { PCICR |= (1<<PCIE2); PCMSK2 |= (1<<PCINT23); } void init_timer1() { TCCR0B |= (1<<CS00); TCNT1 = 0; TIMSK1 |= (1<<TOIE1); } Czy mógłby mi ktoś napisać co jest nie tak i dlaczego otrzymuję wartość zero? Z góry wielkie dzięki Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Listopad 4, 2015 Udostępnij Listopad 4, 2015 Przede wszystkim, zanim zaczniesz eksperymenty z timerami, pomiarami czasu itp musisz być pewien taktowania swojego procesora i odpowiednich do niego ustawień systemu. Napisz prosty programik mrugający diodą, oparty na prymitywnych opóźnieniach delay_ms(). Jeżeli LED będzie mrugał tak jak jak sobie to wymyśliłeś (np. 1Hz) przy pętli {zapal→0.5s→zgaś→0.5s} to możesz iść dalej. Przy takich pracach bardzo pomocny jest oscyloskop. Masz dostęp do czegoś takiego? Jeśli nie ogarniasz co może być nie tak w kodzie, zacznij powoli, po kolei od czegoś mniejszego. Nawet jeśli nie masz jakiegoś sensownego sprzętu pomiarowego, korzytsaj z własnego procesora jak z narzędzia. Np. jeśli chcesz na timerze zliczać czas w przerwaniu, to upewnij się, że przerwania w ogóle przychodzą. Spróbuj mrugać w przerwaniu diodą tj. np. odwracać jej stan w każdym przejściu przez ISR. Możesz zacząć od małej częstotliwości aby mieć pewność, że panujesz nad ustawieniami timera. Program nie musi od razu robić wszystkiego. Uruchomienie samej funkcji pomiaru (generacja impulsu wyzwalającego, liczenie czasu powrotu echa) jest zupełnie niezależne od obliczeń i wyświetlania wyniku. Osobno możesz testować np. arytmetykę przez sztuczne wywoływanie funkcji obliczeniowych ze zmyślonymi odczytami czasu, wpisanymi bezpośrednio w kod - oczywiście takimi jakich się spodziewasz. Potem wyświetlanie itd. Jeśli te części będą niezależnie od siebie pracować id obrze przeliczać a potem wyświetlać wyniki dla pełnego zakresu danych wejściowych, możesz przejść do integracji tych funkcji. Jeden problem na raz. Nikt nie odpala kompletnych programów na żywioł, bo duży program jest jak talerz spaghetti - to pociągniesz, a rusza się w kilku odległych miejscach. Jestem pewien, że stosując tą metodę sam sobie poradzisz. Na początek zaplanuj kierunek np. że zaczniesz od samej góry: wyświetlanie. Zadaj sobie pytanie, czy wyświetlanie działa prawidłowo i sprawdź to dla kilku przypadków wpisanej w kod odległości. Potem obliczenia - te będą już korzystały z uruchomionych, pewnych i sprawdzonych funkcji wyświetlających itd.. Na każdym etapie możesz znajdować błędy. A to w zakresach liczb (na małych kontrolerach zwykły int jest tylko 16-bitowy więc łatwo o błędy przepełnienia), a to w koncepcji lub też w niezrozumieniu mechanizmów działania fragmentów sprzętu. Poprawiaj aż dojdziesz do działającego kodu. Masz takie same narzędzia jak my a przewagę dużą, bo masz pod ręką swój system i nieskończone możliwości próbowania 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
kobustm Listopad 24, 2015 Autor tematu Udostępnij Listopad 24, 2015 Dziękuję Ci bardzo za tak obszerną odpowiedź, wziąłem do siebie to co napisałeś i sprawdzałem wszystko po kolei metodą na diodę ucząc się przy okazji wszystkich etapów programowania AVR. Teraz juz działa i robię kolejne etapy projektu. Dzięki wielkie [ Dodano: 24-11-2015, 14:54 ] Błędy robiłem już na samym początku czyli przy ustalaniu częstotliwości taktowania i jej deklaracji Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Listopad 25, 2015 Udostępnij Listopad 25, 2015 O, to dobrze, że się nie zniechęciłeś. Przy okazji napisz w wolnej chwili co robisz. Co to za projekt? Będzie jeździł czy raczej coś stacjonarnego? Do czego ten pomiar odległości? Będziesz unikał przeszkód czy mapował teren? Podglądanie obcych projektów to druga po samodzielnym ich robieniu najfajniejsza rzecz w tej działce 🙂 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!