Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 kwi 2024, o 08:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 23 mar 2015, o 13:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 196
Lokalizacja: Kielce
Pomógł: 3

Witajcie.

Do obsługi klawiszy wykorzystuję funkcję z bloga Pana Mirka. Mianowicie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Napisałem pewien program obsługujący kilka przycisków. Na tej podstawie wykonałem proste menu. Wszystko ładnie chodziło do momentu wgrania programu obsługującego pomiar temperatury:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po dodaniu podanego wyżej kodu przyciski nie reagują tak jak wcześniej od razu po wciśnięciu tylko po pewnym czasie. Kompilator nie wyrzuca żadnych błędów ani żadnych warningów. No nie wiem co jest powodem takiego zachowania przycisków... jak myślicie ??

Z góry przepraszam, nie mogę udostępnić całego kodu.

Dodam, że po wpisaniu obsługi przycisku w formie następującej:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problem znika. Co może być nie tak ??

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2015, o 16:01 
Offline
Nowy

Dołączył(a): 16 mar 2014
Posty: 13
Pomógł: 1

No to jak możemy się domyślić o co chodzi. Z podanych fragmentów nie wynika niestety za wiele. Nie wiem na jakiej podstawie funkcja ds18b20_ConvertT() zwraca wartość. Nie wiadomo na jakiej zasadzie jest wywoływana konwersja, oraz późniejszy odczyt pomiaru (pomiędzy tymi dwoma momentami jest minimalnie 750ms przerwy dla pełnej rozdzielczości). Nie wiemy jak przydzielasz procesorowi zadania(jedna duża pętla, przerwania, przerwania programowe à la BlueBook). Zacznij od sprawdzenia w którym miejscu kod zatrzymuje się na dłuższy czas(bo prawdopodobnie się gdzieś zatrzymuje,funkcje _delay_ms() etc.), a jeśli się nie zatrzymuje, czy pomiar nie próbuje wykonać się za często. I rozważ udostępnienie kodu o ile wiesz, że sam będziesz miał problem ze znalezieniem. Swoją drogą nie bardzo rozumiem dlaczego nie możesz go udostępnić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2015, o 18:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 196
Lokalizacja: Kielce
Pomógł: 3

Postanowiłem udostępnić cały kod, gdyż faktycznie nie jestem w stanie faktycznie rozwiązać tego problemu. Zauważyłem też, że czasem podczas wgrywania programu moja atmega się zawiesza.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2015, o 19:41 
Offline
Nowy

Dołączył(a): 16 mar 2014
Posty: 13
Pomógł: 1

Widzę, że masz BB, przeczytaj rozdział "Wstęp do systemów czasu rzeczywistego".
Robisz jedną wielką pętlę w której w kółko pracuje cały twój program. Jak napisałem wyżej odczyt z ds'a zajmuje sporo czasu, do tego zatrzymuje przerwania. Odczytaj to tak, jeśli program wskoczy w obsługę magistrali 1Wire, to Twoje przerwanie nie wykona się, więc zegarek nie będzie pracował poprawnie. Ponadto, w momencie kiedy obsługujesz odczyt z czujnika procesor trochę sobie poczeka. Nawet pomijając danie tych 750ms na konwersję, zostają jeszcze czasy które są wymagane do obsługi magistrali. To są bardzo krótkie waity, ale wykonując je co każdy obrót pętli głównej robi się z tego spore opóźnienie. Po co to robić tak często skoro i tak nie zaaktualizujesz wskazań częściej niż to 750ms.Swoją drogą to nie zauważyłem abyś odczekiwał w jakikolwiek sposób ten czas, nie wiem co zwraca ds18b20_ConvertT ale wygląda to tak, jakby ta wartość była na sztywno ustawiona na 1 albo jakbyś używał zmiennych globalnych do sprawdzenia czy powinno się odpalić sprawdzanie temperatury wewnątrz tej funkcji.Kod jest morderczo nie czytelny. Czytałem go kilka razy i nadal średnio rozumiem jego sens. Zacznij używać funkcji i użyj przerwania sprzętowego do zrobienia sobie przerwań programowych, które w odpowiednim momencie będą odpalać odpowiednie części Twojego kodu.A co do pytania co tak na serio zatrzymuje program użyj sobie diody led, wrzuć jej mrygnięcie w obsługę pomiaru temperatury. Podejrzewam, że będzie świeciła non stop.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2015, o 20:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zobacz również ten wątek: http://forum.atnel.pl/topic11142.html
Myślę, że pomoże Ci w zrozumieniu timerów programowych i jak wywoływane są proste funkcje. No mi pomógł! :D Masz tam krótki programik z diodami, zobacz jak to działa na prostym "organiźmie"! Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 10:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 196
Lokalizacja: Kielce
Pomógł: 3

BB nie posiadam tylko korzystam z biblioteki, czasem jak mam możliwość idę poczytać i tyle. Posiadam pliki zgrane z płyty która była dołączona do BB. Przejrzałem kod ale jakoś nic mi to nie mówi. Kod do czujnika DS jest ze strony http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8 Ogólnie to nie wiem w końcu w czym jest błąd. Czy źle zbudowałem pętle główna czy problem leży tylko po stronie pomiaru temperatury. Czy też wina leży po stronie okropnych delaów i trzeba użyć przerwań programowych. Jeżeli chodzi o budowę całego programu to wydaję mi się, że powinno być ok ale nie mnie to nie oceniać. Po za tym skoro uważacie, że jest nie czytelny to pewnie macie racje muszę nad tym popracować. Nie jestem całkowicie początkujący ale na pewno nie jestem w stopni zaawansowanym. Pierwszy raz buduję większy program, który będzie obsługiwał kilka zadań.

Kod, który udostępniłem ma na celu obsługiwać proste menu opierającym się na zwiększaniu lub zmniejszaniu zmiennej menu, w zależności od wartości zmiennej jest wyświetlana jedna z pozycji menu. Będzie obsługa również czasu jak i temperatury. Do tej pory wszystko działało po dodaniu temperatury, wszystko się wykrzaczyło. No i nie wiem gdzie szukać błędu. Czytam już drugi raz to co napisałeś Witold ale no jeszcze chyba nie osiągnąłem odpowiedniego poziomu :/

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 16:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Kolego Rafal9018 piszesz, że masz kody źródłowe z BB i dostęp do tej książki. Masz tam przecież znakomity przykład 10_1Wire. Zobacz jak poradzić sobie z poprawną obsługą (nieblokującą) DS18x20. A później jeszcze 19_ProjektWielozadaniowy. Proponawałbym Ci od tego zacząć i te właśnie przykłady przeanalizować. No i oczywiście obsługę przycisków z bloga pana Mirka. http://mirekk36.blogspot.co.uk/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html (najlepiej wszystkie części), a na końcu przykład z BB 17_SuperDebounce.
Myślę, że to pomoże Ci w rozwiązaniu tego problemu. dlaczego to co napisałeś nie działa. Napisz jeszcze jaką częstotliwością taktujesz processor, jaki to processor, masz to na płytce stykowej czy korzystasz z zestawu? Przydałby się równiż jakiś schemat lub chociaż zdjęcia połączeń. :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 17:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Rafal9018 w Twoim pierwszym poście, w pierwszym listingu, w ostatniej linijce robisz key_lock++. Dlaczego?

Przecież zmienna key_lock to flaga wciśnięcia przycisku, która powinna być ustawiana (np. =1) w momencie wciśnięcia, a zerowana dopiero po jego puszczeniu (np. =0) ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 18:04 
Offline
Nowy

Dołączył(a): 16 mar 2014
Posty: 13
Pomógł: 1

Ok, po pierwsze to nie jest kwestia znajomości języka, tylko umiejętności jego wykorzystania. Jeśli to zrozumiesz, będziesz potrafił tego użyć, nic w tym trudnego. Poczyńmy kilka założeń, po pierwsze ograniczmy ilość wykonywanych zadań do 2. Masz odczytywać stan klawiszy i robić pomiary. Pomiar składa się z 2 części, wysyłasz czujnikowi informację, że ma zrobić pomiar, potem go z niego odczytujesz. Zacznijmy od czujnika. Sama obsługa zlecenia wykonania pomiaru jak i odczytanie informacji o temperaturze z niego jest krótka, jednakże pomiędzy kolejnymi ich fazami konieczne jest spełnienie założeń czasowych, dlatego też w bibliotekach do obsługi dsów wykorzystuje się dwie rzeczy. Po pierwsze blokuje się przerwania, bo jeśli zdarzyło by się, że w środku pomiaru trzeba obsłużyć przerwanie, to zmieniają się czasy pomiędzy poszczególnymi fazami pomiaru (poczytaj jak działa 1Wire aby zrozumieć). Po drugie pomiędzy kolejnymi elementami obsługi magistrali są używane funkcje typu _delay_us(). Trwa to jednak dość krótko, załóżmy że jest to 1ms(wartość wzięta z kosmosu, nie wiem ile to dokładnie trwa, grunt że mało). Trzeba tylko jeszcze spełnić jedna zależność pomiędzy zleceniem pomiaru, a odczytaniem pomiaru musi upłynąć minimum 750ms, czyli 0.75 sekundy. To już dużo. Pierwsze programy, czy też przykłady ludzi którzy chcą obsłużyć czujnik mają po prostu wstawionego _delay_ms(). Jednak ten sposób jest do kitu, bo każemy mikrokontrolerowi nie robić nic przez 750 MS!!!. Spójrz na to tak, nie ma sensu odczytywać wartości pomiaru częściej niż co 750ms, a zazwyczaj można to robić i rzadziej. Naszym celem jest więc wywoływanie funkcji zlecenia odczytu i samego przepisania wartości z czujnika zachowując ten reżim czasowy bez używania funkcji delay. Użyjmy więc timera który odlicza wartość powiedzmy 1ms. Co powinniśmy zrobić w funkcji obsługi przerwania ? Ano powinniśmy zrobić sztuczkę, napiszmy kod, ifa który sprawdza czy przepełniliśmy daną zmienną, a jeśli nie to inkrementuje ją. Natomiast jeśli faktycznie przepełniłeś dany licznik, zmieniamy stan flagi na 1. Flag robisz tyle, ile masz kawałków programu. W tym przypadku są to 2 kawałki. Obsługa czujnika i klawiszy. Przyjmijmy, że funkcję obsługi klawiszy będziesz wywoływał co powiedzmy 30ms, natomiast tą od temperatury co 1000ms. Obsługa przerwania ogranicza się tylko do ustawiania flag po przepełnieniu. Teraz zostaje nam główna pętla programowa. Pętla ta sprawdza stan każdej flagi, jeśli jest jedynką, wywołuje dany fragment kodu, jeśli nie idzie dalej. Mamy więc 2 ify w głównej pętli, które sprawdzają flagi. Oczywiście po skończeniu kodu w głównej pętli musisz wyzerować flagę, inaczej kod będzie się wykonywał przy każdym powtórzeniu pętli. Zobacz jak to wygląda, główna pętla nie robi w zasadzie nic, do momentu kiedy flagi są wyzerowane. Za to czy masz tam jedynkę odpowiada przerwanie z timera. Więc część kodu obsługi klawiszy będzie się wywoływać co około 20ms, a ta od temperatury co 1000ms. Pomijając te momenty, mikrokontroler nie robi praktycznie nic, nie wykonuje zbędnego kodu. To sprawi, że opóźnienia znikną. Bierz pod uwagę, że część kodu od temperatury tak naprawdę musi robić 2 rzeczy naprzemiennie, rozwiąż jakoś sensownie ten problem i nie wykonuj pomiaru i odczytu za każdym razem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2015, o 01:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Kolego Rafal9018 zgodnie z obietnicą dołączam projekt mojej skromnej wersji.
Układ ten wykorzystuje biblioteki do obsługi wyświetlacza LCD hd44780 i czujnika temperatury ds18b20 ze strony http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8 (padanej przez Ciebie) bez żadnych modyfikacji , oprócz portów dla ATmega32 taktowanym wewnętrznym oscylatorem 8MHz. Można użyć bez problemu ATmega16. Przy ATmega8 trzeba pozmieniać porty w pliku main.c, ds18b20 i hd44780.h. Najlepiej by przyciski były na jednym porcie (potrzeba 5 pinów), oraz cały port dla wyświetlacza LCD (4 piny dla D4, D5, D6, D7, 3 dla RS, RW, E oraz 1 dla podświetlenia wyświetlacza).
Ogólnie jest to tylko przykład jak można poradzić sobie z wyświetlaniem temperatury, czasu, ustawiania czasu czy włączenia/wyłączenia podświetlenia wyświetlacza wykorzystująć obsługe przycisków p. Mirka ze strony http://mirekk36.blogspot.co.uk/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html (również celowo bez żadnej modyfikacji funkcji, wykorzystano tutaj tylko reakcję na krótkie wciśnięcie przycisku), timerów programowych oraz prostego "menu".
Celowo nie wykorzystuję tutaj bibliotek z książki BB ani zewnętrznego kwarcu do taktowania procesora myśląć o tych, którzy jeszcze nie mają BB czy kwarcu.
Dodam, że wykorzystywana jest tutaj funkcja sprintf (pamięciożerna, która nie jest zalecana dla AVR), dlatego trzeba "dokonać" pewnej modyfikacji projektu by poprawnie wyświetlało nam zmienną float zamiast "?". Warto poczytać: http://mirekk36.blogspot.co.uk/2013/04/eclipse-nie-dziaa-mi-printf-dla-float.html. Można poprawnie wyświetlać temperaturę nie korzystając z niej! Zapraszam do BB.
Zegarek ten jest bardzo niedokładny, dodany jako opcja tylko i wyłącznie dla celów "edukacyjnych". W praktyce stosuje się specjalizowanie układy RTC np DS3231. Warto odwiedzić stronę: http://mirekk36.blogspot.co.uk/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html
Kolego Rafal9018 mam nadzieję, że Ci się to przyda i pomoże w rozwoju Twojego projektu, który obiecałeś pokazać niebawem w dziale DIY. :D


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2015, o 17:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 196
Lokalizacja: Kielce
Pomógł: 3

Bardzo dziękuję za wszelkie porady i wskazówki. Również za udostępnienie kodów. Jeżeli tylko skończę w całości swój projekt na pewno pojawi się on w dziale DIY :D

Pozdrawiam wszystkich i jeszcze raz dzięki :)

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 15 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO