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][C/WinAvr] - szeregowe wysyłanie danych

kazeciak 28 Wrz 2008 22:08 1969 7
REKLAMA
  • #1 5580716
    kazeciak
    Poziom 15  
    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  
    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  
    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.
  • REKLAMA
  • #4 5580834
    KowalD
    Poziom 17  
    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  
    Zdecydowanie polecam użycie sprzętowego SPI - to tylko kilka rejestrów.
    Pozdrawiam
  • #6 5580899
    kazeciak
    Poziom 15  
    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  
    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  
    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
REKLAMA