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



Teraz jest 24 mar 2026, o 18:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 30 cze 2012, o 00:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Mirku spokojnie nic nie trzeba będzie tłumaczyć ;), to nie chodzi o ten wskaźnik z * :)

Ostatnio przeglądając forum trafiłem na temat w którym jeden z naszych kolegów napisał programik w którym był zrobiony wskaźnik
na "naszym nieśmiertelnym" wyświetlaczu 2x16 lub jak kto woli HD44780. Ale wracając do tego programu tak patrzę i patrzę ......
i przyszła mi do głowy pewna myśl "chłopie ale ty sobie komplikujesz życie", a można przecież prościej.

Do wszytskich przykładów został użyty zestaw ATB i znana nam biblioteka do wyświetlacza.
LCD podpięty jest do portu D, przetwornik natomiast podpięty jest pod PA0 i mierzy napięcie w zakresie 0-5V z dokładnością 9 bitów, czyli wartości przekazywane z przetwornika będą w zakresie od 0 do 511 nazwijmy je "jednostkami"


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


Osobiście nie mam nic przeciwko takiej wersji wykonania wskaźnika na wyświetlaczu, bo przecież działa,a to jest najważniejsze :)
Tylko tak jakoś nie wyraźnie mi się zrobiło bo tak dużo pisania do tak prostego efektu , hmmmm......
Postanowiłem więc pokazać wam że można prościej ;)

Na początek troszkę matematyki ;)
Jak wszyscy wiemy wyświetlacz ten składa się z dwóch linii ( my zajmiemy się jedną ), każda linia składa się z 16 znaków, natomiast każdy znak składa się z 5-ciu pionowych linii. Te informacje okażą się dosyć ważne przy późniejszych wersjach naszego wskaźnika.

Na początek zabierzmy się za przeróbkę pierwszej wersji kodu.
Żeby opracować taki wskaźnik musimy się dowiedzieć przy jakich wartościach ADC powinien zapalać się kolejny segment naszego wyświetlacza, dlatego dzielimy wartość maksymalną ADC przez ilośc segmentów.
512/16=32
Z tego wynika że każdy segment wyświetlacza powienien zapalać się po przekroczeniu kolejnych 32 jednostek z naszego ADC
Ja do wykonania tej czynności użłem pętli for i małej pseudo sztuczki. Sztuczka polega na tym że nie będę inicjalizował zmiennej dla pętli for wartością stałą,a zmienną w której mamy wartość pomiaru z ADC. Dlatego napisałem że to pseudo sztuczka ponieważ nie wiele osób wie lub zdaje sobie sprawę że też tak można.

Nie przedłużając przedstawiam kod programu który robi to samo ale jest o niebo krótszy :)

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


No dobrze, wszytsko działa, tylko ale jak się dokładniej przyjrzymy to przecież taki wskaźnik ma bardzo dużą tolerancję.
Więc sprawdźmy to jak się sprawa ma przy 5 V, w ziązku stym musimy obliczyć jakie napięcie przypada nam na jedną jednostkę ADC ponieważ ta wartość będzie nam potrzebna do obliczenia co jaką wartość będzie nam się zapalał kolejny segment i równocześnie będzie to nasz rozdzielczość wskaźnika ( tolerancja)
5V /512=0,009765625V <--- obliczenie napięcia przypadającego dla jednej jednostki z ADC
0,009765625V*32=0,3125V <--- obliczenie napięcia dla całego segmentu

Okazuje się że każdy następny segment wyświetlacza będzie się zapalał przy zwiększaniu się napięcia o 0,3125V.
Niby nie wiele, ale jak troszkę policzymy to się nagle okazuje że to jest aż 6,25% z naszych pięciu volt, jak dla mnie to już jest dużo.
Dlatego zacząłem się zastanawiać jak zmniejszyć błąd naszego wskaźnika, i w końcu znalazłem .............
Przecież wskaźnik nie składa się tylko z 16 segmentów, ale także z pięciu pionowych linii w każdym z segmentów, a to już daje nam aż 80 pionowych linii które możemy wykorzystać w celu zwiększenia precyzji wskaźnika.
Co by nam dało błąd o wartości 5V/80=0,0625V czyli jakieś 1,25%, według mnie to już naprawdę nie jest źle biorąc pod uwagę na jakim wyświetlaczu pracujemy.

Taaak...., tylko jak się za to zabrać .........
Otóż nic trudnego :), sami wiecie Kto, nie będę wymawiał Jego imienia głośno ;) nauczył nas jak wgrać dodatkowe fonty do tego LCD.
W związku z tym musimy opracować pięć dodatkowych fontów które będą nam zapełniać 1,2,3,4 lub 5 linii określonego segmentu i zostaną załadowane do pamięci CGRAM wyświetlacza

Pozostaje nam jeszcze przeliczenie jaka wartość z naszego ADC przypada na jedną linię z tych 80.
512/80=6,4
I mały klops, wyszła wartość z miejscami po przecinku, ale to nie jest nic aż tak strasznego poniewąz częściowo ominiemy tą niedogodność poprzez zapalanie całych segmentów zamiast linii dlatego że jeden segment ma przecież wartość 6,4*5=32 :)

Kolejny przykładzik wskaźnika na podtswie przemyśleń

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


Dodatko zamieszczam lekko zmodyfikowany kod, który pozwala na wskaźniku obserwować zmiany wartośći w zakresie 4-5V i którego nie będę już opisywał ponieważ rózni się od poprzedniego jedynie dodatkowym warunkiem IF.

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


Mam nadzieję że się komuś przydadzą te moje wywody ;)

Dla tych co nie mają ochoty sprawdzić łopatologicznie tych kodów załączam filmik



Ostatnio edytowano 1 lip 2012, o 21:19 przez Malutki_27, łącznie edytowano 10 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 07:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Zakręciłem się trochę w tym wszystkim i nie rozumiem do końca opisu ... ale uważaj robisz jeden błąd o którym pisałem już na tym forum:

Cytuj:
ADMUX |= (ADMUX & 0xF8) | kanal;


Przy pomiarze z jednego kanału będzie to działać dobrze ale jak będziesz chciał sprawdzać i przełączać się pomiędzy kanałami to zacznie się ZONK :( .... dlatego popraw tą linijkę tak:

Cytuj:
ADMUX = (ADMUX & 0xF8) | kanal;

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 14:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Już całkowicie przeredagowałem, i solennie obiecuje że na razie odstawię niebieski pigułki bo są chyba za mocne ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 14:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Malutki_27 napisał(a):
Już całkowicie przeredagowałem, i solennie obiecuje że na razie odstawię niebieski pigułki bo są chyba za mocne ;)


To nie sięgaj od razu po największe dawki - żeby nie przedawkować ;)

A na poważnie to teraz troszkę mi się rozjaśniło i widzę tak ogólnie do czego dążysz - skrócenia programu z tymi IF'ami jak dobrze myślę ???

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 15:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Takie było założenie:), ale się szybko zmieniło bo wskaźnik działał jakoś tak skokowo , wiec postanowiłem pociągnąć temat troszkę "dalej" ......
Wieczorkiem postaram się dodać jakieś poglądowe filmiki:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 15:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Malutki_27 napisał(a):
Takie było założenie:), ale się szybko zmieniło bo wskaźnik działał jakoś tak skokowo , wiec postanowiłem pociągnąć temat troszkę "dalej" ......
Wieczorkiem postaram się dodać jakieś poglądowe filmiki:)


No widzisz to zdecydowanie ułatwiłoby analizę tego co opisujesz ponieważ nie każdy odtworzy sprzętowo taki układ. A jak pokażesz filmiki i do końca załapię ideę - to może jeszcze coś podpowiem - bo jak patrzę na to to chodzi mi coś po głowie ;) ... nie mówię, że masz źle ale pewnie zdajesz sobie dobrze sprawę z tego, że to samo zadanie można wykonać na milion różnych sposobów - tyle ilu jest programistów na świecie ;) ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

mirekk36 napisał(a):

.... ale pewnie zdajesz sobie dobrze sprawę z tego, że to samo zadanie można wykonać na milion różnych sposobów - tyle ilu jest programistów na świecie ;) ....


Oczywiście że zdaję sobie z tego sprawę:) , dlatego napisałem przy pierwszym kodzie że nic nie mam przeciwko takiemu tasiemcowi.
Bardziej mi chodziło o pokazanie że do tego samego problemu można podejść na wiele róznych sposobów. Z resztą kod z tamtego tematu jest równie dobry co te które przedstawiłem :), także wcale nie twierdzę że te kody są optymalne, po prostu są krótsze :)

A nie rozpisując się jest to jedynie moja wizja jak można taki wskaźnik wykonać, więc wszelkie uwagi, sugestie, tyrady ;) i tym podobne są bardzo mile widziane. :)

Zresztą przy kręceniu filmiku wyłapałem kilka błedów więc od razu naniosłem poprawki :), niestety na filmie są te starsze wersje .........



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Wskaźnik
PostNapisane: 30 cze 2012, o 22:44 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

hehehe - no teraz (ja to jestem jednak wzrokowiec) ... zrozumiałem wszystko co opisałeś, dzięki temu filmikowi. Wcześniej jakoś strasznie mnie zakręcało to określenie wskaźnika - bo (hmm może to zboczenie zawodowe)... myślałem że chodzi ci o jakiś wskaźnik z języka C hyhyhy

A tu proszę chodzi o bargraph czyli słupkowy wskaźnik posiomu/wysterowania itp ;)

Patrząc teraz na tą ostateczną wersję kodu - zrobiłeś to bardzo bardzo fajnie ;) ... a biorąc pod uwagę jak to było na początku z setkami IF'ów - to w całości wyszedł fajny jakby tutorial teraz prezentujący bardzo ciekawe podejście - a nie wspomnę już , że z użyciem timera programowego ładnie.

No właśnie tylko sam tytuł wątku jest nieco albo dość mocno mylący bo dopiero (jak dla mnie filmik wszystko wyjaśnia pięknie).

Generalnie to co opisałeś - to bardzo ale to bardzo dobry poradnik dla początkujących no i super ćwiczenie, które porusza niby w tak prostym temacie użycie kilku zagadnień. I wbrew pozorom (wspominałem wyżej) ciekawostką tu jest użycie przez ciebie timera programowego chociaż można byłby go w ogóle pominąć - ale to pokazuje przepięknie - jak bardzo dla ciebie ten mechanizm stał się hmmm niczym powietrze do oddychania i widać, że to jest proste jak mega drut .... Myślę, że nawet z tego aspektu swojego tutoriala nawet sam sobie sprawy nie zdawałeś bo to jakby tak na uboczu.

No ale najważniejszy temat czyli realizacja programowa samego Bargraph'a i to wyjaśniona w takiej kolejności - nie od razu gotowiec, który mógłby być ciężko strawny dla początkującego ale takie pokazanie krok po kroku jak to się rozwija - jest wręcz akcja jak w kryminale ;) no SUPER materiał edukacyjny.

Dlatego ja cieszę się z dwóch powodów

1. Że chciało ci się na naszym forum to przedstawić - dziękuję
2. Że tak niesamowicie fajnie startujesz i lecisz z tym C ;) jak burza ....

jak się na takie coś patrzy - to aż się chce coś pisać dalej (mówię o książkach) bo tu już namacalnie widać, że pewnie chociaż w jakimś małym ale zawsze stopniu może okazały się te moje wypociny z pierwszej książki przydatne.

Nie mówiąc też o tym jak fajnie przedstawiłeś także sposoby wykorzystania prezentowanej w niej biblioteki do LCD

to tyle .... a temat przydałoby się przenieść do projektów programistycznych - coby służył jako przykład do poczytania dla potomnych. Tylko ja nie wiem jak - ale może nasz moderator SunRiver pomoże ? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2017, o 12:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

@Robson - Pozwolę sobie wkleić fragment twojej wiadomości

Cytuj:
... ale chciałem prosić o wyjaśnienie z jakiego rezonatora korzystałeś i czy mógłbyś wyjaśnić dokładnie
w komentarzach, co dokładnie oznaczają te linijki. Pytanie może bardzo banalne, ale ja stawiam pierwsze
kroki w C, a chciałbym zrozumieć zapis i w ogóle program.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Mirek wspomniał,że można to zrobić podobnie, ale bez przerwania. Czy jest to możliwe i jak to rozwiązać praktycznie. Gdybyś mógł mnie naprowadzić. Będę bardzo wdzięczny za wszelką pomoc.

Dziękuję i pozdrawiam.

@Robson.


Rezonator nie ma tu większego znaczenia, zawsze możesz dobrać przerwanie tak aby przerwanie było wywoływane co 10ms dla dowolnego rezonatora.

A fragment kodu o który pytasz ma za zadanie zapalić odpowiednią ilość pól w zależności od pobranego wyniku pomiaru z ADC.

Czyli, jeżeli Nasza maksymalna wartość pomiaru wynosi 512, to aby zapalić kolejny kwadrat (a mamy ich 16 w jednej linii), wartość musi być równa 32 (bo 512/16=32).

Dlatego zakładając że chcemy zapalić x pól dla wartości np 244, pętla robi tak:

Czy 244 większe od 31 (aby zapalić kwadrat musi być 32) = Tak
zapal kwadrat
Kod:
lcd_str("\x86");

to 244 - 32 = 212
Czy 212 > 31 = Tak
zapal kolejny kwadrat
Kod:
lcd_str("\x86");

itd. .... aż zmienna i osiągnie wartość mniejszą niż 32, wtedy pozostała wartość jest brana do polecenia switch w którym decydujesz ile linii w kwadracie powinno być zapalonych.

Tak na marginesie w tej pętli jest mały błąd gdyż powinna wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Mam nadzieję że ci to trochę rozjaśniło sytuację ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2017, o 13:54 
Offline
Użytkownik

Dołączył(a): 12 lis 2014
Posty: 108
Pomógł: 0

Dziękuję jeszcze raz.
Co do pewnego ograniczenia paska w stosunku do adc, to pomyślałem o czymś takim. Czy idę w dobrą stronę ?

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


Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2017, o 14:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Nie bardzo .... Jeżeli chcesz żeby wskaźnik reagował tylko w zakresie 0 - 850 wystarczy podzielić 850/16 co daje w przybliżeniu 53 i tą wartość wpisać zamiast 31

czyli

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: 31 sty 2017, o 16:42 
Offline
Użytkownik

Dołączył(a): 12 lis 2014
Posty: 108
Pomógł: 0

Dzięki wielkie.
Miałeś rację. Po zastosowaniu Twojej podpowiedzi programik działa zgodnie z założeniem. Nie mogę przyznać punktu za pomoc, bo nie widzę takiej opcji, ale mam
nadzieję, że jeszcze się spotkamy na forum i będzie taka możliwość.
Jeszcze raz dziękuję i pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2017, o 18:47 
Offline
Użytkownik
Avatar użytkownika

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

@Malutki_27, a moją wersję podobnego programu prezentowanego tu gdzieś na forum widziałeś ;-) ?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2017, o 14:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

@Sylewkk Ostatnio niestety, ale nie bardzo mam czas zaglądać na forum, dlatego nie śledzę na bieżąco wątków ;) Ale poszperam to zobaczę ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2017, o 15:36 
Offline
Użytkownik
Avatar użytkownika

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

Żebyś nie szukał :-)
viewtopic.php?p=108922#p108922

W każdym razie twój opis na pewno bardzo ułatwi sprawę początkującym.
Prawa jest jedna - ilu programistów tyle rozwiązań :)
W każdym razie u mnie zobaczysz jak jeszcze można pewne rzeczy uprościć ;-)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2017, o 10:27 
Offline
Użytkownik

Dołączył(a): 12 lis 2014
Posty: 108
Pomógł: 0

Tak, potwierdzam.
Sposób @SylwkaK jest ciekawym rozwiązaniem i sam z niego skorzystałem w moim projekciku, jak również kolegi @Malutki_27.
Pozdrawiam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 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