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



Teraz jest 24 lis 2024, o 06:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 24 ] 
Autor Wiadomość
PostNapisane: 18 paź 2013, o 23:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Cześć

Wszyscy znamy wyświetlacze 7 segmentowe. Mimo prostoty ich konstrukcji, w sumie łopatologicznego sterowania ich obsługa programowa wcale nie jest taka prosta. Przynajmniej dla mnie. W moim odczuciu dużo prościej jest wziąć HD47780, dobra biblioteka i sprawa jest załatwiona.
No nie mniej jednak wyświetlacze LED są w wielu miejscach niezastąpione.

Może opis się komuś przyda :)


Ostatnie poradniki Mirka dotyczące rejestrów przesuwnych natchnęły mnie do tego by pokusić się o sterowanie 8-mio pozycyjnym wyświetlaczem LED przy użyciu 3 pinów MCU. W planach mam również LED 16-seg, ale nie mam jeszcze samych wyświetlaczy (wyglądają niesamowicie fajnie, jak w starych flipperach). :)
W wyniku owego "natchnienia" powstał twór (na płytce uniwersalnej). Zawiera MCU, oraz trzy rejestry 74595 (trzy są pod kątem 16-seg).
Schemat jest następujący (bez części MCU):
Obrazek

Ostatecznie nie udało mi się dostać układu UDN więc zastosowałem 8 oddzielnych tranzystorów PNP BC327
W układzie rzeczywistym dopięty jest w kaskadzie jeszcze trzeci rejestr, ale aktualnie nie używany.
Wyświetlacze są ze wsp. anodą (2 x 4 cyfry). Zarówno anody (przez PNP) jak i segmenty sterowane są oczywiście stanem niskim.

Dane do rejestrów wysyłam przez sprzętowe SPI. Są to za każdym razem dwa bajty. Pierwszym bajtem jest informacja o stanie anod, a drugim informacja o stanie segmentów. Po przesłaniu następuje "kłapnięcie" latchem. Wejście latch jest połączone razem więc za każdym razem zatrzaśnięte są jednocześnie dwa bajty. Używam nieco zmodyfikowanej funkcji Mirka.



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



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


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.


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


Napotkałem jednak trzy problemy:
1. sterowanie 8 anodami powoduje, że powstał problem przy użyciu mechanizmu z Bluebooka. Ostatnia wartość przy przesuwaniu bitu to 128. Następny krok to 256 czyli przekracza wartość jednobajtową. Więc nie mogłem zrobić porównania if(anoda>128) anoda=1; Poradziłem sobie tablicą z 9-cioma elementami.

2. Nie wiem czemu ale próba użycia tablic zapisanych w progmem nie działa. Zrobię później filmik i pokażę o co chodzi.

3. Zastanawiam się jak w prosty sposób konwertować liczbę na poszczególne cyfry do przesyłania na odpowiednie pozycje.
Przychodzi mi do głowy tylko używanie kaskady dzieleń z resztą przez kolejno zmniejszające się potęgi liczby 10. Ale może jest jakaś inna, prostsza metoda...

Na koniec filmik przedstawiający pracujący układ :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2013, o 23:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Projekt programistyczny to brzmi dumnie :P Jak najbardziej jestem za, choć nie sądziłem, że można to nazwać projektem :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2013, o 23:47 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
1. sterowanie 8 anodami powoduje, że powstał problem przy użyciu mechanizmu z Bluebooka. Ostatnia wartość przy przesuwaniu bitu to 128. Następny krok to 256 czyli przekracza wartość jednobajtową. Więc nie mogłem zrobić porównania if(anoda>128) anoda=1; Poradziłem sobie tablicą z 9-cioma elementami.


Nie mogłeś użyć zmiennej 16-bitowej ? w ty momencie ? to by rozwiązało chyba sprawę.

sq8dsr napisał(a):
2. Nie wiem czemu ale próba użycia tablic zapisanych w progmem nie działa


działa działa ;) ale żeby pomóc to musiałbyś pokazać w kodzie co próbowałeś robić i jakie błędy ci wyskakiwały

sq8dsr napisał(a):
3. Zastanawiam się jak w prosty sposób konwertować liczbę na poszczególne cyfry do przesyłania na odpowiednie pozycje.
Przychodzi mi do głowy tylko używanie kaskady dzieleń z resztą przez kolejno zmniejszające się potęgi liczby 10. Ale może jest jakaś inna, prostsza metoda.


napisać na to jedną krótką funkcję formatującą dane do tablicy i to jeszcze z możliwością np pokazywania zer nieznaczących albo bez pokazywania

.... bardzo fajne ćwiczenia - ten projekt ;) bardzo fajne

_________________
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: 19 paź 2013, o 00:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

mirekk36 napisał(a):
Nie mogłeś użyć zmiennej 16-bitowej ? w ty momencie ? to by rozwiązało chyba sprawę.

Hmmm myślałem o tym. Ale później musiałbym chyba zrobić rzutowanie na typ 8 bit ?


mirekk36 napisał(a):
działa działa ale żeby pomóc to musiałbyś pokazać w kodzie co próbowałeś robić i jakie błędy ci wyskakiwały

Zaraz wrzucę filmik. Bo inaczej tego nie jestem w stanie opisać. W kodzie jest tylko zmiana polegająca na dodaniu PROGMEM w definicji tablicy.

mirekk36 napisał(a):
napisać na to jedną krótką funkcję formatującą dane do tablicy i to jeszcze z możliwością np pokazywania zer nieznaczących albo bez pokazywania

No właśnie, ale chyba przez takie dzielenie jak opisałem...

Antystatyczny napisał(a):
Hmm... i mam pewien pomysł na poprawienie obsługi wyświetlacza...

A to bardzo ciekawy jestem jaki to pomysł :)


EDYCJA:

Oto filmik:

Jak widać część znaków ma niewłaściwą konfigurację segmentów. Zmiana dotyczyła tylko umieszczenia PROGMEM w definicjach, np:
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: 19 paź 2013, o 11:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Napisałem takiego oto potwora. :P
Funkcja do konwersji liczby na poszczególne pozycje wyświetlacza z wygaszeniem zer wiodących.

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


Wiem, że wygląda strasznie, ale na razie nic innego nie przyszło mi do głowy :P

Edycja:
Pozycja pusta (bez zera wiodącego) uzyskana jako dodatkowa definicja znaku (0xFF)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2013, o 11:41 
Offline
Moderator
Avatar użytkownika

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

ja bym proponował ci użyć czegoś prostszego - znacznie prostszego jeśli chodzi o tą monstrualną funkcję ;)

jest sobie taka znana ci pewnie wbudowana funkcja itoa() zgadza się ;)

owszem ona zamienia liczbę na string ... no ale robi to jedną linijką i po zawodach

teraz wystarczy każdy znak stringa czyli CYFRĘ w ASCII zamienić na liczbę ;) to już banał, załóżmy że masz zamienioną liczbę ASCII w buforze

char liczba[9]; // jeden znak dodatkowy na zero na końcu stringa

stwórz sobie przy okazji tablicę cyfr skoro już masz ich tyle

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


zamiast cy1, cy2, cy3 itd

i potem

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


i po zawodach panie ;)

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

tzn no musisz jeszcze uwzględnić te zera nieznaczące w tej pętli tzn przed nią ew dodać do stringa z liczba[] te zera nieznaczące albo swoje puste znaki 0xff

ale mam nadzieję że już czujesz o co kaman ;)


Autor postu otrzymał pochwałę

_________________
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: 19 paź 2013, o 15:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Nie bardzo rozumiem ten zapis, -> -'0'
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: 19 paź 2013, o 18:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

hmm tak wiem, że znak '0' w asci ma kod 48.
Znaki kolejnych cyfr są następne w kolejności, więc odjęcie od nich 48 da wartość liczbową danej cyfry. No faktycznie....
Ale nie przyszłoby mi do głowy, że można to tak zapisać, że stałą dosłowną 48 można zastąpić wartością char :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2013, o 18:58 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
hmm tak wiem, że znak '0' w asci ma kod 48.
Znaki kolejnych cyfr są następne w kolejności, więc odjęcie od nich 48 da wartość liczbową danej cyfry. No faktycznie....
Ale nie przyszłoby mi do głowy, że można to tak zapisać, że stałą dosłowną 48 można zastąpić wartością char :P


Akurat ten przykład z taką końwersją to nawet w Bluebooku pokazuję ale pewnie umknęło w gąszczu informacji ;)

_________________
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: 19 paź 2013, o 23:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

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


Tak to teraz wygląda.
konwersja przez itoa/ltoa spowodowała, że zawartość wyświetlacza jest wyrównana "do lewej" czyli problem zer wiodących sam się rozwiązał bo przy takim formatowaniu one w ogóle nie występują. :)
Jak widać dodałem do funkcji warunek. Ponieważ gdy konwertowana liczba jest krótsza niż 8 pozycji to do tablicy liczba[] na dalsze, nieużywane pozycje lądują "zera" następnie wykonuje się na nich operacja " -'0' " i na wyświetlaczu tworzy się w pustym miejscu krzak. Warunek powoduje, że wartość "zero" (nie '0') wpisywana jest do cy[i] jako znak nr 16 który u mnie jest 0xFF czyli wygaszeniem wszystkich segmentów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2013, o 23:27 
Offline
Moderator
Avatar użytkownika

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

to nie magiczna konwersja ;) to "fajność" języka C, że tak się mało poprawnie wyrażę. Pamiętam gdy się go uczyłem po raz któryś - to takie sztuczki - jak je zobaczyłem - przekonały mnie do niego na maxa i wiedziałem, że trzeba szukać kolejnych ... że "tuż za rogiem" czekają następne i się nie przeliczyłem .... zresztą do dzisiaj je znajduję. Anty także ... i każdy kto się tylko za to dalej weźmie to zobaczy, że to kurczę działa ....

_________________
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: 19 paź 2013, o 23:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Cytuj:
Odrobinkę przebudowując pętlę for mozna tez równac do prawej

hmm muszę nad tym pomyśleć...

Podobnie jak nad obsługą decimal point

O ile moja asystentka mi pozwoli :P
Obrazek

------------------------ [ Dodano po: 3 minutach ]

mirekk36 napisał(a):
to nie magiczna konwersja

Kod musi być odpowiednio komentowany :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2013, o 23:35 
Offline
Moderator
Avatar użytkownika

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

sq8dsr --> oddawaj mojego kota :) ... o dżizes - skąd masz KLONA mojego kota tzn też kotki .... normalnie idealny klon ... aż rodzinie pokazałem zdjęcie i każdy od razu powiedział że to nasza "psota" bo tak się nasz klon nazywa :lol:

_________________
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: 19 paź 2013, o 23:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

No moja się nazywa Mruka. Ma 4 lata. wychowana na butelce, była jeszcze ślepa. Ma zamiłowanie do elektroniki, uwielbia te wielką diodę RGB, spi na niej, ale tylko wtedy gdy się świeci. Poza tym wyciąga mi ciągle kable ze stykówki. I to nie pierwsze lepsze. Na stykówce jest zrobiony zegar, wyciąga zawsze kable sterujące anodami :P
Gdy była całkiem mała, spała w pudełku, żeby nie było jej zimno bo taki mały kot potrzebuje ciepła, dałem jej do pudełka lampę EL84 z podłączonym żarzeniem, przez pierwsze tygodnie na niej spała. Pewnie od tego ma teraz zamiłowanie do elektroniki. :P
ObrazekObrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2013, o 01:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sie 2013
Posty: 137
Lokalizacja: śląskie
Pomógł: 13

Witam.

Ha,ha Kolego nie zły Jesteś ;) ,w życiu bym nie wpadł na taki pomysł żeby zwierzątku zainstalować takie CO :lol:

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2013, o 23:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Popracowałem trochę i odpaliłem na shiftowanym wyświetlaczu zegarek:
Przy okazji taka mała koncepcja animacji podczas wyświetlania godziny. Chciałem żeby jakoś odróżniało się od daty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 paź 2013, o 03:16 
Offline
Moderator
Avatar użytkownika

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

no i bardzo ładnie śmiga na SPI ;) i to jeszcze z efektami ;)

_________________
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: 24 paź 2013, o 13:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Tak, bardzo fajna sprawa z tym sterowaniem wyśw. przez SPI. Niesamowicie upraszcza. Zamawiam właśnie wyświetlacze 14 seg. :P
Ale na razie staram się jakoś fajnie oprogramować PCF 8583. Bardzo fajną obsługę oczywiście zrobił Anty, ale nie wiem czy dorosłem już do stosowania callbaków... :P
A może to dobry temat, żeby je opanować :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 paź 2013, o 13:55 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
A może to dobry temat, żeby je opanować


Oczywiście! ;)

_________________
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 paź 2013, o 18:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Obrazek

No to teraz pora na 14-SEG :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2013, o 21:59 
Offline
Moderator
Avatar użytkownika

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

to będzie się działo :lol:

_________________
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: 1 gru 2017, o 00:50 
Offline
Użytkownik

Dołączył(a): 20 lut 2013
Posty: 166
Pomógł: 0

Cytuj:
Odrobinkę przebudowując pętlę for mozna tez równac do prawej


;) Zrobiłem to w taki nieco chyba zbyt rozbudowany sposób, działa ale może da się to zrobić prościej :) ?

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: 1 gru 2017, o 00:59 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Czyżby dzisiaj był dzień górnika?

Wysłane ze srajfona

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2017, o 01:11 
Offline
Użytkownik

Dołączył(a): 20 lut 2013
Posty: 166
Pomógł: 0

Barbórka za pasem w sumie :D A serio to szkoda zakładać kolejnego wątku w tym samym temacie



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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