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):
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.
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...
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
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
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
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
Akurat ten przykład z taką końwersją to nawet w Bluebooku pokazuję ale pewnie umknęło w gąszczu informacji
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.
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 ....
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
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 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.
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.
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. 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... A może to dobry temat, żeby je opanować
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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