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



Teraz jest 10 lip 2025, o 16:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 23 kwi 2014, o 18:38 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

Witam,

Czy istnieje możliwość, aby przesłać jeden bajt do rejestru przesuwnego, a potem przesłać drugi bajt bez zaczepiania tego, co było w pierwszym rejestrze. Mianowicie chodzi mi o podłączenie wyświetlacza 7 segmentowego poprzez właśnie tej układ (74HC595), a mój problem polega na tym, że nie mogę skleić dwóch wartości heksadecymalnych dla setek i dziesiątek do jednego przesyłu danych.
Czyli chodzi o to, żeby najpierw przesłać setki, potem dziesiątki nie zmieniając ilości setek itd.
oto kawałek kodu odpowiedzialnego za transmisję SPI:
Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 18:55 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

No coś Ty. To jest rejestr przesuwny. Wsuwanie danych przepycha te co już w nim są. A bynajmniej ja to tak rozumuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 19:02 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

matrix napisał(a):
No coś4 Ty. To jest rejestr przesuwny. Wsuwanie danych przepycha te co już w nim są. A bynajmniej ja to tak rozumuję.

A wie ktoś może jak zlepić ze sobą trzy wartości hex w jedną i wysłać jako argumeng funkcji SPI_Send_8()?
Np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

DamCos napisał(a):
A wie ktoś może jak zlepić ze sobą trzy wartości hex w jedną

Ja bym to zrobił za pomocą struktury i unii w ten sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Działa to w ten sposób, że tablica tab[3] i zmienne setki, dzies i jedn nakładają się na siebie. Jeśli do tych zmiennych wpiszesz jakieś wartości to te same wartości będą miały poszczególne komórki tablicy.
Teraz tylko wystarczy do zmiennych przypisywać wartości, jakie maja się wyświetlać na wyświetlaczu a do rejestrów przesuwnych wysyłać po kolei zawartość tablicy.

Zmienne i tablica będą się nakładać w ten sposób:
tab[0] == setki
tab[1] == dzies
tab[2] == jedn



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 20:28 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
A wie ktoś może jak zlepić ze sobą trzy wartości hex w jedną i wysłać jako argumeng funkcji SPI_Send_8()?


Panowie, ale co za problem trzy razy wywołać tę funkcję z kolejnym argumentem ? wtedy nie ważne czy chcesz wysłać 3, 4 czy może i 27 bajtów

_________________
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: 23 kwi 2014, o 20:39 
Offline
Użytkownik
Avatar użytkownika

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

Nie wiem jaki wyświetlacz. Ale ja to robię tak:
Wysyłam dwa bajty:
1: wzorzec bitowy dla cyfry na wyświetlaczu (to jest jeden bajt)
2. wzorzec bitowy dla zapalenia odpowiedniej anody (też jeden bajt)
Wyświetlacz jest 7seg przy ośmiu pozycjach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 07:17 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

sq8dsr napisał(a):
Nie wiem jaki wyświetlacz. Ale ja to robię tak:
Wysyłam dwa bajty:
1: wzorzec bitowy dla cyfry na wyświetlaczu (to jest jeden bajt)
2. wzorzec bitowy dla zapalenia odpowiedniej anody (też jeden bajt)
Wyświetlacz jest 7seg przy ośmiu pozycjach.

Chodzi mi o wyświetlacz 7 segementowy. Ósma jest kropka :)
Jeśli mam podłączone segmenty wyswietlacza od A do H razem z wyjsciami rejesteu od Qa do Qh więc przesyłanym bajtem będzie kombinacja zapalania anod wyświetlacza. Tyle, że każda liczba musi byc niezależna, bo jeśli mogę na potrójny wyświetlacz wpisać max. 999 to nie będę pisał 999 kombinacji, tylko 10 dla kazdej cyfry.
A druga sprawa to to, że nawet jak skleję te liczby hex np. Do postaci 6D077F (na wyświetlaczu pojawi się 578) to przecież muszę wysłać SPI_Send_8(0x6D077F). Więc jak dołożyć prefix "0x"
Czy w jakiejś bibliotece typu stdlib.h jest narzędzie do konwersji systemów liczbowych?

+mirekk36
Czyli mogę wysłać 0x00007F, potem 0x0007 a potem 0x6D?

Jestem początkujący i jeszcze ten temat nie jest do końca jasny.

Pozdrawiam :)

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 08:24 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Jak masz 3 układy 595 połączone szeregowo to rozwijasz to w taki sam sposób jak z SPI_Send_8 powstało SPI_Send_16. 0x6D077F to kolejne wysłanie (uint8_t)0x006D077F = 0x7F potem (uint8_t)(0x006D077F>>8) = (uint8_t)0x00006D07 = 0x07 i (uint8_t)(0x006D077F>>16) = (uint8_t)0x0000006D = 0x6D. Jak temat liczb nie jest do końca jasny to zajrzyj do poradników Mirka np. http://www.mirekk36.blogspot.com/2014/0 ... malne.html

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 08:59 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

Krauser napisał(a):
Jak masz 3 układy 595 połączone szeregowo to rozwijasz to w taki sam sposób jak z SPI_Send_8 powstało SPI_Send_16. 0x6D077F to kolejne wysłanie (uint8_t)0x006D077F = 0x7F potem (uint8_t)(0x006D077F>>8) = (uint8_t)0x00006D07 = 0x07 i (uint8_t)(0x006D077F>>16) = (uint8_t)0x0000006D = 0x6D. Jak temat liczb nie jest do końca jasny to zajrzyj do poradników Mirka np. http://www.mirekk36.blogspot.com/2014/0 ... malne.html

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



Ok, popróbuje wszystkich podanych sposobów i zobaczę

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 14:03 
Offline
Użytkownik
Avatar użytkownika

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

DamCos napisał(a):
Tyle, że każda liczba musi byc niezależna, bo jeśli mogę na potrójny wyświetlacz wpisać max. 999 to nie będę pisał 999 kombinacji, tylko 10 dla kazdej cyfry.


A jak będziesz miał 8 pozycji wyświetlacza?
To dasz 8 rejestrów do każdego?
No pewnie, że można tak zrobić. Tylko, że to straszna komplikacja układu. A jak pozycji będzie jeszcze więcej...

Wiesz co to multipleksowanie?
Na 2 sztukach 74595 możesz obsłużyć osiem wyświetlaczy 7 seg. Jeden rejestr dajesz na wspólne anody (osiem wyświetlaczy = osiem wyjść rejestru). Drugi dajesz na segmenty (8 segmentów A do H = 8 wyjść rejestru.)
Rejestry łączysz w kaskadę

Najpierw wysyłasz kod znaku (cyfry). Trafia on do pierwszego rejestru (tego od wspólnych anod) i go zapełnia. NIE AKTYWUJESZ ZASTRZASKU. Tylko szybciutko wysyłasz drugi bajt (ten który zawiera informację o włączonej anodzie 1 z 8). Jako, że rejestry połączone są w kaskadę Pierwszy bajt, który jest już pierwszym rejestrze, zostaje przez następny bajt przesunięty do drugiego rejestru. Dzięki temu mamy sytuację o którą nam chodzi. W rejestrze pierwszym mamy informację, która wspólna anoda jest aktywna, a wzorzec cyfry mamy w drugim rejestrze (tym który steruje segmenty). Teraz nadszedł czas na "kłapnięcie" zatrzaskiem OBU rejestrów jednocześnie. Na wyjściach kostek pojawiają się oczekiwane przez nas stany logiczne. Wyświetlacz zostaje wysterowany.
Ale nie cały. Tylko jedna jego pozycja. Następnie operację powtarzamy dla kolejnej pozycji. Wysyłamy odpowiadający jej kod znaku (cyfry) i bajt zapalający kolejną anodę (jednocześnie gaszący tę która jest aktywna obecnie). Aktywujemy zatrzask i na kolejnej pozycji pojawia się kolejna cyfra. Powtarzamy te operację tyle razy ile mamy pozycji wyświetlacza. Po osiągnięciu ostatniej pozycji wracamy na pierwszą. I tak w kółko.
Oczywiście pełny cykl mus być wykonany przynajmniej 25 razy na sekundę. Wtedy, dzięki bezwładności oka, zobaczymy palącą się na odpowiedniej pozycji odpowiednią cyfrę.

W Blue booku masz dokładnie opisany mechanizm multipleksowania. Co prawda bez rejestrów przesuwnych, ale to w sumie tylko drobne ulepszenie. Prześledź ten mechanizm, bo poza obsługą SPI, jest to dokładnie do samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 14:24 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

sq8dsr napisał(a):
DamCos napisał(a):
Tyle, że każda liczba musi byc niezależna, bo jeśli mogę na potrójny wyświetlacz wpisać max. 999 to nie będę pisał 999 kombinacji, tylko 10 dla kazdej cyfry.


A jak będziesz miał 8 pozycji wyświetlacza?
To dasz 8 rejestrów do każdego?
No pewnie, że można tak zrobić. Tylko, że to straszna komplikacja układu. A jak pozycji będzie jeszcze więcej...

Wiesz co to multipleksowanie?
Na 2 sztukach 74595 możesz obsłużyć osiem wyświetlaczy 7 seg. Jeden rejestr dajesz na wspólne anody (osiem wyświetlaczy = osiem wyjść rejestru). Drugi dajesz na segmenty (8 segmentów A do H = 8 wyjść rejestru.)
Rejestry łączysz w kaskadę

Najpierw wysyłasz kod znaku (cyfry). Trafia on do pierwszego rejestru (tego od wspólnych anod) i go zapełnia. NIE AKTYWUJESZ ZASTRZASKU. Tylko szybciutko wysyłasz drugi bajt (ten który zawiera informację o włączonej anodzie 1 z 8). Jako, że rejestry połączone są w kaskadę Pierwszy bajt, który jest już pierwszym rejestrze, zostaje przez następny bajt przesunięty do drugiego rejestru. Dzięki temu mamy sytuację o którą nam chodzi. W rejestrze pierwszym mamy informację, która wspólna anoda jest aktywna, a wzorzec cyfry mamy w drugim rejestrze (tym który steruje segmenty). Teraz nadszedł czas na "kłapnięcie" zatrzaskiem OBU rejestrów jednocześnie. Na wyjściach kostek pojawiają się oczekiwane przez nas stany logiczne. Wyświetlacz zostaje wysterowany.
Ale nie cały. Tylko jedna jego pozycja. Następnie operację powtarzamy dla kolejnej pozycji. Wysyłamy odpowiadający jej kod znaku (cyfry) i bajt zapalający kolejną anodę (jednocześnie gaszący tę która jest aktywna obecnie). Aktywujemy zatrzask i na kolejnej pozycji pojawia się kolejna cyfra. Powtarzamy te operację tyle razy ile mamy pozycji wyświetlacza. Po osiągnięciu ostatniej pozycji wracamy na pierwszą. I tak w kółko.
Oczywiście pełny cykl mus być wykonany przynajmniej 25 razy na sekundę. Wtedy, dzięki bezwładności oka, zobaczymy palącą się na odpowiedniej pozycji odpowiednią cyfrę.

W Blue booku masz dokładnie opisany mechanizm multipleksowania. Co prawda bez rejestrów przesuwnych, ale to w sumie tylko drobne ulepszenie. Prześledź ten mechanizm, bo poza obsługą SPI, jest to dokładnie do samo.

Masz rację, dlatego ograniczam się tylko do 3 wyświetlaczy :D Spoko, bbulebooka mam, wciąż sie uczę :)

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 14:28 
Offline
Użytkownik
Avatar użytkownika

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

DamCos napisał(a):
Masz rację, dlatego ograniczam się tylko do 3 wyświetlaczy


Czyli rozumiem, że chcesz zrobić 3 pozycyjny (000 -> 999) wyświetlacz NIEMULTIPLEKSOWANY.
Jeśli ma być bez multipleksowania to faktycznie 3 rejestry (jeden na każdą pozycję).

Napisz jeszcze czy wyświetlacze są WA czy WK



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 15:02 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

sq8dsr napisał(a):
DamCos napisał(a):
Masz rację, dlatego ograniczam się tylko do 3 wyświetlaczy


Czyli rozumiem, że chcesz zrobić 3 pozycyjny (000 -> 999) wyświetlacz NIEMULTIPLEKSOWANY.
Jeśli ma być bez multipleksowania to faktycznie 3 rejestry (jeden na każdą pozycję).

Napisz jeszcze czy wyświetlacze są WA czy WK


Wspólna katoda

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 15:32 
Offline
Użytkownik
Avatar użytkownika

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

Robisz tak:
Wspólne katody wyświetlaczy łączysz z masą (do GND bez rezystora, rezystory będą w obwodach segmentów)
Segmenty łączysz sobie z rejestrami, dla każdego disp oddzielnie:
QA -- rezystor -- segment A
QB -- rezystor -- Segment B
...
Dla każdego rejestru tak samo. Czyli mamy łącznie 24 połączenia przez 24 rezystory.


Tworzysz sobie tablice wzorów znaków (aktywny stan to stan WYSOKI)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Robimy funkcję do wysyłania przez SPI. (oczywiście wcześniej inicjujemy moduł SPI)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Czy rozumiesz ten przykład ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 18:59 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

sq8dsr napisał(a):
Robisz tak:
Wspólne katody wyświetlaczy łączysz z masą (do GND bez rezystora, rezystory będą w obwodach segmentów)
Segmenty łączysz sobie z rejestrami, dla każdego disp oddzielnie:
QA -- rezystor -- segment A
QB -- rezystor -- Segment B
...
Dla każdego rejestru tak samo. Czyli mamy łącznie 24 połączenia przez 24 rezystory.


Tworzysz sobie tablice wzorów znaków (aktywny stan to stan WYSOKI)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Robimy funkcję do wysyłania przez SPI. (oczywiście wcześniej inicjujemy moduł SPI)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Czy rozumiesz ten przykład ?


Tak, rozumiem :)

A jeśli chciałbym wysłać int funkcją np. Void led_write(int liczba); to muszę rozłożyć liczbę trzycyfrową na liczbę setek, dzies i jedności dla każdego pojedynczego wysw i ja to se wykombinowalem tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Są ro liczby int wiec myślę, że przecinki i ułamki zostaną zignorowane.

A jeśli liczba będzie dwucyfrowa to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teoretycznie wszystko powinno działać, mógłby ktoś z was sprawdzić to i ocenić?

_________________
Mam 16 lat, nie jestem zawodowcem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 kwi 2014, o 19:42 
Offline
Użytkownik
Avatar użytkownika

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

Dobrze kombinujesz.
Można taką konwersję zrobić na wiele sposobów np. używając funkcji div.
Albo jeszcze prościej co podpowiedział mi kiedyś oczywiście Mirek :) A co doceniłbyś np. przy konieczności konwersji liczby np 6 pozycyjnej.
Na razie zmontuj układ i zobacz jak działa, żeby nie wrzucać nadmiernie nowych tematów do tego zagadnienia ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 05:27 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 208
Lokalizacja: Białystok
Pomógł: 0

sq8dsr napisał(a):
Dobrze kombinujesz.
Można taką konwersję zrobić na wiele sposobów np. używając funkcji div.
Albo jeszcze prościej co podpowiedział mi kiedyś oczywiście Mirek :) A co doceniłbyś np. przy konieczności konwersji liczby np 6 pozycyjnej.
Na razie zmontuj układ i zobacz jak działa, żeby nie wrzucać nadmiernie nowych tematów do tego zagadnienia ;)

Ok, dzisiaj powinien już zapukać listonosz z brakującymi częściami i będę montował. Zobaczę jak działa. Do tego momentu dużo mi pomogliście za co bardzo wam dziękuję :)

_________________
Mam 16 lat, nie jestem zawodowcem ;)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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