logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[avr] Jak wysłać 16-bitowe słowo do drivera LED bit po bicie w AVR?

kazeciak 28 Wrz 2008 22:08 2032 7
REKLAMA
  • #1 5580716
    kazeciak
    Poziom 15  
    Posty: 228
    Pomógł: 5
    Ocena: 24
    Witam!

    Raz na jakiś czas programuje uC Atmela, ale nigdy nie musiałem komunikować się z peryferiami w postaci innych układów.
    Aby za bardzo nie zagłębiać się w szczegóły, muszę wysłać do urządzenia 16bitowe słowo (driver wyświetlacza LED) i nie bardzo wiem, jak wysyłać bit po bicie. Oczywiście funkcje taktowania układu itd nie przedstawiają problemu.
    Aby zobrazować "problem" powiedzmy, że mamy w zmiennej "a" jakąś wartość, a stała "b" ma wartość "ramki" jaką trzeba wysłać do układu drivera, aby ten wiedział że o niego chodzi:


    a = odczyt_z_adc ;
    b = 0x0100 ;

    wg. mnie, powinno się to zsumować, czyli

    c = a | b ;

    i właśnie zmienna "c" wysłać na odpowiedni pin, tylko jak to zrobić bit po bicie ? zapewne napisać jakąś funkcję z pętlą, która to będzie realizowała tą wysyłkę, ale nie mam pojęcia jak "wybierać" kolejno pojedyncze bity.


    Zapewne istnieje jakieś banalne rozwiązanie, jednak jak już pisałem, pierwszy raz mam styczność z komunikacją szeregową (od podszewki rzecz jasna)

    Bardzo dziękuję i pozdrawiam,
    Marcin
  • REKLAMA
  • #2 5580745
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    Witam
    A jakiego inerfejsu zamierzasz użyć SPI, USART, I2C wszystkie one same dbają o wysyłanie kolejnych bitów.
    Myślę że musisz podać więcej szczegółw jeżeli chcesz pomocy.

    Pozdrawiam Piotr.
  • REKLAMA
  • #3 5580793
    kazeciak
    Poziom 15  
    Posty: 228
    Pomógł: 5
    Ocena: 24
    Dziękuję za zainteresowanie

    Generalnie, z tego co wyczytałem, to komunikacja może odbywać się "po" SPI, układ to MAX7219, ale protokół komunikacji jest bardzo prosty, więc pomyślałem aby iść po najniższej linii oporu i napisać to samemu.
    Prawdę mówiąc obawiałem się trochę zagłębiania w SPI czy I2C (z ostatnim "niestety" będę musiał mieć styczność w najbliższym czasie)

    Jeszcze raz dziękuję za zainteresowanie i mam nadzieję, że tym razem dostarczyłem odpowiednią ilość informacji.
  • #4 5580834
    KowalD
    Poziom 17  
    Posty: 290
    Pomógł: 13
    Ocena: 3
    kazeciak napisał:
    Generalnie, z tego co wyczytałem, to komunikacja może odbywać się "po" SPI, układ to MAX7219, ale protokół komunikacji jest bardzo prosty, więc pomyślałem aby iść po najniższej linii oporu i napisać to samemu.
    skoro spi to po najmniejszej linii oporu i do tego najladniej i najfajniej, a nawet najlepiej bedzie uzyc sprzetowego :)... raczej ciezko spotkac teraz jaki uC, ktory by nie posiadal (no chyba, ze jakies 8 nozkowce)... no i wtedy uklad juz sam sobie bit po bicie "wyluska" :)...
  • #5 5580857
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    Zdecydowanie polecam użycie sprzętowego SPI - to tylko kilka rejestrów.
    Pozdrawiam
  • REKLAMA
  • #6 5580899
    kazeciak
    Poziom 15  
    Posty: 228
    Pomógł: 5
    Ocena: 24
    Dzięki raz jeszcze

    ja muszę jednak sterować paroma układami i ten MAX jest jednym z nich, niby można dokonywać wyboru tych układów przez ustalenie odpowiedniego stanu na przeznaczonym do tego wyprowadzeniu, ale z tego co przed chwilą przeczytałem na Elektrodzie, potrafi się pojawić trochę problemów przy SPI.
    Podobnie zastanawiałem się, jak rozwiązuje się takie "przesuwanie" cyfr z liczby przy multipleksowaniu, kiedy mamy np 4 wyświetlacze 7-seg. i chcemy na nich wyświetlić liczbę 1234, w jaki sposób wysłać "1" na pierwszy wyświetlacz, "2" na drugi itd... myślę, że musi istnieć jakieś rozwiązanie tego problemu.
  • REKLAMA
  • #7 5580945
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    kazeciak napisał:

    ja muszę jednak sterować paroma układami i ten MAX jest jednym z nich, niby można dokonywać wyboru tych układów przez ustalenie odpowiedniego stanu na przeznaczonym do tego wyprowadzeniu
    i nie widzę problemu z wykorzystaniem do tego celu sygnału ~CS

    kazeciak napisał:

    Podobnie zastanawiałem się, jak rozwiązuje się takie "przesuwanie" cyfr z liczby przy multipleksowaniu, kiedy mamy np 4 wyświetlacze 7-seg. i chcemy na nich wyświetlić liczbę 1234, w jaki sposób wysłać "1" na pierwszy wyświetlacz, "2" na drugi itd... myślę, że musi istnieć jakieś rozwiązanie tego problemu.

    Przecież w słowie wysłanym do Max'a wysyłasz stan wyświetlacz i adres konkretnego wyświetlacza (jednego z ośmiu) - nic nie musisz przesuwać - podajesz co i gdzie się ma wyświetlić.

    Pozdrawiam
  • #8 5580987
    KowalD
    Poziom 17  
    Posty: 290
    Pomógł: 13
    Ocena: 3
    mnie znanym sposobem, choc na pewno wolnym jest branie reszty z dzielenia przez 10 (np. x%10)... i tak az sie skonczy liczba ;)... oczywiscie za kazdym razem trzeba jeszcze podzielic przez 10 ta liczbe, zeby moc uzyskac kolejna cyfre...

    a jesli chodzi o "wyciaganie" poszczegolnych bitow z liczby to przydatny jest ktorys z operatorow przesuwania bitowego (<< i >>) oraz rozne warianty maskowania:)...
    np.
    x=x>>1; //i juz na lsb mamy kolejny bit
    y=x&1; //a tu juz wiemy jaki on jest

Podsumowanie tematu

LABEL_AI_GENERATED
Temat dotyczy wysyłania 16-bitowego słowa bit po bicie do drivera LED na mikrokontrolerze AVR, w szczególności do układu MAX7219. Autor pyta, jak programowo przesyłać kolejne bity słowa, mając zmienną z wartością i stałą ramką, oraz jak wyodrębniać poszczególne bity do wysłania. W odpowiedziach zasugerowano wykorzystanie sprzętowego interfejsu SPI, który automatycznie obsługuje przesyłanie bitów, co jest najprostszym i najefektywniejszym rozwiązaniem. Poruszono także kwestie multipleksowania wyświetlaczy 7-segmentowych sterowanych przez MAX7219, gdzie adresowanie poszczególnych wyświetlaczy odbywa się przez wysłanie odpowiednich danych i adresów w ramach protokołu SPI, bez konieczności ręcznego przesuwania cyfr. Wskazano, że do wyodrębniania bitów można użyć operatorów bitowych przesunięcia () oraz maskowania bitowego (&). Podkreślono, że większość współczesnych mikrokontrolerów AVR posiada sprzętowe SPI, które znacznie ułatwia komunikację z peryferiami takimi jak MAX7219.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA