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



Teraz jest 28 mar 2024, o 11:22


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 8 cze 2021, o 19:00 
Offline
Nowy

Dołączył(a): 25 kwi 2019
Posty: 6
Lokalizacja: Szczecin
Pomógł: 0

Witam wszystkich.
Postanowiłem założyć nowy wątek, bo temat przewija się przez forum od jakiegoś czasu, ale nie znalazłem konkretnej odpowiedzi.
Chodzi o kompleksowe sterowanie wyświetlaczy LED poprzez dwa rejestry przesuwne 74HC595, czyli katody i anody.
W oparciu o BB i poradniki Pana Mirka napisałem program z użyciem jednego rejestru (sterowanie katod przez SoftSpi), anody steruję z mikrokontrolera i wszystko działa prawidłowo. Problem pojawia się jak podłączę drugi rejestr kaskadowo, żeby sterować nim anody. Nie wiem jak to ogarnąć programowo, żeby wysłać dwa bajty za jednym razem poprzez SoftSpi. Mam podłączone dwa wyświetlacze 3-cyfrowe, docelowo chcę mierzyć napięcie na dwóch pinach mikrokontrolera i wyświetlać wartości na tych dwóch wyświetlaczach.
Jak wspominałem wcześniej, to wszystko działa jeśli anody steruję z mikrokontrolera.
Poniżej kawałek kodu z piku d_led.c.
Zakomentowałem wszystkie if-y żeby pokazać co działa. Jeśli do zmiennej „data” przypiszę na siłę np. 0xFFFF (starszy bajt anody, młodszy katody) to mam na wyjściu obu rejestrów stany wysokie, dla 0xFF00 na pinach rejestru od anod mam stany wysokie, na tym od katod - niskie, jakakolwiek inna kombinacja daje odpowiednie stany logiczne na poszczególnych pinach rejestrów. Mogę zapalać dowoli poszczególne cyfry i pojedyncze segmenty, więc hardware jest ok., komunikacja SoftSpi też działa.
Nie wiem co wpisać do kolejnych przerwań timera, żeby oprócz kodu cyfry, wysłać również odpowiednią komendę do rejestru sterującego anodami, czyli do starszego bajtu w słowie. Próbowałem różnych kombinacji i nic nie działa, prosiłbym o jakąś podpowiedź.
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: 9 cze 2021, o 20:59 
Offline
Nowy

Dołączył(a): 28 maja 2021
Posty: 21
Pomógł: 0

Ja to ogarnąłem tak, że podłączyłem dwa rejestry do dwóch wyświetlaczy jednocyfrowych tak jak mi było wygodnej. Oczywiście anody do anod a katodę do minusa. Trzeba dac oczywiście oporniki pomiędzy zależne od rodzaju led.
Programowo wygląda to tak , że dzięki uprzejmości pana Mirka mam zrobioną funkcję, która ogarnia wysyłanie czyli odpowiednio :

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


W tej funkcji pięknie dzieli się zmienną na dwa bajty. Jak by trzeba było wysłać trzy bajty dla trzech cyfr (wyświetlaczy) to wystarczy dopisać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Do tego mam zrobione dwie tablice z wartościami bitowymi dla cyfr od 0 do 9 dla każdego z wyświetlaczy.

Na koniec mam funkcję, która korzysta z tych tablic i odpowiednio w zależności od wartości przekazywanej do niej wyświetla odpowiednią wartość.
Jak widać i co oczywiste mogę wyświetlać wynik od 0 do 99.
Hej.

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


Czyli chodzi tylko o to, żeby zrobić sobie gotowe liczby, które potem się tylko łączy, wyrzuca na rejestry, włącza i wyłącza zatrzask i już.
PS. Też jestem początkujący.
hej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2021, o 20:27 
Offline
Nowy

Dołączył(a): 25 kwi 2019
Posty: 6
Lokalizacja: Szczecin
Pomógł: 0

Hej, dzięki za zainteresowanie moim problemem.
Z tego co widzę to masz sprzętowe SPI, ja działam na soft SPI a to nie do końca to samo.
Dzisiaj zrobiłem coś takiego; stworzyłem drugi interface softSpi i z niego steruję drugi rejestr przesuwny, dopiero jak wyśle oba bajty uruchamiam zatrzask, który steruje obydwoma rejestrami. W sumie osiągnąłem swój cel, bo zwolniły mi się cztery piny mikrokontrolera. Wszystko działa idealnie.
Twój kod wygląda dość ciekawie, będę miał trochę czasu w weekend to go przeanalizuję.
Poniżej wrzucam kawałek swojego kodu, może trochę prymitywny, ale robi swoją robote.
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: 12 cze 2021, o 07:55 
Offline
Nowy

Dołączył(a): 28 maja 2021
Posty: 21
Pomógł: 0

Czy sprzętowe Spi czy programowe to w sumie mało ważne. Zależy jakie możliwości, czy masz "gdzie robić" czyli czy masz wolne piny, czy chcesz zrobić coś nowego lub czy wykorzystać gotowe, kiedyś zrobione funkcje. W sumie to chyba najważniejsze jest żeby dobrze opisać kod i załapać się na tzw "dobre praktyki programistyczne" zwłaszcza jak robisz coś na zlecenie.
Swoją funkcję zrobiłem pół roku temu. Teraz napisałbym ją inaczej np. mam dwie tablice do cyfr bo mam różnie podpięte segmenty do rejestrów, gdyby zrobić to tak samo, zaoszczędziło by się kilka bajtów, program byłby prostszy i czytelniejszy.

Nie wiem, czy nie dało by się napisać Twojej wyliczanki przy pomocy funkcji for po to by się tyle nie powtarzać.

Hej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2021, o 14:44 
Offline
Nowy

Dołączył(a): 25 kwi 2019
Posty: 6
Lokalizacja: Szczecin
Pomógł: 0

Oczywiście, że kod napiszę inaczej. Mam taką zasadę, że jak coś uruchamiam po raz pierwszy, to piszę kod w najprostszej postaci, żeby sprawdzić czy ruszy, jak ruszy to potem dopiero optymalizuję. Często prototypuję na stykówkach, tam nie trudno o pomyłkę, jak coś przestaje działać to zawsze mogę wrócić do swojego prymitywnego kodu i przynajmniej wykluczyć czy to hardware czy software.



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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO