Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Arduino] [SAA1057] Wysyłanie słowa, konfiguracja SPI, taktowanie magistrali

ORMO_PL 11 Gru 2017 18:00 462 6
  • #1 11 Gru 2017 18:00
    ORMO_PL
    Poziom 19  

    Witajcie.

    Problem jest następujący.

    Próbuję napisać kawałek kodu, który będzie wysyłał na port kombinację bitów akceptowalnych przez SAA1057

    Komunikacja z SAA dzieli się tak naprawdę na dwa 16 bitowe słowa.
    Słowo A, gdzie zapisuje się częstotliwość, oraz słowo B, gdzie wysyła się konfig.
    Praktyka wskazuje, że najpierw wysyła się słowo B, następnie A.

    Ze słowem B generalnie póki co problemu nie mam, bo wystawiam jego wartość na "sztywno" już w odpowiedniej kolejności (od MSB do LSB)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W pozostałej części programu deklaruję krok 1 kHz, 25 kHz, oraz 100 kHz.

    Funkcja, która ma wystawiać stan pinu w odpowiedniej sekwencji wygląda:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz problem pojawia się z bitem częstotliwościowym, ponieważ:

    Program syntezy wystawia wartość np. 9700.
    SAA1057 oczekuje 16 bitowego słowa, gdzie od lewej mamy MSB (2^15), LSB po prawej (2^0) pomijam oczywiście wysłanie "0" na początku transmisji dla rozróżnienia słowa.

    1. Czy ktoś byłby w stanie wytłumaczyć mi łopatologicznie zapis, a w szczególności zapis "&0x0001?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    2. Jak zrealizować "odwrócenie" słowa A, by podawać je od MSB do LSB? Czy wystawienie wartości dziesiętnej np. 9700 zostanie "automatycznie" przeanalizowane na słowo binarne?
    3. Gdzie tutaj wrzucić funkcję odpowiadającą za taktowanie magistrali?


    Za wszelką pomoc z góry dziękuję.

    0 6
  • #2 11 Gru 2017 19:24
    Djwazi
    Poziom 12  

    Witam,+
    z tego co pamiętam to & - operator pobrania adresu lub operator logiczny "and". 0x oznacza wartość szesnastkową i cztery kolejne człony liczby 16 czyli 4+4+4+4 bity. Nie pamiętam czy jest jakaś funkcja konwertująca, ale zawsze można sobie taką napisać. Liczba dla komputera zawsze jest binarna i kompilator automatycznie ją konwertuje niezależnie w jakim systemie ją zapiszemy i tak 0b..... oznacza binarny zapis, liczby dziesiętne zapisujemy bez prefiksu i liczby szestnastkowe zapisujemy 0x.....

    0
  • #3 11 Gru 2017 21:03
    ORMO_PL
    Poziom 19  

    Jestem durny. Co robi if?

    Dla każdej pozycji w postaci bitowej - idx - if sprawdza jego wartość. & to wiadomo, AND, czyli koniunkcja. W przypadku pojawienia się 1 na pozycji idx funkcja spełnia warunek if i zwraca 1, wystawiając stan wysoki na porcie. W innym przypadku port pozostaje w stanie niskim. Przecież to proste...
    Zarówno słowo A, jak i słowo B jest ograniczone do 16 bitów, co jest zdefiniowane w for.

    Chcąc założyć kolejność od MSB do LSB dla słowa A (tego - załóżmy 8700, lub innego podobnego, gdzie program może założyć nieograniczoną ilość bitów) mogę zapisać:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Bo na chłopski rozum, gdy for przyjmie wartość 16 - czyli nasze MSB w rozumieniu procesora - otrzymamy wartość -1, czyli bit o najmniejszej wartości binarnej. Następnie pętla będzie wykonywać się ponownie.

    Czy to rozumowanie jest poprawne?

    Teraz - co z timingami? Czy nie prościej byłoby użyć SPI sprzętowego, gdzie nie musimy dbać o taktowania szyny?

    0
  • #4 11 Gru 2017 21:34
    Djwazi
    Poziom 12  

    Tak na dobrą sprawę jak używam timingów to inicjalizuję timer i w przerwanie uruchamia mi funkcję cykliczną, ale w tym wypadku oczywiście, że prościej użyć sprzętu

    0
  • Pomocny post
    #6 25 Gru 2017 23:09
    themosfet124
    Poziom 16  

    W Bascomie program (prawie wszystkie dostępne na elektrodzie bazują na tym samym kodzie) sam "uzupełniał" zera na początku w WORD A. Skoro miał do wysłania 16 bitów - a dzielnik był zapisany w np. pierwszych 6 to automatycznie dopisywał "0". Kolejność wysyłania słów nie ma znaczenia, bo SAA i tak zacznie "łapać" jak otrzyma dwa kompletne zestawy. Inaczej nie było by możliwości zmiany częstotliwości/konfiguracji po pierwszym ustawieniu :) Nie lepiej byłoby zrobić osobny sterownik niż męczyć się z arduino ? Na elektrodzie jest wiele działających gotowców :)

    0
  • #7 26 Gru 2017 15:19
    ORMO_PL
    Poziom 19  

    Może i łatwiej i pewnie tak się skończy, że zmodyfikuję program z BASCOM'u.
    Jedynym słowem ZA było użycie wyświetlacza z 5510, a w BASCOMie programuje się go problematycznie.

    Dzięki za pomoc.

    0