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



Teraz jest 25 kwi 2024, o 11:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 21 mar 2021, o 11:25 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Witam forumowiczów.
Chciałem prosić o pomoc w rozwiązaniu wydawałoby się prostej kwestii, ale jakoś stanąłem w miejscu i ni jak do przodu. Dawno nic nie robiłem. Rysuję linię składającą się z pionowych pasków. 0 adc równa się nic do wyświetlenia. 1023 równa się wyświetlenie całego paska w linii. Rozdzielczość wyświetlania co jeden słupek w kolumnie, czyli 16x5=80.
Wszystko działa zgodnie z założeniami, ale chciałem wprowadzić pewną modyfikację polegającą na spowolnieniu "opadania" paska. Powiedzmy, że napięcie adc maleje gwałtownie, ale bar cofa się płynnie, ale trochę wolniej (jak np. wskaźnik wychyłowy w sprzęcie audio). Narasta szybko, a spada wolniej.

Powołałem zmienne: zmienna_pomiar_adc i zmienna_peak_adc

Napisałem prosty kod z myślą, że to wystarczy:

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


Podstawa czasu jest 10ms (100Hz) i jeśli dobrze rozumiem, co natworzyłem, to co 10ms przy każdym obiegu pętli (jeśli zmienna_peak_adc > zmienna_pomiar_adc) następuje odejmowanie o 1. Występuje zauważalne lekkie spowolnienie opadania, ale to zbyt mało. zmiana wartości Timer2 na np. 10, czy 100 nic nie wnosi do prędkości opadania paska. Jedynie po gwałtownym cofnięciu pr-ka w zestawie atb pasek "czeka" ten okres (np 1s) i opadanie zaczyna się po tym czasie, ale prędkość jest nie zmienna (trochę wolniejsza ze względu na "zmienna_peak_adc--;"
Jak by to zmodyfikować, a żeby uzyskać inny efekt. Gdyby można za pomocą określonej zmiennej móc dowolnie zmieniać szybkość opadania paska. Nie proszę o 100% kodu, ale o pomoc, jak to ugryźć.
Myślę, że wystarczająco dokładnie opisałem, o co mi chodzi. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 13:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Tylko pierwszy "if" wystarczy czyli ten uzupełniający zmienną jeśli jest większa niż to co opadło. W momencie przepisania zmiennej ustaw też timer spowalniacza. Opadanie natomiast zrób permanentne (bez żadnych warunków, sprawdzisz tylko czy zero osiągnęło) z prędkością jaka Ci pasuje.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 20:01 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Witaj Sylwku po długim czasie :)

SylwekK napisał(a):
Tylko pierwszy "if" wystarczy czyli ten uzupełniający zmienną jeśli jest większa niż to co opadło. W momencie przepisania zmiennej ustaw też timer spowalniacza.


Rozumiem, że o tym piszesz:

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


Ale dalszej kwestii nie rozumiem:

SylwekK napisał(a):
Opadanie natomiast zrób permanentne (bez żadnych warunków, sprawdzisz tylko czy zero osiągnęło) z prędkością jaka Ci pasuje.


Nie mogę zaskoczyć. Im dłużej nad tym siedzę.......

Ten zapis zmienna_peak_adc--; wymusza jakby stałą prędkość odejmowania o 1 zależną od podstawy czasu i kombinacje z Timerem mi nie wychodzą.
Gdybym mógł odejmować o np. --10, --15, itd... , ale tak się nie da. Kombinowałem różnie. Ja wiem, że to proste i podstawy podstaw, ale ja coś robię od przypadku i nieraz mam długie przerwy. Może jakoś inaczej spróbuj mi wytłumaczyć, łopatologicznie :) Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 20:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Tak to widzę:

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


I to w zasadzie wszystko :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 20:59 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki Sylwku.
Jeszcze nie sprawdziłem, ponieważ szykowałem się właśnie do napisania posta. Sprawdzałem takie coś:

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


W tym przypadku opadanie jest z kolei zbyt powolne, nawet przy Timer2=1; W linijce paska, kolejny pojedynczy słupek w kolumnie pojawia się co wartość ADC 13, czyli kolejny przy 26-7 itd... Biorąc pod uwagę te 10ms podstawy i odejmowanie --1 mam tak, a nie inaczej. Nie mniej jednak zaraz sprawdzę, co mi podpowiedziałeś. pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

To przy okazji pokaż jak masz zrobione przerwania (w szczególności chodzi o timer programowy)/ Przy podstawie 10ms to ten słupek powinien znikać prawie natychmiast.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 21:54 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

A więc Sylwku poprawność działania samych funkcji jest 100% ok.

Natomiast przy ustawieniu Timer2=1; pasek wolno schodzi i wolniej się nie da (Timer2=1:)

Tak mam przerwania. Stosuję wyświetlanie z bufora.

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


Kwarc 18xxxxx I zawsze robię miganie diodą, co sekundę, a żeby sprawdzić, czy nie mam byka z przerwaniem i kwarcem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

A spróbuj tego paska (#10 post) zamiast swojego. Może tam jest problem.
topic18208.html

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 mar 2021, o 22:38 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki Sylwku.
Jutro sprawdzę. Muszę wstać o 5-j, ale wrzucam jeden ze sposobów rysowania paska. Używam również Twojego z negatywem spacji, ale akurat w tym programie zastosowałem ten:
Może to coś wyjaśni. Chciałem wrzucić filmik, jak to wygląda, ale trochę mam z tym kłopot.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2021, o 07:51 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Robert_1967 napisał(a):
A więc Sylwku poprawność działania samych funkcji jest 100% ok.

Natomiast przy ustawieniu Timer2=1; pasek wolno schodzi i wolniej się nie da (Timer2=1:)

Tak mam przerwania. Stosuję wyświetlanie z bufora.

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


Kwarc 18xxxxx I zawsze robię miganie diodą, co sekundę, a żeby sprawdzić, czy nie mam byka z przerwaniem i kwarcem.


Oczywiście w tej kwestii "Natomiast przy ustawieniu Timer2=1; pasek wolno schodzi i wolniej się nie da (Timer2=1:)" miało być "Natomiast przy ustawieniu Timer2=1; pasek wolno schodzi i SZYBCIEJ się nie da (Timer2=1:)"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2021, o 08:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

A masz jeszcze coś innego w pętli co może zabierać czas? Wyświetlanie jest dość czasochłonne, a nie wiem jak u Ciebie działa to buforowanie. Wstaw tę migającą diodę zaraz po Timer2=1; i zwróć uwagę czy widoczne jest miganie. Przy tej wartości nie powinno być widać zmian (100Hz/2 jak się nie mylę). Jeśli jednak będziesz widział wyraźne miganie tzn. że timer już dawno sobie odliczył i czeka, a opóźnienie wynika z innej przyczyny.

------------------------ [ Dodano po: 14 minutach ]

Jeszcze być może odczyt ADC masz jakiś czasochłonny. Nie wiem , gdybam :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2021, o 15:19 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

A więc zrobiłem tak.
Zrobiłem drugi testowy projekt. W pętli while(1) nie ma nic, poza rysowaniem paska i zmiana stanu dwóch diod LED. na lcd. W sumie są trzy Timery programowe.
Jeden przełącza diodę nr1 co sekundę (^=) dla sprawdzenia, czy Timer jest ok. Drugi Timer steruje "spowalniaczem" i przełącza diodę nr2 z nim powiązaną. Trzeci
Timer czyści lcd co jakiś czas. Obsługa pomiaru adc typowa, bez byków, jak w książce:

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


Obsługa lcd "zwykła bez buforowania".

Timery działają prawidłowo. Zmniejszyłem podstawę czasu do 1ms. Wówczas dioda mruga równo co 1s przy Timer1=1000;

Działanie się nie zmieniło. Czy to na "tamtej" wersji, czy na tej. Poza tym, że działa lepiej (podstawa 1ms). Na 10ms jest identycznie. Myślę, ze nic nie blokuje.

Ale zauważyłem jeden mankament. Jeśli w funkcji rysowania

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


/55 zamienię na np.5 lub 1, to wówczas wszystko jest oka. Prędkości opadania, jakie sobie życzę. Niestety rysowanie paska nie nadaje się do programu, gdyż tą
wartością reguluję sobie jego długość i tu modyfikacji nie mogę zrobić. Wydaje mi się, że klapa i nic tu za bardzo nie wymyślę.

Najprościej mógłbym ładować kondensatorek elektrolityczny (odpowiednia dobrana R C) na wejściu pinu adc i osiągnąłbym cel, ale chciałem to robić z poziomu programu.

Co by tu jeszcze wykombinować ???



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2021, o 15:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Teraz jestem w pracy. Jak będę miał chwilę jutro to po swojemu zrobię ten program, bo coś mi tu nie pasi... :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2021, o 17:29 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

OK. Dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2021, o 10:12 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Mogę oczywiście zastosować filtr cyfrowy, uśrednić pomiar z którego jest brana zmienna do paska i wówczas powiedzmy, że jest ok, ale to znowu wpływa na czas narastania, który w małym stopniu jest ok i może nawet pożądany, ale zbyt wielkie uśrednienie powoduje nie nadążanie za innymi wskazaniami.... Można by "wziąć" nazwijmy to zwykłą zmienną do wyświetlania, a uśrednioną do opadania, ale wówczas zaczyna się, jak to Mirek zawsze mawia tworzenie kocich kodów o niekończącej się długości i zajętości do prostego zadania. To "będzie działać", ale pewnie można jakoś prościej....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2021, o 12:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Niestety nie mam dobrych wieści. Tak jak myślałem i sugerowałem wcześniej obciążenie pętli głównej okazało się przyczyną.
Uruchomiłem swój program na 100Hz i standardowej obsłudze LCD bez żadnych opóźnień i efekt marny. Następnie podmieniłem na moją obsługę LCD buforowanego i zwiększyłem przerwania do 1000Hz (dla dokładniejszej regulacji) i efekt jak na filmie.
Podsumowując, nie ma szans z normalną obsługą LCD zrobić sensownie tego o co Ci chodzi. Odświeżanie ekranu jest bardzo czasochłonne. W moim rozwiązaniu wszystko się dzieje około 30x szybciej.



Autor postu otrzymał pochwałę

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2021, o 21:00 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Witaj Sylwku.
Dziękuję za szczere chęci i poświęcony czas. Na razie pozostałem przy uśrednianiu i podoba mi się, ale spróbuję jeszcze do tego wrócić. Może jakoś inaczej....
W wolnej chwili podrzucę filmik, ale też mam spore problemy z czasem. Buforowanie zaczerpnąłem i "wyłuskałem" z książki Mirka i projektu L19_HD44780_LCD.
Używam tak od dłuższego czasu. W zasadzie zaprzestałem korzystania ze standardowej obsługi lcd. Tylko że w tym projekcie podstawa czasu jest 100Hz i 10ms.
Jak przestawiłem na 1000Hz i 1ms, to było lepiej, ale chyba rozsypało się trochę buforowanie Mirkowego kodu i były nietypowe zauważalne migotania obrazu. Na szybko za bardzo nie wiedziałem, jak to poprawić przystosować do podstawy czasu 1ms i odpuściłem. Podstawowa funkcja nie kompletna z wiadomych względów:

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


Jak by to dostosować do szybszej podstawy czasu 1ms? Musze to ogarnąć. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2021, o 11:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Nie analizowałem Mirkowego buforowania, bo ja poszedłem trochę inną drogą, a częścią wspólną obu rozwiązań jest tylko bufor, na którym robi się wszelkie operacje wyświetlania. Natomiast zupełnie inne jest odświeżanie tego bufora i przepisanie go z procka do LCD. U Mirka cały bufor idzie hurtem w momencie wywołania odświeżania co zajmuje trochę czasu, a u mnie wywołanie odświeżania to wysyłka TYLKO jednego znaku z całego wyświetlacza pod koniec pętli głównej, czyli żeby pokazać pełną zawartość ekranu 16x2 odświeżanie musi być wywołane 32 razy + 1 czy 2 kody potwierdzające (nie pamiętam już). Oczywiście zmusza to do pisania programu w pełni nieblokującego (co mi nie przeszkadza :) ) bez żadnych pauz w środku, w przeciwnym wypadku wyświetlanie by się zatrzymało. Dzięki takiemu rozwiązaniu pętla wykonuje się jak pisałem około 30x szybciej niż z tradycyjną obsługą LCD. Moje rozwiązanie ma też zaletę w postaci automatycznego czyszczenia zbędnych miejsc czyli jeśli, np. licznik odlicza 10..9..8 to nie muszę na końcu umieszczać spacji " " aby mi zero z dziesiątki zmazać - ono się po prostu nie wyświetli, bo mój bufor oprócz standardowego zapełniania, ma opcję natychmiastowego kasowania tego co właśnie wysłał do LCD. Jest to ogromna zaleta i bardzo upraszcza pisanie programów z dużą ilością wyświetlanych danych, które się często zmieniają. Oczywiście na zawołanie mogę też natychmiast przesłać kompletny bufor - rzadko korzystam, ale przydaje się czasem gdy trzeba wyskoczyć z pętli głównej do jakiejś nietypowej funkcji pisanej dla zwykłej obsługi LCD.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2021, o 16:55 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

A no widzisz, to masz super rozwiązane :)

Ja nie buduję skomplikowanych urządzeń. Od czasu do czasu coś wymyślę i jakoś sobie radzę z moim poziomem wiedzy, ale nieraz są małe przeszkody. Po prostu nie ma systematyczności i to się mści. "Męczę" jak na razie te zwykłe lcd-ki monochromatyczne i do tego obecne materiały mi starczają. Aczkolwiek chodzi po głowie spróbować jakiegoś wyświetlacza dotykowago kolorowego. W Mirka książkach trochę tego jest i na początek jakiś rozruch pewnie by się udał, ale myślę, na jaki wyświetlacz się zdecydować. Jak największy, ale żeby na atmedze jakoś to pracowało. Pozdrawiam.
Temat paska ogarnąłem. Może nie tak, jak chciałem, ale jest dobrze podczas pracy. Zastosowałem uśrednianie. Nie używając timera prędkość reguluję ilością pomiarów.
Przy 100Hz jest poprawnie.



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: 19 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO