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



Teraz jest 8 kwi 2026, o 06:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 9 lip 2014, o 12:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Witam wszystkich serdecznie.

Jako, że niedomagania BASCOMA w kwestii obsługi timerów i pwm sprowokowały mnie do przejścia na C, naskrobałem sobie prosty kod do obsługi tego ciekawego układu, który wygląda tak:

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


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


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


Kod napisany pod attiny2313, bo tylko taki procesor z wyjściem wewnętrznego zegara miałem pod ręką (zegar jest potrzebny dla układu MBI). Docelowo użyję pewnie attiny88. Brakuje jeszcze procedur zapisu do rejestru konfiguracyjnego i odczytu errorów (czy w ogóle potrzebne?), ale pewnie dopiszę niedługo.

Pomiary:
Korzystając z programowego SPI, czas wysłania bufora składającego się z 32 bajtów wynosi 508 uS, przy wykorzystaniu USI spada do 289 uS, wszystko przy wewnętrznym oscylatorze 8 MHz.
Może ktoś podpowie co jeszcze poprawić w kwestii szybkości działania? Wydaje mi się, że zamiana funkcji inline na makra nie zrobi różnicy?

Zrobiłem też próby widoczności migania diod z wykorzystaniem generatora. Przy 100 kHz podanych na pin GCLK migotanie jest jeszcze minimalnie widoczne, przy 8 MHz nie da się go zauważyć nawet machając ręką nad diodami.

A testowy programik wygląda tak (jeszcze bez korekcji gamma, a raczej nie-gamma ale o tym innym razem):


_________________
Pozdrawiam, Adrian.



Ostatnio edytowano 11 lip 2014, o 23:29 przez Federerer, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lip 2014, o 23:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Trochę po cichu liczyłem na opinie co można zrobić lepiej albo poprawić, bo dopiero zaczynam i pewnie coś się znajdzie a tu cisza. :( No nic to lecimy dalej, bo korekcja nie-gamma gotowa. Nie-gamma dlatego, że skorzystałem z równań używanych w modelu CIELab do opisu luminancji, które powinny zasadniczo opisywać nieliniowość odbierania jasności przez oko ludzkie, choć problem wydaje się być dużo bardziej złożony. Moja korekcja bazuje na tym artykule:
http://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/
Widać, że różnice nie są duże, ale korekcja w oparciu o CIELab według mnie ma przewagę nad użyciem gammy w zakresie niewielkich jasności (L* poniżej 8), gdzie zależność opisywana jest za pomocą równania liniowego, w efekcie czego dostajemy mniej zer na początku tablicy.
Dokładniejszy opis odczuwania jasności przez człowieka można znaleźć tu:
http://www.telescope-optics.net/eye_intensity_response.htm
Wzory z których korzystałem tu:
http://www.brucelindbloom.com/index.html?Equations.html

Kod po modyfikacjach wygląda tak:

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


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


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


Zauważyłem, że kompilator wyrzuca błąd, gdy pgmspace.h nie jest dołączony zarówno do pliku main.c jak i MBI5040.c, chciałbym, żeby wystarczyło dołączenie go w pliku biblioteki. Działa, gdy dołączę go tylko w pliku nagłówkowym biblioteki, ale tak się chyba nie powinno robić?

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lip 2014, o 09:12 
Offline
Moderator
Avatar użytkownika

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

Federerer napisał(a):
Działa, gdy dołączę go tylko w pliku nagłówkowym biblioteki, ale tak się chyba nie powinno robić?


plik nagłówkowy dołącza się za pomocą #include tylko w tych plikach *.c w których korzystasz z funkcji w nim istniejących. Ale jego zainkludowanie przypadkowe w innych plikach źródłowych wcale nie przynosi żadnego warninga - więc pewnie masz coś innego źle :( ale ciężko coś podpowiedzieć bo opisujesz to tylko na zasadzie, że coś ci działa albo nie działa ... więc reszty to już trzeba się domyślać albo być jasnowidzem. Opisz dokładnie błąd, fragment kodu itp żeby można było pomóc

Federerer napisał(a):
ale korekcja w oparciu o CIELab według mnie ma przewagę nad użyciem gammy


Ale to nie jest tak że wg ciebie ma a wg innych nie ma ;) .... CIElab zawsze ma przewagę nad gamma ... bo CIElab do tego został stworzony w przeciwieństwie do gamma ;)

I pewnie w przypadku rozdzielczości PWM 16-bit jest to lepiej widoczne .,.... ale tak na prawdę narzędziem do dowolnej zmiany współczynnika gamma w MkAvrCalculator ;)

http://mirekk36.blogspot.com/2013/09/ga ... zie-w.html

można uzyskać podobne hmm zbliżone efekty dla oka ;) ...

Nie mniej jednak - bardzo fajnie jest się pobawić coraz lepszymi profilami kolorów niż RGB czyli HSV no i CIElab szczególnie ;)

_________________
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: 12 lip 2014, o 11:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

No więc tak:
w pliku MBI5040.h mam zdefiniowane makro, podpatrzone zresztą z MkAvrCalkulatora ;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

natomiast w pliku MBI5040.c mam zdefiniowaną tablicę w pamięci flash, więc muszę do niego dołączyć pgmspace.h.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W pliku main.c korzystam z makra, więc muszę do niego również dołączyć pgmspace.h, bo jeśli tego nie zrobię to dostaję błąd:
Kod:
main.c:(.text+0x5e): undefined reference to `pgm_read_word'
main.c:(.text+0x76): undefined reference to `pgm_read_word'
main.c:(.text+0x8e): undefined reference to `pgm_read_word'
make: *** [MBI_TEST.elf] Error 1

Chodzi mi o to, że korzystając z mojej biblioteki muszę pamiętać o tym, żeby dołączyć również pgmspace.h a chciałbym, żeby to następowało automatycznie wraz z dołączeniem mojej biblioteki, tylko nie wiem jak to zrobić poprawnie.

Co do MkAvrKalkulatora, to bardzo łatwo można rozszerzyć jego funkcjonalność o korekcję opartą o model CIELab. W razie czego chętnie służę pomocą.
Pozwolę sobie jeszcze odnieść się do przytoczonego tekstu na blogu, gdzie załączone są charakterystyki prądowo-napięciowe diod LED. Owszem są one nieliniowe, ale przy użyciu PWM do regulacji jasności korzystamy zwykle ze źródła prądowego do zasilania diod (ewentualnie rezystora), więc jej jasność zależy tylko i wyłącznie od współczynnika wypełnienia PWM (pomijam wpływ zmian temperatury złącza, przy małych diodach i prądach jest pomijalny). Tak więc korekcję gamma czy nie-gamma stosujemy nie dlatego, że dioda świeci nieliniowo a dlatego, że wzrok człowieka działa nieliniowo. ;)

Korzystam z 16 bitowego PWM z powodu tego, że przy 8 bitowym nie udawało mi się uzyskać ładnych przejść przy małych poziomach jasności. Wynika to z tego, że czułość oka ludzkiego na zmianę natężenia światła jest zależna od... samego natężenia ;) Chodzi o to, że bez problemu dostrzeżemy zmianę pomiędzy wypełnieniem np 2 a 12, natomiast zmiana pomiędzy 245 a 255 będzie trudna do zauważenia. Jest to szczegółowo opisane w drugim załączonym przeze mnie linku. W dużym uproszczeniu: obserwator zauważa zmianę natężenia jeżeli wynosi ona 1/64 pierwotnego natężenia (wartości tego ułamka są różne w zależności od źródła).
Moja korekcja jest o tyle przyjazna, że użyłem 256-elementowej tablicy, więc w efekcie użytkownik korzysta z niej jak z normalnego 8 bitowego PWM, tyle że już skorygowanego :)
Jeszcze małe porównanie (zawęziłem specjalnie zakres żeby było widać różnicę):
Obrazek
Napisałem kiedyś prosty kod testowy do obserwowania wpływu ilości bitów PWM na płynność zapalania się diody (symulacja bezwładności włókna żarówki). Jak go znajdę i posprzątam to dołączę, każdy będzie mógł się pobawić, bo wykorzystuje PWM sprzętowy na timerze.

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lip 2014, o 11:58 
Offline
Moderator
Avatar użytkownika

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

Federerer napisał(a):
Chodzi mi o to, że korzystając z mojej biblioteki muszę pamiętać o tym, żeby dołączyć również pgmspace.h a chciałbym, żeby to następowało automatycznie


No to dobrze że musisz pamiętać - tak się programuje w C, gdy trzeba to dołączasz biblioteki ... bo sam sobie wyjaśniłeś, że skoro korzystasz z makr, które korzystają z kolei z pgm_read_xxx() no to chyba oczywiste że musisz podciągnąć tą bibliotekę

nie chcesz jej podciągać ? ;) zastąp sobie makra funkcjami w bibliotece i wtedy się okaże że nie musisz w main.c podciągać - sprawa jak widzisz dość prosta

------------------------ [ Dodano po: 9 minutach ]

Federerer napisał(a):
Tak więc korekcję gamma czy nie-gamma stosujemy nie dlatego, że dioda świeci nieliniowo a dlatego, że wzrok człowieka działa nieliniowo.


Tak to słuszna uwaga.

Federerer napisał(a):
użyłem 256-elementowej tablicy, więc w efekcie użytkownik korzysta z niej jak z normalnego 8 bitowego PWM


no ale każdy element 16-bitowy więc tablica i tak puchnie dwa razy - nie mniej jednak zdecydowanie zgadzam się z tym, że jeśli JUŻ chcieć robić fajne efekty to nie ma co żałować na pamięci Flash bo i tak wrzucamy ją do flasha ;) a cóż to jest dla procka zmieścić 1,5kb tablic ;) ....

Federerer napisał(a):
Jeszcze małe porównanie (zawęziłem specjalnie zakres żeby było widać różnicę):


No tym suwakiem w MkAvrCalculator można sobie jak widać regulować sobie krzywą współczynnika korekcji gamma - ale dla CIElab .. trzeba by było rzeczywiście użyć innego wzoru ...

Federerer napisał(a):
Co do MkAvrKalkulatora, to bardzo łatwo można rozszerzyć jego funkcjonalność o korekcję opartą o model CIELab. W razie czego chętnie służę pomocą.


No jeśli się tym już jak widać sporo pobawiłeś i zbadałeś (mi zabrakło wcześniej czasu na CIElab a gamma też dawał radę) ... to oczywiście chętnie skorzystam z sugestii jeśli jakieś masz i wrzucę też do MkAvrCalca jak dam radę ... wtedy wszyscy będziemy mieli do dyspozycji dwa rodzaje korekcji w razie czego ;)

_________________
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: 12 lip 2014, o 12:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

mirekk36 napisał(a):
Federerer napisał(a):
nie chcesz jej podciągać ? ;) zastąp sobie makra funkcjami w bibliotece i wtedy się okaże że nie musisz w main.c podciągać - sprawa jak widzisz dość prosta

No i to jest właśnie to na co nie wpadłem, dzięki! :) Choć z drugiej strony makra powinny działać szybciej... Czyli coś za coś. ;)

Cytuj:
No jeśli się tym już jak widać sporo pobawiłeś i zbadałeś (mi zabrakło wcześniej czasu na CIElab a gamma też dawał radę) ... to oczywiście chętnie skorzystam z sugestii jeśli jakieś masz i wrzucę też do MkAvrCalca jak dam radę ... wtedy wszyscy będziemy mieli do dyspozycji dwa rodzaje korekcji w razie czego


W takim razie jak znajdę chwilę to dopisze komentarze i wrzucę plik excela z obliczeniami.

_________________
Pozdrawiam, Adrian.



Ostatnio edytowano 12 lip 2014, o 12:58 przez Federerer, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lip 2014, o 12:46 
Offline
Moderator
Avatar użytkownika

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

Federerer napisał(a):
Choć z drugiej strony makra powinny działać szybciej... Czyli coś za coś.


Wiesz tu szybkość to byłaby istotna może dopiero wtedy gdybyś chciał robić sobie na tych LED'ach ekran RGB ;) a tak ?

a tak to uwierz że różnice żadne a zawsze masz jeszcze trzecie wyjście ;) podpowiem

zrobić funkcje INLINOWE zamiast tych makr, ale pamiętasz mam nadzieję, że ciała tych funkcji jeśli chodzi o C umieszczamy w plikach *.h a nie źródłowych *.c

_________________
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: 12 lip 2014, o 13:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Znów podpowiedź w sam raz, bo właśnie zrobiłem funkcję inline myślę dlaczego mi nie działa - dałem ciało funkcji oczywiście w pliku .c zamiast .h ;) W przypadku funkcji static inline które już tam miałem wszystko działa, ale to pewnie dlatego, że one nie przyjmują żadnych argumentów z pliku main ani nic tam nie zwracają (dlatego dałem static)?

Edit:

Czy w takim razie pgmspace.h dołączam również w pliku .h?

_________________
Pozdrawiam, Adrian.



Ostatnio edytowano 12 lip 2014, o 13:21 przez Federerer, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lip 2014, o 13:21 
Offline
Moderator
Avatar użytkownika

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

static dla funkcji po pierwsze powoduje że staje się ona widoczna TYLKO w ramach tego pliku *.c a to powoduje że jest inaczej traktowana przez kompilator i czasem nawet może zostać zinlinowana ;) ... to już jak kompilatorowi wygodniej ...

_________________
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: 12 lip 2014, o 13:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Czyli dokładnie to co chciałem uzyskać, nie widzę tych funkcji w pliku main.c korzystając z autouzupełniania. Tak trochę jak private w klasach w C++

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

Pytanie, czy jest poprawnie? ;)

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lip 2014, o 13:54 
Offline
Moderator
Avatar użytkownika

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

jeśli się wszystko kompiluje ładnie bez warningów to tak - jest poprawnie ;)

_________________
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: 12 lip 2014, o 14:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Wersja z makrami też działa, i nawet daje ten sam rozmiar kodu co użycie funkcji inline, co jest w sumie logiczne,oczywiście pod warunkiem dołączenia pgmspace.h w pliku MBI504.h, który przecież jest dołączany zarówno do main.c jak i MBI5040.c, więc tam już nie trzeba dołączać.


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

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lip 2014, o 12:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Załączam plik excela z wyliczeniami korekcji CIELab. Myślę, że wszystko jest dość czytelnie opisane. Dla chcących się pobawić, wpisujemy tylko rozdzielczość PWM w bitach w zielone pole i ewentualnie zmieniamy gammę dla porównania ;)

------------------------ [ Dodano po: 1 minucie ]

Machnąłem małą literówkę, powinno być "L* [0-100]" zamiast "L* [1-100]" ale to detal ;)


Załączniki:

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

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2014, o 22:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Cytuj:
Napisałem kiedyś prosty kod testowy do obserwowania wpływu ilości bitów PWM na płynność zapalania się diody (symulacja bezwładności włókna żarówki). Jak go znajdę i posprzątam to dołączę, każdy będzie mógł się pobawić, bo wykorzystuje PWM sprzętowy na timerze.


Wystarczy u góry w definicji wpisać sobie ilość bitów (maksymalnie 16), skompilować (pisane na atmegę8, na inne procesory może wymagać przeróbek) i można po podłączeniu diody pomiędzy PB2 i masę się pobawić, uzyskując jakiś tam kompromis pomiędzy częstotliwością migotania a płynnością zmian jasności. Stałe czasowe dobrałem analizując zachowanie żarówki do kierunkowskazów, można zmienić. Kod:

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

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2014, o 18:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Udało się w końcu polutować i przetestować jedną płytkę testową. ;)
Obrazek

Obok miga sobie mała płyteczka z STM32F030, która będzie docelowo tym sterować i komunikować się przez dwuprzewodową sieć. Teraz tylko zostało zlutować kilka takich kompletów, żeby było z czego tą sieć stworzyć. Dorzucam jeszcze aktualny kod biblioteki, wciąż w fazie beta.
P.S. Płytek mam nadmiar, więc mogę się podzielić ;)
Załącznik:
MBI5040_lib.zip


Załączniki:

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

_________________
Pozdrawiam, Adrian.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 8 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